殼學習二:Aspack 2.12 加殼脫殼
SkyJacker
Http://blog.csdn.net/skyjacker
Email:HeMiaoYu <At> gmail.com
QQ:67705517
2007-2-10
1、加殼過程
自動動手編寫一個簡單的表單程式.
使用Aspack2.12 加殼(按預設選項),產生已加殼程式NullFormAspack.exe.
原始檔案與加殼後檔案資訊描述:
原始檔案大小:379 KB (388,096 位元組)
原始檔案佔用空間:384 KB (393,216 位元組)
加殼檔案大小:157 KB (161,280 位元組)
加殼檔案佔用空間:160 KB (163,840 位元組)
Aspack2.12 壓縮率:41%
2、脫殼過程
使用PEID查殼: ASPack 2.12 -> Alexey Solodovnikov
OllyDbg載入,停在程式進入點:
OllyDbg載入,停在程式進入點:
00465001 > 60 pushad
00465002 E8 03000000 call 0046500A // F7 進入
00465007 - E9 EB045D45 jmp 45A354F7
0046500C 55 push ebp
0046500D C3 retn
0046500E E8 01000000 call 00465014
00465013 EB 5D jmp short 00465072
00465015 BB EDFFFFFF mov ebx, -13
call 0046500A
0046500A 5D pop ebp ; NullForm.00465007
0046500B 45 inc ebp // 00465008
0046500C 55 push ebp // 00465008 入棧。 函數功能:將返回地址加1,即修改了下一條要執行的指令地址
0046500D C3 retn
進入46500A時棧資訊為:
0012FFA0 00465007 返回到 NullForm.00465007 來自 NullForm.0046500A
0012FFA4 7C930738 ntdll.7C930738
0012FFA8 FFFFFFFF
0012FFAC 0012FFF0
retn 之後:
EIP=465008
00465008 /EB 04 jmp short 0046500E //已修改EIP := EIP +1 因為指令轉換為 jmp short
0046500A |5D pop ebp // 來自call 0046500A。隱藏法:)
0046500B |45 inc ebp
0046500C |55 push ebp
0046500D |C3 retn
0046500E /E8 01000000 call 00465014 // F7進入。 又執行到了EIP := EIP +1 。單位元組進行。
00465013 EB 5D jmp short 00465072
00465015 BB EDFFFFFF mov ebx, -13
0046501A 03DD add ebx, ebp
0046501C 81EB 00500600 sub ebx, 65000
00465022 83BD 22040000 0>cmp dword ptr [ebp+422], 0
call 00465014
00465014 5D pop ebp //返回時EIP修改為:7C930738 ; NullForm.00465013
00465015 BB EDFFFFFF mov ebx, -13 //原EBX := 7FFDE000 ,現:EBX:=FFFFFFED
0046501A 03DD add ebx, ebp //EBX := FFFFFFED + 00465013 = 00465000
0046501C 81EB 00500600 sub ebx, 65000 //EBX := 400000 MZP
00465022 83BD 22040000 0>cmp dword ptr [ebp+422], 0
00465029 899D 22040000 mov dword ptr [ebp+422], ebx
0046502F 0F85 65030000 jnz 0046539A //長跳轉,移到此地址,按F4
00465035 8D85 2E040000 lea eax, dword ptr [ebp+42E]
0046503B 50 push eax
0046503C FF95 4D0F0000 call dword ptr [ebp+F4D]
進入00465014時棧資訊為:
0012FFA0 00465013 返回到 NullForm.00465013 來自 NullForm.00465014
0012FFA4 7C930738 ntdll.7C930738
0012FFA8 FFFFFFFF
0012FFAC 0012FFF0
jnz 0046539A //長跳轉,移到此地址,滑鼠點擊這一行,按F4
0046539A B8 84320500 mov eax, 53284 //立即數. 用於產生 OEP
0046539F 50 push eax
004653A0 0385 22040000 add eax, dword ptr [ebp+422] // EAX := NullForm.00453284
004653A6 59 pop ecx
004653A7 0BC9 or ecx, ecx
004653A9 8985 A8030000 mov dword ptr [ebp+3A8], eax // 動態修改程式指令.
//被修改指令的地址:00465013 + 3A8 = 4653BB
004653AF 61 popad
004653B0 75 08 jnz short 004653BA
004653B2 B8 01000000 mov eax, 1
004653B7 C2 0C00 retn 0C
004653BA 68 00000000 push 0 // 被修改的資料為 PUSH 的值
004653BF C3 retn
轉到0046539A時,cpu資訊為:
EAX 00000000
ECX 7C939AEB ntdll.7C939AEB
EDX 00400000 ASCII "MZP"
EBX 00000000
ESP 0012FFA4
EBP 00465013 NullForm.00465013
ESI 004570F0 NullForm.004570F0
EDI 004576EC NullForm.004576EC
EIP 0046539A NullForm.0046539A
C 0 ES 0023 32位 0(FFFFFFFF)
P 1 CS 001B 32位 0(FFFFFFFF)
A 0 SS 0023 32位 0(FFFFFFFF)
Z 1 DS 0023 32位 0(FFFFFFFF)
S 0 FS 003B 32位 7FFDF000(FFF)
T 0 GS 0000 NULL
D 0
O 0 LastErr ERROR_NO_IMPERSONATION_TOKEN (0000051D)
堆棧資訊為:
0012FFA4 7C930738 ntdll.7C930738
0012FFA8 FFFFFFFF
0012FFAC 0012FFF0
0012FFB0 0012FFC4
mov dword ptr [ebp+3A8], eax 執行完這行後,下面的指令轉為:
004653A9 8985 A8030000 mov dword ptr [ebp+3A8], eax
004653AF 61 popad
004653B0 75 08 jnz short 004653BA
004653B2 B8 01000000 mov eax, 1
004653B7 C2 0C00 retn 0C
004653BA 68 84324500 push 00453284 // OEP
004653BF C3 retn
F8執行,到達目的地:Dump之,OK!
00453284 55 db 55 ; CHAR 'U'
00453285 8B db 8B
00453286 EC db EC
00453287 83 db 83
00453288 C4 db C4
00453289 F0 db F0
0045328A B8 db B8
0045328B 14 db 14
0045328C 31 db 31 ; CHAR '1'
0045328D 45 db 45 ; CHAR 'E'
0045328E 00 db 00
0045328F E8 db E8
00453290 80 db 80
00453291 33 db 33 ; CHAR '3'
00453292 FB db FB
00453293 FF db FF
00453294 A1 db A1
00453295 20 db 20 ; CHAR ' '
00453296 4F db 4F ; CHAR 'O'
00453297 45 db 45 ; CHAR 'E'