吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 10138|回复: 21
收起左侧

[分享] 菜鸟我的第一篇脱文:手脱Armadillo5.0双进程标准壳

[复制链接]
ximo 发表于 2008-6-21 22:30
【破文标题】手脱Armadillo5.0双进程标准壳
【破文作者】zk8891111(其实也就是我,呵呵)
【作者邮箱】178911980@163.com
破解工具】OD,LordPE ImportREC
【破解平台】XP SP2
【原版下载】见附件
【破解声明】菜鸟练习笔记,无技术含量,有纪念意义
------------------------------------------------------------------------
【破解过程】最近一直在学习脱穿山甲的壳,今天抽空写个破文,当是学习笔记。高手就飘过了~

1、查壳:用PEID查壳结果为:Armadillo V5.00 -> Silicon Realms Toolworks *
    运行程序,打开资源管理器,很明显是双进程的
2、设置OD:忽略所有异常,用插件隐藏OD

3、开始脱壳,用OD载入
 004A2DC2 A> E8 E3400000     call Armadill.004A6EAA   //停在这 004A2DC7 ^ E9 16FEFFFF     jmp Armadill.004A2BE2 004A2DCC  6A 0C        push 0C 004A2DCE  68 B0104D00     push Armadill.004D10B0 004A2DD3  E8 44150000     call Armadill.004A431C 004A2DD8  8B4D 08       mov ecx,dword ptr ss:[ebp+8] 004A2DDB  33FF        xor edi,edi 004A2DDD  3BCF        cmp ecx,edi 004A2DDF  76 2E        jbe short Armadill.004A2E0F 004A2DE1  6A E0        push -20
(1) 把双进程变单进程:
  下断点:BP OpenMutexA,SHIFT+F9
  7C80EA3B k> 8BFF        mov edi,edi     //停在这  7C80EA3D  55         push ebp  7C80EA3E  8BEC        mov ebp,esp  7C80EA40  51         push ecx  7C80EA41  51         push ecx  7C80EA42  837D 10 00     cmp dword ptr ss:[ebp+10],0  7C80EA46  56         push esi  7C80EA47  0F84 D7540300    je kernel32.7C843F24 


然后观察队栈窗口:
   0012F720 0048EDAA /CALL 到 OpenMutexA 来自 Armadill.0048EDA4  0012F724 001F0001 |Access = 1F0001  0012F728 00000000 |Inheritable = FALSE  0012F72C 0012FD7C \MutexName = "1220::DA8B2CFD8D"   0012F730 6452266E
记录数据为:0012FD7C,一会就会用到。[/code]
  
  打开ALT+M内存镜像,找.code段的起始地址为00401000
  于是,在反汇编窗口CTRL+G,来到00401000
  然后输入下面代码:(大家做的时候其他的代码都不变,只改变第三句中的地址)
  00401000  60         pushad  00401001  9C         pushfd  00401002  68 7CFD1200     push 12FD7C    //这里的地址就是刚才所记录的地址           00401007  33C0        xor eax,eax  00401009  50         push eax  0040100A  50         push eax  0040100B  50         push eax  0040100C  E8 4ED9407C     call kernel32.CreateMutexA  00401011  9D         popfd  00401012  61         popad  00401013 - E9 23DA407C     jmp kernel32.OpenMutexA

  接着在首句新建EIP,取消断点。

(2)处理IAT
这里有两种方法:
方法一:
下断点he GetModuleHandleA+9,SHIFT+F9多次,观察队栈,适当时机返回。
 00129474 /0012EB88 00129478 |00EA5325 返回到 00EA5325 来自 kernel32.GetModuleHandleA 0012947C |00ED0C04 ASCII "kernel32.dll" 00129480 |00ED1AD0 ASCII "VirtualAlloc"
 00129474 /0012EB88 00129478 |00EA5343 返回到 00EA5343 来自 kernel32.GetModuleHandleA 0012947C |00ED0C04 ASCII "kernel32.dll" 00129480 |00ED1AC4 ASCII "VirtualFree"
  001291C0 /00129478 001291C4 |00E87F54 返回到 00E87F54 来自 kernel32.GetModuleHandleA 001291C8 |00129340 ASCII "kernel32.dll"

