2011-06-24 137 views
4

注入x64進程的x64-DLL掛鉤x86-DLL失敗,使用C++和EasyHook。 它工作如果Loader,InjectionLibrary和InjectionTarget(它在兩個版本都可用,我需要兩個都被掛鉤)是x86。 獲取導出過程的地址(GetProcAddress本身)在x64上不是問題。 InjectionTarget將HookTarget(Kernel32.dll)作爲x64的依賴項。 LhInstallHook(...)將返回STATUS_NOT_SUPPORTED,其中源註釋表示發生以下情況: 「目標入口點包含不受支持的指令。」注入x64進程的x64-DLL掛鉤x86-DLL失敗,使用C++和EasyHook

由於源代碼適用於x86版本,因此我決定不添加它。

我劃了一根小圖 enter image description here

+1

甚至可以將x86 DLL映射到x64進程中嗎?這對我來說是新的。 –

+0

我檢查了dependencywalker,它被列出,但不是我的領土。無論如何,我需要達到能夠鉤住GetProcAddress或類似於x64的目標。 – zEh

回答

6

不能在64位進程使用32位的DLL,而事實上,這generalizes-你不能混搭x86和x64代碼,一個單一的過程或者完全是x64,或者完全是x86。這是x86-64的基礎,你無能爲力。在Windows控制檯中,他們創建一個64位進程和一個32位進程,並使用IPC來控制32位進程來加載和處理所有32位外殼擴展。如果你勇敢和/或絕望,你可以嘗試類似的東西。

編輯:等一下,等一下。如果在x86模式下一切都正常工作,您可以在基礎知識中多描述一下這個過程嗎?就像,X從Y加載函數,我做Z,因爲它看起來我不明白你在做什麼。

您有一個注入目標和一個注入的DLL,您試圖從第三方x86 DLL中調用過程。所以正常的調用流程從InjectionTarget - > InjectionLibrary - > HookTarget - > ExportedProcedure。這不適用於你,因爲HookTarget僅僅是x86,你不能改變它,所以當你爲x64版本的InjectionTarget重新編譯InjectionLibrary for x64時,它不再工作了,因爲你的x64注入庫試圖加載x86 HookTarget。

此問題的唯一解決方案是創建一個x86進程並使用進程間通信使其調用HookTarget中您要調用的過程。如果你不能重新編譯HookTarget for x64,那麼這就是只有這樣做的方法。

+0

我肯定需要掛接x86-DLL的導出過程。你能否給我一個正確方向的提示? IPC似乎太籠統了。 – zEh

+1

@zEh:爲什麼不生成一個x86進程?如果你的目標是一個x64 exe文件,那麼它不能再加載一個x86 DLL,它也必須是x86。 – Puppy

+0

您的意思是InjectionLibrary注入InjectionTarget產生一個x86進程?那麼我怎樣攔截InjectionTarget的GetProcAddress調用呢? – zEh