在日常工作和学习中,我们会遇到各种恶心的弹窗和广告,关也不了,删也删不掉,如何利用逆向的方式,彻底解决呢?
使用某知名下载软件的的用户经常会遇到一个弹窗提示:

初步分析
搜索弹窗字符串
使用 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 加密
遍历所有可能的 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 字符 =)。
解密弹窗文本
加密字符串位于文件偏移 <span leaf="">0x3591A4</span>(位于 <span leaf="">.data</span> 段),解密后的完整内容:

整个弹窗对话框的字符串拼在一整块加密内存中,共约 9000+ 字节。
字符串引用定位
解密字符串的 VA(虚拟地址)为 <span leaf="">0x0075B5A4</span>。在代码段中搜索对这个地址的引用:
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 @ +0x3CB
fcn.0048ACB0 @ 0x48B7D4
CDownloaderDlg case.5199 @ +0x780
COleListCtrlDropTarget @ 0x504204关键指令定位
弹窗触发的关键指令位于:
VA: 0x004649A1
文件偏移: 0x00063DA1 (.text 段内)
原始字节: E8 7A 3D 04 00 → call fcn.004A8720补丁方案
方案:NOP 掉弹窗调用
将调用弹窗函数的 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

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