飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4004|回复: 2

[转贴] ASProtect SKE 2.11变形代码浅浅谈

[复制链接]

该用户从未签到

发表于 2008-5-24 17:23:06 | 显示全部楼层 |阅读模式
标 题: ASProtect SKE 2.11变形代码浅浅谈
作 者: kanxue
时 间: 2006-01-28,09:22
链 接: http://bbs.pediy.com/showthread.php?t=20841

这段时间学习了一下ASProtect SKE 2.11 的壳,感谢shoooo给与技巧指点,让我少走了不少弯路。shoooo一文nspack3.5主程序脱壳分析(Aspr SKE 2.X) 给人启发不少,看懂这篇文章,再展开一下,ASProtect SKE的壳基本能拿下。
ASProtect脱壳其实也可以不修复Stolen Code,直接将壳的这段代码借用过来。但如果要完美脱壳的话,就必须了解点ASProtect中的一些变形技巧了,将代码一句句还原(是个体力活)。

ASProtect SKE难点就在代码变形,用了一段代码来模拟如下指令(可能是作者自己写的变形引擎):
cmp x,y
jxx n

call xxxxx
jmp  xxxxx

jxx  n  

等等…

例如:
下面这段变形代码的作用是模拟cmp指令。
cmp x,y
jxx n

00A8896A    8BCE            mov     ecx, esi                     
00A8896C    8B55 0C         mov     edx, [ebp+C]
00A8896F    8B45 F8         mov     eax, [ebp-8]
00A88972    E8 D5FDFFFF     call    00A8874C                        
{
      00A8877E    8B5483 40       mov     edx, [ebx+eax*4+40]
      00A88782    8BC7            mov     eax, edi
      00A88784    FFD2            call    edx           ;此CALL返回决定是何寄存器 (x)0=eax,1=ecx,2=edx,3=ebx,4=esp,5=ebp,6=esi,7=edi
      ……
      00A887BA    8B5483 40       mov     edx, [ebx+eax*4+40]
      00A887BE    8BC7            mov     eax, edi
      00A887C0    FFD2            call    edx           ; (y)0=eax,1=ecx,2=edx,3=ebx,4=esp,5=ebp,6=esi,7=edi
      ……
}

00A88977    8945 10         mov     [ebp+10], eax
00A8897A    EB 01           jmp     short 00A8897D
00A8897C  - E9 33C08A43     jmp     443349B4
00A88981    04 8B           add     al, 8B
00A88983    55              push    ebp
00A88984    F8              clc
00A88985    8B5482 40       mov     edx, [edx+eax*4+40]
00A88989    8BC6            mov     eax, esi
00A8898B    FFD2            call    edx                              ; 此CALL返回值决定跳转类型3=jnb,2=jb,……
00A8898D    8BD8            mov     ebx, eax
00A8898F    8B4D 10         mov     ecx, [ebp+10]
00A88992    8BD3            mov     edx, ebx
00A88994    8B45 F8         mov     eax, [ebp-8]
00A88997    E8 74FBFFFF     call    00A88510                         ; 里面比较(cmp x,y)
00A8899C    84C0            test    al, al                           
00A8899E    74 17           je      short 00A889B7



