2011-05-23 154 views
5

因此,我有一個用C#編寫的可執行文件,我沒有它的源代碼,但我用IDA反彙編了它,它給了我很多面向對象的程序集。從C#.exe調用非託管C++ .dll的函數

我製作了一個.exe文件,將.dll注入到另一個.exe中,並且我已經將這個新的C++ DLL注入到C#.exe中,沒有任何問題,DLLMain被調用,所以...

但是,當我將此DLL注入到用C++創建的普通.exe文件中時,我可以在.exe中調用它的內存地址的函數,我可以在IDA上使用它。

問題是,即使函數名稱被反彙編,面向對象的程序集函數也沒有地址。

那麼,有沒有什麼辦法可以用C#.exe文件中的注入DLL調用此函數?

如果可能,是否有一種方法可以使用C#.exe文件及其所有函數和變量中聲明的命名空間,即使是私有的?

樣本反彙編代碼:

.namespace MyCSharpApp 
{ 
.class public auto ansi Test extends [mscorlib]System.Object 
{ 
    .field public value class [Microsoft.Xna.Framework]Microsoft.Xna.Framework.Vector2 pos 

    .field public int32 foo 
.... 
+0

即使有可能得到一個地址 - 代碼是MSIL,而不是本地代碼也沒有多大意義。需要啓動CLR(我不知道這將如何發生)。 – 2011-05-23 20:22:35

+0

@pst:由於應用程序是.NET,所以CLR將啓動並運行。但是,被調用的特定函數可能不會被打亂,所以您的關注是有效的。 – 2011-05-23 21:13:17

回答

3

你試圖做一些棘手的,我不是它是什麼非常清楚。從你的描述,你至少有四兩件事:

  • 託管EXE
  • 託管DLL
  • 非託管EXE
  • 非託管的DLL

其中一些你可以控制(即源代碼爲),其中一些沒有。

你想用你調用一個過程「注入」改變模塊你擁有控制權調用模塊,您擁有控制權。爲了做到這一點,您正在使用一種工具,要求您在進程的地址空間中有一個非託管入口點。

如果您使用非託管模塊獲得所需內容,那麼您只需編寫一個新的混合模式模塊(您明顯可以控制該模塊)來調用不受控制的託管DLL。現在你有效地擁有一個非託管DLL(用於導出目的),並且它被管理的問題已經消失。

要從新的非託管的包裝模塊調用託管代碼,您可以使用此介紹性文章中描述的技術:

基本上你需要一個C++/CLI項目引用您的黑盒管理的DLL並調用它並導出一個非託管入口點,您可以「爲其注入地址」。搜索會爲你找到更多的想法。

最後,你可以使用這種方法調用受管DLL(無法控制的託管DLL)中的private方法嗎?不,不是直接。然而,它是一個託管的DLL,所以它必須有一個對任何人都有用的入口點,你可以調用這些DLL入口點。如果這還不夠,你可以使用反思C++/CLI調用私有方法並訪問私有成員。

1

您需要使用非託管主機/調試API。如果你可以注入一個託管的DLL,這會容易得多,你可以使用Reflection。

+0

我試圖注入一個託管的DLL,它編譯得很好,但是,我不能在DllMain上啓動我的線程,因爲它在運行時給我一個錯誤:''嘗試在本地期間使用本地組件中的MSIL代碼代碼初始化「(即使我沒有在初始化時使用MSIL代碼),但我必須使用DllMain,因爲目標.exe不會調用我的DLL中的任何方法,這意味着我不能任何東西,直到.exe完全加載。 – 2011-05-23 22:29:42

+0

@Flavio:把DllMain放在一個沒有'/ clr'的文件中,然後把所有東西鏈接在一起。 – 2011-05-23 23:45:25