转载自https://blog.csdn.net/kkfd1002/article/details/79832269
转载自https://blog.csdn.net/x356982611/article/details/48370297
脱壳前如果知道壳的版本和编译程序的语言和编译器将事半功倍
特征1:VC链接器版本
VS版本 | 链接器版本 |
---|---|
VS2019 | 14.21 |
VS2017 | 14.12 |
VS2015 | 14.0, 14.1 |
VS2013 | 12.0 |
VS2012 | 11.0 |
VS2010 | 10.0 |
VS2008 | 9.0 |
VS2005 | 8.0 |
VC2003 | 7.0 7.1 |
VC5/BC++ | 5.0 |
DelPhi | 2.5 |
VB5 | 4.20 |
特征2:OEP
a0) VB5:
【VB5】的OEP平衡堆栈是 sub esp,0x54
【VB5】的OEP第一个API调用是GetStartupInfoA
【VB5】程序的IAT引用,都是FF15型的
a1) VB6
【VB6】的OEP平衡堆栈是 sub esp,0x4C
【VB6】的OEP第一个API调用是GetStartupInfoA
【VB6】程序的IAT引用,都是FF15型的
// Microsoft Visual Basic 5.0 / 6.0
FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>] //MSVBVM60.ThunRTMain
68 147C4000 PUSH PACKME.00407C14
E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100>
0000 ADD BYTE PTR DS:[EAX],AL
0000 ADD BYTE PTR DS:[EAX],AL
0000 ADD BYTE PTR DS:[EAX],AL
3000 XOR BYTE PTR DS:[EAX],AL
//或省略第一行的JMP
68 D0D44000 push dumped_.0040D4D0
E8 EEFFFFFF call <jmp.&msvbvm60.ThunRTMain>
0000 add byte ptr ds:[eax],al
0000 add byte ptr ds:[eax],al
0000 add byte ptr ds:[eax],al
3000 xor byte ptr ds:[eax],al
0000 add byte ptr ds:[eax],al
b0) Delphi
【Delphi】OEP上面是一个地址
【Delphi】OEP处 有5个CALL
【Delphi】OEP 5个CALL之后,全是0
【Delphi】OEP处第一个CALL有GetModuleHandleA调用
【Delphi】的IAT调用是 FF25形式的
55 PUSH EBP
8BEC MOV EBP,ESP
83C4 EC ADD ESP,-14
53 PUSH EBX
56 PUSH ESI
57 PUSH EDI
33C0 XOR EAX,EAX
8945 EC MOV DWORD PTR SS:[EBP-14],EAX
B8 20975000 MOV EAX,unpack.00509720
E8 84CCEFFF CALL unpack.0040694C
b1) BC++
【BC++】 二进制特征:EB1066623A432B2B484F4F4B90
【BC++】 OEP的第一个API调用是 GetModuleHandleA
【BC++】 IAT调用是 FF25形式的
EB 10 JMP SHORT BCLOCK.0040164E
66 DB 66 ; CHAR 'f'
62 DB 62 ; CHAR 'b'
3A DB 3A ; CHAR ':'
43 DB 43 ; CHAR 'C'
2B DB 2B ; CHAR '+'
2B DB 2B ; CHAR '+'
48 DB 48 ; CHAR 'H'
4F DB 4F ; CHAR 'O'
4F DB 4F ; CHAR 'O'
4B DB 4B ; CHAR 'K'
90 NOP
E9 DB E9
DD OFFSET BCLOCK.___CPPdebugHook
A1 8BE04E00 MOV EAX,DWORD PTR DS:[4EE08B]
C1E0 02 SHL EAX,2
A3 8FE04E00 MOV DWORD PTR DS:[4EE08F],EAX
52 PUSH EDX
6A 00 PUSH 0 ; /pModule = NULL
E8 DFBC0E00 CALL ; \GetModuleHandleA
8BD0 MOV EDX,EAX
c) VC6/E语言(通过分析,发现二者特征一致,可以判定E语言和VC6如出一辙)
【VC6】的OEP平衡堆栈是 sub esp,0x58 或 sub esp,0x68或add esp, -0x5C
【VC6】的OEP第一个API调用是GetVersion
【VC6】程序的IAT引用,都是FF15型的
//入口点特征代码
55 PUSH EBP ; (初始 cpu 选择)
8BEC MOV EBP,ESP
6A FF PUSH -1
68 ???????? PUSH Screensh.00563740
68 ???????? PUSH Screensh.0049C78C ; SE 处理程序安装
64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
50 PUSH EAX
64:8925 00000>MOV DWORD PTR FS:[0],ESP
83EC 58 SUB ESP,58
d) VS2013
【VS2013】开始处,call xxx; jmp xxx;
【VS2013】的OEP平衡堆栈是sub esp, 0x44
【VS2013】的OEP第一个API调用是GetStartupInfoW
【VS2013】Release第一个API调用GetSystemTimeAsFileTime
【VS2013】程序的IAT引用,都是FF15型的
e)Dasm
6A 00 PUSH 0 ; /pModule = NULL
E8 C50A0000 CALL <JMP.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
A3 0C354000 MOV DWORD PTR DS:[40350C],EAX
E8 B50A0000 CALL <JMP.&KERNEL32.GetCommandLineA> ; [GetCommandLineA
A3 10354000 MOV DWORD PTR DS:[403510],EAX
6A 0A PUSH 0A ; /Arg4 = 0000000A
FF35 10354000 PUSH DWORD PTR DS:[403510] ; |Arg3 = 00000000
6A 00 PUSH 0 ; |Arg2 = 00000000
FF35 0C354000 PUSH DWORD PTR DS:[40350C] ; |Arg1 = 00000000