![]() |
目标软件: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.sil |
(一)捕获页面保护异常、找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的描述。 |