windycandy 发表于 2006-5-20 20:00:01

ASProtect 2.11 SKE之advanced import protection

【破解作者】 windycandy
【使用工具】 ODdyk,LordPe,Peid 0.94,ImportREC1.6
【破解平台】 Win XP sp1
【软件名称】 ASProtect 2.11 SKE之advanced import protection
【软件简介】 ASProtect SKE2.1x build 03.13在看雪工具下载区下载的对98notepad加壳时,
             用了除了protect original entrypoint外的选项,没有stolen code,有变形码
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】


1.前言

   5月看雪论坛热闹非凡,激情洋溢,先是Asprotect,再到themida一锅端,众位前辈和高手出手,精品穷出不尽,
放之论坛与众人分享,实在是我等菜鸟莫大的福分。惜我等菜鸟功力不深.今看论坛有关Asprotect的文章已经
是一堆堆一箩箩,尤其是Volx大侠的脱壳脚本已经很完美了。本问只要是练习手动脱Advanced Import protection
,仅以此文献给和我一样的菜鸟。高手略过。声明本文是学习看雪老师的经典作《Asprotect SKE 2.2 的Advanced
Import protection保护技术》完成的。

2.过程

首先,到OEP后进入call XXXXXXXX,对照看雪和8100303两位老师的教程,找到以下几个关键点处

00ACA7D6   8B7C82 68               mov edi,dword ptr ds:
00ACA7DA   8B06                  mov eax,dword ptr ds:
00ACA7DC   FFD7                  call edi
00ACA7DE   8845 CA               mov byte ptr ss:,al
00ACA7E1   8B45 F4               mov eax,dword ptr ss:
00ACA7E4   8A40 4A               mov al,byte ptr ds:
00ACA7E7   3A45 EF               cmp al,byte ptr ss:-------得到AL的值,决定是ff15还是ff25
00ACA7EA   0F85 9C000000         jnz 00ACA88C                     这个程序AL=CC(记住AL的值)

后面需要下硬件断点的3个位置

00ACA7F3   8B45 F4               mov eax,dword ptr ss:
00ACA7F6   8B80 E0000000         mov eax,dword ptr ds:
00ACA7FC   0145 FC               add dword ptr ss:,eax
00ACA7FF    /EB 01                   jmp short 00ACA802----------这里是B1

00ACA8A5   8B45 F4               mov eax,dword ptr ss:
00ACA8A8   8B80 E0000000         mov eax,dword ptr ds:
00ACA8AE   0145 FC               add dword ptr ss:,eax
00ACA8B1   8D45 0C               lea eax,dword ptr ss:-----这里是B2

00ACB807   8945 FC               mov dword ptr ss:,eax
00ACB80A   8B45 E0               mov eax,dword ptr ss:
00ACB80D   8B00                  mov eax,dword ptr ds:
00ACB80F   E8 C0E6FFFF             call 00AC9ED4
00ACB814   8BD0                  mov edx,eax
00ACB816   0255 DF               add dl,byte ptr ss:
00ACB819   8B4D FC               mov ecx,dword ptr ss:-------这里是A

找到这3个地方了就可以动手了,OD载入目标程序,停在入口处,设置OD忽略所有异常

00401000 N>68 01D04000             push NOTEPAD.0040D001
00401005   E8 01000000             call NOTEPAD.0040100B
0040100A   C3                      retn
0040100B   C3                      retn
0040100C   7D 30                   jge short NOTEPAD.0040103E
0040100E   DA8A 5DEA5230         fimul dword ptr ds:
00401014   - 78 BE                   js short NOTEPAD.00400FD4
00401016   9C                      pushfd

下bp GetModuleHandleA, shift+F9中断2次后,取消断点,ALT+F9返回

00AE14AC   85C0                  test eax,eax---返回这里                               ; kernel32.77E40000
00AE14AE   75 07                   jnz short 00AE14B7
00AE14B0   53                      push ebx
00AE14B1   FF95 F0314400         call dword ptr ss:
00AE14B7   8985 4D294400         mov dword ptr ss:,eax
00AE14BD   C785 51294400 00000000mov dword ptr ss:,0
00AE14C7   8B95 D8304400         mov edx,dword ptr ss:
00AE14CD   8B06                  mov eax,dword ptr ds:
00AE14CF   85C0                  test eax,eax
00AE14D1   75 03                   jnz short 00AE14D6
00AE14D3   8B46 10               mov eax,dword ptr ds:

单击右键“搜索------所有字符串--------“85”,来到

