Shark恒 发表于 2015-1-20 17:24

使用OllyDbg从零开始Cracking 第四十四章-ACProtect V1.09脱壳(修复AntiDump)

               第四十四章-ACProtect V1.09脱壳(修复AntiDump)我们上一章节介绍了如何定位stolen bytes,以及IAT的修复。我们利用上一章编写的脚本可以很方便的修复IAT并且定位到OEP,接下来我们的任务就是dump。我们依然用OD加载UnPackMe_ACProtect1.09,并对KiUserExceptionDispatcher入口以及下方的ZwContinue调用处分别设置断点,并且清除之前设置的硬件断点。接着我们执行OEP.txt这个脚本定位到OEP处。好了,现在我们到达了OEP处。接下来进行dump。这里我们不勾选Rebuild Import的选项,将转储出来的文件重命名为dumped.exe。接下来我们重启OD,执行修复IAT的脚本。接下来打开Import Reconstructor,定位到该程序所在进程。接着就需要填上OEP(RVA),IAT起始地址(RVA),IAT的大小。OEP = 271B5IAT的起始地址(RVA) = 60818IAT的大小 = 460F28 - 460818 = 710点击Get Imports。我们会发现有一项是无效的,其他项都是有效的,是不是我们哪里处理的有问题?我们来跟一下,看看哪里出了问题,重启OD,我们选中上面显示无效的IAT项,设置内存写入断点。运行起来,断在了尝试对460DE8该内存单元进行写入的指令处。我们会发现ESP - 0C指向的栈空间中并没有保存API函数的入口地址,而是保存了46E5CB这个值。我们可以看到通过IAT.txt脚本,460DE8这个IAT项被保存的是46E5CB这个值,那么不通过脚本呢?我们按F7执行该指令。我们可以看到不通过脚本460DE8这个内存单元中保存的值是46BD5B。我们转到46BD5B地址处看看是什么。这里我们可以看到首先是将一个常量压入堆栈,接着与另一个常量进行异或就可以得到某个API函数的入口地址,我们一起来计算一下。942C0892 xor 946aed59如果你不想通过计算器来算的话,那么也可以通过OD执行这几条指令来得到结果。这里我们可以看到异或得到的结果是46E5CB,跟执行IAT.txt脚本得到的结果是一致的。也就是问题并不是出在脚本上。应该是其他的某个环节出了问题。我们重启OD,随便找一个API函数跟一下。我们执行OEP.txt脚本到达了OEP处,接着依然对刚刚的460DE8这个无效的项设置内存访问断点,看看会断在哪里。断在了这里,我们跟进去看看。我们跟到RET指令处,继续跟进。这里我们可以看到第一条指令是PUSHAD,那么根据堆栈平衡原理,可以很自然的想到后面应该有个POPAD指令,我们按F7键往下跟若干行会到达这里。这里我们可以看到调用了MessageBoxA这个API函数。另一种更加快捷的方法就是通过OD的自动跟踪功能来定位,我们设置自动跟踪的终止条件为EIP大于500000,也就是说从当前区段转入到系统DLL中去执行API函数的时候就会断下来,我们一起来看一看。这里我们选中EIP is outside the range。范围设置为0~500000。下面我们一起来看看效果。我们可以看到断在了MessageBoxA的入口处,为了验证API函数的正确性,我们来看看该函数的调用处是哪里,看看堆栈中的返回地址。这里我们可以看到返回地址是40E51B,我们直接转到这个地址。这里返回到的是调用处的下一行,好了,这里我们就得到了正确的API函数,我们重启OD,执行IAT.txt脚本,就OEP,IAT起始地址,IAT大小等数据都填入到IMP REC中。我们定位到这个无效的项,双击之,将其修改为MessageBoxA。好了,现在所有的项都有效了。接下来修复dump文件,选中dumped.exe,单击Fix dump。修复后的dump文件被重命名为了dumped_.exe,别忘了stolen bytes我们还没有填充回去,我们用OD打开dumped_.exe。停在了假的OEP处,我们准备好stolen bytes。我们将stolen bytes以汇编指令的形式填充上。我们通过计算可知stolen bytes总共占5个字节长度,4271b5往上5个字节就是4271b0,也就是说正确的OEP应该是4271b0。我们从4271b0地址处开始写入stolen bytes。接下来我们通过单击鼠标右键选择-Copy to executable-All modifications将刚所做的修改保存到文件。接着我们来将其OEP更正。用OD加载刚刚保存的文件,我们可以通过在数据窗口中单击鼠标右键选择-Go to-Expression,输入400000定位到PE头。单击鼠标右键选择Special-PE header将显示模式切换为PE头视图,接下来定位到AddressOfEntryPoint,将其修改为271b0并保存。好了,现在我们就修复完毕了,但是我们运行修复后的程序会发现无法正常运行,程序崩溃了。好,那么我们不勾选忽略异常的选项,加载刚刚修复过的程序,运行起来,看看会提示哪些异常。我们可以看到日志窗口中显示了一个非法访问异常。我们通过单击工具栏中的K按钮查看调用堆栈。这里我们可以看到最后一次调用来至于429806,我们通过单击鼠标右键选择-Show call定位到该调用处。单击鼠标右键选择-Follow看看这个CALL里面是什么。嘿嘿,这里我们我们可以看到一个跳转表,正是由于这些跳转表的目标地址诸如177658这类地址才导致程序无法正常运行报错的。该地址所属的区段是由壳创建的,但是我们并没有dump出来。下面我们就来解决这个问题。我们再开一个OD,加载原始的程序,执行OEP.txt脚本到达OEP处。我们到了这里,我们定位到上面的跳转表。我们在数据窗口中定位跳转表中唯一一个目标地址,这里我们定位1775C4。我们往上定位到第一个跳转,我这里是46C0F5。这些跳转指令都占6个字节长度,我们随便挑一个目标地址,这里我们选择目标地址为178250,转到这个地址处,我们会发现其执行会6个字节长度的指令,然后返回。这里我的想法是用这6个字节替换掉那跳转表中的6个字节。我们选中这三行指令,单击鼠标右键选择-Binary-Binary copy。然后定位到相应的跳转指令处,单击鼠标右键选择-Binary-Binary paste。这里我们可以看到覆盖后的效果。下面我们来将整个跳转表都替换掉。我们可以看到跳转表开始于1772B4。该跳转表的最后一项为1782B4,其中的值为1799BA。(PS:该跳转表的地址在你们的机器上可能不一样)这里将所有的代码都以二进制的形式拷贝出来,接着以二进制的形式粘贴到跳转表所在区域。这里我们会发现没有覆盖完全。可能该壳做了一些干扰吧,没有关系,到目前为止,我们的思路是正确的。好,那么我们直接定位dump文件所在的OD,就这部分二进制数据粘贴上去。效果同上。(PS:作者处理有点冗余,这里我稍微修改了下,让大家更好理解)接着保存所做的修改到文件,运行修复过的文件看看效果。我们可以看到程序可以正常运行了,至此关于ACProtect V1.09的OEP定位,stolen bytes,IAT,AntiDump的修复我们就介绍完毕了。