这时候就是返回时机了。
取消断点,ALT+F9,返回程序代码段,然后修改magic jump(不知道这里还可不可以叫magic jump)
 00E87F54  8B55 F4       mov edx,dword ptr ss:[ebp-C] 00E87F57  8B0D 7CDFED00    mov ecx,dword ptr ds:[EDDF7C] 00E87F5D  890491       mov dword ptr ds:[ecx+edx*4],eax 00E87F60  8B55 F4       mov edx,dword ptr ss:[ebp-C] 00E87F63  A1 7CDFED00     mov eax,dword ptr ds:[EDDF7C] 00E87F68  833C90 00      cmp dword ptr ds:[eax+edx*4],0 00E87F6C  75 5C        jnz short 00E87FCA 00E87F6E  8B4D F8       mov ecx,dword ptr ss:[ebp-8] 00E87F71  8B51 08       mov edx,dword ptr ds:[ecx+8] 00E87F74  83E2 02       and edx,2 00E87F77  74 38        je short 00E87FB1 00E87F79  B8 0B000000     mov eax,0B 00E87F7E  C1E0 02       shl eax,2 00E87F81  8B0D 04BBED00    mov ecx,dword ptr ds:[EDBB04]     ; Armadill.004CB378 00E87F87  8B15 04BBED00    mov edx,dword ptr ds:[EDBB04]     ; Armadill.004CB378 00E87F8D  8B35 04BBED00    mov esi,dword ptr ds:[EDBB04]     ; Armadill.004CB378 00E87F93  8B5E 78       mov ebx,dword ptr ds:[esi+78] 00E87F96  335A 34       xor ebx,dword ptr ds:[edx+34] 00E87F99  331C01       xor ebx,dword ptr ds:[ecx+eax] 00E87F9C  83E3 10       and ebx,10 00E87F9F  F7DB        neg ebx 00E87FA1  1BDB        sbb ebx,ebx 00E87FA3  F7DB        neg ebx 00E87FA5  0FB6C3       movzx eax,bl 00E87FA8  85C0        test eax,eax 00E87FAA  75 05        jnz short 00E87FB1 00E87FAC ^ E9 1BFFFFFF     jmp 00E87ECC 00E87FB1  8D8D C8FEFFFF    lea ecx,dword ptr ss:[ebp-138] 00E87FB7  51         push ecx 00E87FB8  FF15 D4E1EC00    call dword ptr ds:[ECE1D4]      ; kernel32.LoadLibraryA 00E87FBE  8B55 F4       mov edx,dword ptr ss:[ebp-C] 00E87FC1  8B0D 7CDFED00    mov ecx,dword ptr ds:[EDDF7C] 00E87FC7  890491       mov dword ptr ds:[ecx+edx*4],eax 00E87FCA  8B55 F4       mov edx,dword ptr ss:[ebp-C] 00E87FCD  A1 7CDFED00     mov eax,dword ptr ds:[EDDF7C] 00E87FD2  833C90 00      cmp dword ptr ds:[eax+edx*4],0 00E87FD6  75 05        jnz short 00E87FDD          //把他NOP掉吧! 00E87FD8 ^ E9 EFFEFFFF     jmp 00E87ECC 00E87FDD  C785 BCFEFFFF 000000>mov dword ptr ss:[ebp-144],0
处理完后,直接拉到下面:
 00E88246  33348A       xor esi,dword ptr ds:[edx+ecx*4] 00E88249  8B45 F4       mov eax,dword ptr ss:[ebp-C] 00E8824C  8B0D 7CDFED00    mov ecx,dword ptr ds:[EDDF7C] 00E88252  893481       mov dword ptr ds:[ecx+eax*4],esi 00E88255 ^ E9 72FCFFFF     jmp 00E87ECC 00E8825A  EB 03        jmp short 00E8825F  //在这F2,SHIFT+F9,取消断点
接着返回到刚才修改的地方,撤消修改,IAT处理到此结束!

方法二:下断点:bp VirtualProtect,SHIFT+F9,观察队栈,找适当时机返回
返回的时机就是:当Size的值小于1000,且NewProtect为PAGE_READWRITE时
 00129470 00EAA814 /CALL 到 VirtualProtect 来自 00EAA80E 00129474 0045F118 |Address = Armadill.0045F118 00129478 0000008C |Size = 8C (140.) 0012947C 00000004 |NewProtect = PAGE_READWRITE 00129480 0012C028 \pOldProtect = 0012C028

