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