【温故】干掉QQ NT更新提醒
本帖最后由 tangptr@126.com 于 2024-5-11 06:20 编辑# 前言
前段时间PC端QQ推出了NT架构的QQ,但试用了一段时间后感觉非常不适应。
之所以试用是因为QQ会间隔性的提醒你更新(关掉后又会再开),而且还找不到设置把这个提醒关掉。
你™要是这么玩就不要怪我攻击你啊。
# 实现
鉴于从Win64开始就没啥很优雅的办法实现窗口保护(不能用Shadow SSDT Hook),那么我们直接干掉窗口即可。
标题里之所以说**温故**,是因为窗口攻击在2009年左右是一种对抗杀软的非常流行的策略。
这里直接用最原始`FindWindowW`+`SendMessageW`方式实现。
这个窗体类名叫做`TXGuiFoundation`,标题叫`更新提醒`。至于类名是怎么看出来的?用Spy++就行了,Visual Studio里自带的。
类名没什么问题,但是标题含有中文,因此**编辑器保存的字节码的行为不可控**(你管不了别人的编辑器用啥编码),导致`FindWindowW`也无法查找中文窗口名,因此只能用硬编码来表示这个字符串了。
可以用Python的命令行窗口里来算出硬编码:
```Python
>>> import codecs
>>> codecs.encode("更新提醒".encode('utf-16le'),'hex')
b'f466b065d0639291'
```
那么源码就简单了:
```C
#include <stdarg.h>
#include <Windows.h>
#include <strsafe.h>
// Avoid codec issue via hardcoding...
UCHAR TargetName[]="\xf4\x66\xb0\x65\xd0\x63\x92\x91\0\0";
ULONG64 Counter=0;
void GetLocalTimeString(OUT PSTR Buffer,IN SIZE_T Length)
{
SYSTEMTIME Time;
GetLocalTime(&Time);
StringCbPrintfA(Buffer,Length,"%04u-%02u-%02u %02u:%02u:%02u.%03u",Time.wYear,Time.wMonth,Time.wDay,Time.wHour,Time.wMinute,Time.wSecond,Time.wMilliseconds);
}
void dprintf(const char* format,...)
{
CHAR Buff=" ";
SIZE_T Start;
va_list ArgList;
va_start(ArgList,format);
StringCbLengthA(Buff,sizeof(Buff),&Start);
StringCbVPrintfA(&Buff,sizeof(Buff)-Start,format,ArgList);
va_end(ArgList);
OutputDebugStringA(Buff);
}
void KillerLoop()
{
while(1)
{
HWND hWnd=FindWindowW(L"TXGuiFoundation",(PWSTR)TargetName);
if(hWnd)
{
CHAR TimeText;
LRESULT Result=SendMessageW(hWnd,WM_CLOSE,0,0);
GetLocalTimeString(TimeText,sizeof(TimeText));
dprintf("| %s | SendMessageW Result: %u, Last-Error: %u\n",TimeText,Result,GetLastError());
dprintf("| %s | Last seen this Window is %llu seconds ago!\n",TimeText,Counter);
Counter=0;
// Immediately retry without waiting.
continue;
}
// We will use sleep to count time roughly.
Sleep(1000);
Counter++;
}
}
int WinMain(IN HINSTANCE hInstance,IN HINSTANCE hPrevInstance,IN LPSTR lpCmdLine,IN int nCmdShow)
{
dprintf("QQ NT Updater Killer is Initialized!\n");
KillerLoop();
return 0;
}
```
程序打开后直接进入死循环,调试输出可以通过DbgView看。如果需要关闭,直接用任务管理器杀进程。
# 结语
没啥总结的。
TX, NMSL。
全选本文有惊喜,没发现惊喜也不要问惊喜在哪。
源码文件也是可以选择文件编码的。保存成UNICODE类型就没有编码问题的尴尬了。用记事本操作就行了。 所以,为啥不用FindWindowW来查找?你管不了别人编辑器用的啥编码,同样的是不是也管不别人电脑的非Unicode字符集用的编码?它们用的是非gbk,那你的FindWindowA不照样GG了吗?:lol 不编译成控制台程序,编译成gui程序不创建界面,就没窗口了,最好指定入口 YY菌 发表于 2024-5-7 09:30
所以,为啥不用FindWindowW来查找?你管不了别人编辑器用的啥编码,同样的是不是也管不别人电脑的非Unicode ...
已修改
页:
[1]