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

Armadillo 2.52加壳原理分析和改进的脱壳方法(12千字)

更新时间:2008-4-22 0:19:47
责任编辑:果果龙
热 点:
目标软件:The Armadillo Software Protection System Version2.52 build 1164 
目标文件:Armadillo.exe 
加壳方式:Armadillo 2.52 
使用工具:WinDbg或trw2000, peditor, WinHex 10.2 SR-2,m$的win32 sdk文档,<winnt.h> 
      
URL:      http://www.siliconrealms.com/ 
本文作者:leo_cyl 

    Armadillo 的保护方式主要有以下特点:修改pe头,使WinDbg等调试器无法“attach”,使procdump无法dump;anti-debug代码(我以前的贴子有讨论);利用调试器捕获页面保护异常,分段解码。 

(一)捕获页面保护异常、找OEP 

    和以前版本一样,Armadillo 外壳产生另外一个进程(被加壳的程序)。所以下断点“bpx createprocessa” 

004C39E4                call    ds:CreateProcessA 
004C39EA                test    eax, eax 
004C39EC                jnz    4C39F5 
…… 
…… 

0187:004C3A0F 51              PUSH    ECX 
0187:004C3A10 68E6314C00      PUSH    DWORD 004C31E6 
0187:004C3A15 6A00            PUSH    BYTE +00 
0187:004C3A17 6A00            PUSH    BYTE +00 
0187:004C3A19 FF1554A04C00    CALL    `KERNEL32!CreateThread` 
0187:004C3A1F 6A00            PUSH    BYTE +00 
0187:004C3A21 FF1530A14C00    CALL    `KERNEL32!GetModuleHandleA` 
…… 
…… 
…… 
0187:004C3A42 6A00            PUSH    BYTE +00 
0187:004C3A44 FF1530A14C00    CALL    `KERNEL32!GetModuleHandleA` 
…… 
…… 

0187:004C3A68 E80C0C0000      CALL    004C4679 
0187:004C3A6D 83C40C          ADD      ESP,BYTE +0C 
0187:004C3A70 8B8D68FEFFFF    MOV      ECX,[EBP+FFFFFE68] 
0187:004C3A76 51              PUSH    ECX 
0187:004C3A77 8B157CE54C00    MOV      EDX,[004CE57C] 
0187:004C3A7D 52              PUSH    EDX 
0187:004C3A7E E8BA0C0000      CALL    004C473D 

以上代码在被加壳的程序第一条指令处写入“eb fe”代码,即“jmp eip” 使被加壳程序“挂起” 


0187:004C3A83 83C408          ADD      ESP,BYTE +08 
0187:004C3A86 A17CE54C00      MOV      EAX,[004CE57C] 
0187:004C3A8B 8B4804          MOV      ECX,[EAX+04] 
0187:004C3A8E 51              PUSH    ECX 
0187:004C3A8F FF158CA04C00    CALL    `KERNEL32!ResumeThread` 
0187:004C3A95 8B157CE54C00    MOV      EDX,[004CE57C] 
0187:004C3A9B 8B4208          MOV      EAX,[EDX+08] 
0187:004C3A9E 50              PUSH    EAX 
0187:004C3A9F FF1588A04C00    CALL    `KERNEL32!DebugActiveProcess` 
0187:004C3AA5 8B0D7CE54C00    MOV      ECX,[004CE57C] 
0187:004C3AAB 8B5104          MOV      EDX,[ECX+04] 
0187:004C3AAE 52              PUSH    EDX 
0187:004C3AAF FF1584A04C00    CALL    `KERNEL32!SuspendThread` 

以上代码通过调用“DebugActiveProcess”开始调试被加壳的程序。 
…… 
…… 
…… 

0187:004C3AFA 68E8030000      PUSH    DWORD 03E8  《===== dwMilliseconds 
0187:004C3AFF 8B9574FEFFFF    MOV      EDX,[EBP+FFFFFE74] 
0187:004C3B05 52              PUSH    EDX          〈====  lpDebugEvent 
0187:004C3B06 FF1580A04C00    CALL    `KERNEL32!WaitForDebugEvent` 
0187:004C3B0C 85C0            TEST    EAX,EAX 
0187:004C3B0E 0F8414060000    JZ      NEAR 004C4128 
0187:004C3B14 C78570FDFFFF68B4+MOV      DWORD [EBP+FFFFFD70],004CB468 
0187:004C3B1E 33C0            XOR      EAX,EAX 
0187:004C3B20 A06EE54C00      MOV      AL,[004CE56E] 
0187:004C3B25 85C0            TEST    EAX,EAX 
0187:004C3B27 7565            JNZ      004C3B8E 
0187:004C3B29 8B4DE4          MOV      ECX,[EBP-1C] 
0187:004C3B2C 81E1FF000000    AND      ECX,FF 
0187:004C3B32 85C9            TEST    ECX,ECX 
0187:004C3B34 7458            JZ      004C3B8E      〈==跳转 
0187:004C3B36 C645E400        MOV      BYTE [EBP-1C],00 
0187:004C3B3A C745FC00000000  MOV      DWORD [EBP-04],00 
0187:004C3B41 669C            PUSHFW            + 
0187:004C3B43 6658            POP      AX        | 
0187:004C3B45 66056200        ADD      AX,62    |设置单步调试标志 
0187:004C3B49 66059E00        ADD      AX,9E    |anti-debug??? 
0187:004C3B4D 6650            PUSH    AX        | 
0187:004C3B4F 669D            POPFW              + 
0187:004C3B51 66050100        ADD      AX,01 
0187:004C3B55 C745FCFFFFFFFF  MOV      DWORD [EBP-04],FFFFFFFF 
0187:004C3B5C EB30            JMP      SHORT 004C3B8E 

以上进入调试循环,根据DebugEvent结构中的debugging event code 做相应处理。其中最重要的是EXCEPTION_DEBUG_EVENT(0x00000001)。请参考MSDN中WaitForDebugEvent的描述。 

1 2 3 下一页

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