前言
前段时间PC端QQ推出了NT架构的QQ,但试用了一段时间后感觉非常不适应。
之所以试用是因为QQ会间隔性的提醒你更新(关掉后又会再开),而且还找不到设置把这个提醒关掉。
你™要是这么玩就不要怪我攻击你啊。
实现
鉴于从Win64开始就没啥很优雅的办法实现窗口保护(不能用Shadow SSDT Hook),那么我们直接干掉窗口即可。
标题里之所以说温故,是因为窗口攻击在2009年左右是一种对抗杀软的非常流行的策略。
这里直接用最原始FindWindowW
+SendMessageW
方式实现。
这个窗体类名叫做TXGuiFoundation
,标题叫更新提醒
。至于类名是怎么看出来的?用Spy++就行了,Visual Studio里自带的。
类名没什么问题,但是标题含有中文,因此编辑器保存的字节码的行为不可控(你管不了别人的编辑器用啥编码),导致FindWindowW
也无法查找中文窗口名,因此只能用硬编码来表示这个字符串了。
可以用Python的命令行窗口里来算出硬编码:
>>> import codecs
>>> codecs.encode("更新提醒".encode('utf-16le'),'hex')
b'f466b065d0639291'
那么源码就简单了:
#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[512]="[KillQQUpdate] ";
SIZE_T Start;
va_list ArgList;
va_start(ArgList,format);
StringCbLengthA(Buff,sizeof(Buff),&Start);
StringCbVPrintfA(&Buff[Start],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[64];
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。
全选本文有惊喜,没发现惊喜也不要问惊喜在哪。