反编译工具效果大比拼!哪款软件能快速还原程序结构

今天一早我对着屏幕发呆,突然接了个活儿,要改个十年前的破程序。好家伙,连源代码都没有,这咋整?我琢磨着只能靠反编译工具了,干脆把市面上几个热门工具都测一遍。

准备工作

先从旧硬盘里翻出来个十几兆的小软件,故意选了C++写的控制台程序。你问我为啥选C++?这玩意儿反编译最难还原,要是连C++都能搞定,别的更不在话下。

掏出三个最常听人提的工具:DragonEggHex-RaysIlSpy。每个都装最新版,打开虚拟机新建快照,万一搞崩了直接回档。

第一回合测试

先祭出DragonEgg,加载文件就卡了五分钟。好不容易显示反编译结果,好嘛满屏的mov、eax这种汇编指令,函数名全变成sub_1234这种火星文。

不死心点开个函数,直接给我弹错误框:"内存不足"。我8G内存的电脑,反编译个3M的程序居然说内存不足?气得我差点把鼠标摔了。

换工具再战

打开Hex-Rays时手都在抖,毕竟这玩意儿收费巨贵。加载速度倒是快,十秒出结果。乍一看挺像样,连for循环都给还原出来了。

仔细看发现问题了:所有变量名都变成v1、v2、v3,连用户输入的密码字段都显示成"int v5"。这要是真改代码,分分钟搞错变量!

希望

IlSpy时我基本不抱希望了。结果加载C++程序直接报错,才想起来这货主要对付C#的。临时换成.NET写的测试程序,这回倒是丝滑得很:

  • 类名都还原成OrderManager这种人类能看懂的名字
  • if条件语句保持原样
  • 连try-catch错误处理都没丢

不过点开事件处理函数就露馅了,全变成了一堆add_remove方法,看得我眼晕。

血泪教训

折腾一上午得出三条

  • 别指望完美还原:就像碎纸机粉碎的文件,再厉害的软件也拼不回原样
  • C++最惨:反编译出来跟天书似的,改行做密码破译比较合适
  • .NET算亲儿子:好歹能看出个大概结构,不过关键逻辑照样抓瞎

只能硬着头皮用Hex-Rays的结果,边猜边改代码。改完测试时手都是抖的,生怕程序炸了。要我说,反编译就跟吃别人嚼过的口香糖似的,看着像那么回事,真要用起来全是恶心事儿。