00ACEBF8   68 E8F4AC00             push 0ACF4E8                                 ; ASCII "85"
00ACEBFD   E8 2A62FEFF             call 00AB4E2C
00ACEC02   A1 1C37AD00             mov eax,dword ptr ds:
00ACEC07   8B00                  mov eax,dword ptr ds:
00ACEC09   E8 0A8CFFFF             call 00AC7818-----------这里F2下断
00ACEC0E   84C0                  test al,al
00ACEC10   75 0A                   jnz short 00ACEC1C
00ACEC12   68 E8F4AC00             push 0ACF4E8                                 ; ASCII "85"

shift+F9,中断在00ACEC09,F7跟进

00AC7818   53                      push ebx
00AC7819   56                      push esi
00AC781A   57                      push edi
00AC781B   55                      push ebp
00AC781C   83C4 F4               add esp,-0C
00AC781F   8BF0                  mov esi,eax
00AC7821   C60424 01               mov byte ptr ss:,1

向下拉动鼠标找到

00AC7959   56                      push esi
00AC795A   E8 59FCFFFF             call 00AC75B8----这个CALL是进行IAT处理,先在00AC7989F2下断,再F4到这里,F7跟进
00AC795F   0FB707                  movzx eax,word ptr ds:
00AC7962   83C0 02               add eax,2
00AC7965   03F8                  add edi,eax
00AC7967   8A1F                  mov bl,byte ptr ds:
00AC7969   47                      inc edi
00AC796A   3A5E 34               cmp bl,byte ptr ds:
00AC796D   ^ 0F85 77FFFFFF         jnz 00AC78EA-------每个DLL的函数是否处理
00AC7973   8BDF                  mov ebx,edi
00AC7975   8B03                  mov eax,dword ptr ds:
00AC7977   85C0                  test eax,eax
00AC7979   ^ 0F85 0AFFFFFF         jnz 00AC7889-------------比较DLL是否处理完
00AC797F   8A0424                  mov al,byte ptr ss:
00AC7982   83C4 0C               add esp,0C
00AC7985   5D                      pop ebp
00AC7986   5F                      pop edi
00AC7987   5E                      pop esi
00AC7988   5B                      pop ebx
00AC7989   C3                      retn--------先在这里F2下断

进入00AC795A的call,来到

00AC75D9   8B45 10               mov eax,dword ptr ss:
00AC75DC   83E8 02               sub eax,2
00AC75DF   0FB600                  movzx eax,byte ptr ds:
00AC75E2   3B43 2C               cmp eax,dword ptr ds:
00AC75E5   76 06                   jbe short 00AC75ED
00AC75E7   8943 2C               mov dword ptr ds:,eax
00AC75EA   EB 01                   jmp short 00AC75ED
00AC75EC   6933 C08A433B         imul esi,dword ptr ds:,3B438AC0
00AC75F2   3BF0                  cmp esi,eax----------这里是比较ESI的3个值
00AC75F4   75 5E                   jnz short 00AC7654---这里下断

每人的机子不一样数值也不一样,我这里是ESI=61,A5,26,其中A5,61时IAT不加密,其中esi的值为61,26时00AC75F4处的
跳转成立,但两个数中只有当esi=26时才会对IAT进行加密,因此只要将26改为61就可以避开IAT加密了.
好,就在00AC75F4进行修改,先用OD 插件memory manage申请一个内存空间,我申请的是01640000

00AC75F4 75F4- E9 078A3500   JMP 01640000      然后下F2断点,F9运行中断后,F7跟进

将PATH代码写进去:

01640000   - 0F84 F37548FF         je 00AC75F9
01640006   83FE 61               cmp esi,61
01640009   - 0F84 457648FF         je 00AC7654
0164000F   BE 61000000             mov esi,61
01640014   - E9 3B7648FF             jmp 00AC7654
01640019   90                      nop

写好代码后,取消00AC75F2及00AC75F4 两处的断点,F9运行中断在00AC7989,中断后取消断点
看看数据窗口,是不是得到所有的IAT了?起始4062E4,终点406e00.

004062E477DA2410ADVAPI32.RegQueryValueExA
004062E877DA17D8ADVAPI32.RegCloseKey
004062EC77DB63B1ADVAPI32.RegSetValueExA
004062F077DA23D9ADVAPI32.RegOpenKeyA
004062F477DA28BBADVAPI32.RegCreateKeyA
004062F800000000
004062FC77C4513DGDI32.GetObjectA
0040630077C44B71GDI32.GetDeviceCaps
0040630477C4889DGDI32.CreateFontIndirectA

