文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» C/C++ » DLL函数内部记录格式初探       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: [转载] DLL函数内部记录格式初探  ( 查看:447  回复:0 )   
 
ribut9225
主版主  点击可查看详细


开坛元老   内阁大臣   诚信兄弟   主版主专用   巨蟹座  
帖子 3116
精华 1
无忧币 5987
积分 4103
阅读权限 150
来自 (保密)
注册日期 2006-6-22
最后登录 2008-10-14 离线

[查看资料]  [发短消息]  [Blog
  QQ       
发表于:2007-9-21 09:42   标题:DLL函数内部记录格式初探
上一帖 |
DLL函数内部记录格式初探

发信人: 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版较容易入手,附带信息较多嘛!)



用户必读,51CTO积分系统调整通知
2007-9-21 09:421楼
[ 顶部 ]
     
论坛跳转:  

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号