找回密码
 注册
搜索
热搜: 回贴

脱壳技术,爱的中体验之Armadillo3.X加壳的双进程基本壳,Armadillo

2010-1-30 18:19| 发布者: admin| 查看: 91| 评论: 0|原作者: 江海


脱壳技术,爱的中体验之Armadillo3.X加壳的双进程基本壳,Armadillo
2008年06月23日 星期一 下午 04:25
【脱文标题】 爱的中体验之Armadillo3.X加壳的双进程基本壳



【脱文作者】 weiyi75[Dfcg]



【作者邮箱】 weiyi75@sohu.com



【作者主页】 Dfcg官方大本营 --- http://www.chinadfcg.com/



【使用工具】 Ollydbg,Loadpe,Imprec1.6F



【脱壳平台】 Win2K



【软件名称】 NOTEPAD



【软件简介】 Armadillo3.X版双进程标准加壳的Win98的记事本



【软件大小】 212KB



【本地下载】本地下载



【加壳方式】 Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks



【保护方式】 双进程标准方式加壳



【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:





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



【脱壳内容】



运行程序,发现进程里有两个Notepad.exe,昏。看了mysqladm的文章《试玩armadillo3.50a一点心得 》暂时无法吸收,看了Jwh51的文章,照猫画虎搞定,还是自己来一遍加深印像。



首先不要让父进程生成子进程,原理太复杂,没有深入的编程知识无法理解,急,日夜脱壳还是不够,还有N个壳等着要脱。先打好基础吧,慢慢来。



OD载入程序,插件自动隐藏OD,忽略所有异常。



00432999 >/$Content$nbsp; 55 PUSH EBP //外壳入口

0043299A |. 8BEC MOV EBP,ESP

0043299C |. 6A FF PUSH -1

0043299E |. 68 502C4500 PUSH NOTEPAD.00452C50

004329A3 |. 68 80234300 PUSH NOTEPAD.00432380 ; SE handler installation

004329A8 |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]

004329AE |. 50 PUSH EAX

004329AF |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP

004329B6 |. 83EC 58 SUB ESP,58

004329B9 |. 53 PUSH EBX

004329BA |. 56 PUSH ESI

004329BB |. 57 PUSH EDI

004329BC |. 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP

004329BF |. FF15 4CD14400 CALL DWORD PTR DS:[<&KERNEL32.GetVersion>; KERNEL32.GetVersion

.....................................................................



命令行下断点 BP OpenMutexA,F9运行。



中断



77E6D78C > 55 PUSH EBP

77E6D78D 8BEC MOV EBP,ESP

77E6D78F 51 PUSH ECX

77E6D790 51 PUSH ECX

77E6D791 837D 10 00 CMP DWORD PTR SS:[EBP 10],0

77E6D795 56 PUSH ESI

77E6D796 0F84 F0B30200 JE KERNEL32.77E98B8C

.....................................................................



堆栈内容



0012F59C 004145F1 /CALL 到 OpenMutexA 来自 NOTEPAD.004145EB

0012F5A0 001F0001 |Access = 1F0001

0012F5A4 00000000 |Inheritable = FALSE

0012F5A8 0012FBDC \MutexName = "614:A2AA26D13" //注意MutexName 这个地址 每个机器不同,以看到的为主。



找一块程序领空空地址,写入一些欺骗Arm的代码。



Ctrl G 401000



00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。

00401002 0000 ADD BYTE PTR DS:[EAX],AL

00401004 0000 ADD BYTE PTR DS:[EAX],AL

00401006 0000 ADD BYTE PTR DS:[EAX],AL

00401008 0000 ADD BYTE PTR DS:[EAX],AL

0040100A 0000 ADD BYTE PTR DS:[EAX],AL

0040100C 0000 ADD BYTE PTR DS:[EAX],AL

0040100E 0000 ADD BYTE PTR DS:[EAX],AL

00401010 0000 ADD BYTE PTR DS:[EAX],AL

00401012 0000 ADD BYTE PTR DS:[EAX],AL



OD直接双击修改,填入以下代码。



00401000 60 PUSHAD

00401001 9C PUSHFD

00401002 68 DCFB1200 PUSH 12FBDC //以上面堆栈中地址为准。

00401007 33C0 XOR EAX,EAX

00401009 50 PUSH EAX

0040100A 50 PUSH EAX

0040100B E8 687BA677 CALL KERNEL32.CreateMutexA

00401010 9D POPFD

00401011 61 POPAD

00401012 - E9 75C7A677 JMP KERNEL32.OpenMutexA

............................................................



将当前的 Eip 77E6D78C 切换到 401000 来。



点右键 选在此处新建 Eip ,看到Eip 变为 401000



F9运行。



中断



77E6D78C > 55 PUSH EBP //双击它或F2清除断点。

77E6D78D 8BEC MOV EBP,ESP

77E6D78F 51 PUSH ECX

77E6D790 51 PUSH ECX

77E6D791 837D 10 00 CMP DWORD PTR SS:[EBP 10],0

77E6D795 56 PUSH ESI

77E6D796 0F84 F0B30200 JE KERNEL32.77E98B8C

77E6D79C 64:A1 18000000 MOV EAX,DWORD PTR FS:[18]

77E6D7A2 FF75 10 PUSH DWORD PTR SS:[EBP 10]

77E6D7A5 8DB0 F80B0000 LEA ESI,DWORD PTR DS:[EAX BF8]

77E6D7AB 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]

