尽然论坛已经不在是单一的ios我来分享一个我学习后脱加密壳的经历。
第一步:
我们先使用LordPE把exe的随机基址取消掉,也可以从设置PE头中的,看个人习惯。
第二步:
出现这种PUSHAD的时候我们就可以用ESP定律来找OEP了,
F8单步执行,看寄存器只有ESP是红色的时候,也就是只有ESP寄存器的值改变了,我们就follow in dump
这里就选择内存,从第一个开始,1024KB为一页,这里如果选多了可能会跨页,但是也没有关系,硬件断点的本质就是利用Dr0-Dr3寄存器,把线性地址存进去,然后CPU执行到这里的时候会根据Dr7的0-8位L0,G0-L1,G1-L2,G2,L3,G3来判断是否存在硬件断点,L就是只影响当前线程,G就是影响整个进程中的所有线程,就会触发单步异常。
(操作系统的文件系统,加载文件的时候会将一页的内容缓存到内存,通过FCFI算法来进行调度,这个算法就是如果需要的使用时候在缓存中命中了在就可以直接使用这些数据,如果没有命中就又会到磁盘去加载,性能就不好。一页就有4096子节的数据,所以我猜应该是选多了会缓存两页的内容到内存)
选择多少个字节这个就18,19位代表Dr0的长度,11就代表4字节,从Dr0线性地址开始后面的字节长度。
第三步:
F9让程序跑起来,就会自动断下来。
第四步:
删除硬件断点。
第五步:
F8执行几下就来到这种没有分析的代码了,这个就是OEP了
我们右键分析代码。
然后从模块中删除分析。
就得到正常解密后的代码了。
第六步:
打开lordpe,correct ImageSize
dump full…
储存起来。
第七步:
打开ImportREC,选择我们调试的进程
当前的EIP是0045C821,
但是ImportREC这里需要填没有ImageBase的,应该就是EP。然后点击自动搜索(这个只有EIP寄存器是在OEP的时候才能使用,测试后发现并不是)
出现这个就是明找到了,如果没有就需要手动输入RVA和大小,这个可以使用另一个工具来实现。
这个工具会帮我们从内存中修复IAT然后存到内存的一个位置,我们利用这个IAT就可以配合上面了。
点击获取导入表
显示无效的,Trace level 1右键选择这个
第八步:
点击修正转储
选择刚才lordpe保存的文件。
这样就OK了,脱壳成功!
脱壳后的文件就会多一个节,.mackt这个节就是修正后的IAT表(IAT表就导入函数表,这个应用程序用到的其它dll的函数就要靠这张表去找)
在XP上面运行找不到函数,所以这个还是需要修护的。