什麼是 DLL? DLL 是動態連結庫。它充當共享物件,多個程式可以多次呼叫同一個 DLL。
為什麼要使用 DLL? 它與 Linux 共享物件和庫的概念並沒有太大區別。不過在設計上略有不同。簡而言之,它節省了空間並允許廣泛的程式碼重用。
關於 DLL 的事實: 編譯 DLL 時,其函式透過符號進行引用。這些符號直接關聯到函式的名稱(符號以可見且可讀的字串表示)、其返回型別和引數。實際上,可以直接透過文字編輯器讀取符號,儘管在大型 DLL 中很難找到。這些符號也可以使用 WinAPI 中的函式進行提取。斷點:在此處插入螢幕截圖或示例。DEF 檔案也可用作參考,儘管可以避免使用它們。另外,使用 DLL,存在一個實現。使用 DLL,我們可以生成一個 .lib 檔案,前提是您至少擁有該 DLL。現在,使用符號和可能從 DLL 生成的庫,您可以建立自己的簡單標頭檔案來隱式呼叫 DLL 中的函式。酷吧?
我為什麼要關心? 通常您不會。它經常用於基礎駭客攻擊。但它也可以作為良好的參考和恢復工具,特別是當您知道 DLL 的設計方式時。假設您有一個以前實現的 DLL。它很簡單,有四個或五個函式。但是您不再擁有標頭檔案、庫,並且不記得函式名稱。使用此方法,您可以輕鬆恢復所有這些。儘管對於不是您自己的且不打算被第三方呼叫的 DLL,情況也可能如此。
我根本不在乎!我從來不實現 DLL! 您是這麼說的,但從某種意義上說,您確實實現了。DLL 非常類似於 Windows 可執行檔案。因此,您實際上可以載入一個可執行檔案並像呼叫 DLL 一樣顯式呼叫可執行檔案(感謝 Null)。您也可以隱式呼叫可執行檔案,但我們每次建立可執行檔案時都會這樣做。斷點:可執行檔案使用符號系統嗎?
你說謊! 哦,是嗎?每當我嘗試透過操作 DLL 來建立 UT2004 反作弊系統時,我都慘敗了,而且我注意到很多人認為這是因為您無法使用此方法,因為它根本不起作用。好吧,他們錯了!作為對此的回應,我將實現一個基本的 DLL,刪除除 DLL 本身之外的所有引用,並在此文章的分步說明中恢復所有內容。斷點:我應該使用 C 語言來獲得清晰的符號,還是使用 C++ 語言,即使步驟稍微長一些?
過程!
要破解的 DLL:
http://computerquip.com/BasicDLL.dll這個過程很簡單。首先,我們需要提取可以被客戶端呼叫的公共函式。請注意,夥計們,符號是複雜的,它們不僅僅是為了匯出的函式。因此,我們只需要提取我們想要的函式,而這些函式碰巧 90% 的時候都是公開匯出的函式。例如,所有符號
http://img38.imageshack.us/img38/7575/exportedsymbols.png
首先,我們需要建立一個 .DEF 檔案。在 MinGW 中,這是使用 pexports 完成的,它甚至以與 DEF 檔案相容的格式提供。我們可以將其放置在一個檔案中,使用
pexports BasicDLL.dll
。在 VC++ 控制檯中,您可以使用
dumpbin /exports
(我發誓您可以匯出 def 檔案與 dumpbin)如圖所示
http://img682.imageshack.us/img682/5596/symbols.png 這只是我憑著記憶知道的。我花了一個小時昨天設定我的 Windows 環境卻沒成功。我試圖避免 Code::Blocks,但我想那將是不可能的。
儘管我已經在如何破解和利用常見 DLL 方面進行了大量研究,但我對其背景或內部機制瞭解不多。我目前正在研究這些併發布我的發現。