安全中国首页 > 文章中心 > 脱壳技术
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

爱的中体验之Armadillo3.X加壳的双进程基本壳

更新时间:2008-4-25 0:02:49
责任编辑:池天
热 点:

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

脱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,查阅了几篇文章,这里一一感谢诸位前辈指点,感觉文中有很多不足,还请各位大侠不吝指教。

上一页 1 2 

 
相关文章
一日一文章
 
一日一软件
一日一动画