1、所有的Delphi7界面程序,进入到OEP后的第一个函数内容都类似于如下形式:
00405BC8 /$ 53 push ebx
00405BC9 |. 8BD8 mov ebx, eax
00405BCB |. 33C0 xor eax, eax
00405BCD |. A3 9CD04400 mov dword ptr [44D09C], eax
00405BD2 |. 6A 00 push 0 ; /pModule = NULL
00405BD4 |. E8 2BFFFFFF call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
00405BD9 |. A3 64F64400 mov dword ptr [44F664], eax
00405BDE |. A1 64F64400 mov eax, dword ptr [44F664]
00405BE3 |. A3 A8D04400 mov dword ptr [44D0A8], eax
00405BE8 |. 33C0 xor eax, eax
00405BEA |. A3 ACD04400 mov dword ptr [44D0AC], eax
00405BEF |. 33C0 xor eax, eax
00405BF1 |. A3 B0D04400 mov dword ptr [44D0B0], eax
00405BF6 |. E8 C1FFFFFF call 00405BBC
00405BFB |. BA A4D04400 mov edx, 0044D0A4
00405C00 |. 8BC3 mov eax, ebx
00405C02 |. E8 51DFFFFF call 00403B58
00405C07 |. 5B pop ebx
00405C08 \. C3 retn
2、Delphi特征码定位
第一个CALL
A3??????00A1??????00A3??????0033C0A3??????0033C0A3??????00
第二个CALL
53A1??????00833800740A8B1D??????008B1BFFD35BC3
OEP
558BEC33C05568??????0064FF3064892033C05A595964891068??????00C3E9
Ctrl+B查找“558BEC33C05568??????0064FF3064892033C05A595964891068??????00C3E9”二进制串,找到如下:
0044C890 . 55 push ebp ->再查找这里的地址
0044C891 . 8BEC mov ebp, esp
0044C893 . 33C0 xor eax, eax
0044C895 . 55 push ebp
0044C896 . 68 AFC84400 push 0044C8AF
0044C89B . 64:FF30 push dword ptr fs:[eax]
0044C89E . 64:8920 mov dword ptr fs:[eax], esp
0044C8A1 . 33C0 xor eax, eax
0044C8A3 . 5A pop edx
0044C8A4 . 59 pop ecx
0044C8A5 . 59 pop ecx
0044C8A6 . 64:8910 mov dword ptr fs:[eax], edx
0044C8A9 . 68 B6C84400 push 0044C8B6
0044C8AE > C3 retn ; RET 用作跳转到 0044C8B6
然后再Ctrl+B查找“90 C8 44 00”二进制串,即可到过OEP附近。
3、在Delphi、BC++程序中,对系统函数的调用都是FF25型,即JMP [xxxxxxxx] / 6字节,机器码为FF25 XXXXXXXX ,知道这一点有助于IAT的修复。
4、Delphi7编写的程序,在代码段的开始位置会有“Boolean”的字样,可在数据窗口中查看。
5、VC6编写的程序,入口点类似于如下样式:
00409E65 >/$ 55 push ebp
00409E66 |. 8BEC mov ebp, esp
00409E68 |. 6A FF push -1
00409E6A |. 68 006A4200 push 00426A00 ;注意这里连续push了两个地址,这是第一个显著特征
00409E6F |. 68 64D74000 push 0040D764 ; SE 处理程序安装
00409E74 |. 64:A1 0000000>mov eax, dword ptr fs:[0]
00409E7A |. 50 push eax
00409E7B |. 64:8925 00000>mov dword ptr fs:[0], esp
00409E82 |. 83EC 58 sub esp, 58
00409E85 |. 53 push ebx
00409E86 |. 56 push esi
00409E87 |. 57 push edi
00409E88 |. 8965 E8 mov dword ptr [ebp-18], esp
00409E8B |. FF15 0C424200 call dword ptr [<&KERNEL32.GetVersion>; 这里调用kernel32.GetVersion,第二个显著特征
00409E91 |. 33D2 xor edx, edx
5、在VC、ASM程序中,对系统函数的调用都是FF15型,即CALL [XXXXXXXX] / 6字节,机器码为FF15 XXXXXXXX 。
6、BC++的程序,在OEP后面不远处有如下代码:
004013C8 /$ 60 pushad
004013C9 |. BB 0050B0BC mov ebx, BCB05000
004013CE |. 53 push ebx
004013CF |. 68 AD0B0000 push 0BAD
004013D4 \. C3 retn
可查找该二进制串以方便地定位OEP。
7、VB程序的入口点是如下形式:
004014AA $- FF25 F0104000 jmp dword ptr [<&MSVBVM60.#100>] ; MSVBVM60.ThunRTMain
004014B0 > $ 68 28264000 push 00402628
004014B5 . E8 F0FFFFFF call <jmp.&MSVBVM60.#100>
其中,00402628处的内容如下:
00402628 56 42 35 21 F0 1F 76 62 36 63 68 73 2E 64 6C 6C VB5!?vb6chs.dll
如果OEP处的代码被偷取,可以查找“VB5!?vb6chs.dll”字符串来还原OEP。后面的call <jmp.&MSVCBM60.#100>实际就是call 004014AA。