首页
社区
课程
招聘
[原创]Armadillo 3.78 - 4.xx脱壳手记
发表于: 2007-8-30 13:10 5730

[原创]Armadillo 3.78 - 4.xx脱壳手记

2007-8-30 13:10
5730
【文章标题】: Armadillo 3.78 - 4.xx脱壳手记
【文章作者】: wuhanqi
【软件名称】: Disk Clean Up 2000
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  1.peid查壳Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks
  2.od载入,忽略所有异常,隐藏od
  下bp OpenMutexA断点,shift+f9运行
  断下之后来到这里:
  7C80EA1B >  8BFF            mov     edi, edi
  7C80EA1D    55              push    ebp
  7C80EA1E    8BEC            mov     ebp, esp
  7C80EA20    51              push    ecx
  7C80EA21    51              push    ecx
  7C80EA22    837D 10 00      cmp     dword ptr [ebp+10], 0
  7C80EA26    56              push    esi
  7C80EA27    0F84 66530300   je      7C843D93
  7C80EA2D    64:A1 18000000  mov     eax, dword ptr fs:[18]
  7C80EA33    FF75 10         push    dword ptr [ebp+10]
  
  Ctrl+G,跟随来到401000
  将那里的0数据修改为
  00401000    60              pushad
  00401001    9C              pushfd
  00401002    68 B8DD1200     push    12DDB8                           ; ASCII "D78::DA79E43FB3"
  00401007    33C0            xor     eax, eax
  00401009    50              push    eax
  0040100A    50              push    eax
  0040100B    E8 2FD9407C     call    kernel32.CreateMutexA
  00401010    9D              popfd
  00401011    61              popad
  00401012  - E9 04DA407C     jmp     kernel32.OpenMutexA
  00401017    90              nop
  
  此时要注意一下00401002      68 A0FD1200      push 12DDB8 中的12DDB8是根据堆栈来判断的!
  0012D778   0043DA50  /CALL 到 OpenMutexA 来自 CleanUp.0043DA4A
  0012D77C   001F0001  |Access = 1F0001
  0012D780   00000000  |Inheritable = FALSE
  0012D784   0012DDB8  \MutexName = "D78::DA79E43FB3"   //看到12DDB8了么,就是在这里判断出来的!
  0012D788   0012FF04
  
  选中所有修改的部分,右键此处为新EIP,弹出个对话框,选是!
  
  然后F9运行,断下之后取消断点!
  
  下he GetModuleHandleA+5断点,然后shift+f9
  当堆栈中依次出现:
  00127B6C  /0012CE30
  00127B70  |00AE1B31  返回到 00AE1B31 来自 kernel32.GetModuleHandleA
  00127B74  |00AF6364  ASCII "kernel32.dll"
  00127B78  |00AF7588  ASCII "VirtualAlloc"
  
  00127B6C  /0012CE30
  00127B70  |00AE1B4E  返回到 00AE1B4E 来自 kernel32.GetModuleHandleA
  00127B74  |00AF6364  ASCII "kernel32.dll"
  00127B78  |00AF757C  ASCII "VirtualFree"
  
  001278DC  /00127B70
  001278E0  |00AC9CD7  返回到 00AC9CD7 来自 kernel32.GetModuleHandleA
  001278E4  |00127A24  ASCII "kernel32.dll"  //此时取消断点,Alit+f9返回!
  
  
  来到:
  00AC9CD7    8B0D 74B7AF00   mov     ecx, dword ptr [AFB774]
  00AC9CDD    89040E          mov     dword ptr [esi+ecx], eax
  00AC9CE0    A1 74B7AF00     mov     eax, dword ptr [AFB774]
  00AC9CE5    391C06          cmp     dword ptr [esi+eax], ebx
  00AC9CE8    75 16           jnz     short 00AC9D00
  00AC9CEA    8D85 B4FEFFFF   lea     eax, dword ptr [ebp-14C]
  00AC9CF0    50              push    eax
  00AC9CF1    FF15 DC00AF00   call    dword ptr [AF00DC]               ; kernel32.LoadLibraryA
  00AC9CF7    8B0D 74B7AF00   mov     ecx, dword ptr [AFB774]
  00AC9CFD    89040E          mov     dword ptr [esi+ecx], eax
  00AC9D00    A1 74B7AF00     mov     eax, dword ptr [AFB774]
  00AC9D05    391C06          cmp     dword ptr [esi+eax], ebx
  00AC9D08    0F84 3B010000   je      00AC9E49                         ; 这就是Magic jump了,修改为jmp
  00AC9D0E    33C9            xor     ecx, ecx
  00AC9D10    8B07            mov     eax, dword ptr [edi]
  00AC9D12    3918            cmp     dword ptr [eax], ebx
  00AC9D14    74 06           je      short 00AC9D1C
  00AC9D16    41              inc     ecx
  00AC9D17    83C0 0C         add     eax, 0C
  00AC9D1A  ^ EB F6           jmp     short 00AC9D12
  00AC9D1C    8BD9            mov     ebx, ecx
  00AC9D1E    C1E3 02         shl     ebx, 2
  
  然后在00AC9D08    0F84 3B010000   jmp      00AC9E49  这一行回车来到:
  00AC9E49    83C7 0C         add     edi, 0C
  00AC9E4C    89BD 84FDFFFF   mov     dword ptr [ebp-27C], edi
  00AC9E52    83C6 04         add     esi, 4
  00AC9E55    395F FC         cmp     dword ptr [edi-4], ebx
  00AC9E58  ^ 0F85 35FEFFFF   jnz     00AC9C93
  00AC9E5E    EB 03           jmp     short 00AC9E63                   ; 下硬件执行断点,shift+f9运行
  00AC9E60    D6              salc
  00AC9E61    D6              salc
  
  断下之后取消断点,撤销00AC9D08处的修改,打开内存镜像在00401000处f2下断,shift+f9直达oep!
  
  接下来就是用lordpe和ir修复了
  
  用ir修复的时候会有错误指针,不用管他cut就ok了!
   
  
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年08月30日 13:13:56

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 324
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
2
哦,补充一下,最后修复的时候要用ir级别一修复一下,不行的cut
2007-8-30 13:32
0
游客
登录 | 注册 方可回帖
返回
//