本系列文章汉化版转载看雪论坛
感谢原作者:RicardoNarvaja(西班牙人) 原作者个人主页:http://www.ricardonarvaja.info/
感谢热心翻译的朋友:1~3章译者:BGCoder4~58章译者:安于此生
全集配套程序下载地址:
链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv



hackysh 发表于 2022-2-8 17:14


[快捷回复]-感谢楼主热心分享!

别管我了行 发表于 2022-3-2 03:59

zg2600 发表于 2022-7-10 11:06

[吾爱汇编论坛52HB.COM]-每天都能学到新知识,赞!正在寻找,非常感谢楼主!顶帖,不仅谢谢楼主,也能赚HB

zg2600 发表于 2022-7-26 10:38

[吾爱汇编论坛52HB.COM]-Thanks~向楼主致敬!

曾经沧海 发表于 2022-10-31 19:53

学习,收藏, 看下

曾经沧海 发表于 2022-11-20 19:33

楼主辛苦了,谢谢分享!

一生逍遥 发表于 2022-12-5 08:00

Thank you!!!Thank you!

曾经沧海 发表于 2023-4-5 23:22

这个必须点个赞!

一生逍遥 发表于 2023-4-22 17:18

老大推荐必是精品
页: [1]
查看完整版本: 第四十四章-ACProtect V1.09脱壳(修复AntiDump)