当前位置:首页教程笔记聊天软件不让截图?我偏要!破解它!

聊天软件不让截图?我偏要!破解它!

前几天,有小伙伴反映:他手里有个聊天软件,每次一截图,聊天窗口就不见了,甚至按键盘上的PrtSc截图键截下来都没有这个聊天窗口的内容,他想尽各种办法,就是截不了这个软件的图。

聊天软件不让截图?我偏要!破解它!

听他这么一描述,我还有些好奇了起来。首先怀疑的是这软件是不是安装了什么消息钩子,通过监听键盘按键,禁止截图,于是有人建议他换个快捷键,结果发现也不行:

聊天软件不让截图?我偏要!破解它!

于是我建议让他手动点击微信的截图按钮,不要敲键盘,结果还是不行:

聊天软件不让截图?我偏要!破解它!

 

有群友建议他使用录屏功能,直接录视频,发现居然仍然不行!

这一下挑起了我的兴趣,这软件还真有两下子啊。

基于这么多操作都不行,于是我怀疑是不是这软件安装了什么内核驱动,在内核里面拦截捕捉屏幕像素内容的操作,于是建议用PChunter查一下:

聊天软件不让截图?我偏要!破解它!

于这位小伙伴不是太会操作,于是我找他要到了这个聊天软件的安装包,自己安装了来研究。结果发现居然啥驱动都没装!也没有什么可疑的钩子行为。甚至连软件的登录界面都截不了图!

这一下让我皱眉头了,一个普通应用程序,它是咋做到这一切的?难道是有什么我不知道的操作?

于是我打开ChatGPT,把上面的现象给它描述了一下,他告诉了我一个系统API,这个API可以办到这样的效果,这个API就是:SetWindowDisplayAffinity

聊天软件不让截图?我偏要!破解它!

根据MSDN的描述,这个函数可以用来设置窗口不被任何屏幕录制行为捕获:

聊天软件不让截图?我偏要!破解它!

为了验证这聊天软件是不是通过这个API实现的,我用APImonitor抓了一下它启动的过程,果然发现了对这个函数的调用,而且第二个参数传递的值正是上面的0x11,也就是17。

聊天软件不让截图?我偏要!破解它!

问题搞清楚了,想要破解就好办了,再调用一下这个函数,把第二个参数设置为0,解除对窗口的保护就好了。

不过要注意,根据MSDN的描述,调用这个函数必须要窗口属于当前进程才行,无法操作别的进程的窗口。所以我们得让那个聊天软件自己去调用这个函数解除它的窗口保护。【本文来自微信公众号:轩辕的编程宇宙,未经许可,禁止搬运】

那如何让聊天软件主动去干这件事呢?用我们第26课学到的DLL注入就好了:我们编写一个DLL,在DLL里面调用这个函数解除窗口保护,然后把DLL注入到目标聊天软件进程中就好了。

我们先用Spy++看一下要解除保护的窗口,通过上面APImonitor中抓到的两次调用SetWindowDisplayAffinity函数所设置的两个窗口句柄值在Spy++中找到这两个窗口:

聊天软件不让截图?我偏要!破解它!

查看两个窗口的窗口类和窗口名称,接下来,写代码解除保护:

聊天软件不让截图?我偏要!破解它!

在DLL加载的时候就执行上述动作:

BOOL APIENTRY DllMain(HMODULE hModule,
 DWORD  ul_reason_for_call,
 LPVOID lpReserved
)
{
 switch (ul_reason_for_call)
 {
 case DLL_PROCESS_ATTACH:
  MessageBoxA(NULL, 'dll注入成功!', 'CaptureCrack', MB_OK);
  Work();
  break;
 case DLL_THREAD_ATTACH:
 case DLL_THREAD_DETACH:
 case DLL_PROCESS_DETACH:
  break;
 }
 return TRUE;
}

接下来,把DLL注入进去:

int main(int argc, char* argv[])
{
 DWORD dwProcessId = 4092; // 需要自己找到对应进程ID
 LPVOID pfnLoadLibraryA = GetFunctionAddress(dwProcessId, 'kernel32.dll', 'LoadLibraryA');


 // 2、拿到进程的句柄
 HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
 if (!hProcess) {
  printf('can not open process!\n');
  return 0;
 }

 // 3、在进程中分配内存
 LPVOID address = VirtualAllocEx(hProcess, NULL, 100, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
 if (!address) {
  printf('VirtualAllocEx failed!\n');
  return 0;
 }

 // 4、向分配到的内存中写入要注入的DLL路径,作为参数
 SIZE_T writeBytes = 0;
 const char* dllPath = 'CaptureCrack.dll';
 if (!WriteProcessMemory(hProcess, address, dllPath, strlen(dllPath) + 1, &writeBytes)) {
  printf('WriteProcessMemory failed!\n');
  return 0;
 }


 // 5、创建远程线程
 HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pfnLoadLibraryA, address, NULL, NULL);
 if (!hThread) {
  printf('CreateRemoteThread failed!\n');
  return 0;
 }

 WaitForSingleObject(hThread, INFINITE);

 CloseHandle(hProcess);
 CloseHandle(hThread);

 return 0;
}

最后,执行成功,终于可以截图了:

聊天软件不让截图?我偏要!破解它!

上面的办法,不是个长久之计,因为程序重启后,又得要重新注入来改。挺麻烦的,那有没有一劳永逸的办法呢?

还真有!直接逆向分析找到程序调用SetWindowDisplayAffinity函数的地方,找到第二个参数传参的指令,直接修改exe文件中的指令参数,把它改为0,保存exe文件就好了!

温馨提示:

文章标题:聊天软件不让截图?我偏要!破解它!

文章链接:https://i.mojue88.com/1549.html/

更新时间:2024年09月07日

本站大部分内容均收集于网络!若内容若侵犯到您的权益,请发送邮件至:admin@mojue88.com我们将第一时间处理!

资源所需价格并非资源售卖价格,是收集、整理、编辑详情以及本站运营的适当补贴,并且本站不提供任何免费技术支持。

所有资源仅限于参考和学习,版权归原作者所有,更多请阅读墨觉网络服务协议

版权声明

   站内部分内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供网络资源分享服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请 联系我们 一经核实,立即删除。并对发布账号进行永久封禁处理。在为用户提供最好的产品同时,保证优秀的服务质量。


本站仅提供信息存储空间,不拥有所有权,不承担相关法律责任。

给TA打赏
共{{data.count}}人
人已打赏
教程笔记

解决WordPress“正在执行例行维护,请一分钟后回来”的错误提示

2024-9-7 11:08:48

教程笔记

Spark数据介绍

2024-9-7 20:18:24

0 条回复 A文章作者 M管理员
😊 表情
  • 贴吧
  • 泡泡
  • 黄脸
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索