00406DECB91D3742
00406DF00055F5A5OLE32.0055F5A5
00406DF4D13637ED
00406DF86422CE52
00406DFC387863B7
00406E0000000000

将1640000处的修改代码及00AC75F4 75F4- E9 078A3500   JMP 01640000的修改
全部取消修改.

CTRL+B搜索33,C0,8A,07,8D,04,40,8B,6C,83,68,8B,C6,找到

00ACB956   33C0                  xor eax,eax---这里
00ACB958   8A07                  mov al,byte ptr ds:
00ACB95A   8D0440                  lea eax,dword ptr ds:
00ACB95D   8B6C83 68               mov ebp,dword ptr ds:
00ACB961   8BC6                  mov eax,esi
00ACB963   FFD5                  call ebp
00ACB965   8BE8                  mov ebp,eax
00ACB967   036B 24               add ebp,dword ptr ds:
00ACB96A   03AB E0000000         add ebp,dword ptr ds:
00ACB970   EB 01                   jmp short 00ACB973
00ACB972   E8 33C08A47             call 483779AA
00ACB977   098D 04408B54         or dword ptr ss:,ecx
00ACB97D   8368 8B C6            sub dword ptr ds:,-3A
00ACB981   FFD2                  call edx-----------直接F4到这里
00ACB983   807B 20 00            cmp byte ptr ds:,0
00ACB987   0F85 3D010000         jnz 00ACBACA

看堆栈:
0012FEF8   00000044--------有68个地址要处理
0012FEFC   495732D5
0012FF00   0653FC49
0012FF04   00000000

先在这句00ACB987jnz 00ACBACA按回车跟随到这里

00ACBACA   8B43 2C               mov eax,dword ptr ds:
00ACBACD   2BC5                  sub eax,ebp
00ACBACF   83E8 05               sub eax,5
00ACBAD2   45                      inc ebp
00ACBAD3   8945 00               mov dword ptr ss:,eax
00ACBAD6   6A 0A                   push 0A
00ACBAD8   E8 7F9AFEFF             call 00AB555C
00ACBADD   8BC8                  mov ecx,eax
00ACBADF   038B E4000000         add ecx,dword ptr ds:
00ACBAE5   8BD6                  mov edx,esi
00ACBAE7   8BC3                  mov eax,ebx
00ACBAE9   E8 8EE5FFFF             call 00ACA07C
00ACBAEE   FF0C24                  dec dword ptr ss:
00ACBAF1   03B3 E4000000         add esi,dword ptr ds:
00ACBAF7   833C24 00               cmp dword ptr ss:,0
00ACBAFB   ^ 0F87 55FEFFFF         ja 00ACB956
00ACBB01   53                      push ebx
00ACBB02   E8 5D000000             call 00ACBB64
00ACBB07   0183 EC000000         add dword ptr ds:,eax
00ACBB0D   B0 01                   mov al,1
00ACBB0F   83C4 24               add esp,24
00ACBB12   5D                      pop ebp
00ACBB13   5F                      pop edi
00ACBB14   5E                      pop esi
00ACBB15   5B                      pop ebx
00ACBB16   C3                      retn-----------找到这里,F2下断

在00ACBB16下断后,返回00ACB981
将00ACB981 call edx修改为:

00ACB981   - E9 7A46B700             jmp 01640000
00ACB986   90                      nop

写入path代码:

01640000   FFD2                  call edx
01640002   60                      pushad
01640003   8B1D 30006401         mov ebx,dword ptr ds:
01640009   C1E0 1F               shl eax,1F
0164000C   03C5                  add eax,ebp
0164000E   8903                  mov dword ptr ds:,eax
01640010   83C3 04               add ebx,4
01640013   891D 30006401         mov dword ptr ds:,ebx
01640019   61                      popad
0164001A   807B 20 00            cmp byte ptr ds:,0
0164001E   - E9 A7BA48FF             jmp 00ACBACA
01640023   0000                  add byte ptr ds:,al
01640025   0000                  add byte ptr ds:,al
01640027   0000                  add byte ptr ds:,al
01640029   0000                  add byte ptr ds:,al
0164002B   0000                  add byte ptr ds:,al
0164002D   0000                  add byte ptr ds:,al
0164002F   0040 00               add byte ptr ds:,al
01640032   64:0100               add dword ptr fs:,eax

二进制代码:

FF D2 60 8B 1D 30 00 64 01 C1 E0 1F 03 C5 89 03 83 C3 04 89 1D 30 00 64 01 61 80 7B 20 00 E9 A7
BA 48 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 64 01 00

