游客发表
凌晨两点,完成我盯着屏幕上的持漏进程树,目标程序“helper.exe”刚启动就加载了我伪造的洞利version.dll。系统日志里没有任何异常,完成杀毒软件安静得像只睡着的持漏猫。DLL劫持就是洞利这么回事——你不需要攻破任何防线,只需要找到程序信任的完成那个“自己人”,然后替换它。持漏
原理其实简单得让人发笑。洞利Windows加载程序时,完成会按照固定顺序搜索DLL:程序所在目录、持漏系统目录、洞利PATH环境变量。完成很多开发者图省事,持漏调用LoadLibrary时只写文件名不写全路径。洞利于是,攻击者只要把恶意DLL放到程序目录下,抢在系统找到真货之前冒名顶替。这就像你给快递员留了张纸条说“放门口就行”,结果邻居把包裹拿走了。
我选中的目标是个老旧的图像处理工具,官网还挂着2015年的更新日志。用Process Monitor一抓,好家伙,它启动时尝试加载十几个不存在的DLL——全是没写绝对路径的“裸奔”调用。其中最理想的是“libpng.dll”,程序会在启动后三秒内加载它,而且加载前会先检查当前目录。完美,这就是我要的那个门。
写恶意DLL的工作量不大。我建了个空的DllMain,导出函数用GetProcAddress转发到系统目录里的真实libpng.dll——这叫“转发导出”,能让程序以为自己加载了正版货。真正的payload放在DllMain的DLL_PROCESS_ATTACH分支里,用CreateThread起个新线程,等三秒后弹出一个MessageBox,证明代码执行成功。就这么简单,连反调试都没做,因为目标程序本身就没有任何防护。
编译完成后,我把伪造的libpng.dll扔进程序安装目录,双击运行。程序正常打开,界面毫无异样。三秒后,屏幕上弹出一个写着“pwned”的对话框。那一刻的满足感,比玩通任何3A大作都强。但紧接着是种微妙的空虚——这种攻击太安静了,安静到你怀疑自己是不是真的做了什么。
实际上,DLL劫持在真实攻击中从来不是终点。它更像一把万能钥匙,帮你打开房间后,真正的偷窃行为才刚开始。我见过有人用它注入键盘记录器,有人用它维持权限持久化,还有人干脆把整个勒索软件打包成DLL等系统重启时自动加载。最讽刺的是,微软官方给的建议只是“调用LoadLibrary时使用完整路径”——这建议从2005年喊到现在,依然有大把软件中招。
测试结束后,我删掉了伪造文件,恢复原样。但那种“信任被滥用”的感觉留在脑海里。下次你双击任何来路不明的软件时,想想它背后可能藏着的那个version.dll、libpng.dll或者随便什么名字的“替身”。系统不会告诉你它加载的每个模块是否可信,它只负责执行,从不质疑。
友情链接