前言:我真是老鸽子了,这篇文章拖了一年多才发出来。虽然内容是逆向工程中非常基础的一部分,并且已经有相当成熟的小工具来实现自动化脱壳 / 去除花指令,不过自己动手尝试一下,学习学习,然后记录下来也挺好。
随着新冠肺炎疫情的发展,口罩的价格一涨再涨,数量也更是稀缺,各大电商平台都是供不应求。京东更是沦为黄牛党的战场,服务器架在京东云上以降低延迟,比谁的代码效率更高。而在民间,各种抢购脚本、抢购软件也同样应运而生。有一天在抢口罩的交流群发现了一个抢购软件,号称“免费”,抱着试试看的心理就下载了下来,结果在提交商品 ID 的时候要我充钱。看了看 20 块钱包年,不贵,但我可不想让这种可以说是发国难财的人赚到钱,想自己逆向一下试试看,能不能给他破解了。
1. 确定是否加壳 / 壳类型
用最新版 EXEInfoPE 查壳,提示 ASPack 2.24-2.42 ,扫描一下又变成了 ASProtect DLL ,但区段明确显示是 ASPack (虽然不排除伪装的可能)。
查壳工具也就是给我们一个提示,一个大致的方向,真正脱壳还是要具体情况具体分析。
2. OllyDbg 手动脱壳
OD 载入,一个 pushad 接着一个 call ,明显的 ASPack 特征:
既然确定了是 ASPack ,那就直接 ESP 定律。
ESP 定律的理论支撑是堆栈平衡原理,所以要在关键语句(涉及到压栈的语句)的下一句处对 ESP 下断点。ESP 定律的使用条件是在关键语句执行之后,寄存器只有 ESP 和 EIP 发生“突变”,也就是显示变红。
单步跟踪一次,发现仅有 ESP 和 EIP 发生了突变。那么,就从这里的 ESP 地址入手。
寄存器窗口中右键 ESP 地址,点击 HW break [ESP],在此地址下断点。
运行程序,程序会在我们设置的 ESP 断点处停下。接着单步跟踪,在大跨度的跳转语句处停下(如下图)。如果对 ASPack 比较熟悉,就会知道这里会直接跳向 OEP:
我们跟进这个跳转,会来到如下图所示的位置。嗯?看起来并不是 OEP ,起初我以为这是一个 ASPack 的变形壳,不过搜索了一下,得知这是易语言的花指令加密。
3. 去除易语言花指令
去除易语言花指令有多种方法,比如使用花指令去除小工具,使用 PEiD 的通用脱壳插件查找 OEP,直接在 OD 内使用单步法或是 ESP 定律法都是可以的。
单步法,顾名思义,就是一步一步跟下去,遇到向上的跳转不执行,跳过;遇到向下的跳转则跟进,一直跟到一个向上的大跳转语句处为止,跟进跳转,一般就会来到 OEP。
这里还是采用 ESP 定律法脱壳。
单步跟踪到下图所示位置,ESP 和 EIP 发生突变,在此处应用 ESP 定律。
应用 ESP 定律后,会来到下图所示的位置。这里的反汇编代码看起来有些杂乱,似乎是不正确的。不过不用担心,接着单步跟踪下去就行。
我们单步跟踪到了这里,发现这里是一个跨度很大的向上跳转。一般来讲,具备这种特征的跳转都可能直接跳向 OEP。
看到这段熟悉的 VC++ 程序的特征反汇编代码,可以得知我们来到了 OEP。
接下来就是将内存中以及脱壳完毕的程序转储出来,得到脱壳后的文件了。你可以采用任意方法,例如直接用 OD Dump 出来,或者用 LordPE + ImortREC 的方式实现转储 + 输入表修复,抑或是 Scylla 修复均可。请注意:单一方法可能无法成功转储所有脱壳后的程序,请视实际情况选择合适的脱壳方法,以脱壳后的程序正常运行不报错为标准。