写好代码后,F9运行,中断00ACBB16,取消断点,返回00ACB981撤消修改,数据框得到68个地址的数据

D3 10 40 00 31 11 40 00 4C 11 40 00 56 13 40 00 05 15 40 00 1D 15 40 00 79 1E 40 00 E5 1E 40 00
C9 21 40 00 DA 22 40 00 83 23 40 00 BC 23 40 00 3A 24 40 00 59 24 40 00 69 24 40 00 7E 24 40 00
B6 24 40 00 04 25 40 00 1B 25 40 00 B9 26 40 00 09 29 40 00 83 29 40 00 9D 30 40 00 8C 31 40 00
C8 31 40 00 1B 32 40 00 34 32 40 00 FC 32 40 00 19 33 40 00 26 33 40 00 53 33 40 00 80 33 40 00
CE 33 40 00 E0 33 40 00 69 34 40 00 85 34 40 00 F5 34 40 00 05 35 40 00 70 35 40 00 7C 35 40 00
A0 35 40 00 07 37 40 00 DD 37 40 00 C3 39 40 00 69 3D 40 00 7A 3D 40 00 0A 41 40 00 63 46 40 00
CB 46 40 00 6F 49 40 00 F8 49 40 00 BF 4A 40 00 95 4B 40 00 AC 4B 40 00 78 4C 40 00 AB 4C 40 00
08 4D 40 00 10 4E 40 00 5B 4E 40 00 75 4E 40 00 EE 4E 40 00 47 4F 40 00 60 4F 40 00 B0 4F 40 00
B6 4F 40 00 C2 4F 40 00 C8 4F 40 00 CE 4F 40 00

将这些数据复制出来(后面用到),然后将01640000到01640150间的数据全部撤消修改

然后F8从retn返回到

00ACB8B6   84C0                  test al,al
00ACB8B8   75 0A                   jnz short 00ACB8C4
00ACB8BA   68 E4B8AC00             push 0ACB8E4                                 ; ASCII "108"
00ACB8BF   E8 6895FEFF             call 00AB4E2C
00ACB8C4   5B                      pop ebx
00ACB8C5   5D                      pop ebp
00ACB8C6   C2 0400               retn 4

不断交替使用CTRL+F9和F8(重复几次),来到

77F79BA4   64:8B25 00000000      mov esp,dword ptr fs:
77F79BAB   64:8F05 00000000      pop dword ptr fs:
77F79BB2   8BE5                  mov esp,ebp
77F79BB4   5D                      pop ebp
77F79BB5   C2 1400               retn 14
77F79BB8   8B4C24 04               mov ecx,dword ptr ss:

到这里后改用ALT+F9,几次后来到

00AD095A   C700 EFCA5C85         mov dword ptr ds:,855CCAEF
00AD0960   67:64:8F06 0000         pop dword ptr fs:
00AD0966   83C4 04               add esp,4
00AD0969   83E8 AF               sub eax,-51
00AD096C   83C8 4B               or eax,4B
00AD096F   58                      pop eax
00AD0970   8BC3                  mov eax,ebx
00AD0972   E8 49A8FEFF             call 00ABB1C0
00AD0977   8B15 FC37AD00         mov edx,dword ptr ds:
00AD097D   0302                  add eax,dword ptr ds:
00AD097F   83C0 08               add eax,8
00AD0982   BA 00100000             mov edx,1000
00AD0987   E8 DCCEFFFF             call 00ACD868
00AD098C   E8 CBEEFFFF             call 00ACF85C
00AD0991   A3 20B6AD00             mov dword ptr ds:,eax

到这里了就可以ALT+M, code段下断,shift+F9到OEP了

004010CC   55                      push ebp
004010CD   8BEC                  mov ebp,esp
004010CF   83EC 44               sub esp,44
004010D2   56                      push esi
004010D3   E8 28EF8F00             call 00D00000
004010D8   93                      xchg eax,ebx
004010D9   7D 0A                   jge short NOTEPAD.004010E5
004010DB   8A00                  mov al,byte ptr ds:
004010DD   3C 22                   cmp al,22
004010DF   75 1B                   jnz short NOTEPAD.004010FC
004010E1   56                      push esi

ALT+G 1640000,到1640000处写入path代码(用看雪老师的,已经包括A情况)

