【软件名称】: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通过异常,中断后取消断点,向下找:

 

 

找到上面01A69871处,F4直接过来就行了。F7跟进后,向下看看,找到这:

 

 

进入一面01A77834call,向下可以看见:

 

 

01A774FE处,就是shoooo大侠所说的“cmp esi, eax开始了4种类型的比较”,

详细内容请参观:nspack3.5主程序脱壳分析(Aspr SKE 2.X)

而下面这个Call出来之后,eax里就是API的地址,在整个这个段落里,我们没有必要进入到Call里边去,F8过就行了。Call 01A772D0 共有三处(自己找另外二处),对应了esi的不同情况。如果有兴趣,可以看看我的视频,当然了,不是这个程序的!

 

 

在这,我这个esi4个值,要把其中两个改成另外二个,而我跟了其它的程序,大多只有3个值,只改其中的一个就行了。这里写一段代码来处理IAT十分简单,就是看esi是不是那个要改的值,是就改之,在jmp回去就行了。我的代码不好看,就不显示了!处理完后,建议做个COPY,如果后面一个不小心挂了也不用怕,dump前贴回来就好了。

另外,我多说一句,别嫌罗嗦,由于异常次数在变,有可能走过了头,好象在IAT第二次变化后的第二次异常时断下来就OK了,这点是乎是不会变的。

当然了,现在可以改回我们修改了的代码,进行第二步了。

  

2、寻觅oep,并对所有对壳的调用进行处理;

 

我们先看看syscom大侠的贴子:

--------------------------------------------------------------------------------

……….

2)  CTRL+B 搜尋 83,C4,2C,5D,5F,5E,5B,C3 , 00BDA8C5 ,設硬件斷點

00BDA8C5--E8 7ACEFFFF     CALL 00BD7744   <= 設硬件斷點
00BDA8CA--83C2C         ADD  ESP,2C
00BDA8CD--5D              POP  EBP
00BDA8CE--5F              POP  EDI
00BDA8CF--5E              POP  ESI
00BDA8D0--5B              POP  EBX
00BDA8D1--C3              RETN

………..

---------------------------------------------------------------------------------

详细内容参考ASProtect 2.1x SKE + Delphi + Stolen Code

 

正好我这个也是Delphi的东东。我试过好几个程序,都可以这样子找到OEP,但我今天这个会报错!不过不要紧的,至少我们可以知道我们的目标在哪了。我们不需要过程,只要结果,我们要的是走到上面那个Call的位置,方法不管,到达停下就OK

 

0012FF44     01A9CB38    ASCII "IqxPWACAeXA="

0012FF48     01A9CB04    ASCII "A2134F65-48EE"

 

这点是乎也是不会变的:在上面硬碟指纹消矢后的第二次异常就是我们要找的最后一次异常!立马断下!

 

 

 

断下后取消断点,向下就可以找到syscom大侠指明的特征码了:

 

 

F7进入后,一段小走(F7),不一会儿就到了:

 

 

现在找syscom大侠指明的第二个特征码,找到后按syscom大侠那样jmp好了:先分一块内存,然后跳过去!又贴上你的代码,新建EIPrun!,中断后就可以收工了!当然要先看看调用壳的代码了:

 

 

---------------------------------------------------------------------------------------------

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
0054B06F--61                    POPAD                         ;還原寄存器 

---------------------------------------------------------------------------------------------

 

上面是大侠的代码,我进行了一下变通:别忘了了贴回你的IAT COPY,如果不是一次到这的。

 

   MOV DWORD PTR DS:[54AFF0],ESP ;保存 ESP 

 MOV DWORD PTR DS:[54AFE0],EDX   ;解码前保存原地址  

JMP EDX                       ;進入ASPR 解碼 

……………………

NOP                           ;<=取得 API 返回點

pushad

Mov  eaxIAT地址

@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吧!这个东东用了自己的DllIAT的大小填大一点点,就包括进去了,ImportREC可以认出来的:

 

 

 

3dump下所有你需要的区段,组合成一个PE

 

这一步我没有做,你可以自己来。大侠们有讲的,多说无益。

 

4、也可以不进行第3步,dump后直截修复stolen code

 

这一步你可以参考:ASProtect SKE 2.11变形代码浅浅谈

其实修理stolen code 好象没有技巧可言,多多注意aspr的拉积代码,在多用点时间,加一点点耐心,完成修复十分可能!

下面是OEP

 

01C903F1     55               push ebp

01C903F2     E9 E5020000      jmp 01C906DC

01C903F7     C3               retn

 

请注意第一句:01C903F1     55               push ebp

你在codeCtrl+F,授:jmp 01C903F1 找到下面:

 

 

现在,我们已找到原OEP的位置了(00639A28),快快动手吧,填入push ebp

后面的我不想多说了,的确没什么技术可言,自己看着办好了。反正在每处抽code的地方,都有个jmp XXXXX 到壳里的标志,看来Aspr也是友好的了。跟着Aspr一步步走,你会找到所有你想要的code。在这个过程中,找一个相同语言的未加壳程序参考一下,是个十分不错的想法,那样你很快就能找到所有的代码了。

Aspr处理原程序的call 和跳转都是这样:

 

第一步:call 01D40000(你的不大可能是这个)

 

 

第二步:明目张胆地进行现场保护

 

 

第三步:这一步也忽视你的存在,作案后总是要恢复现场的

 

 

每次都会到这,记住这个地址会有点好处的!

在上面01D500BC处,你就可以看见那个地址了,也就是要找的那个jmp XXXXX 到壳里的标志地址。进去后就是原Calljmp等的代码了,当然里面有好多的拉积!修复的进程中你还会找到一个错误的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!我没有进行伪注册,但试用期限一直停下来不动了!

 

我是一只小小莱鸟,各位看官看过勿笑了!