2014-02-20 73 views
1

上次我描述我的問題很糟糕。 現在我會試着解釋我的問題更清楚。如何更正WinAPI呼叫?

我試圖使HDD串行檢查,以防止程序的分發。我沒有它的src,所以我在.code部分找到了一些空間,並在那裏注入了代碼。

Screenshot

你可以看到intermodular電話。例如,call kernel32.GetDriveTypeA匹配call 75738D98。但重啓後這個地址會改變。但是,我的代碼調用的地址不正確75738D98

我需要修復它(解決新GetDriveTypeA地址和正確的地址替換75738D98

+2

現代版本的Windows將隨機化已加載模塊的基址,使其更難實現「返回到libc」攻擊。見http://en.wikipedia.org/wiki/Address_space_layout_randomization – Bukes

+0

你應該編輯你以前的問題,而不是重新制定一個新問題。現在請刪除前面的問題。 – manuell

回答

2

LoadLibraryGetProcAddress會給你的地址DLL函數。下一個自然的問題是:如果你不知道他們的地址,你怎麼能撥打LoadLibraryGetProcAddress

所有用戶進程都加載了kernel32。你不需要在kernel32中動態加載任何東西。

通常您連接&操作系統加載器通過鏈接到導入庫(KERNEL32.LIB例如)做這一切爲您服務。這將告訴操作系統你需要用你的DLL加載kernel32。您的DLL有一個import address table,其中包含一堆存根到真正的導入函數。當您的模塊被加載時,操作系統修補這些存根以指向真實的功能地址。

你也應該這樣做。如果您嘗試過分嘮叨,您的應用程序甚至可能會被檢測爲惡意軟件。

你有沒有很好的理由不鏈接到導入庫?

+0

不,鏈接器生成一個存根,當DLL映射到內存時,該存根由OS加載程序代碼連接。 – tenfour

+0

然後繼續:*那個*存根如何被修改? – user2864740

+0

更好的問題是:爲什麼假設它應該保持不變?它是虛擬地址空間;你不應該假定任何模塊的位置。這就是LoadLibrary和GetProcAddress存在的原因。 – tenfour