ASProtect SKE最新版也在这方面加强了,这部分我还没搞明白,别问我。;(


对于一般的指令ASProtect也变形,这部分识别起来简单多了,自己用ASProtect SKE压一个软件,对比跟踪一下,很快能找到规律。下面列出的是ASProtect常用的一些简单变形指令。原理是利用lea来指令来计算加,减,乘法,或利用堆栈来传递一些数据。

1.
原代码:
add     esi, 8
变形后的代码:
lea     esi, [esi+8] //esi=esi+8

2
原代码:
add     edi, 4
变形后的代码:
lea     edi, [edi+ecx+4] //edi=edi+ecx+4
sub     edi, ecx         //edi=edi-ecx=edi+ecx+4-ecx=edi+4

3.
原代码:
mov     ecx, eax
变形后的代码:
  lea     ecx, [eax+C]  //ecx=eax+c
  lea     ecx, [ecx-C]  //ecx=ecx-c=eax+c-c=eax

4.
原代码:mov     esi, eax
变形后的代码:
  or      esi, BD20817E
  push    eax //有效指令
  rol     esi, 9D
  xor     esi, [esp+8]
  pop     esi//有效指令

5.
mov     esi, eax
变形后的代码:
  sub     esi, ecx
  lea     esi, [eax+2B]
  lea     esi, [esi+ebp-2B]
  sub     esi, ebp


6.
mov     edi, eax
变形后的代码:
  lea     edi, [edx+edi*2+50]
  adc     edi, F299E634
  lea     edi, [eax+56]     //edi =eax+56
  lea     edi, [edi+ecx-56] //edi=eax+56+ecx-56=eax+ecx
  sub     edi, ecx          //edi=edi-ecx=eax+ecx-ecx=eax

7
mov     edi, eax
变形后的代码:
  lea     edi, [ebx+ecx+48612E]
  sub     edi, ecx
  xor     edi, 1ABFD486
  lea     edi, [eax+ecx+39] //edi=eax+ecx+39
  sub     edi, ecx          //edi=edi-ecx=eax+ecx+39-ecx=eax+39
  lea     edi, [edi-39]     //edi=edi-39=eax+39-39=eax


8.
mov     edi, eax
变形后的代码:
  lea     edi, [ebx+ecx+48612E]
  sub     edi, ecx
  xor     edi, 1ABFD486
  lea     edi, [eax+ecx+39]
  sub     edi, ecx
  lea     edi, [edi-39]


9.
原代码:
  mov     eax, 800
变形后的代码:
  push    ABCAA2A8
  pushfw
  push    ebx
  xor     ebx, C567C100
  and     ebx, edi
  lea     ebx, [esp+69]
  sub     ebx, 69
  prefix repne:
  jmp L010
  prefix rep:
L010:
  add     ebx, 6
  mov     dword ptr [ebx], 800 //有效指令
  pop     ebx
  popfw
  add     eax, A38396E6
  pop     eax                 //有效指令

10
原代码:
mov     ecx, edi
变形后的代码:
  mov     ecx, 42338A
  mov     ecx, 42A4FA
  xor     ecx, [esp+8]
  mov     ecx, 4780E2
  rcr     ecx, 0ED
  lea     ecx, [edi+eax+5C]  //ecx=edi+eax+5C
  sub     ecx, eax           //ecx=ecx-eax=edi+eax+5C-eax=edi+5C
  lea     ecx, [ecx-5C]      //ecx=ecx-5c=edi+5C-5C=edi
  sar     eax, 5
  and     ecx, 1F

11
原代码:
mov     edi, 405904
变形后的代码:
  and     edi, ebx
  mov     edi, 43FB92
  ror     edi, 0C5
  lea     edi, [ebp+esi*2+53]
  lea     edi, [eax+ecx+405904] //edi=eax+ecx+405904
  sub     edi, ecx              //edi=edi-ecx=eax+ecx+405904-ecx=eax+405904
  sub     edi, eax              //edi=edi-eax=eax+405904-eax=405904

12.
原代码:
mov   ebp, esp
变形后的代码:
lea     ebp, [esp+ecx+5C]  //ebp=esp+ecx+5c
sub     ebp, ecx           //ebp=ebp-ecx=esp+ecx+5c-ecx=esp+5c
lea     ebp, [ebp+ebx-5C]  //ebp=ebp+ebx-5C=esp+5c+ebx-5C=esp+ebx
sub     ebp, ebx           //ebp=ebp-ebx=esp+ebx-ebx=esp


13
mov     eax, [405A10]
变形后的代码:
  lea     eax, [ecx+405A10]
  sub     eax, ecx
  push    dword ptr [eax]
  xor     eax, [esp+28]
  xor     eax, [esp+8]
  pop     eax

14.  
原代码:mov     ecx, [eax]
变形后的代码:
  xor     ecx, ebx
  push    dword ptr [eax]  //[eax]入栈
  rcr     ecx, 0C9
  mov     ecx, 43378A
  pop     ecx              //栈入数据放到ecx


15.
原代码:  
  mov     eax, [405900]
变形后的代码:
  lea     eax, [ebp+esi+424388]  
  sub     eax, esi               
  lea     eax, [ecx+405900]      //eax=ecx+405900
  sub     eax, ecx               //eax=eax-ecx=ecx+405900-ecx=405900
  mov     eax, [eax]            


16.
原代码:
  mov     esi, [eax]

变形后的代码:
  or      esi, edi
  push    dword ptr [eax]
  sub     esi, -45
  rol     esi, 97
  pop     esi

17
mov     eax, [405900]
变形后的代码:
  lea     eax, [edi+42CA6C]
  xor     eax, 710E8EFA
  mov     eax, 427EBE
  add     eax, [esp+18]
  lea     eax, [ebp+esi+405900]  
  sub     eax, esi
  sub     eax, ebp
  mov     eax, [eax]


18.

mov     eax, [405664]
变形后的代码:

  lea     eax, [ecx+edx-7F]
  lea     eax, [edi+405664] //eax=edi+405664
  sub     eax, edi          //eax=eax-edi=edi+405664-edi=405664
  prefix repne:
  jmp L006
  ???
L006:
  push    dword ptr [eax]   //[405664]入栈
  add     eax, [esp+18]
  mov     eax, 4487CE
  pop     eax              //[405664]出栈



19.
原代码:
mov     ebp, esp
变形后的代码:
add     ebp, ebx
mov     ebp, 45A51E
mov     ebp, [esp+10]               
mov     ebp, 4A54FE
mov     ebp, 463636
lea     ebp, [esp+esi+E]  //ebp=esp+esi+E
push    eax
push    edx
push    ecx
mov     edx, 45F39E
mov     edx, 447AD6
mov     edx, 7DF8A705     //edx=7DF8A705
mov     ecx, 4A86CA   
mov     ecx, 488942  
mov     ecx, edx          //ecx=edx=7DF8A705
sub     ecx, B783FC03     //ecx=ecx-B783FC03=7DF8A705-B783FC03=C674AB02
neg     ecx               //ecx=398B54FE
push    ecx               //398B54FE入栈
xor     edx, [esp+8]
rcl     edx, 0EB
pop     edx               //398B54FE出栈入edx中
add     edx, 63BE880B     //edx=edx+63BE880B=398B54FE+63BE880B=9D49DD09
xor     eax, [esp+28]
rcl     eax, 49
push    edx               //值9D49DD09入栈
sub     eax, ebx
pop     eax               //值9D49DD09出栈进eax
xor     eax, 62B622F9     //9D49DD09 XOR 62B622F9=FFFFFFF0
neg     eax               //eax=10
lea     edx, [ebp+esi+6C] //edx=ebp+esi+6C
push    eax               //10入栈
push    edi
mov     eax, 93D3D3A9
xchg    eax, edi
xor     edi, 4B566F99
neg     edi
sub     edi, 6A63E261
neg     edi
xchg    edi, eax
sub     eax, 42E99E29
dec     eax
lea     edx, [edx+eax*2+6A]
lea     edx, [edx+ecx-6A]  
sub     edx, ecx        
sub     edx, eax        
pop     edi
pop     eax
sub     edx, esi   
push    eax
sbb     edx, -17
ror     edx, 7B
pop     edx                 //10出栈放edx,edx=10
lea     ebp, [ebp+edx+6F]   //ebp=esp+esi+E+10+6F
lea     ebp, [ebp+ecx-6F]   //ebp=esp+esi+E+edx+6F+ecx-6F=esp+esi+E+10+ecx
sub     ebp, ecx            //ebp=ebp-ecx=esp+esi+E+edx+ecx-ecx=esp+esi+E+10
lea     ecx, [ecx+edx*2+72]
lea     ecx, [ecx+ebx-72]
sub     ecx, ebx
pop     ecx
xor     edx, EF5EAB78
pop     edx
add     eax, [esp+38]
sbb     eax, 2B
pop     eax
sub     ebp, esi            //ebp=ebp-esi=esp+esi+E+edx-esi=esp+E+10=esp+1E
lea     ebp, [ebp-1E]       //ebp=ebp-1E=esp+1E-1E=esp


20.
原代码:push    004040D0
变形后的代码:
  push    -6
  pushfw
  push    ebp
  sub     ebp, 61388612
  mov     ebp, esp
  lea     ebp, [ebp+ebx+6]
  sub     ebp, ebx
  push    4040D0
  pop     dword ptr [ebp]
  pop     ebp
  popfw


21.
原代码:  push    00401ED4
变形后的代码:

  push    dword ptr [esp+14]
  pushfw
  push    ecx
  xor     ecx, ebp
  mov     ecx, esp         //ecx=esp
  lea     ecx, [ecx+edi+6] //ecx=ecx+edi+6=esp+edi+6
  sub     ecx, edi         //ecx=ecx-edi=esp+edi+6-edi=esp+6
  push    edi
  sub     edi, -59
  sub     edi, -3D
  lea     edi, [eax+401ED4] //edi=eax+401ED4
  sub     edi, eax          //edi=edi-eax=401ED4
  mov     [ecx], edi
  pop     edi
  pop     ecx              //相当于mov [esp+6],401ED4
  popfw


22.
原代码:push 100
变形后的代码:

  push    dword ptr fs:[0]
  pushfw
  push    ecx
  xor     ecx, 428F6676
  mov     ecx, esp         
  lea     ecx, [ecx+edi+6]  
  sub     ecx, edi         
  push    edi
  sub     edi, -57
  mov     edi, 46894A
  adc     edi, 1AA636D6
  lea     edi, [eax+ecx+100] //edi=eax+ecx+100
  sub     edi, ecx           //edi=edi-ecx=eax+ecx+100-ecx=eax+100
  sub     edi, eax           //edi=edi-eax=eax+100-eax=100
  push    edi
  pop     dword ptr [ecx]
  pop     edi
  pop     ecx
  popfw

[ 本帖最后由 杨家将 于 2008-5-24 17:25 编辑 ]
PYG19周年生日快乐!

该用户从未签到

发表于 2008-9-25 13:58:24 | 显示全部楼层
现在好多东西,都在想着法了变形,多谢指导了。
PYG19周年生日快乐!
  • TA的每日心情
    郁闷
    2020-6-16 23:02
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-3-3 09:30:00 | 显示全部楼层
    版 主 能不能讲解一下以delphi为例 ASProtect 的SDK使用呢
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表