这个时候就可以返回了!

取消断点,ALT+F9
 00EAA814  6A 14        push 14    //返回到这 00EAA816  E8 FBCA0000     call 00EB7316 00EAA81B  83C4 04       add esp,4 00EAA81E  8985 84ABFFFF    mov dword ptr ss:[ebp+FFFFAB84],eax 00EAA824  83BD 84ABFFFF 00  cmp dword ptr ss:[ebp+FFFFAB84],0 00EAA82B  74 59        je short 00EAA886 00EAA82D  8B0D EC53EE00    mov ecx,dword ptr ds:[EE53EC] 00EAA833  898D 10AAFFFF    mov dword ptr ss:[ebp+FFFFAA10],ecx 00EAA839  8B95 74D8FFFF    mov edx,dword ptr ss:[ebp-278C] 00EAA83F  0395 78D3FFFF    add edx,dword ptr ss:[ebp-2C88]
接着CTRL+F,查找命令push 100(把整个短块前面的勾去掉)
 00EAAA87  68 00010000     push 100        //来到这 00EAAA8C  8D8D 40C1FFFF    lea ecx,dword ptr ss:[ebp-3EC0] 00EAAA92  51         push ecx 00EAAA93  8B95 40C2FFFF    mov edx,dword ptr ss:[ebp-3DC0] 00EAAA99  8B02        mov eax,dword ptr ds:[edx] 00EAAA9B  50         push eax 00EAAA9C  E8 2F7CFBFF     call 00E626D0    //跟随 00EAAAA1  83C4 0C       add esp,0C 00EAAAA4  8D8D 40C1FFFF    lea ecx,dword ptr ss:[ebp-3EC0]

然后跟随进入下面的一个CALL,然后把段首改为RETN

这样,同样可以阻止对IAT进行修改,达到目的!

(3)寻找OEP
同样有2种方法:
方法一:下断点bp CreateThread,SHIFT+F9
 7C810657 k> 8BFF        mov edi,edi     //停在这里 7C810659  55         push ebp  7C81065A  8BEC        mov ebp,esp 7C81065C  FF75 1C       push dword ptr ss:[ebp+1C] 7C81065F  FF75 18       push dword ptr ss:[ebp+18] 7C810662  FF75 14       push dword ptr ss:[ebp+14] 7C810665  FF75 10       push dword ptr ss:[ebp+10] 7C810668  FF75 0C       push dword ptr ss:[ebp+C] 7C81066B  FF75 08       push dword ptr ss:[ebp+8] 7C81066E  6A FF        push -1 7C810670  E8 D7FDFFFF     call kernel32.CreateRemoteThread 7C810675  5D         pop ebp 7C810676  C2 1800       retn 18

