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

初步分析
搜索弹窗字符串
使用 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 字符 =)。
解密弹窗文本
加密字符串位于文件偏移 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 内部。
定位弹窗触发调用链
弹窗函数:fcn.004A8720
使用 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补丁方案
方案: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

完成后,点击保存。
接下来,运行程序,你会发现不再有烦人的弹窗了。更多精彩文章 欢迎关注我们
本文首发于微信公众号,原文链接:【逆向实战】去除软件弹窗