手脱ASProtect v1.23 RC1(无Stolen Code)

手脱ASProtect v1.23 RC1(无Stolen Code)

1.载入PEID

ASProtect v1.23 RC1

2.载入OD,不勾选内存访问异常,其他异常全部勾选

00401000 >  68 01C04200     push 跑跑排行.0042C001                       ; //入口处
00401005    E8 01000000     call 跑跑排行.0040100B
0040100A    C3              retn
0040100B    C3              retn
0040100C    D6              salc
0040100D    54              push esp
0040100E    4A              dec edx
0040100F    60              pushad
00401010    55              push ebp
 

3.使用最后一次异常法,来到最后一次异常处应该是第16次,第17次就跑飞了

009E2CD1    3100            xor dword ptr ds:[eax],eax               ; //落脚点
009E2CD3    64:8F05 0000000>pop dword ptr fs:[0]
009E2CDA    58              pop eax
009E2CDB    833D 7C6D9E00 0>cmp dword ptr ds:[9E6D7C],0
009E2CE2    74 14           je short 009E2CF8
009E2CE4    6A 0C           push 0C
009E2CE6    B9 7C6D9E00     mov ecx,9E6D7C
009E2CEB    8D45 F8         lea eax,dword ptr ss:[ebp-8]
009E2CEE    BA 04000000     mov edx,4
009E2CF3    E8 54E1FFFF     call 009E0E4C
 

4.往下拉找到最近的一个retn处F2,shift+F9,F2,让程序运行到指定位置

009E2D08    FF75 F0         push dword ptr ss:[ebp-10]
009E2D0B    FF75 EC         push dword ptr ss:[ebp-14]
009E2D0E    C3              retn                                     ; //F2,shift+F9,F2
009E2D0F    5F              pop edi
009E2D10    5E              pop esi
009E2D11    5B              pop ebx
 

5.程序到这里有两种方式可以到达OEP:

  • 第一种:

打开内存窗口,在00401000处下段然后shift+F9就可以到达OEP

0040A41E    55              push ebp                                 ; //来到OEP
0040A41F    8BEC            mov ebp,esp
0040A421    6A FF           push -1
0040A423    68 C8CB4000     push 跑跑排行.0040CBC8
0040A428    68 A4A54000     push 跑跑排行.0040A5A4                      
0040A42D    64:A1 00000000  mov eax,dword ptr fs:[0]
0040A433    50              push eax
0040A434    64:8925 0000000>mov dword ptr fs:[0],esp
0040A43B    83EC 68         sub esp,68
 
  • 第二种:

找到堆栈窗口第四行(跑跑排行榜.0040000下面两行)的值,也就是”0012FFA4”,然后命令行下硬件断点”hr 0012FFA4”,然后shift+F9运行一次

堆栈窗口:

0012FF5C   009F2BF4  //第一行
0012FF60   00400000  跑跑排行.00400000
0012FF64   3D375BA5
0012FF68   0012FFA4  //第四行
0012FF6C   009D0000
0012FF70   009B0000
 

这里是一个大跳转,也就是指向OEP的关键跳,F8单步一次

009F3457  - FFE0            jmp eax                                  ; //落脚点
009F3459    66:8BC4         mov ax,sp
009F345C    BD F2E44268     mov ebp,6842E4F2
009F3461    F7D5            not ebp
009F3463    81C5 8039C332   add ebp,32C33980
009F3469    80D2 51         adc dl,51
009F346C    BF A1CAF122     mov edi,22F1CAA1
009F3471    C1CF B3         ror edi,0B3

0040A41E    55              push ebp                                 ; //来到OEP
0040A41F    8BEC            mov ebp,esp
0040A421    6A FF           push -1
0040A423    68 C8CB4000     push 跑跑排行.0040CBC8
0040A428    68 A4A54000     push 跑跑排行.0040A5A4                      
0040A42D    64:A1 00000000  mov eax,dword ptr fs:[0]
0040A433    50              push eax
0040A434    64:8925 0000000>mov dword ptr fs:[0],esp
0040A43B    83EC 68         sub esp,68

6.然后依然是LoadPE+ImportREC脱壳,注意使用ImportREC修复的时候等级1+插件修复

7.运行查壳

运行OK,查壳:Microsoft Visual C++ v6.0