tangptr@126.com 发表于 2024-5-6 17:50:45

【温故】干掉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。
全选本文有惊喜,没发现惊喜也不要问惊喜在哪。

美俪女神 发表于 2024-5-6 20:49:08

源码文件也是可以选择文件编码的。保存成UNICODE类型就没有编码问题的尴尬了。用记事本操作就行了。

YY菌 发表于 2024-5-7 09:30:41

所以,为啥不用FindWindowW来查找?你管不了别人编辑器用的啥编码,同样的是不是也管不别人电脑的非Unicode字符集用的编码?它们用的是非gbk,那你的FindWindowA不照样GG了吗?:lol

AyalaRs 发表于 2024-5-7 19:10:55

不编译成控制台程序,编译成gui程序不创建界面,就没窗口了,最好指定入口

tangptr@126.com 发表于 2024-5-11 06:21:15

YY菌 发表于 2024-5-7 09:30
所以,为啥不用FindWindowW来查找?你管不了别人编辑器用的啥编码,同样的是不是也管不别人电脑的非Unicode ...

已修改
页: [1]
查看完整版本: 【温故】干掉QQ NT更新提醒