【软件名称】:Resource Builder 软件版本:2.3.3.3
【破 解 人】:林海雪原
【调试环境】:Win2K、OllyICE、LordPE、ImportREC
【作者声明】:初学Crack,只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
好久前就想脱ASPR了,听前人说了关于它的可怕,也就只好从它的最低版开始练习(这样子还真行呢!),终于脱了它!不敢独享,就写了这个丑文。开工时不知如何写,大大们都写过了,而且都是妙文,我又是学他们的,只好用图来占些地方。
我脱Aspr的步骤如下:
1、找到IAT处理所在,并设法避开其加密;
2、寻觅oep,并对所有对壳的调用进行处理;
3、dump下所有你需要的区段,组合成一个PE;
4、也可以不进行第3步,dump后直截修复stolen code;
我是莱鸟,没什么创新,全是学别人的东东,没有学象的地方各位可不要笑掉大牙了!高手就不要看了!......
1、找到IAT处理所在,并设法避开其加密:
详细方法请参考:脱壳基础知识入门(2006年版)--------
第九课 手动确定IAT的地址与大小
让目标程序在OD中放开了跑,一下子主窗口就出来了,到CODE中去,仍找一个API调用,就可以了。
好了,我们找到了IAT的区段:00652000。现在设置OD如下,重新载入目标程序:
我们选不分析后中断在下面位置:(当然也就是壳的入口了)
现在把OD改为如下设置:
按F9,让程序运行,立即中断在aspr的第一个异常处(注意:异常次数同一程序每次载入也可能不一样,我这个会在32~~36次之间变化的,我不敢说你的娈与不变):
此时,我们把OD的数据窗口转到IAT所在区段(我这里是00652000);并把它稍稍拉大一些,以有利于我们观察。如下:
这时的IAT是加密后的,我们这时按shift+f9,注意看数据窗口的变化,同时别忘了数一下你按了几次。第13次发生了变化,但看不出什么来,直到第17次异常,
我们中断在下面:
这时的IAT是下面的样子:
IAT已然解开,API地址还没有被写入,继续按shift+f9。到第20次后API地址解密完成:
由于错过了IAT的处理,我们重来。于第19次异常时断下(注意:异常次数同一程序每次载入也可能不一样,只能是一个参考,可以多试几下,有了经验就好了):
按上面设好中断,按shift+f9通过异常,中断后取消断点,向下找:
找到上面
进入一面
在
详细内容请参观:nspack3.5主程序脱壳分析(Aspr SKE 2.X)
而下面这个Call出来之后,eax里就是API的地址,在整个这个段落里,我们没有必要进入到Call里边去,F8过就行了。Call
在这,我这个esi有4个值,要把其中两个改成另外二个,而我跟了其它的程序,大多只有3个值,只改其中的一个就行了。这里写一段代码来处理IAT十分简单,就是看esi是不是那个要改的值,是就改之,在jmp回去就行了。我的代码不好看,就不显示了!处理完后,建议做个COPY,如果后面一个不小心挂了也不用怕,dump前贴回来就好了。
另外,我多说一句,别嫌罗嗦,由于异常次数在变,有可能走过了头,好象在IAT第二次变化后的第二次异常时断下来就OK了,这点是乎是不会变的。
当然了,现在可以改回我们修改了的代码,进行第二步了。
2、寻觅oep,并对所有对壳的调用进行处理;
我们先看看syscom大侠的贴子:
--------------------------------------------------------------------------------
……….
2) 按 CTRL+B 搜尋 83,C4,
00BDA
00BDA8CA-
00BDA8CD--5D POP EBP
00BDA8CE-
00BDA8CF--5E POP ESI
00BDA8D0--5B POP EBX
00BDA8D1--C3 RETN
………..
---------------------------------------------------------------------------------
详细内容参考:ASProtect 2.1x SKE + Delphi + Stolen Code
正好我这个也是Delphi的东东。我试过好几个程序,都可以这样子找到OEP,但我今天这个会报错!不过不要紧的,至少我们可以知道我们的目标在哪了。我们不需要过程,只要结果,我们要的是走到上面那个Call的位置,方法不管,到达停下就OK!
0012FF44
0012FF48
这点是乎也是不会变的:在上面硬碟指纹消矢后的第二次异常就是我们要找的最后一次异常!立马断下!
断下后取消断点,向下就可以找到syscom大侠指明的特征码了:
F7进入后,一段小走(F7),不一会儿就到了:
现在找syscom大侠指明的第二个特征码,找到后按syscom大侠那样jmp好了:先分一块内存,然后跳过去!又贴上你的代码,新建EIP,run!,中断后就可以收工了!当然要先看看调用壳的代码了:
---------------------------------------------------------------------------------------------
0054B060--90 NOP ;<=取得 API 返回點
0054B061--8BDA MOV EBX,EDX
0054B063--891D F8AF5400 MOV DWORD PTR DS:[54AFF8],EBX ;保存 API
0054B069--8B25 F0AF5400 MOV ESP,DWORD PTR DS:[54AFF0] ;取回 ESP
0054B
---------------------------------------------------------------------------------------------
上面是大侠的代码,我进行了一下变通:别忘了了贴回你的IAT 的COPY,如果不是一次到这的。
MOV DWORD PTR DS:[54AFF0],ESP ;保存 ESP 值
MOV DWORD PTR DS:[54AFE0],EDX ;解码前保存原地址
JMP EDX ;進入ASPR 解碼
……………………
NOP ;<=取得 API 返回點
pushad
Mov eax,IAT地址
@2:
Cmp [eax],ebx 在IAT中找API,
Jnz @1 找到后把
call XXXXXX 改为 jmp api地址
Mov
ecx, DWORD PTR DS:[54AFE0]
;取调用壳的地址
Mov
[ecx],25FF
找到后把
call XXXXXX 改为
jmp api地址
Mov
[ecx+2],edx
Popad
MOV EBX,EDX
MOV DWORD PTR DS:[54AFF8],EBX ;保存 API
MOV ESP,DWORD PTR DS:[54AFF0] ;取回 ESP
POPAD ;還原寄存器
………..
@1:
Add eax,4
Jmp @2
代码简单,自己看着写好了。大至就是解密出API后,到我们的IAT中找下这个API的位置,然后写入原程序就好了。看看修改后的情况:
现在可以收工了,dump吧!这个东东用了自己的Dll,IAT的大小填大一点点,就包括进去了,ImportREC可以认出来的:
3、dump下所有你需要的区段,组合成一个PE;
这一步我没有做,你可以自己来。大侠们有讲的,多说无益。
4、也可以不进行第3步,dump后直截修复stolen code;
这一步你可以参考:ASProtect SKE 2.11变形代码浅浅谈
其实修理stolen code 好象没有技巧可言,多多注意aspr的拉积代码,在多用点时间,加一点点耐心,完成修复十分可能!
下面是OEP:
请注意第一句:
你在code段Ctrl+F,授:jmp
现在,我们已找到原OEP的位置了(
后面的我不想多说了,的确没什么技术可言,自己看着办好了。反正在每处抽code的地方,都有个jmp XXXXX 到壳里的标志,看来Aspr也是友好的了。跟着Aspr一步步走,你会找到所有你想要的code。在这个过程中,找一个相同语言的未加壳程序参考一下,是个十分不错的想法,那样你很快就能找到所有的代码了。
Aspr处理原程序的call 和跳转都是这样:
第一步:call 01D40000(你的不大可能是这个)
第二步:明目张胆地进行现场保护
第三步:这一步也忽视你的存在,作案后总是要恢复现场的
每次都会到这,记住这个地址会有点好处的!
在上面01D500BC处,你就可以看见那个地址了,也就是要找的那个jmp XXXXX 到壳里的标志地址。进去后就是原Call或jmp等的代码了,当然里面有好多的拉积!修复的进程中你还会找到一个错误的API,跟下原程序,知道是GetProcAddress,用LordPE就可以更正它。
整过修复工作应是顺利的,只是有个跳转表面目全非(就是原OEP上面那个---对delphi而言,其它的没有修复过,不知道)
这个表Aspr用它自己的方法去实现,共有12CH次循环调用(不同程序这个值不同),但它终归要调用原程序,于是就在它Call的时机让它到我们的代码中来(这个地方你修复时一定能找到的,我没有记下位置),Aspr对这段代码十分敏感,下断或修改都有可能被测出来,让我很是苦。最后才明白:它先算出要Call的偏移量放在ESI中,在加上基址00400000,就去Call esi。它的唯一可以功击的地方只有那个基址,它在堆栈中,地址同一次调试是不变的。现在我们按下面方法,让它交出jmp表!
⑴、分配二块内存,一块要足够大,看雪老大的HideOD这时有点力不从心,用其它的插件,大小是原文件code段的大小,我这是00240000;
⑵、用nop填充你分到的大内存 ,在最后一句写上jmp XXXX,这个XXXX应是你的另一块内存地址;那块小内存写上你保存所有esi值的代码(注意:ESI-03000000+00400000才是你要的值!这个不用我多说吧?),保存好后别忘了Call 一下esi,然后retn;
⑶、现在找到基址00400000在堆栈中的位置,把它改成你的大内存的首址,我这是03000000;现在可以运行了!看见内存中一串红色的数据,心里真的很高兴!
还是那句话,代码很简单,自己写!修复后的jmp表很好看:
当然了,我还是要提一下,这个表要进行二次修复,一次是启动时,另一次退出时;第一次是从低地址向高地址每间隔4个字填充;第二次反过来,从高地址向低地址每间隔4个字节填充(也就是每次要+8或-8)。
修好运行下,OK!我没有进行伪注册,但试用期限一直停下来不动了!
我是一只小小莱鸟,各位看官看过勿笑了!