01640000   A1 C0006401             mov eax,dword ptr ds:
01640005   8B18                  mov ebx,dword ptr ds:
01640007   81E3 FFFFFF7F         and ebx,7FFFFFFF
0164000D   FFE3                  jmp ebx
0164000F   0000                  add byte ptr ds:,al
01640011   0000                  add byte ptr ds:,al
01640013   0000                  add byte ptr ds:,al
01640015   0000                  add byte ptr ds:,al
01640017   0000                  add byte ptr ds:,al
01640019   0000                  add byte ptr ds:,al
0164001B   0000                  add byte ptr ds:,al
0164001D   0000                  add byte ptr ds:,al
0164001F   0000                  add byte ptr ds:,al
01640021   BF C0006401             mov edi,16400C0
01640026   8B07                  mov eax,dword ptr ds:
01640028   8B18                  mov ebx,dword ptr ds:
0164002A   81FB FFFFFF7F         cmp ebx,7FFFFFFF
01640030   79 49                   jns short 0164007B
01640032   837D D4 FF            cmp dword ptr ss:,-1
01640036   74 0F                   je short 01640047
01640038   8B47 04               mov eax,dword ptr ds:
0164003B   8B1F                  mov ebx,dword ptr ds:
0164003D   8B1B                  mov ebx,dword ptr ds:
0164003F   8918                  mov dword ptr ds:,ebx
01640041   83C0 04               add eax,4
01640044   8947 04               mov dword ptr ds:,eax
01640047   8B5D FC               mov ebx,dword ptr ss:
0164004A   E8 46000000             call 01640095
0164004F   B0 CC                   mov al,0CC------------------前面找到AL的值CC
01640051   66:B9 FF15            mov cx,15FF
01640055   3A45 EF               cmp al,byte ptr ss:
01640058   74 05                   je short 0164005F
0164005A   66:81C1 0010            add cx,1000
0164005F   8B07                  mov eax,dword ptr ds:
01640061   8B18                  mov ebx,dword ptr ds:
01640063   81E3 FFFFFF7F         and ebx,7FFFFFFF
01640069   83C0 04               add eax,4
0164006C   8907                  mov dword ptr ds:,eax
0164006E   66:890B               mov word ptr ds:,cx
01640071   83C3 02               add ebx,2
01640074   8933                  mov dword ptr ds:,esi
01640076   ^ EB 88                   jmp short 01640000
01640078   90                      nop
01640079   90                      nop
0164007A   90                      nop
0164007B   8B5D B4               mov ebx,dword ptr ss:
0164007E   E8 12000000             call 01640095
01640083   B0 CC                   mov al,0CC
01640085   66:B9 FF15            mov cx,15FF
01640089   3AC2                  cmp al,dl
0164008B   ^ 74 D2                   je short 0164005F
0164008D   ^ EB CB                   jmp short 0164005A
0164008F   0000                  add byte ptr ds:,al
01640091   0000                  add byte ptr ds:,al
01640093   0000                  add byte ptr ds:,al
01640095   BE E4624000             mov esi,4062E4----------------IAT的起始
0164009A   391E                  cmp dword ptr ds:,ebx
0164009C   74 0D                   je short 016400AB
0164009E   83C6 04               add esi,4
016400A1   81FE 006E4000         cmp esi,406E00----------------IAT的结束
016400A7   77 03                   ja short 016400AC
016400A9   ^ EB EF                   jmp short 0164009A
016400AB   C3                      retn
016400AC   - EB FE                   jmp short 016400AC

写好上面的代码后,将前面复制出来的68个地址复制过来(从16400D0开始)

016400D0D3 10 40 00 31 11 40 00 4C 11 40 00 56 13 40 [email protected]@.L@.V@.
016400E005 15 40 00 1D 15 40 00 79 1E 40 00 E5 1E 40 00@.@.y&@.?@.
016400F0C9 21 40 00 DA 22 40 00 83 23 40 00 BC 23 40 00?@.?@.?@.?@.
016401003A 24 40 00 59 24 40 00 69 24 40 00 7E 24 40 00:[email protected][email protected]$@.~$@.
01640110B6 24 40 00 04 25 40 00 1B 25 40 00 B9 26 40 00?@.%@.%@.?@.
0164012009 29 40 00 83 29 40 00 9D 30 40 00 8C 31 40 00.)@.?@.?@.?@.
01640130C8 31 40 00 1B 32 40 00 34 32 40 00 FC 32 40 00?@.mail protected]@.?@.
0164014019 33 40 00 26 33 40 00 53 33 40 00 80 33 40 003@.&[email protected]@.

无幻刹那 发表于 2006-5-20 21:00:41

看过你的教程,,无stolen code的aspr,基本能搞顶,,希望楼主 能分析下stolen code,最好能做个动画 出来,
页: [1]
查看完整版本: ASProtect 2.11 SKE之advanced import protection