不同opCode,Call的作用是不同的。
E8 Call Offset(调用普通函数)(VS)
FF 15 Call Dword ptr [ 地址 ] (调用IAT)(VS)
如何确定目标程序的语言?
1.OEP特征
2.链接器版本
3.区段信息
Borland C++程序 ( BC++ )
1.OEP特征
- OEP是一个短跳转,之后是一个字符串:fb:C++Hook
- 第一个调用的函数:GetModuleHandle
- 二进制特征:
EB 10 66 62 3A 43 2B 2B 48 4F 4F 4B

- IAT函数的调用通常都是 E8 跳转表 + FF25 IAT 地址

2.链接器版本 5.0

3.区段信息

Borland Delphi程序(Delphi)
1.OEP特征
- 二进制特征:
55 8B EC 83 C4 F0 B8 ?? ?? ?? ?? E8 ?? ?? ?? ?? A1 ?? ?? ?? ?? 8B 00 - OEP处有连续的5个Call,后面紧跟着一堆零;其中第一个Call里面调用了GetModuleHandle


- 由于 Delphi 和 BC++ 程序都是宝蓝公司的,所以 IAT 调用特征相同;即IAT函数的调用通常都是 E8 跳转表 + FF25 IAT 地址

2.链接器版本 2.25

3.区段信息

易语言、VC6.0(Debug、Release版本)
1.OEP特征
- 二进制特征:
55 8B EC 6A FF 68 ?? ?? ?? ?? 68 ?? ?? ?? ?? 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 - 第一个CALL是调用 GetVersion
- 易语言、Release版:SUB ESP,0x58

- Debug版:ADD ESP,-0x5C

2.区段信息、链接器版本 6.0



VS 程序的特征
VS 版本的不同会导致编写出的程序特征(链接器、入口点、区段)也不同。
- Debug 下编译的程序区段的数量相对于 Release 多一些
- Debug版的OEP在内存窗口(查看地址)时,不会显示IAT的名称,而Release版的却可以。
- (2008、2013) Debug 版本的程序入口点是 JMP -> Call + Call,而 Release版 是 Call + JMP

VS2008
1.OEP特征
- Debug版本( JMP -> Call + Call ):先跳转到某一个地址,地址代码有两个CALL。
第一个是初始化安全Cookie
第二个C运行库函数,内有Main函数或者Winmain函数


- Release版本( Call + JMP )

2.区段信息、链接器版本 9.0


VS2013、VS2012、VS2010
1.OEP特征
- Debug版本( JMP -> Call + Call ):先跳转到某一个地址,地址代码有两个CALL。


- Release版本( Call + JMP )

2.区段信息、链接器版本 12.0


VB( VB5、VB6 )
1.OEP特征
- Push参数之后,调用VB的Dll(msvbvm50 或 msvbvm60)
- VB6程序

- OEP 上面有一片调用IAT的代码(FF25 IAT 地址)

- VB5程序
- 同样的,在VB5中OEP 上面也是一片调用IAT的代码(FF25 IAT 地址)

2.区段信息、链接器版本


汇编程序
- OEP的特征:文件体积小,入口点直接就是逻辑代码;由于其编写代码不包括C运行库或者其他的一些库,OEP完全由程序员自己指定,那么特征不明显。
- 链接器版本:一般链接器版本5.12 或者 2.18
本文探讨了通过OEP特征、链接器版本和区段信息来识别不同编程语言的方法,如BC++、Delphi、易语言、VC6.0、VS系列、VB及汇编程序。强调OEP的特征不能单独作为判断依据,需要多层验证。
1604

被折叠的 条评论
为什么被折叠?