77E6D7AE 50 PUSH EAX

77E6D7AF FF15 8010E677 CALL DWORD PTR DS:[<&NTDLL.RtlInitAnsiSt>; ntdll.RtlInitAnsiString

............................................................



Ctrl G 401000



00401000 60 PUSHAD

00401001 9C PUSHFD

00401002 68 DCFB1200 PUSH 12FBDC ; ASCII "614:A2AA26D13"

00401007 33C0 XOR EAX,EAX

00401009 50 PUSH EAX

0040100A 50 PUSH EAX

0040100B E8 687BA677 CALL KERNEL32.CreateMutexA

00401010 9D POPFD

00401011 61 POPAD

00401012 - E9 75C7A677 JMP KERNEL32.OpenMutexA



选定上面的红色代码,右键撤销选择,看到全部还原为



00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。

00401002 0000 ADD BYTE PTR DS:[EAX],AL

00401004 0000 ADD BYTE PTR DS:[EAX],AL

00401006 0000 ADD BYTE PTR DS:[EAX],AL

00401008 0000 ADD BYTE PTR DS:[EAX],AL

0040100A 0000 ADD BYTE PTR DS:[EAX],AL

0040100C 0000 ADD BYTE PTR DS:[EAX],AL

0040100E 0000 ADD BYTE PTR DS:[EAX],AL

00401010 0000 ADD BYTE PTR DS:[EAX],AL

00401012 0000 ADD BYTE PTR DS:[EAX],AL

.....................................................................



这时我们就完全可以象调试普通标准壳那样调试它了,因为它已经不会生成子进程而是把自己当作子进程运行起来。



脱Arm标准壳一般分两个步骤。



1.找magic jmp 调试过几个arm壳发现,magic jmp 位置和GetModuleHandleA 非常近,避开加密IAT。



2.找oep,在入口脱壳程序。注意Arm修改了Pe头,让OD插件无法脱壳,但对Loadpe一点效果都没有。



先找 magic jmp 命令行下断点,bp GetModuleHandleA



btw: 这种普通断点,调试时极容易让ARM产生异常而使程序提前退出导致调试失败,至少我这里是这样的。



将普通断点改为硬件断点,Alt B找到断点,



77E756DB > 55 PUSH EBP //F2去掉断点,右键改为硬件执行。

77E756DC 8BEC MOV EBP,ESP

77E756DE 837D 08 00 CMP DWORD PTR SS:[EBP 8],0

77E756E2 0F84 BC670000 JE KERNEL32.77E7BEA4

77E756E8 FF75 08 PUSH DWORD PTR SS:[EBP 8]

77E756EB E8 B1F6FFFF CALL KERNEL32.77E74DA1

77E756F0 85C0 TEST EAX,EAX

77E756F2 74 08 JE SHORT KERNEL32.77E756FC

77E756F4 FF70 04 PUSH DWORD PTR DS:[EAX 4]

77E756F7 E8 C384FFFF CALL KERNEL32.GetModuleHandleW

77E756FC 5D POP EBP

77E756FD C2 0400 RETN 4

........................................................................



F9运行,多次硬件中断,注意堆栈值。



11次F9提示一个非法指令错误,Shift F9忽略。



继续六次F9



堆栈内容



0012BC98 00A1799B /CALL 到 GetModuleHandleA 来自 00A17995

0012BC9C 0012BDD4 \pModule = "advapi32.dll" //看到这个动态库就要慢些了。

0012BCA0 00000000

0012BCA4 ED700000

0012BCA8 EBA10012

0012BCAC 00000004

........................................................................



在一次F9,就到达magic jmp 附近。



0012BF24 00A3134F /CALL 到 GetModuleHandleA 来自 00A31349

0012BF28 00000000 \pModule = NULL

0012BF2C 00000001

0012BF30 00A53938

0012BF34 00000000

0012BF38 00145518

0012BF3C 77F902BD 返回到 ntdll.77F902BD 来自 ntdll.77F9042D

........................................................................



点调试菜单,里面清除硬件断点。



Ctrl F9 返回。



00A31349 FF15 C480A300 CALL DWORD PTR DS:[A380C4] ; KERNEL32.GetModuleHandleA

00A3134F 3985 BCE8FFFF CMP DWORD PTR SS:[EBP-1744],EAX ; NOTEPAD.00400000

00A31355 75 0F JNZ SHORT 00A31366

00A31357 C785 B8E8FFFF 3>MOV DWORD PTR SS:[EBP-1748],0A3C530

00A31361 E9 C4000000 JMP 00A3142A

00A31366 83A5 94E6FFFF 0>AND DWORD PTR SS:[EBP-196C],0

00A3136D C785 90E6FFFF 4>MOV DWORD PTR SS:[EBP-1970],0A3CB48

00A31377 EB 1C JMP SHORT 00A31395

00A31379 8B85 90E6FFFF MOV EAX,DWORD PTR SS:[EBP-1970]

00A3137F 83C0 0C ADD EAX,0C

00A31382 8985 90E6FFFF MOV DWORD PTR SS:[EBP-1970],EAX

00A31388 8B85 94E6FFFF MOV EAX,DWORD PTR SS:[EBP-196C]

00A3138E 40 INC EAX

00A3138F 8985 94E6FFFF MOV DWORD PTR SS:[EBP-196C],EAX

00A31395 8B85 90E6FFFF MOV EAX,DWORD PTR SS:[EBP-1970]

00A3139B 8338 00 CMP DWORD PTR DS:[EAX],0

00A3139E 0F84 86000000 JE 00A3142A //很大一个magic jmp 跳转,注意,修改它为jmp 00a3142a 程序将异常无法继续运行,但IAT已经没有加密了。为了跟踪到oep,动态修改Z标志吧。

00A313A4 8B85 90E6FFFF MOV EAX,DWORD PTR SS:[EBP-1970]

00A313AA 8B40 08 MOV EAX,DWORD PTR DS:[EAX 8]

00A313AD 83E0 01 AND EAX,1

00A313B0 85C0 TEST EAX,EAX

00A313B2 74 25 JE SHORT 00A313D9

.................................................................



对 00A3139E /0F84 86000000 JE 00A3142A 也下内存断点,切记不要下普通断点,Arm对断点检测很严格,一不小行就退出。



F9,运行,不断修改Z标志。



大概5-6次,看到



0012BF2C 00000001

0012BF30 00A53938

0012BF34 00000000

0012BF38 00EDC74A ASCII "GetFileTitleA"

0012BF3C 77F902BD 返回到 ntdll.77F902BD 来自 ntdll.77F9042D

0012BF40 77F902ED 返回到 ntdll.77F902ED 来自 ntdll.77F90301



F9断在这里。



00A113AC 8B08 MOV ECX,DWORD PTR DS:[EAX] //IAT跳过解密完成,清除内存断点。

00A113AE 8365 08 00 AND DWORD PTR SS:[EBP 8],0

00A113B2 8D50 04 LEA EDX,DWORD PTR DS:[EAX 4]

00A113B5 894D E8 MOV DWORD PTR SS:[EBP-18],ECX

00A113B8 8955 0C MOV DWORD PTR SS:[EBP C],EDX

00A113BB C745 10 2000000>MOV DWORD PTR SS:[EBP 10],20

00A113C2 8B12 MOV EDX,DWORD PTR DS:[EDX]

00A113C4 8955 E4 MOV DWORD PTR SS:[EBP-1C],EDX

00A113C7 816D 08 4786C86>SUB DWORD PTR SS:[EBP 8],61C88647

00A113CE 8BF2 MOV ESI,EDX

00A113D0 8BFA MOV EDI,EDX

00A113D2 C1EE 05 SHR ESI,5

00A113D5 0375 FC ADD ESI,DWORD PTR SS:[EBP-4]

00A113D8 C1E7 04 SHL EDI,4

00A113DB 037D F0 ADD EDI,DWORD PTR SS:[EBP-10]

00A113DE 33F7 XOR ESI,EDI

00A113E0 8B7D 08 MOV EDI,DWORD PTR SS:[EBP 8]

................................................................



寻找OEP







内存镜像,项目 12

地址=00401000 //下内存访问断点,当执行到Oep处程序立即中断

大小=00004000 (16384.)

Owner=NOTEPAD 00400000

区段=.text

类型=Imag 01001002

访问=R

初始访问=RWE



F9运行程序,



004010CC 55 PUSH EBP //到达地球人都知道的位置,全部红色代码,动态解码的,Loadpe脱壳。

004010CD 8BEC MOV EBP,ESP

004010CF 83EC 44 SUB ESP,44

004010D2 56 PUSH ESI

004010D3 FF15 E4634000 CALL DWORD PTR DS:[4063E4] ; KERNEL32.GetCommandLineA

004010D9 8BF0 MOV ESI,EAX

004010DB 8A00 MOV AL,BYTE PTR DS:[EAX]

004010DD 3C 22 CMP AL,22

004010DF 75 1B JNZ SHORT NOTEPAD.004010FC

004010E1 56 PUSH ESI

004010E2 FF15 F4644000 CALL DWORD PTR DS:[4064F4] ; USER32.CharNextA

004010E8 8BF0 MOV ESI,EAX

004010EA 8A00 MOV AL,BYTE PTR DS:[EAX]

004010EC 84C0 TEST AL,AL

004010EE 74 04 JE SHORT NOTEPAD.004010F4

004010F0 3C 22 CMP AL,22

004010F2 ^ 75 ED JNZ SHORT NOTEPAD.004010E1

.............................................................................



修复IAT,Imprec1.6f选择进程,Oep填入10CC,自动搜索,还剩下六个Arm添加的标准垃圾指针,不是六个心里还有点不舒服也不习惯,我就没有用jwh51的nop垃圾指针的方法了,拿剪刀把六个垃圾指针剪掉,正常运行。



刚接触ARM,查阅了几篇文章,这里一一感谢诸位前辈指点,感觉文中有很多不足,还请各位大侠不吝指教。




最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 23:40 , Processed in 0.206280 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部