一. DUMPBIN 命令行
Microsoft COFF 二進制文件轉儲器 (DUMPBIN.EXE) 顯示有關 32 位通用對象文件格式 (COFF) 二進制文件的信息。可以使用 DUMPBIN 檢查 COFF 對象文件、標準 COFF 對象庫、可執行文件和動態鏈接庫 (DLL)。(在VC Studio 目錄下有dumpbin.exe工具,環境配置文件路徑:visual Studio/VC98/Bin/VCVARS32.BAT,可放到命令提示符下運行。執行後,在其它的命令提示符下可執行dumpbin.exe命令了。)
注意 DUMPBIN 僅從命令行運行。
在使用VC時,可以用DUMPBIN。EXE來得到某個DLL中所輸出的符號的清單。如下面的命令:dumpbin -exports Cmpnt1.dll
如:
C:/WINDOWS/system32>dumpbin -exports msgsvc.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
Dump of file msgsvc.dll
File Type: DLL
Section contains the following exports for msgsvc.dll
0 characteristics
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 00004ABF ServiceMain
2 1 00004595 SvchostPushServiceGlobals
Summary
1000 .data
1000 .reloc
1000 .rsrc
8000 .text
C:/>dumpbin
Microsoft (R) COFF Binary File Dumper Version 6.00.844
Copyright (C) Microsoft Corp 1992-1998. All rights res
usage: DUMPBIN [options] [files]
options:
/ALL
/ARCH
/ARCHIVEMEMBERS
/DEPENDENTS
/DIRECTIVES
/DISASM
/EXPORTS
/FPO
/HEADERS
/IMPORTS
/LINENUMBERS
/LINKERMEMBER[:{1|2}]
/LOADCONFIG
/OUT:filename
/PDATA
/RAWDATA[:{NONE|BYTES|SHORTS|LONGS}[,#]]
/RELOCATIONS
/SECTION:name
/SUMMARY
/SYMBOLS
若要運行 DUMPBIN,請使用下列語法:
DUMPBIN [options] files...
指定一個或多個二進制文件,以及控制信息所需的任何選項。DUMPBIN 將該信息顯示到標準輸出。可以將輸出重定向到文件,或者使用 /OUT 選項爲輸出指定文件名。
當在文件上運行 DUMPBIN 但未指定選項時,DUMPBIN 顯示 /SUMMARY 輸出。
當鍵入命令 dumpbin 但沒有任何其他命令行輸入時,DUMPBIN 顯示彙總其選項的用法語句。
C:/demo>dumpbin -exports kk_richedit.dll(命令提示符下,點擊右鍵,選擇標記,選擇文本之後,在點擊右鍵,就把文本粘貼上了)
顯示如下信息:
1 0 00001096 ??0KK_RichEdit@@QAE@ABV0@@Z
2 1 0000115E ??0KK_RichEdit@@QAE@XZ
3 2 000010E6 ??1KK_RichEdit@@UAE@XZ
4 3 000011D6 ??4KK_RichEdit@@QAEAAV0@ABV0@@Z
5 4 0003B038 ??_7KK_RichEdit@@6B@
前面數字是導出函數序號,後邊的數字表示提示碼,導出的DLL函數名字。C++爲了支持函數的重載,在編譯時,對函數名字進行了改編,(也叫名字粉碎)。
如果希望名字在編譯時不要進行改編,可以在聲明前加上extern “C”必須是大寫的C。整個名字可以寫成:
#define RICHEDIT_API extern “C” _declspec(dllexport)
extern “C”,不能夠導出類的成員函數,只能夠導出全局函數,讓全局函數不發生名字改編。
另外,如果調用約定改變了,那麼即使使用 extern “C”也沒有作用。例如:函數名字前面加上__stdcall,函數名字仍然會發生名字改編。
解決名字改編的問題:(模塊定義文件.def)
LIBRARY DLLNAME
EXPORTS ;用法可輸入到MSDN中,查看幫助
動態鏈接庫的加載LoadLibrary不僅可加載DLL程序,還可以加載EXE程序。GetProcAdress()可以得到導出函數的指針。
動態加載不需要頭文件,也不需要lib文件,只要DLL文件就可以了。
注意:動態鏈接庫導出的調用約定是什麼,在使用時也要聲明成相同的調用約定,例如:typedef int (__stdcall *ADDPROC)(int a,int b)
查看調用DLL的EXE文件是否加載DLL模塊。
可以用dumpbin –imports name.exe可以看到沒有DLL文件,因爲是動態加載,所以看不到了。
GetProcAdress()中也可以通過序號調用函數MAKEINTRESOURCE
()
ADDPROC ADD=(ADDPROC)GetProcAddress(hInst, MAKEINTRESOURCE(1));
調用序號爲
1
的函數。
什麼情況下需要用到
DLLMAIN()
函數,
如果有些函數需要使用
DLL
的句柄,可以用傳到
DLLMAIN()
的參數進行調用。
二. Depends工具,VC工具裏可找到,不僅可以打開EXE文件,也可以打開DLL文件,查看其導出函數。
代碼:extern int add(); 改爲 _declspec(dllimport)來引入函數。
不同之處是,用_declspec(dllimport)聲明時,告訴編譯器函數是從動態鏈接庫中引入的,編譯器編譯的代碼就會比較優化的。
GetForegroundWindow
The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working). The system assigns a slightly higher priority to the thread that creates the foreground window than it does to other threads.
API函數可以得到DLL調用者的窗口句柄。
DLL使用API函數需要加載頭文件 #include <windows.h>
C運行庫頭文件 #include <studio.h>
其他DUMPBIN命令:
/ALL
此選項顯示除代碼反彙編外的所有可用信息。使用 /DISASM 顯示反彙編。可以與 /ALL 一起使用 /RAWDATA:NONE 來省略文件的原始二進制詳細資料。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/ARCHIVEMEMBERS
此選項顯示有關庫成員對象的最少信息。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/CLRHEADER file
此處:
file
用 /clr 生成的圖像文件。
備註
CLRHEADER 顯示有關在任何託管程序中使用的 .NET 頭的信息。輸出顯示 .NET 頭及其中各節的位置和大小(以字節計)。
File Format Spec.doc 描述 .NET 頭中的信息。NET SDK 將 File Format Spec.doc 安裝在 Tools Developers Guide 目錄中。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/DIRECTIVES
此選項轉儲圖像中由編譯器生成的 .directive 節。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/DEPENDENTS
轉儲圖像從中導入函數的 DLL 的名稱。不要轉儲導入函數名。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/DISASM
此選項顯示代碼段的反彙編,如果出現在文件中則使用符號。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/EXPORTS
此選項顯示從可執行文件或 DLL 導出的所有定義。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/FPO
此選項顯示框架指針優化 (FPO) 記錄。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/HEADERS
此選項顯示文件頭和每節的頭。當用於庫時,顯示每個成員對象的頭。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/IMPORTS[:file]
此選項顯示導入到可執行文件或 DLL 的 DLL 列表(靜態鏈接的和延遲加載)和上述每個 DLL 的各個導入。
可選 file 規範允許指定僅顯示某個 DLL 的導入。例如:
dumpbin /IMPORTS:msvcrt.dll
此選項顯示的輸出與 /EXPORTS 輸出相似。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/LINENUMBERS
此選項顯示 COFF 行號。如果對象文件是用程序數據庫 (/Zi)、C7 兼容 (/Z7) 或僅限行號 (/Zd) 編譯的,則它包含行號。如果可執行文件或 DLL 是與生成調試信息 (/DEBUG) 鏈接的,則它包含 COFF 行號。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/LINKERMEMBER[:{1|2}]
此選項顯示庫中定義的公共符號。指定參數 1 將按對象順序顯示符號及其偏移量。指定參數 2 將顯示對象的偏移量和索引號,然後按字母順序列出這些符號及每個符號的對象索引。若要兩個輸出都獲得,指定不帶數字參數的 /LINKERMEMBER。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/LOADCONFIG
此選項轉儲 IMAGE_LOAD_CONFIG_DIRECTORY 結構,此結構是由 Windows NT 加載程序使用並在 WINNT.H 中定義的可選結構。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/OUT:filename
此選項指定輸出的 filename。默認情況下,DUMPBIN 將信息顯示到標準輸出。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/PDBPATH[:VERBOSE] filename
此處:
filename
要爲其查找匹配 .pdb 文件的 .dll 或 .exe 文件名。
VERBOSE(可選)
報告曾嘗試在其中定位 .pdb 文件的所有目錄。
備註
/PDBPATH 將沿調試器搜索 .pdb 文件的同一路徑搜索計算機,並將報告哪些 .pdb 文件(若有)和 filename 中指定的文件相對應。
使用 Visual Studio 調試器時可能會遇到問題,這是因爲調試器對調試文件的不同版本使用 .pdb 文件。
/PDBPATH 將沿下列路徑搜索 .pdb 文件:
- 檢查可執行文件駐留的位置。
- 檢查寫入可執行文件的 PDB 的位置。這通常是圖像被鏈接時的位置。
- 沿 Visual Studio IDE 中配置的搜索路徑檢查。
- 沿 _NT_SYMBOL_PATH 和 _NT_ALT_SYMBOL_PATH 環境變量中的路徑檢查。
- 在 Windows 目錄中檢查。
/PDATA
僅用於 RISC 處理器。
此選項從圖像或對象轉儲異常表 (.pdata)。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/RAWDATA[:{1|2|4|8|NONE[,number]]
此選項顯示文件中每節的原始內容。參數控制顯示格式,如下所示:
參數 |
結果 |
1 |
默認值。內容以十六進制字節顯示,如果內容具有打印的表示形式,則還顯示爲 ASCII 字符。 |
2 |
內容顯示爲十六進制的 2 字節值。 |
4 |
內容顯示爲十六進制的 4 字節值。 |
8 |
內容顯示爲十六進制的 8 字節值。 |
NONE |
取消顯示原始數據。此參數對控制 /ALL 輸出很有用。 |
Number |
顯示的行被設置爲每行具有 number 個值的寬度。 |
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/RELOCATIONS
此選項顯示對象或圖像中的任何重定位。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/SECTION:section
此選項限制與指定的 section 有關的信息的輸出。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/SUMMARY
此選項顯示有關節的最少信息(包括總大小)。如果未指定其他選項,則此選項爲默認值。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/SYMBOLS
此選項顯示 COFF 符號表。符號表存在於所有對象文件中。而對於圖像文件,只有當它是與 /DEBUG 鏈接的時,它才包含 COFF 符號表。
下面是關於 /SYMBOLS 輸出的說明。通過查閱 winnt.h(IMAGE_SYMBOL 和 IMAGE_AUX_SYMBOL)或 COFF 文檔,可找到有關 /SYMBOLS 輸出含義的附加信息。
假設有下列示例轉儲:
Dump of file main.obj
File Type: COFF OBJECT
COFF SYMBOL TABLE
000 00000000 DEBUG notype Filename | .file
main.cpp
002 000B1FDB ABS notype Static | @comp.id
003 00000000 SECT1 notype Static | .drectve
Section length 26, #relocs 0, #linenums 0, checksum
005 00000000 SECT2 notype Static | .text
Section length 23, #relocs 1, #linenums 0, checksum 459FF
007 00000000 SECT2 notype () External | _main
008 00000000 UNDEF notype () External | ?MyDump@@YAXXZ (void __cdecl MyDump(void))
String Table Size = 0x10 bytes
Summary
26 .drectve
23 .text
對於以符號號碼開頭的行,下列說明描述了含有與用戶相關的信息的列:
- 開頭的 3 位數字是符號索引/號碼。
- 如果第三列包含 SECTx,則符號在對象文件的那一節中定義。但如果出現 UNDEF,則它不在那個對象中定義並且必須在其他地方被解析。
- 第五列 (Static, External) 說明符號是否只在那個對象的內部可見,或者是否是公共的(外部可見)。靜態符號 _sym 不會鏈接到公共符號 _sym;這些符號是名爲 _sym 的函數的兩種不同實例。
編號行中的最後一列是符號名(修飾名和未修飾名)。
只有 /HEADERS DUMPBIN 選項可用於由 /GL 編譯器選項產生的文件。
/UNWINDINFO
在程序圖像(例如 exe 和 dll)中轉儲結構化異常處理 (SEH) 表的展開描述符。/UNWINDINFO 僅適用於 IA64 圖像。