在日常工作和学习中,我们会遇到各种恶心的弹窗和广告,关也不了,删也删不掉,如何利用逆向的方式,彻底解决呢?
声明:本文仅为技术研究和逆向工程学习之用。请尊重软件著作权,在合法授权范围内使用软件。本文所述技术手段不应被用于侵犯他人知识产权或获取非法利益。
使用某知名下载软件的的用户经常会遇到一个弹窗提示:


初步分析

使用 strings 命令在 主程序.exe 中搜索弹窗中的关键字:
strings 主程序.exe | grep -i "executivefile\|damaged\|the main"
结果什么都找不到。
即使在所有 DLL 文件中搜索编码后的宽字符串(UTF-16 LE),同样一无所获:
strings -e l 主程序.exe | grep -i "executive\|damaged"这说明 弹窗文本被加密存储了,不是明文。
既然找不到明文字符串,就转向分析代码。主程序.exe 是一个标准的 32位 PE 可执行文件:
objdump -x 主程序.exe | head -40
导入的关键 API: 列出所有导入的 DLL 及其函数。
objdump -p 主程序.exe | awk '/DLL Name:/{dll=$NF} /vma:/{print dll, $NF}'
这些 API 提示了弹窗流程:先获取自身文件名 → 打开自身文件 → 验证完整性 → 若验证失败则弹出 MessageBoxW。

定位加密的弹窗字符串

遍历所有可能的 XOR 密钥来搜索字符串片段。用 Python 每秒扫描数十万个字节,最终命中:
for key in range(256): decoded = bytes(b ^ key for b in data) if b'The main' in decoded: print(f"Found! XOR key = 0x{key:02x}")输出:
Found! XOR key = 0x3d弹窗文本使用 单字节 XOR 加密,密钥 = 0x3D(即 ASCII 字符 =)。
加密字符串位于文件偏移 0x3591A4(位于 .data 段),解密后的完整内容:

整个弹窗对话框的字符串拼在一整块加密内存中,共约 9000+ 字节。
解密字符串的 VA(虚拟地址)为 0x0075B5A4。在代码段中搜索对这个地址的引用:
python3 -c "# 搜索 push 0x75b5a4 模式target = bytes([0xa4, 0xb5, 0x75, 0x00])pos = data.find(target)print(f'引用位置: file 0x{pos:06x}, VA 0x{pos+0x400000:08x}')"找到唯一引用点:VA 0x004A86FA,位于方法 CDuplicateDownloadsDlg::virtual_280 内部。

定位弹窗触发调用链

使用 radare2 分析:
r2 -A 主程序.exe > afl | grep "0x4a87"
函数 fcn.004A8720(大小约 1793 字节)就是构造并显示弹窗的完整函数。
fcn.004648d0 (检测函数) │ ├─ 检查某个条件 └─ [条件为真时] │ ├─ 0x0046499b: lea ecx, [缓冲区] ├─ 0x004649a1: call fcn.004A8720 ← 🎯 目标! └─ 弹窗显示该函数的调用者:
fcn.00482DB0 @ +0x3CBfcn.0048ACB0 @ 0x48B7D4 CDownloaderDlg case.5199 @ +0x780COleListCtrlDropTarget @ 0x504204弹窗触发的关键指令位于:
VA: 0x004649A1文件偏移: 0x00063DA1 (.text 段内)原始字节: E8 7A 3D 04 00 → call fcn.004A8720
补丁方案

将调用弹窗函数的 5字节 call 指令 替换为 5个 NOP(0x90):
在 010 Editor 中打开源文件,Ctrl+G 跳转打开 IDMan.exe 后,按 Ctrl+G,输入十六进制偏移值063DA1。完成跳转。

光标会直接跳到该字节位置,你会看到: E8 7A 3D 04 00
选中这 5 个字节,手工输入:90 90 90 90 90

完成后,点击保存。 接下来,运行程序,你会发现不再有烦人的弹窗了。