找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 150|回复: 4

【温故】干掉QQ NT更新提醒

[复制链接]

66

主题

118

回帖

1万

积分

用户组: 超级版主

OS与VM研究学者

UID
1043
精华
36
威望
791 点
宅币
8367 个
贡献
1094 次
宅之契约
0 份
在线时间
2086 小时
注册时间
2015-8-15
发表于 2024-5-6 17:50:45 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 tangptr@126.com 于 2024-5-11 06:20 编辑

前言

前段时间PC端QQ推出了NT架构的QQ,但试用了一段时间后感觉非常不适应。
之所以试用是因为QQ会间隔性的提醒你更新(关掉后又会再开),而且还找不到设置把这个提醒关掉。
你™要是这么玩就不要怪我攻击你啊。
你不要逼我攻击你.png

实现

鉴于从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。
全选本文有惊喜,没发现惊喜也不要问惊喜在哪。

回复

使用道具 举报

55

主题

277

回帖

9368

积分

用户组: 管理员

UID
77
精华
16
威望
237 点
宅币
8231 个
贡献
251 次
宅之契约
0 份
在线时间
256 小时
注册时间
2014-2-22
发表于 2024-5-6 20:49:08 | 显示全部楼层
源码文件也是可以选择文件编码的。保存成UNICODE类型就没有编码问题的尴尬了。用记事本操作就行了。
回复 赞! 靠!

使用道具 举报

9

主题

180

回帖

1万

积分

用户组: 真·技术宅

UID
4293
精华
6
威望
441 点
宅币
8710 个
贡献
850 次
宅之契约
0 份
在线时间
342 小时
注册时间
2018-9-19
发表于 2024-5-7 09:30:41 | 显示全部楼层
所以,为啥不用FindWindowW来查找?你管不了别人编辑器用的啥编码,同样的是不是也管不别人电脑的非Unicode字符集用的编码?它们用的是非gbk,那你的FindWindowA不照样GG了吗?
回复 赞! 靠!

使用道具 举报

30

主题

216

回帖

2850

积分

用户组: 版主

UID
1821
精华
7
威望
69 点
宅币
2225 个
贡献
206 次
宅之契约
0 份
在线时间
500 小时
注册时间
2016-7-12
发表于 2024-5-7 19:10:55 | 显示全部楼层
不编译成控制台程序,编译成gui程序不创建界面,就没窗口了,最好指定入口
回复 赞! 靠!

使用道具 举报

66

主题

118

回帖

1万

积分

用户组: 超级版主

OS与VM研究学者

UID
1043
精华
36
威望
791 点
宅币
8367 个
贡献
1094 次
宅之契约
0 份
在线时间
2086 小时
注册时间
2015-8-15
 楼主| 发表于 2024-5-11 06:21:15 | 显示全部楼层
YY菌 发表于 2024-5-7 09:30
所以,为啥不用FindWindowW来查找?你管不了别人编辑器用的啥编码,同样的是不是也管不别人电脑的非Unicode ...

已修改
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-5-19 11:54 , Processed in 0.040719 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表