DLL函数内部记录格式初探
来源:互联网 发布:网络语比格是什么意思 编辑:程序博客网 时间:2024/05/18 00:43
发信人: yago (亚格), 信区: VisualC
标 题: DLL函数内部记录格式初探
发信站: BBS 水木清华站 (Mon Dec 4 10:17:34 2000)
主持人注:以下内容只适合COM进程内组件,对于普通DLL,从函数名通常无法看出参数类型。
DLL函数内部记录格式初探(针对COM进程内组件)
某接口定义如下:
class IAdTran: public IUnKnown
{
public:
virtual HRESULT Initialize(void)=0; // Func1
virtual HRESULT InitializeTrace(ITrace* pTrace)=0; // Func2
virtual HRESULT GetDestAddress(CsmStatus* pCsm)=0; // Func3
virtual HRESULT ReloadDB(void)=0; // Func4
virtual ULONG GetEntryCount(void)=0; // Func5
virtual void DeleteEntry(TranTblEntry* pEntry)=0; // Func6
virtual void AddEntry(TranTblEntry* pEntry)=0; // Func7
virtual BOOL QueryEntry(UINT nItem,TranTblEntry* pEntry)=0; // Func8
}
在组件中的内在表现形式:(注意:在dll中自动按字母顺序排列了)
0001 ?AddEntry@CAdTran@@UAEXPAUtranTblEntry@@@Z
0002 ?DeleteEntry@CAdTran@@UAEXPAUtranTblEntry@@@Z
0003 ?GetDestAddress@CAdTran@@UAEJPAUCsmStat@@@Z
0004 ?GetEntryCount@CAdTran@@UAEKXZ
0005 ?Initialize@CAdTran@@UAEJXZ
0006 ?InitializeTrace@CAdTran@@UAEJPAVITrace@@@Z
0007 ?QueryEntry@CAdTran@@UAEHIPAUtranTblEntry@@@Z
0008 ?ReloadDB@CAdTran@@UAEJXZ
0009 ?QueryEntry@CAdTran@@UAEKKPAUCsmStat@@@Z
分析一:(注:本处有些具体的尝试对比的过程省掉了)
(1) 参数记录格式
@this @@UAExxxx@@@Z (i)
@this @@UAExxxxXZ (ii)
对于参数列表为空(仅含this指针)的成员函数如Func1,Func4,Func5,参数记录格式采用
(ii).
(注意:@@前导串可能有多个,具体数目规则见后)
(2) 成员函数的参数/返回值均在@@引导串中描述,分析后的结果如下:
(i) @@UAE为固定前导串,引导后面的参数描述符,具体记录顺序为返回值,参数1,参数
2...
(ii)参数描述符与数据类型对照表
+++++++++++++++++++++++++++++++++
| 参数描述符 | 数据类型 |
+++++++++++++++++++++++++++++++++
| D | char |
+---------------+---------------+
| E | UCHAR |
+---------------+---------------+
| F | short |
+---------------+---------------+
| G | USHORT |
+---------------+---------------+
| H | int |
+---------------+---------------+
| I | UINT |
+---------------+---------------+
| J | long |
+---------------+---------------+
| K | ULONG |
+---------------+---------------+
| M | float |
+---------------+---------------+
| N | double |
+---------------+---------------+
| X | void |
+---------------+---------------+
| _N | bool |
+---------------+---------------+
| W4 | enum |
+---------------+---------------+
| U | class/struct |
+---------------+---------------+
| V | Interface |
+---------------+---------------+
| PA | pointer |
+---------------+---------------+
| Z | 终止符 |
+---------------+---------------+
(注:bool在VC5.0之前定义为int,之后作为内建类型,占一个byte)
(iii)实例分析
分析一:0003 ?GetDestAddress@CAdTran@@UAEJPAUCsmStat@@@Z
@CAdTran this指针(隐含)
@@UAE 参数列表符前导
JPAUCsmStat 参数串
J-->long 即返回值为long型
PA 引导指针
U 引导类/结构
CsmStat 类/结构名
PAUCsmStat 类/结构CsmStat的指针
@@@Z 参数列表终结
分析二:0004 ?GetEntryCount@CAdTran@@UAEKXZ
@CAdTran this指针(隐含)
@@UAE 参数列表符前导
KX 参数串
K-->ULONG 即返回值为ULONG型
X-->void 即参数为空
Z 参数列表终结
(iv)多@@引导串
在实际分析中可能会碰到多个@@引导串的情况,具体分析与上面一样,不过就是只有第
一个@@引导会
有UAE前导(或者从另一个角度看,可以视UAE为返回值的前导串)。
(v)进一步的工作
通过上面的分析我们就可以有二进制的dll文件构造出函数声明,但是函数参数/返回值中的类/结构/接口的直接定义却还无法获得,进一步的分析还望各位大虾出手了。鄙人先扔点砖块,希望 能砸出几块宝玉来。
(对类/结构/接口的定义分析可能Debug版较容易入手,附带信息较多嘛!)
标 题: DLL函数内部记录格式初探
发信站: BBS 水木清华站 (Mon Dec 4 10:17:34 2000)
主持人注:以下内容只适合COM进程内组件,对于普通DLL,从函数名通常无法看出参数类型。
DLL函数内部记录格式初探(针对COM进程内组件)
某接口定义如下:
class IAdTran: public IUnKnown
{
public:
virtual HRESULT Initialize(void)=0; // Func1
virtual HRESULT InitializeTrace(ITrace* pTrace)=0; // Func2
virtual HRESULT GetDestAddress(CsmStatus* pCsm)=0; // Func3
virtual HRESULT ReloadDB(void)=0; // Func4
virtual ULONG GetEntryCount(void)=0; // Func5
virtual void DeleteEntry(TranTblEntry* pEntry)=0; // Func6
virtual void AddEntry(TranTblEntry* pEntry)=0; // Func7
virtual BOOL QueryEntry(UINT nItem,TranTblEntry* pEntry)=0; // Func8
}
在组件中的内在表现形式:(注意:在dll中自动按字母顺序排列了)
0001 ?AddEntry@CAdTran@@UAEXPAUtranTblEntry@@@Z
0002 ?DeleteEntry@CAdTran@@UAEXPAUtranTblEntry@@@Z
0003 ?GetDestAddress@CAdTran@@UAEJPAUCsmStat@@@Z
0004 ?GetEntryCount@CAdTran@@UAEKXZ
0005 ?Initialize@CAdTran@@UAEJXZ
0006 ?InitializeTrace@CAdTran@@UAEJPAVITrace@@@Z
0007 ?QueryEntry@CAdTran@@UAEHIPAUtranTblEntry@@@Z
0008 ?ReloadDB@CAdTran@@UAEJXZ
0009 ?QueryEntry@CAdTran@@UAEKKPAUCsmStat@@@Z
分析一:(注:本处有些具体的尝试对比的过程省掉了)
(1) 参数记录格式
@this @@UAExxxx@@@Z (i)
@this @@UAExxxxXZ (ii)
对于参数列表为空(仅含this指针)的成员函数如Func1,Func4,Func5,参数记录格式采用
(ii).
(注意:@@前导串可能有多个,具体数目规则见后)
(2) 成员函数的参数/返回值均在@@引导串中描述,分析后的结果如下:
(i) @@UAE为固定前导串,引导后面的参数描述符,具体记录顺序为返回值,参数1,参数
2...
(ii)参数描述符与数据类型对照表
+++++++++++++++++++++++++++++++++
| 参数描述符 | 数据类型 |
+++++++++++++++++++++++++++++++++
| D | char |
+---------------+---------------+
| E | UCHAR |
+---------------+---------------+
| F | short |
+---------------+---------------+
| G | USHORT |
+---------------+---------------+
| H | int |
+---------------+---------------+
| I | UINT |
+---------------+---------------+
| J | long |
+---------------+---------------+
| K | ULONG |
+---------------+---------------+
| M | float |
+---------------+---------------+
| N | double |
+---------------+---------------+
| X | void |
+---------------+---------------+
| _N | bool |
+---------------+---------------+
| W4 | enum |
+---------------+---------------+
| U | class/struct |
+---------------+---------------+
| V | Interface |
+---------------+---------------+
| PA | pointer |
+---------------+---------------+
| Z | 终止符 |
+---------------+---------------+
(注:bool在VC5.0之前定义为int,之后作为内建类型,占一个byte)
(iii)实例分析
分析一:0003 ?GetDestAddress@CAdTran@@UAEJPAUCsmStat@@@Z
@CAdTran this指针(隐含)
@@UAE 参数列表符前导
JPAUCsmStat 参数串
J-->long 即返回值为long型
PA 引导指针
U 引导类/结构
CsmStat 类/结构名
PAUCsmStat 类/结构CsmStat的指针
@@@Z 参数列表终结
分析二:0004 ?GetEntryCount@CAdTran@@UAEKXZ
@CAdTran this指针(隐含)
@@UAE 参数列表符前导
KX 参数串
K-->ULONG 即返回值为ULONG型
X-->void 即参数为空
Z 参数列表终结
(iv)多@@引导串
在实际分析中可能会碰到多个@@引导串的情况,具体分析与上面一样,不过就是只有第
一个@@引导会
有UAE前导(或者从另一个角度看,可以视UAE为返回值的前导串)。
(v)进一步的工作
通过上面的分析我们就可以有二进制的dll文件构造出函数声明,但是函数参数/返回值中的类/结构/接口的直接定义却还无法获得,进一步的分析还望各位大虾出手了。鄙人先扔点砖块,希望 能砸出几块宝玉来。
(对类/结构/接口的定义分析可能Debug版较容易入手,附带信息较多嘛!)
- DLL函数内部记录格式初探
- dll初探
- 不要在Windows DLL内部使用函数指针进行比较!
- 不要在Windows DLL内部使用函数指针进行比较!
- 一个导出类的内部函数的dll
- VB.net调用C++ 6.0 DLL内部函数
- DLL 内部的非模态对话框的 PreTranslateMessage 函数不执行
- 通过内联汇编实现DLL自卸载,即在DLL的函数内部FreeLibrary自己
- 【记录】atoi() 与 itoa()函数的内部实现
- 位图文件内部初探(转)
- 初探spring aop内部实现
- TIF格式图像文件初探
- TIF格式图像文件初探
- TIF格式图像文件初探
- TIF格式图像文件初探
- PVR图像文件格式初探
- PVR图像文件格式初探
- PVR图像文件格式初探
- 使用DUMPBIN命令
- Unicode字符编码规范
- 高级Bash脚本编程指南学习笔记
- 无页面刷新上传文件
- liferay 初步分析
- DLL函数内部记录格式初探
- 生活指南:IT人士健康生活应多吃的几种食物
- 从Windows 1.0到Windows Vista(多图)
- IFRAME自动适应网页宽度
- MFC消息响应机制分析
- COM编程入门
- T-SQL象数组一样处理字符串、分割字符串
- 试玩matplotlib碰到的问题
- 《中国贫富标准线》【看看自己是哪一档】