【脱文标题】 移花接木之ASProtect 1.23 SDK之 Aspack2.12 2002版主程序脱壳破解
 
【脱文作者】 weiyi75[Dfcg][D.4S]
 
【作者邮箱】 weiyi75@sohu.com
 
【作者主页】 Dfcg官方大本营+龙族联盟论坛
 
【使用工具】 Ollydbg1.10b,Imprec1.42,LoadPe,PeEditor
 
【破解平台】 Win2000/XP
 
【软件名称】 Aspack2.12 2002版主程序
 
【下载地址】 www.aspack.com 
 
【软件简介】 ASPack is an advanced Win32 executable file compressor, capable of reducing the file size of 32-bit Windows programs by as much as 70%. (ASPack's compression ratio improves upon the industry-standard zip file format by as much as 10-20%.) ASPack makes Windows 95/98/NT programs and libraries smaller, and decrease load times across networks, and download times from the internet; it also protects programs against reverse engineering by non-professional hackers. Programs compressed with ASPack are self-contained and run exactly as before, with no runtime performance penalties. 
 
【软件大小】 189k
 
【加壳方式】 ASProtect 1.22 - 1.23 Beta 21 -> Alexey Solodovnikov
 
【保护方式】 RSAKEY保护+30天日期限制。
 
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
 
--------------------------------------------------------------------------------
 
【破解内容】

几年前与Jeffzhang相识,蒙他和Jwh51指点,学了不少东西。两人都忙于事业,都已潜水。武汉牛人Jeffzhang实力真是令人佩服,以他为偶像。

当年送我一个Aspack2.12主程序脱壳破解,这个是没有Rsakey的,他可以脱壳成完整版本,牛。那时我的技术还不能理解,只写了一篇ASProtect 1.23 SDK之 Aspack2.12r 主程序脱壳去暗桩这个是有Rsakey的,今天又看了一下,我也可以嫁接出一个完整版本出来。

想起看学的一段话,Asprotect SDK开发程序时可以在一段关键代码设置开始结束标记,没有RsaKey这段会直接跳过也就是Demo版本,想完整版本除非买Key或攻破其1024算法。

Aspack2.11版我学习破解时就开始用了,确实帮我节约了不少硬盘空间。有些程序压缩虽然可以用但会有问题,如VB6.0主程序压缩后有时提示I/O错误,某些软件以为你在破解来个温馨提示。当时Aspack2.11网上是有注册机的,被Aspack作者升级为Aspack2.12r就是看学论坛提供的版本,关于是2001版,UG2002已经有Rsakey,但名字是SAC/2002!确实搞破解的不喜欢自己用的东西用别人的名字,Aspack作者已将其加入小黑,2002版此Key已经无效。

运气不错,2001和2002版代码变化不大,区别当然有,自己调试体会。用Asprotect保护的程序实在不少,Rsakey每次升级Key也升级,如果可以找到规律多好,可以破解同步升级,我想temerata[DFCG]应该体会最深,应用更广。

这篇其实是ASProtect 1.23 SDK之 Aspack2.12r 主程序脱壳去暗桩的姊妹篇,读者可以参考一下。

首先看完ASProtect 1.23 SDK之 Aspack2.12r 主程序脱壳去暗桩后,发现Aspack主程序修复有三部分。

中间是解码部分,难度较高,而且需要Key,其它两处只是简单验证壳是否存在。

我先导入了SAC/2002!的Key,OD载入Aspack2.12 2002版。

OD异常设置不忽略内存异常,其余全部忽略。

00401000 A>  68 01804600                push ASPack.00468001 //外壳入口。
00401005     E8 01000000                call ASPack.0040100B
0040100A     C3                         retn
0040100B     C3                         retn
0040100C     3B92 7724E04E              cmp edx,dword ptr ds:[edx+4EE02477]
00401012     04 84                      add al,84
00401014     3D 62110889                cmp eax,89081162
00401019     1905 9080A438              sbb dword ptr ds:[38A48090],eax
0040101F     45                         inc ebp
00401020     E1 09                      loopde short ASPack.0040102B
00401022     2301                       and eax,dword ptr ds:[ecx]
00401024     2872 48                    sub byte ptr ds:[edx+48],dh
00401027     7A 42                      jpe short ASPack.0040106B
.........................................................................

F9运行。

1.寻找注册名位置

00990739     3100                       xor dword ptr ds:[eax],eax //内存异常。
0099073B     EB 01                      jmp short 0099073E
0099073D     68 648F0500                push 58F64
00990742     0000                       add byte ptr ds:[eax],al
00990744     00EB                       add bl,ch
00990746     02E8                       add ch,al
00990748     0158 68                    add dword ptr ds:[eax+68],ebx
0099074B     F8                         clc
0099074C   ^ E2 98                      loopd short 009906E6
0099074E     0068 74                    add byte ptr ds:[eax+74],ch
00990751     0899 0068A4FD              or byte ptr ds:[ecx+FDA46800],bl
00990757     98                         cwde
00990758     0068 54                    add byte ptr ds:[eax+54],ch
0099075B     FA                         cli
0099075C     98                         cwde
0099075D     0068 2C                    add byte ptr ds:[eax+2C],ch
00990760     F4                         hlt
00990761     98                         cwde
00990762     0068 BC                    add byte ptr ds:[eax-44],ch
00990765     EE                         out dx,al
.........................................................................

继续Shift+F9来到这里

00990F07     3100                       xor dword ptr ds:[eax],eax  //看堆栈中好像正校验Rsakey真伪
00990F09     EB 01                      jmp short 00990F0C
00990F0B     68 648F0500                push 58F64
00990F10     0000                       add byte ptr ds:[eax],al
00990F12     00EB                       add bl,ch
00990F14     02E8                       add ch,al
00990F16     0158 8D                    add dword ptr ds:[eax-73],ebx
00990F19     05 6C369900                add eax,99366C
00990F1E     50                         push eax
00990F1F     E8 04F6FFFF                call 00990528
00990F24     E8 3A000000                call 00990F63
00990F29     68 320F9900                push 990F32
00990F2E     FF0424                     inc dword ptr ss:[esp]
00990F31     C3                         retn
00990F32     BC 8B44240C                mov esp,0C24448B
00990F37     EB 01                      jmp short 00990F3A
00990F39     8683 80B80000              xchg byte ptr ds:[ebx+B880],al
00990F3F     0002                       add byte ptr ds:[edx],al
00990F41     EB 1A                      jmp short 00990F5D
00990F43     BC EB17E8EB                mov esp,EBE817EB
00990F48     14 E8                      adc al,0E8
00990F4A     EB 11                      jmp short 00990F5D
00990F4C     E8 EB0EE8EB                call EC811E3C
00990F51     0BE8                       or ebp,eax
00990F53     EB 08                      jmp short 00990F5D
00990F55     CD20 EB04E8EB              vxdcall EBE804EB
00990F5B     01E8                       add eax,ebp
00990F5D     31C0                       xor eax,eax
00990F5F     C3                         retn

堆栈友好提示

0012D71C    0012D724  指针到下一个 SEH 记录
0012D720    00990EBE  SE 句柄
0012D724    0012FFE0  指针到下一个 SEH 记录
0012D728    009912CF  SE 句柄
0012D72C    0012FF90
0012D730    00980000
0012D734    00960000
0012D738    009906D4
0012D73C    009A040C  ASCII "0vKiRNl66uKx8sot6BFZOoQUZGrqmy5ObFIeSG8OZ0JJh0vizDoYi8KDpenBkQOczSPgwYqx9Xca>
0012D740    009A04C8  ASCII "0vKiRNl66uKx8sot6BFZOoQUZGrqmy5ObFIeSG8OZ0JJh0vizDoYi8KDpenBkQOczSPgwYqx9Xca>

继续Shift+F9一次特殊异常,可能是Key错误造成的。

继续Shift+F9来到

0099108E     3100                       xor dword ptr ds:[eax],eax
00991090     EB 01                      jmp short 00991093
00991092     68 648F0500                push 58F64
00991097     0000                       add byte ptr ds:[eax],al
00991099     00EB                       add bl,ch
0099109B     02E8                       add ch,al
0099109D     0158 83                    add dword ptr ds:[eax-7D],ebx
009910A0     FB                         sti
009910A1     0175 64                    add dword ptr ss:[ebp+64],esi
009910A4     837D F8 00                 cmp dword ptr ss:[ebp-8],0
009910A8     74 5E                      je short 00991108
009910AA     33C0                       xor eax,eax
009910AC     55                         push ebp
009910AD     68 F9109900                push 9910F9
009910B2     64:FF30                    push dword ptr fs:[eax]
009910B5     64:8920                    mov dword ptr fs:[eax],esp
009910B8     8B45 F8                    mov eax,dword ptr ss:[ebp-8]
009910BB     E8 70F7FFFF                call 00990830
009910C0     DD5D B4                    fstp qword ptr ss:[ebp-4C]
009910C3     9B                         wait
009910C4     8B45 FC                    mov eax,dword ptr ss:[ebp-4]
........................................................................

对准401000 Code下F2断点,Shift+F9来到这里。

0044277F     90                         nop
00442780     55                         push ebp
00442781     8BEC                       mov ebp,esp
00442783     8B45 08                    mov eax,dword ptr ss:[ebp+8]
00442786     A3 BC564400                mov dword ptr ds:[4456BC],eax  //这个就是Aspack2.12存放注册用户名的地方,我现在的Key是小黑,这里当然没有内容,先记住,找这个要多调试Asprotect程序找规律。
0044278B     5D                         pop ebp
0044278C     C2 0400                    retn 4
0044278F     90                         nop
00442790     55                         push ebp       //当前位置
00442791     8BEC                       mov ebp,esp 
00442793     8B45 08                    mov eax,dword ptr ss:[ebp+8]
00442796     A3 FC484400                mov dword ptr ds:[4448FC],eax  //剩余日期
0044279B     8B45 0C                    mov eax,dword ptr ss:[ebp+C]
0044279E     A3 00494400                mov dword ptr ds:[444900],eax //总共日期
004427A3     5D                         pop ebp
004427A4     C2 0800                    retn 8
........................................................................

继续Shift+F9两次来到最后一次异常

009900E1     3100                       xor dword ptr ds:[eax],eax
009900E3     64:8F05 00000000           pop dword ptr fs:[0]
009900EA     58                         pop eax
009900EB     833D DC399900 00           cmp dword ptr ds:[9939DC],0
009900F2     74 14                      je short 00990108
009900F4     6A 0C                      push 0C
009900F6     B9 DC399900                mov ecx,9939DC
009900FB     8D45 F8                    lea eax,dword ptr ss:[ebp-8]
009900FE     BA 04000000                mov edx,4
00990103     E8 94C3FFFF                call 0098C49C
00990108     FF75 FC                    push dword ptr ss:[ebp-4]
0099010B     FF75 F8                    push dword ptr ss:[ebp-8]
0099010E     8B45 F4                    mov eax,dword ptr ss:[ebp-C]
00990111     8338 00                    cmp dword ptr ds:[eax],0
00990114     74 02                      je short 00990118
00990116     FF30                       push dword ptr ds:[eax]
00990118     FF75 F0                    push dword ptr ss:[ebp-10]
0099011B     FF65 EC                    jmp dword ptr ss:[ebp-14]
0099011E     5F                         pop edi
0099011F     5E                         pop esi
00990120     5B                         pop ebx
00990121     8BE5                       mov esp,ebp
00990123     5D                         pop ebp
00990124     C3                         retn
........................................................................

0044289C     55                         push ebp  //早期的Asprotect善良,可以在入口脱壳,先写注册名。

命令行

dd 4456BC 内容为00983431,有些Asprotect校验这里验证壳是否存在。

寻找空地址

445FDC 写入 Mr.David

然后修改

4456BC 内容为 445FDC 

0044289D     8BEC                       mov ebp,esp
0044289F     83C4 F4                    add esp,-0C
004428A2     E8 4D0BFCFF                call ASPack.004033F4
004428A7     E8 0C21FCFF                call ASPack.004049B8
004428AC     E8 6354FCFF                call ASPack.00407D14
004428B1     E8 D6C6FCFF                call ASPack.0040EF8C
004428B6     E8 BDC7FCFF                call ASPack.0040F078
004428BB     E8 08E7FCFF                call ASPack.00410FC8
004428C0     E8 974DFDFF                call ASPack.0041765C
004428C5     E8 B61AFEFF                call ASPack.00424380
004428CA     E8 F986FEFF                call ASPack.0042AFC8
004428CF     E8 E899FEFF                call ASPack.0042C2BC
004428D4     E8 639AFEFF                call ASPack.0042C33C
004428D9     E8 CEA5FEFF                call ASPack.0042CEAC
004428DE     E8 95ABFEFF                call ASPack.0042D478
004428E3     E8 30BAFEFF                call ASPack.0042E318
004428E8     E8 6FBAFEFF                call ASPack.0042E35C
004428ED     E8 FABAFEFF                call ASPack.0042E3EC
004428F2     E8 69E1FEFF                call ASPack.00430A60
004428F7     E8 A4AFFFFF                call ASPack.0043D8A0
004428FC     A1 30564400                mov eax,dword ptr ds:[445630]
00442901     E8 D210FEFF                call ASPack.004239D8
00442906     BA 38294400                mov edx,ASPack.00442938                      ; ASCII "ASPack"
...................................................................................................

然后Loadpe脱壳,运行ImportREC,选择这个进程。把OEP改为4289C,点IT AutoSearch,点“Get Import”,用“追踪层次1”修复,然后用Asprotect1.22插件修复剩下8个指针,FixDump,脱壳就完成了。

2.SDK修复。

OD载入脱壳程序,F9运行出错。

堆栈友好提示

0012FFB0    0044291B  返回到 dumped_.<ModuleEntryPoint>+7F 来自 0098C9A0 //访问壳,右键反汇编中跟随。
0012FFB4    0012FFE0  指针到下一个 SEH 记录
0012FFB8    00403330  SE 句柄
0012FFBC    0012FFC0
0012FFC0    0012FFF0
0012FFC4    77E614C7  返回到 kernel32.77E614C7

00442915   |.  FF15 0C494400            call dword ptr ds:[44490C]     //这里有问题,去原程序看看。
0044291B   |.  A1 30564400              mov eax,dword ptr ds:[445630] //来到这里
00442920   |.  E8 5311FEFF              call dumped_.00423A78
00442925   |.  E8 D21BFCFF              call dumped_.004044FC
0044292A   |.  8BE5                     mov esp,ebp
0044292C   |.  5D                       pop ebp
0044292D   \.  C3                       retn

主程序跟踪路线

00442915     FF15 0C494400              call dword ptr ds:[44490C]        //都是F7避免跑飞

0098C9A0     833D A8359900 00           cmp dword ptr ds:[9935A8],0
0098C9A7     74 06                      je short 0098C9AF
0098C9A9     FF15 A8359900              call dword ptr ds:[9935A8]  ; ASPack.004427A8 //验证壳是否存在,就是处于pre-dip中

004427A8     B9 B8564400                mov ecx,ASPack.004456B8
004427AD     BA 08E54300                mov edx,ASPack.0043E508
004427B2     A1 30564400                mov eax,dword ptr ds:[445630]
004427B7     E8 2C12FEFF                call ASPack.004239E8
004427BC     C3                         retn

那么先修复

00442915   |.  FF15 0C494400            call dword ptr ds:[44490C]     //这里有问题,去原程序看看。

原地址

0098C9A0

修改为

004427A8

复制到程序,重启OD。

F9出错,这次是主功能了,精神些,代码也多了些。

0012FE00    0043F1BE  返回到 dumped_.0043F1BE 来自 0098C8F4  //右键反汇编中跟随。
0012FE04    0012FE58  指针到下一个 SEH 记录
0012FE08    0043F4D0  SE 句柄
0012FE0C    0012FE50
0012FE10    0012CD78
0012FE14    0043E508  dumped_.0043E508
0012FE18    009620C4
0012FE1C    00000000
0012FE20    0096BF88  ASCII "D:\Down\Aspack V2.12\dumped_.exe"

0043F1B8    .  FF15 04494400            call dword ptr ds:[444904]
0043F1BE    .  E9 83000000              jmp dumped_.0043F246 //返回这里,右键删除分析
0043F1C3       26                       db 26                                        ;  CHAR '&'
0043F1C4       F4                       db F4
0043F1C5       CC                       int3
0043F1C6       46                       db 46                                        ;  CHAR 'F'
0043F1C7       F2                       db F2
0043F1C8       B8                       db B8
0043F1C9       A1                       db A1
0043F1CA       34                       db 34                                        ;  CHAR '4'
0043F1CB       0E                       db 0E
0043F1CC       BD                       db BD
0043F1CD       59                       db 59                                        ;  CHAR 'Y'
0043F1CE       6B                       db 6B                                        ;  CHAR 'k'
0043F1CF       0F                       db 0F
0043F1D0       05                       db 05

0043F1B8     FF15 04494400              call dword ptr ds:[444904] //跟踪原程序,这里只是一个简单的ret返回,如果这样修复只是Demo版,当然不能让我们满足。
0043F1BE     E9 83000000                jmp dumped_.0043F246  //这里根本没有解码。
0043F1C3     26:F4                      hlt
0043F1C5     CC                         int3
0043F1C6     46                         inc esi
0043F1C7     F2:                        prefix repne:
0043F1C8     B8 A1340EBD                mov eax,BD0E34A1
0043F1CD     59                         pop ecx
0043F1CE     6B0F 05                    imul ecx,dword ptr ds:[edi],5
0043F1D1     F8                         clc
0043F1D2     58                         pop eax
0043F1D3     DBD8                       fcmovnu st,st
0043F1D5     4C                         dec esp
0043F1D6   ^ EB B0                      jmp short dumped_.0043F188
0043F1D8     BC 2B2DDCE3                mov esp,E3DC2D2B
0043F1DD     28FE                       sub dh,bh
0043F1DF     332B                       xor ebp,dword ptr ds:[ebx]
........................................................................

这段代码是什么?

应该类似2.12r版这里的代码。

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

0043F5E8    > \8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F5EB    .  8B80 E0010000            mov eax,dword ptr ds:[eax+1E0]
0043F5F1    .  8B40 44                  mov eax,dword ptr ds:[eax+44]
0043F5F4    .  33D2                     xor edx,edx
0043F5F6    .  E8 2993FDFF              call David.00418924
0043F5FB    .  8D55 D4                  lea edx,dword ptr ss:[ebp-2C]
0043F5FE    .  A1 BC564400              mov eax,dword ptr ds:[4456BC]
0043F603    .  E8 586DFCFF              call David.00406360
0043F608    .  8B55 D4                  mov edx,dword ptr ss:[ebp-2C]
0043F60B    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F60E    .  8B80 E0010000            mov eax,dword ptr ds:[eax+1E0]
0043F614    .  E8 073BFDFF              call David.00413120
0043F619    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F61C    .  8B80 6C020000            mov eax,dword ptr ds:[eax+26C]
0043F622    .  E8 E53EFDFF              call David.0041350C
0043F627    .  B2 01                    mov dl,1
0043F629    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F62C    .  8B80 7C020000            mov eax,dword ptr ds:[eax+27C]
0043F632    .  E8 513AFDFF              call David.00413088
0043F637    .  B2 01                    mov dl,1
0043F639    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F63C    .  8B80 78020000            mov eax,dword ptr ds:[eax+278]
0043F642    .  E8 413AFDFF              call David.00413088
0043F647    .  B2 01                    mov dl,1
0043F649    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F64C    .  8B80 EC020000            mov eax,dword ptr ds:[eax+2EC]
0043F652    .  E8 313AFDFF              call David.00413088
0043F657    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F65A    .  8B80 E4020000            mov eax,dword ptr ds:[eax+2E4]
0043F660    .  C640 20 01               mov byte ptr ds:[eax+20],1

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


这里其它语句好猜,主要是Call难,当时没想通,今天想起fly常用的Ctrl+S查找Call的命令序列

还好Call不多。

现在去Aspack2.12r找。

call 00418924    === Call 0041894C

push ebx
cmp edx,dword ptr ds:[eax+10]    

call 00406360   ==== Call 00406414        ^轻松愉快^

push ebx
push esi 
mov esi,edx
mov ebx,eax
mov eax,esi
mov edx,ebx

call 00413120    ==== 0041316C   //这个有些难,类似代码较多,仔细些。查命令序列限制8条,有些代码只能辅助搜索,这个自己要体会,如Call XXXX。

push ebp
mov ebp,esp
push 0
push ebx
push esi
push edi                      //我这里取了2.12r版的一些特征码,OD脚本好手们对特征码应该非常亲切。
mov esi,edx
mov ebx,eax
xor eax,eax
push ebp
push David.00413176
push dword ptr fs:[eax]
mov dword ptr fs:[eax],esp
lea edx,dword ptr ss:[ebp-4]
mov eax,ebx
call 004130F0
mov eax,dword ptr ss:[ebp-4]
mov edx,esi
call D0040378C

首先找到这里

0040A8E0   /.  55                       push ebp  
0040A8E1   |.  8BEC                     mov ebp,esp
0040A8E3   |.  6A 00                    push 0
0040A8E5   |.  53                       push ebx
0040A8E6   |.  56                       push esi
0040A8E7   |.  57                       push edi
0040A8E8   |.  8BF2                     mov esi,edx
0040A8EA   |.  8BD8                     mov ebx,eax
0040A8EC   |.  33C0                     xor eax,eax
0040A8EE   |.  55                       push ebp
0040A8EF   |.  68 35A94000              push dumped_.0040A935
0040A8F4   |.  64:FF30                  push dword ptr fs:[eax]
0040A8F7   |.  64:8920                  mov dword ptr fs:[eax],esp
0040A8FA   |.  8BC3                     mov eax,ebx       //这里不同于特征码,排除。
0040A8FC   |.  8B10                     mov edx,dword ptr ds:[eax]
0040A8FE   |.  FF52 44                  call dword ptr ds:[edx+44]
0040A901   |.  8BD0                     mov edx,eax
0040A903   |.  8D45 FC                  lea eax,dword ptr ss:[ebp-4]
0040A906   |.  E8 558DFFFF              call dumped_.00403660


0040A9F4   /.  55                       push ebp
0040A9F5   |.  8BEC                     mov ebp,esp
0040A9F7   |.  6A 00                    push 0
0040A9F9   |.  53                       push ebx
0040A9FA   |.  56                       push esi
0040A9FB   |.  57                       push edi           //继续Ctrl+L排除。
0040A9FC   |.  8BF2                     mov esi,edx
0040A9FE   |.  8BD8                     mov ebx,eax
0040AA00   |.  33C0                     xor eax,eax
0040AA02   |.  55                       push ebp
0040AA03   |.  68 38AA4000              push dumped_.0040AA38
0040AA08   |.  64:FF30                  push dword ptr fs:[eax]
0040AA0B   |.  64:8920                  mov dword ptr fs:[eax],esp
0040AA0E   |.  8D45 FC                  lea eax,dword ptr ss:[ebp-4]
0040AA11   |.  8BD6                     mov edx,esi
0040AA13   |.  E8 488CFFFF              call dumped_.00403660
0040AA18   |.  8B55 FC                  mov edx,dword ptr ss:[ebp-4]
0040AA1B   |.  8BC3                     mov eax,ebx
0040AA1D   |.  8B08                     mov ecx,dword ptr ds:[eax]    //Mov语句太多。
0040AA1F   |.  FF51 24                  call dword ptr ds:[ecx+24]

继续Ctrl+L 3次来到这里

0041316C   /$  55                       push ebp         //真命天子
0041316D   |.  8BEC                     mov ebp,esp
0041316F   |.  6A 00                    push 0
00413171   |.  53                       push ebx
00413172   |.  56                       push esi
00413173   |.  57                       push edi
00413174   |.  8BF2                     mov esi,edx
00413176   |.  8BD8                     mov ebx,eax
00413178   |.  33C0                     xor eax,eax
0041317A   |.  55                       push ebp
0041317B   |.  68 C2314100              push dumped_.004131C2
00413180   |.  64:FF30                  push dword ptr fs:[eax]
00413183   |.  64:8920                  mov dword ptr fs:[eax],esp
00413186   |.  8D55 FC                  lea edx,dword ptr ss:[ebp-4]
00413189   |.  8BC3                     mov eax,ebx
0041318B   |.  E8 ACFFFFFF              call dumped_.0041313C
00413190   |.  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
00413193   |.  8BD6                     mov edx,esi
00413195   |.  E8 1E06FFFF              call dumped_.004037B8
0041319A   |.  74 10                    je short dumped_.004131AC
0041319C   |.  8BC6                     mov eax,esi
0041319E   |.  E8 C906FFFF              call dumped_.0040386C
004131A3   |.  8BD0                     mov edx,eax
004131A5   |.  8BC3                     mov eax,ebx
004131A7   |.  E8 6CFFFFFF              call dumped_.00413118
004131AC   |>  33C0                     xor eax,eax
004131AE   |.  5A                       pop edx
004131AF   |.  59                       pop ecx
004131B0   |.  59                       pop ecx
004131B1   |.  64:8910                  mov dword ptr fs:[eax],edx
004131B4   |.  68 C9314100              push dumped_.004131C9
004131B9   |>  8D45 FC                  lea eax,dword ptr ss:[ebp-4]
004131BC   |.  E8 7303FFFF              call dumped_.00403534
004131C1   \.  C3                       retn

00413120   /$  55                       push ebp       //Aspack2.12r版特征码,是否很像。
00413121   |.  8BEC                     mov ebp,esp
00413123   |.  6A 00                    push 0
00413125   |.  53                       push ebx
00413126   |.  56                       push esi
00413127   |.  57                       push edi
00413128   |.  8BF2                     mov esi,edx
0041312A   |.  8BD8                     mov ebx,eax
0041312C   |.  33C0                     xor eax,eax
0041312E   |.  55                       push ebp
0041312F   |.  68 76314100              push David.00413176
00413134   |.  64:FF30                  push dword ptr fs:[eax]
00413137   |.  64:8920                  mov dword ptr fs:[eax],esp
0041313A   |.  8D55 FC                  lea edx,dword ptr ss:[ebp-4]
0041313D   |.  8BC3                     mov eax,ebx
0041313F   |.  E8 ACFFFFFF              call David.004130F0
00413144   |.  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
00413147   |.  8BD6                     mov edx,esi
00413149   |.  E8 3E06FFFF              call David.0040378C
0041314E   |.  74 10                    je short David.00413160
00413150   |.  8BC6                     mov eax,esi
00413152   |.  E8 E906FFFF              call David.00403840
00413157   |.  8BD0                     mov edx,eax
00413159   |.  8BC3                     mov eax,ebx
0041315B   |.  E8 6CFFFFFF              call David.004130CC
00413160   |>  33C0                     xor eax,eax
00413162   |.  5A                       pop edx
00413163   |.  59                       pop ecx
00413164   |.  59                       pop ecx
00413165   |.  64:8910                  mov dword ptr fs:[eax],edx
00413168   |.  68 7D314100              push David.0041317D
0041316D   |>  8D45 FC                  lea eax,dword ptr ss:[ebp-4]
00413170   |.  E8 9303FFFF              call David.00403508
00413175   \.  C3                       retn

call 0041350C   ===  Call 00413554 这个要找跳板,也不难。

xor edx,edx
call 0041304C  //特征语句少,不好找,需要判断2002版本Aspack这里Call是多少。
retn

我们先去

2001版本这里看看。

call 0041304C 

0041304C   /$  53                       push ebx
0041304D   |.  56                       push esi
0041304E   |.  51                       push ecx
0041304F   |.  881424                   mov byte ptr ss:[esp],dl
00413052   |.  8BF0                     mov esi,eax
00413054   |.  8A46 37                  mov al,byte ptr ds:[esi+37]
00413057   |.  3A0424                   cmp al,byte ptr ss:[esp]
0041305A   |.  74 28                    je short David.00413084
0041305C   |.  8BC6                     mov eax,esi
0041305E   |.  66:BB E8FF               mov bx,0FFE8
00413062   |.  E8 1DFCFEFF              call David.00402C84

很容易找一段

push ebx
push esi
push ecx
mov byte ptr ss:[esp],dl
mov esi,eax
mov al,byte ptr ds:[esi+37]
cmp al,byte ptr ss:[esp]

去2002版找到过渡Call

00413098   /$  53                       push ebx   //这里
00413099   |.  56                       push esi
0041309A   |.  51                       push ecx
0041309B   |.  881424                   mov byte ptr ss:[esp],dl
0041309E   |.  8BF0                     mov esi,eax
004130A0   |.  8A46 37                  mov al,byte ptr ds:[esi+37]
004130A3   |.  3A0424                   cmp al,byte ptr ss:[esp]

所以算出,也是简单的算法。

xor edx,edx
call 00413098
retn

然后找到

00413554   /$  33D2                     xor edx,edx
00413556   |.  E8 3DFBFFFF              call dumped_.00413098
0041355B   \.  C3                       retn

call 00413088  ====4130D9-5=4030D4

mov byte ptr ds:[eax+38],dl
push 0                                   
xor ecx,ecx                       
mov edx,0B00C                     

然后去 Aspack2.12版寻找相应Call,整理为

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

0043F1BF    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F1C2    .  8B80 E0010000            mov eax,dword ptr ds:[eax+1E0]
0043F1C8    .  8B40 44                  mov eax,dword ptr ds:[eax+44]
0043F1CB    .  33D2                     xor edx,edx
0043F1CD    .  E8 7A97FDFF              call David.0041894C
0043F1D2    .  8D55 D4                  lea edx,dword ptr ss:[ebp-2C]
0043F1D5    .  A1 BC564400              mov eax,dword ptr ds:[4456BC]
0043F1DA    .  E8 3572FCFF              call David.00406414
0043F1DF    .  8B55 D4                  mov edx,dword ptr ss:[ebp-2C]
0043F1E2    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F1E5    .  8B80 E0010000            mov eax,dword ptr ds:[eax+1E0]
0043F1EB    .  E8 7C3FFDFF              call David.0041316C
0043F1F0    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F1F3    .  8B80 6C020000            mov eax,dword ptr ds:[eax+26C]
0043F1F9    .  E8 5643FDFF              call David.00413554
0043F1FE    .  B2 01                    mov dl,1
0043F200    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F203    .  8B80 7C020000            mov eax,dword ptr ds:[eax+27C]
0043F209    .  E8 C63EFDFF              call David.004130D4
0043F20E    .  B2 01                    mov dl,1
0043F210    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F213    .  8B80 78020000            mov eax,dword ptr ds:[eax+278]
0043F219    .  E8 B63EFDFF              call David.004130D4
0043F21E    .  B2 01                    mov dl,1
0043F220    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F223    .  8B80 EC020000            mov eax,dword ptr ds:[eax+2EC]
0043F229    .  E8 A63EFDFF              call David.004130D4
0043F22E    .  8B45 FC                  mov eax,dword ptr ss:[ebp-4]
0043F231    .  8B80 E4020000            mov eax,dword ptr ds:[eax+2E4]
0043F237    .  C640 20 01               mov byte ptr ds:[eax+20],1

二进制代码

8B 45 FC 8B 80 E0 01 00 00 8B 40 44 33 D2 E8 7A 97 FD FF 8D 55 D4 A1 BC 56 44 00 E8 35 72 FC FF
8B 55 D4 8B 45 FC 8B 80 E0 01 00 00 E8 7C 3F FD FF 8B 45 FC 8B 80 6C 02 00 00 E8 56 43 FD FF B2
01 8B 45 FC 8B 80 7C 02 00 00 E8 C6 3E FD FF B2 01 8B 45 FC 8B 80 78 02 00 00 E8 B6 3E FD FF B2
01 8B 45 FC 8B 80 EC 02 00 00 E8 A6 3E FD FF 8B 45 FC 8B 80 E4 02 00 00 C6 40 20 01

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

说了半天,不知大家看明白没有,很绕口的,如果你是二哥的fans估计很容易看明白,常用术语,我的系列教学等,如果需要我可以来个辅助动画。

然后将上面代码写入相应地方

0043F1B8     FF15 04494400              call dword ptr ds:[444904] 

dd 444904

修改为 401234,你自己 G 401234 看到一个ret语句,所以不一定取401234。

0043F1BE     90                         nop    //去小花
0043F1BF     8B45 FC                    mov eax,dword ptr ss:[ebp-4]
0043F1C2     8B80 E0010000              mov eax,dword ptr ds:[eax+1E0]
0043F1C8     8B40 44                    mov eax,dword ptr ds:[eax+44]
0043F1CB     33D2                       xor edx,edx
0043F1CD     E8 7A97FDFF                call dumped_.0041894C
0043F1D2     8D55 D4                    lea edx,dword ptr ss:[ebp-2C]
0043F1D5     A1 BC564400                mov eax,dword ptr ds:[4456BC]
0043F1DA     E8 3572FCFF                call dumped_.00406414
0043F1DF     8B55 D4                    mov edx,dword ptr ss:[ebp-2C]
0043F1E2     8B45 FC                    mov eax,dword ptr ss:[ebp-4]
0043F1E5     8B80 E0010000              mov eax,dword ptr ds:[eax+1E0]
0043F1EB     E8 7C3FFDFF                call dumped_.0041316C
0043F1F0     8B45 FC                    mov eax,dword ptr ss:[ebp-4]
0043F1F3     8B80 6C020000              mov eax,dword ptr ds:[eax+26C]
0043F1F9     E8 5643FDFF                call dumped_.00413554
0043F1FE     B2 01                      mov dl,1
0043F200     8B45 FC                    mov eax,dword ptr ss:[ebp-4]
0043F203     8B80 7C020000              mov eax,dword ptr ds:[eax+27C]
0043F209     E8 C63EFDFF                call dumped_.004130D4
0043F20E     B2 01                      mov dl,1
0043F210     8B45 FC                    mov eax,dword ptr ss:[ebp-4]
0043F213     8B80 78020000              mov eax,dword ptr ds:[eax+278]
0043F219     E8 B63EFDFF                call dumped_.004130D4
0043F21E     B2 01                      mov dl,1
0043F220     8B45 FC                    mov eax,dword ptr ss:[ebp-4]
0043F223     8B80 EC020000              mov eax,dword ptr ds:[eax+2EC]
0043F229     E8 A63EFDFF                call dumped_.004130D4
0043F22E     8B45 FC                    mov eax,dword ptr ss:[ebp-4]
0043F231     8B80 E4020000              mov eax,dword ptr ds:[eax+2E4]
0043F237     C640 20 01                 mov byte ptr ds:[eax+20],1
0043F23B     90                         nop
0043F23C     90                         nop       
0043F23D     90                         nop
0043F23E     90                         nop
0043F23F     90                         nop      //去小花,Demo版是直接跳到0043F246的,Nop要适度啊。
0043F240     90                         nop
0043F241     90                         nop
0043F242     90                         nop
0043F243     90                         nop
0043F244     90                         nop
0043F245     90                         nop 
0043F246     FF15 08494400              call dword ptr ds:[444908] //这里也访问壳中,顺手修改为

401234

这个一跟踪原程序就知道是个简单的ret类似IAT重定位。

保存所有结果,完整版本就是你的了,只有自己动手的果实才有甜的感觉。

然后是区段减肥,删除无用区段,OD载入程序,自401000-478000区段下F2断点,F9按住到程序运行。

看到

446000

448000

44A000

44C000

477000

为理论垃圾区段,先备份程序。

PeEdit初步删除区段,只保留验证PE啊。

正常运行,然后Loadpe可以减肥了。

484k To 434k ,减肥过猛,Aspack压缩可以运行但图标没有了,北斗程序提示已经压缩了,最后用PECompact 2.x加壳成功,434k To 225K。

感觉还是很复杂,只是锻炼一下操作。不知当时Jeffzhang是否这个方法,如果他写应该精彩多了。如果高手有Patch 小黑Key为真的方法还请指教,这样的Rsakey只需个人购买一个就可以Dump一个完整版大家分享,也可以移花接木,另外如果你的Aspack不幸过期了,可以用EVACleaner搞定。

二哥30岁了,不能像原先那样猛写文章了,还有心事未了.....

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

【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!