ASPROTECT V2.x版本的手工识别


【任    务】:手工识别aspr v2.x的那三个版本
【操作平台】:Windows 2003 server 
【作    者】: LOVEBOOM[DFCG][FCG][US]
【简要说明】:写在前面的,这篇文章主要写给初学朋友的,没有别的意思。asprotect v2.x已经公布的版本有三个按时间顺序分别为 v2.0 

06.23、v2.0 01.13和最近网上出的v2.1 02.19,
用PEID无法直接区分出来,如果是v2.1 02.19的话,PEID会误报为ASProtect 1.2x - 1.3x.于是动手写下这篇文章,方便以后自己区分:-)

【详细过程】:
我分别按时间的来去分析(注明一点,加密选项选择了保护iat、oep混乱和检测调试的选项,我想没有几个人加密是不选吧):

Asprotect v2.06.23:
   这个版本现在已经很容易脱了,OD设置:忽略除INT3之外的全部异常项,隐藏调试器,载入目标后,F9运行,这样便会中断在int3异常处
0097341F    90              NOP                                      ; 中断在这里
00973420    EB 01           JMP SHORT 00973423
00973422    6966 81 FE47467>IMUL ESP,DWORD PTR DS:[ESI-7F],744647FE
......
009734C4    59              POP ECX
009734C5    C3              RETN                                     ; 直接在这里下断
在009734C5处下断,几次int3异常后,断在009734c5处后,取消断点,然后设置忽略int 3异常,不忽略内存访问异常。
按F9再次运行触发内存访问异常:
00976807    C700 7F0677B9   MOV DWORD PTR DS:[EAX],B977067F          ; 内存访问异常
0097680D    FB              STI
异常发生后,向下看到一个远程条件跳转:
  00976882    833D 10249800 0>CMP DWORD PTR DS:[982410],0
  00976889    74 14           JE SHORT 0097689F
  0097688B    6A 04           PUSH 4
  0097688D    B9 10249800     MOV ECX,982410
  00976892    8D45 F4         LEA EAX,DWORD PTR SS:[EBP-C]
  00976895    BA 04000000     MOV EDX,4
  0097689A    E8 31ADFEFF     CALL 009615D0
  0097689F    B8 02000000     MOV EAX,2
  009768A4    E8 1BC0FDFF     CALL 009528C4
  009768A9    85C0            TEST EAX,EAX
  009768AB    0F85 81010000   JNZ 00976A32                             ; 找到这里
在按回车跟随到00976A32处,然后向下找到第一个RETN处就是跳去Stolen code的开始处:
  00976AEB   /74 0B           JE SHORT 00976AF8
  00976AED   |8B65 F8         MOV ESP,DWORD PTR SS:[EBP-8]
  00976AF0   |FF35 40249800   PUSH DWORD PTR DS:[982440]               ; 这里push 跳去stolen code的地址
  00976AF6   |C3              RETN                                     ; 向下找到这里
  00976AF7  -|E9 FF75F8FF     JMP 008FE0FB
......
  00B30192    55              PUSH EBP                                 ; stolen code开始处
  00B30193    C1D5 29         RCL EBP,29                               ; Shift constant out of range 1..31
在076AF0处F2断点,然后Shift+F9,中断后2次f8就到了stolen code处。Asprotect v2.06.23分析完毕。


ASPROTECT V2.0.01.13:
    这个版本和上一个版本又有所不同,STOLEN CODE更加难以修复了,我自己是没有多少时间和兴趣做这类苦力活。OD设置:忽略除INT3之

外的全部异常项,隐藏调试器,载入目标后,F9运行,这样便会中断在int3异常处
0099B497    90              NOP                                      ; 中断在这里
0099B498    EB 01           JMP SHORT 0099B49B
0099B49A    6966 81 FE47467>IMUL ESP,DWORD PTR DS:[ESI-7F],744647FE
......
0099B515    C7              ???                                      ; Unknown command
0099B516    5B              POP EBX
0099B517    5A              POP EDX
0099B518    59              POP ECX
0099B519    C3              RETN                                     ; 直接在这里下断然后Shift+f9运行到这里
......
取消断点,然后设置忽略int 3异常,不忽略内存访问异常。
按F9再次运行触发内存访问异常,这个版本过了int3后,还有两个内存访问异常:
0099D181    C601 46         MOV BYTE PTR DS:[ECX],46                 ; 异常一
0099D184    67:64:8F06 0000 POP DWORD PTR FS:[0]
0099D18A    83C4 04         ADD ESP,4
......
0099E8F9    C601 9E         MOV BYTE PTR DS:[ECX],9E                 ; 异常二
0099E8FC    BB 71FE8A67     MOV EBX,678AFE71
0099E901    64:8F06         POP DWORD PTR FS:[ESI]
第二次异常后,直接向下找到第一个RETN:
0099EA4C    E8 23D0FFFF     CALL 0099BA74                            ; 直接在这里下断,然后Shift+f9,断下后,取消断点
0099EA51    83C4 2C         ADD ESP,2C
0099EA54    5D              POP EBP
0099EA55    5F              POP EDI
0099EA56    5E              POP ESI
0099EA57    5B              POP EBX
0099EA58    C3              RETN                                     ; 找到这里
在0099EA4C处下断,并运行到那里,中断后,取消断点,F7一次跟进,进去后,按CTRL+F9运行到返回:

0099BA74    8D4451 41       LEA EAX,DWORD PTR DS:[ECX+EDX*2+41]      ; F7进这里,然后CTRL+F9执行到RETN
0099BA78    83E8 41         SUB EAX,41
......
0099BAFB    8D40 46         LEA EAX,DWORD PTR DS:[EAX+46]
0099BAFE    C3              RETN                                     ; 执行到这里

......
00B60250    55              PUSH EBP                               ;Stolen code开始处
00B60251    81E5 E2C34062   AND EBP,6240C3E2
00B60257    F2:             PREFIX REPNE:                            ; Superfluous prefix

执行到返回后,再次F7一次便到了Stolen code的开始处。

ASPROTECT V2.1.02.19:
  这个版本和 v2.0.01.13差不多(指识别方法,不是指加密强度),所以前面的操作我就不再重复,最后两个内存异常代码不同而已:
0099DA0A    0156 00         ADD DWORD PTR DS:[ESI],EDX               ; 第一次异常
0099DA0D    1ACB            SBB CL,BL
......
0099F569    0156 00         ADD DWORD PTR DS:[ESI],EDX               ; 第二次异常
0099F56C    EE              OUT DX,AL                                ; I/O command
0099F56D    B7 D8           MOV BH,0D8
0099F56F    855F E3         TEST DWORD PTR DS:[EDI-1D],EBX
找Stolen code开始处和 01.13是一样的。

好了,现在简单一点的总结:

asprotect v2.06.23-->最后一次内存异常-->然后向下找push [addr];ret
asprotect v2.01.13-->最后一次内存异常-->向下找到最ret最近的一个CALL.
asprotect v2.02.19和asprotect v2.01.13的识别为最后两次异常代码不同.

        END