DLL怎么導(dǎo)出函數(shù)?
1.1 使用關(guān)鍵字_decslpec(dllexport)
1.2 使用def文件導(dǎo)出在函數(shù)前加extern "C" 起到什么作用?
2.1 禁用c++的名稱粉碎機制一個軟件,在不修改已有代碼的前提下,如何加載新的DLL?
3.1 軟件在啟動時, 遍歷指定文件夾找到所有的dll,并加載它們。
- 一個軟件,在不修改已有代碼的前提下,擴展新的功能
4.1 以插件的形式擴展新功能
4.1.1 調(diào)用軟件帶有的功能
4.1.2 提供導(dǎo)出函數(shù)供軟件調(diào)用
4.2 以補丁的形式。
4.3 軟件加載DLL時,如何識別DLL是為本軟件編寫的插件?
4.3.1 先加載DLL(不進(jìn)行判斷)
4.3.2 獲取DLL指定的導(dǎo)出函數(shù)(如果獲取失敗,就可以說明dll不是本軟件的插件)
4.3.3 調(diào)用dll的導(dǎo)出函數(shù), 判斷導(dǎo)出函數(shù)的返回值是否符合要求(要求可以是一個版本號,或者是TRUE和FALSE)。
4.4 當(dāng)軟件想要在特定場景下調(diào)用DLL的導(dǎo)出函數(shù)時,也會動態(tài)獲取dll的導(dǎo)出函數(shù),如果能獲取到就調(diào)用,獲取不到就不調(diào)用來的.
4.4.1 當(dāng)軟件希望它的一個功能能夠被插件所擴展的時候,就可以在實現(xiàn)這個功能的時候調(diào)用dll的特定導(dǎo)出函數(shù)。
- 當(dāng)一個加載DLL的exe不是自己編寫的,但DLL是自己編寫的,怎么調(diào)試DLL?
5.1 不直接調(diào)試dll,而是調(diào)試加載dll的exe
5.2 在vs的項目屬性->調(diào)試->命令->設(shè)置為exe的路徑
5.3 在vs的項目屬性->調(diào)試->工作目錄->設(shè)置為exe所在目錄
OD插件的編寫:
- 導(dǎo)入頭文件和庫文件
- 導(dǎo)出一個必選的函數(shù): ODBG2_Pluginquery
OD的反調(diào)試插件:
- 導(dǎo)出一個必選的函數(shù): ODBG2_Pluginquery
- 在被調(diào)試進(jìn)程被加載到OD的時候,獲取被調(diào)試進(jìn)程的PEB的地址
然后將PEB.BeginDebug字段設(shè)置為0
x32dbg命令行顯示peb/teb數(shù)據(jù)的插件:
- 導(dǎo)出3個必選的函數(shù)
- 在插件初始化函數(shù)中注冊2個命令("pebaddr","tebaddr")
- 在命令的回調(diào)函數(shù)中獲取peb和teb的地址,并調(diào)用x32dbg的api將將內(nèi)存窗口轉(zhuǎn)到peb/teb所在的地址。