2013-01-03 94 views
0

好的,我會盡量讓它快速。我正試圖學習如何在另一個進程中注入DLL。目前,我只是在打開計算器時試圖檢測何時輸出消息。我心中已經寫了下面的DLL:DLL注入| GetProcAddress返回NULL

#include <windows.h> 
#include <iostream> 

using namespace std; 
extern "C"{ 
    LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam) 
    {  
     cout << "I'M NOT WORKING " << endl; 
     // Bunch of code... 
     return CallNextHookEx(0, nCode, wParam, lParam); 
    } 
    void ASimpleFunc(){ 
     cout << "DLL WORKING" << endl; 
    } 
} 

這裏是我的注射器(嗯......它只是試圖加載此刻的DLL)。

#include <windows.h> 
#include <iostream> 

using namespace std; 
typedef LRESULT (*CBTProc)(int,WPARAM,LPARAM); 
typedef void (*ASimpleFunc)(); 
int main() 
{ 
    // My two functions... 
    LRESULT _CBTProc; 
    ASimpleFunc _ASimpleFunc; 

    HMODULE hDll = LoadLibrary("myDLL.dll"); 
    if(!hDll){ 
     cout << "DLL FAILED TO LOAD" << endl; 
    }else{ 
     cout << "DLL LOAD SUCCESS" << endl; 

     // This one is working 
     _ASimpleFunc = (ASimpleFunc)GetProcAddress(hDll, "ASimpleFunc"); 

     // This one is not working 
     _CBTProc = (CBTProc)GetProcAddress(hDll, "CBTProc"); 
     if(!_ASimpleFunc || !_CBTProc){ 
      cout << "UNABLE TO CALL HOOK" << endl; 
     }else{ 
      // other code... 
     } 
    } 
    return 1; 
} 

任何想法?

編輯:這不是100%的代碼。我拿出了一些顯而易見的東西,比如DLLMain以及一些不直接與我的問題交互的東西。

回答

1

你需要真正的獲得DLL加載到另一個進程中才能工作。您可以通過在其他進程中創建遠程線程來加載DLL。

然後,您需要在加載DLLMain時執行掛鉤以掛鉤您希望掛鉤的功能。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx

http://en.wikipedia.org/wiki/DLL_injection

這兩個環節應該指向你在正確的方向。

+0

好吧,我沒有把DLLMain,因爲它似乎很明顯,它在那裏。然而,你的意思是我應該只使用GetProcAddress作爲DLLMain,而DLLMain應該是調用CPTProc的那個。 這是正確的嗎? –

+0

是的,你在'DLLMain'中執行遠程進程中的鉤子。通過使用LoadLibraryA調用另一個進程的CreateRemoteThread並將DLL傳遞給該函數,可以讓遠程進程調用DLLMain。 – sean

0

我不知道爲什麼其中一個沒有這個工作,但如果你想要一個函數從DLL中導出,你必須明確地導出它。有兩種方法可以做到這一點:

  1. 通過一些具體的編譯器來告訴編譯器

    For Visual C++use __declspec(dllexport)

  2. Use a module definition file.

+0

哦,我只是不想把太多的代碼(如DLLMain)我使用cygwin編譯器,並導出它manualy。我對C++還不太熟悉,所以我正在盡我所能地把握自己的一切。 –

+0

@Michael:你可以編輯你的問題來包含DEF文件嗎? – icktoofay

2

CALLBACK宏給了CBTProc stdcall調用,所以它的名字將與領先的下劃線和字節數(例如,它可能是[email protected])進行註解。您需要撥打GetProcAddress並輸入確切的名稱。該名稱可以使用dumpbin工具找到。

請注意,您的函數指針也必須註釋爲CALLBACK,以便在通過函數指針調用函數時使用正確的調用約定。

+0

出於好奇,什麼是@ 12位?它是參數幀的大小嗎? – dreamlax

+0

@dreamlax:[Yes。](http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx) –