阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 2622|回复: 4

[转帖] 我的第一篇脱文:手脱Armadillo5.0双进程标准壳

[复制链接]

该用户从未签到

发表于 2009-1-5 22:04:18 | 显示全部楼层 |阅读模式
【破文标题】手脱Armadillo5.0双进程标准壳
【PJ工具】OD,LordPE ImportREC
【PJ平台】XP SP2
【原版下载】见附件
【PJ声明】菜鸟练习笔记,无技术含量,有纪念意义
------------------------------------------------------------------------
【PJ过程】最近一直在学习脱穿山甲的壳,今天抽空写个破文,当是学习笔记。高手就飘过了~

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:A8B2CFD8D"
  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,脱壳文件能正常运行!
  脱壳到此结束!

------------------------------------------------------------------------
【PJ总结】早就听到穿山甲的大名,所以反复看教程,然后自己动手实践!
HOHO~~终于成功!说实话,真有点小兴奋!
不过这只是简单的保护方式,以后路还有很长要走!
菜鸟还要继续努力啊!不过,我会继续加油!

评分

参与人数 1阳光币 +2 收起 理由
xiaolijiadian + 2 鼓励论坛新人发展

查看全部评分

楼主热帖
启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2012-3-8 10:08
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2009-1-5 22:10:46 | 显示全部楼层
    原帖由 似曾温柔 于 2009-1-5 22:04 发表
    【破文标题】手脱Armadillo5.0双进程标准壳
    【PJ工具】OD,LordPE ImportREC
    【PJ平台】XP SP2
    【原版下载】见附件
    【PJ声明】菜鸟练习笔记,无技术含量,有纪念意义
    ---------------------------------------- ...

    写得很详细,不过提醒一下楼主大人,附件好像没有上传哦
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2011-5-23 00:51
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2009-1-5 22:11:13 | 显示全部楼层
    期待楼主的进一步文章,这样的好咚咚
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2013-9-6 14:28
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2009-1-6 08:28:29 | 显示全部楼层
    这也叫新手,太牛了。。。
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    开心
    2018-3-30 20:27
  • 签到天数: 227 天

    [LV.7]常住居民III

    发表于 2017-8-4 16:20:57 | 显示全部楼层
    辛苦了,楼主                                          
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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