取消断点,ALT+F9返回
下面就单步跟吧!
 00EAF2B1  /EB 46        jmp short 00EAF2F9 00EAF2B3  |8B55 08       mov edx,dword ptr ss:[ebp+8] 00EAF2B6  |833A 01       cmp dword ptr ds:[edx],1 00EAF2B9  |75 3E        jnz short 00EAF2F9 00EAF2BB  |A1 04BBED00     mov eax,dword ptr ds:[EDBB04] 00EAF2C0  |8B0D 04BBED00    mov ecx,dword ptr ds:[EDBB04]     ; Armadill.004CB378 00EAF2C6  |8B50 68       mov edx,dword ptr ds:[eax+68] 00EAF2C9  |3351 34       xor edx,dword ptr ds:[ecx+34] 00EAF2CC  |A1 04BBED00     mov eax,dword ptr ds:[EDBB04] 00EAF2D1  |3350 60       xor edx,dword ptr ds:[eax+60] 00EAF2D4  |8955 DC       mov dword ptr ss:[ebp-24],edx 00EAF2D7  |8B4D 08       mov ecx,dword ptr ss:[ebp+8] 00EAF2DA  |8B51 04       mov edx,dword ptr ds:[ecx+4] 00EAF2DD  |52         push edx 00EAF2DE  |8B45 08       mov eax,dword ptr ss:[ebp+8] 00EAF2E1  |8B48 08       mov ecx,dword ptr ds:[eax+8] 00EAF2E4  |51         push ecx 00EAF2E5  |6A 00        push 0 00EAF2E7  |8B55 08       mov edx,dword ptr ss:[ebp+8] 00EAF2EA  |8B42 0C       mov eax,dword ptr ds:[edx+C] 00EAF2ED  |50         push eax 00EAF2EE  |8B4D F4       mov ecx,dword ptr ss:[ebp-C] 00EAF2F1  |2B4D DC       sub ecx,dword ptr ss:[ebp-24] 00EAF2F4  |FFD1        call ecx       //这里就跳向OEP了!F7跟进即可! 00EAF2F6  |8945 FC       mov dword ptr ss:[ebp-4],eax 00EAF2F9  \8B45 FC       mov eax,dword ptr ss:[ebp-4]
 0045B52C  55         push ebp   //这里就是OEP了! 0045B52D  8BEC        mov ebp,esp 0045B52F  83C4 F0       add esp,-10 0045B532  B8 8CB24500     mov eax,Armadill.0045B28C 0045B537  E8 C0ABFAFF     call Armadill.004060FC 0045B53C  A1 C8D44500     mov eax,dword ptr ds:[45D4C8] 0045B541  8B00        mov eax,dword ptr ds:[eax] 0045B543  E8 F893FFFF     call Armadill.00454940 0045B548  8B0D B0D54500    mov ecx,dword ptr ds:[45D5B0]     ; Armadill.0045EC88 0045B54E  A1 C8D44500     mov eax,dword ptr ds:[45D4C8] 0045B553  8B00        mov eax,dword ptr ds:[eax] 0045B555  8B15 B4AF4500    mov edx,dword ptr ds:[45AFB4]     ; Armadill.0045B000 0045B55B  E8 F893FFFF     call Armadill.00454958 0045B560  A1 C8D44500     mov eax,dword ptr ds:[45D4C8] 0045B565  8B00        mov eax,dword ptr ds:[eax] 0045B567  E8 6C94FFFF     call Armadill.004549D8 0045B56C  E8 B38BFAFF     call Armadill.00404124 0045B571  8D40 00       lea eax,dword ptr ds:[eax]
方法二:ALT+M,在00401000处F2,SHIFT+F9,然后单步走,
        同样可以找到下面地址:
         00EAF2F4  |FFD1        call ecx       //这里就跳向OEP了!F7跟进即可!

4、用LordPE脱壳,然后用Import REC修复,剪掉无效的指针即可!
  OK,脱壳文件能正常运行!
  脱壳到此结束!

------------------------------------------------------------------------
【破解总结】早就听到穿山甲的大名,所以反复看教程,然后自己动手实践!
HOHO~~终于成功!说实话,真有点小兴奋!
不过这只是简单的保护方式,以后路还有很长要走!
菜鸟还要继续努力啊!不过,我会继续加油!
------------------------------------------------------------------------
【版权声明】转载请注明作者并保持文章的完整, 谢谢!

穿山甲.rar

761 KB, 下载次数: 86, 下载积分: 吾爱币 -1 CB

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ydf001 发表于 2008-6-22 01:12
随便我看不懂.但是想学习.
山中斑虎 发表于 2008-6-22 04:13
我这么笨只能学简单的
有那位高手愿意免费教一下我吗
lchy 发表于 2008-6-22 09:19
这吗好的教程我咋就看不明白呢?菜鸟就是菜鸟
flyjmu 发表于 2008-6-22 11:09
太厉害了 跟着学习一遍
nxg6886368 发表于 2008-6-22 12:43
看不懂 蛮深奥的``但是 我会努力学的
头像被屏蔽
cxz278444492 发表于 2008-6-24 04:19
提示: 作者被禁止或删除 内容自动屏蔽
天下无雪 发表于 2009-1-6 01:03
太感谢了,下来试试
a098 发表于 2010-3-3 07:25
跟着学习一遍
cz2181413 发表于 2010-3-3 07:38
这些东西太深奥咯!!看不懂。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 10:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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