我使用的是teltel超速拨号器,看样子是一款很老的软件了,我们可以看到它是未注册版。
要破解这样一款软件,我们还是按照套路来查壳脱壳:
一、用PEID查壳
从图中我们可以发现他是ASPack 2.12的壳,但奈何PEID中并未显示它是由什么语言编写的,所以我们还得进行下一步。
二、用Die查软件的编写语言
由图可以看出这是一个BC++[Borland C++]开发的软件(不知道Borland C++的可以看看这个https://baike.baidu.com/item/Borland%20C++/4620812?fr=aladdin),至于为什么要查看语言,我会在后面的步骤中进行阐述。
三、载入OD
在此我们终于进入正题开始破解软件了,这里使用的是OllyDBG(至于为什么不用IDAPro,原因很简单——我不会);载入OD后我们来到pushad这个地方,F8运行一步后发现寄存器窗口ESP寄存器变红,所以直接用ESP定律即可(不知道什么是ESP定律的可以看这里https://baike.baidu.com/item/esp%E5%AE%9A%E5%BE%8B),鼠标右键点击ESP寄存器,选择HW break[ESP],按F9运行,再按F8来到如下图所在的地方,右键选择分析-从模块中删除分析便可恢复成汇编代码。
在这里我们可以看到ESP寄存器还是变成红色,那我们是否继续使用ESP定律呢? 答案是根据不同软件的OEP来判定是否到达程序的入口点,可以根据下图来判定。
四、脱壳
右键选择使用Ollydump脱壳调试进程,复制修正后的入口地址,打开LoadPE找到该进程,右键选择修正镜像大小然后完整转存,这时会出现一个dump.exe的文件;
再打开ImpREC,找到该进程输入OEP偏移量点击IAT自动搜索-->获取导入表-->修正转存(修正刚才的dump.exe文件)这时会出现一个dump_.exe的文件,这就是修正后的文件;但点击后会发现这个文件根本打不开,这时就要想想这个软件是不是有自效验。
五、手动查找偏移量
同样载入OD重复第三步操作,来到程序入口处,向下找到第一个call并按Enter键跟随进入call里面看看,可以看到这个call是引用函数部分。
我们找到第一个jmp,右键选择数据窗口中跟随--内存地址,将数据窗口中的地址变为jmp的地址而数据窗口中的地址则为真实的地址,这时我们进行手动修正,将EVA改为0016E114(这里为什么是16E114而不是56E114,这是因为我们要减掉段地址,而段地址大小为40000),大小为1000(表示向下搜索范围为1000),点击获取导入表--显示无效的--右键选择剪切指针(或删除指针)--修正转存,这时点击dump_.exe便可以运行了,证明脱壳成功!!!
六、总结
1、在用ESP定律脱壳时一定的用Die查一下使用什么语言编译的,再查找OEP以免错过程序入口。
2、BC++程序在脱壳后需要手动修复IAT(仅限于BC++程序,其他程序按照正常的脱壳流程来),自动搜索的结果为错误的,这造成了脱壳后程序打不开的现象,当初怀疑是程序自效验,现在就可以否定这一说法。