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版較容易入手,附帶信息較多嘛!)
標 題: 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版較容易入手,附帶信息較多嘛!)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.