2013-05-20 39 views
3

我已經用C++編寫了一個dll和注入器。該dll代碼如下:DLLMain()注入後未執行

#include <cstdio> 
#include <stdio.h> 
#include <windows.h> 
#include <string> 
#include <fstream> 
#include <winsock.h> 
using namespace std; 
#pragma comment(lib, "wsock32.lib") 

extern "C" __declspec(dllexport) void UploadFile() 
{ 
..... 
} 

INT APIENTRY DLLMain(HMODULE hinstDLL, DWORD fdwReason, LPVOID lpReserved) 
{ 
    switch(fdwReason) 
    { 
    case DLL_PROCESS_ATTACH: 
     MessageBox(0,"Process Attach","Info",MB_OK); 
     UploadFile(); 
     break; 
    case DLL_THREAD_ATTACH: 
     MessageBox(0,"Thread Attach","Info",MB_OK); 
     UploadFile(); 
     break; 
    case DLL_PROCESS_DETACH: 
     break; 
    case DLL_THREAD_DETACH: 
     break; 
    default: 
     break; 
    } 
    return TRUE; 
} 

dll上傳一個特定的文件到服務器。我成功地能夠使用LoadLibrary()和CreateRemoteThread()將該DLL注入到「notepad.exe」中,但它沒有被執行。甚至沒有dllmain()函數。不知道什麼是錯的。

+1

這個函數應該用小寫字母L叫做'DllMain'(我想我應該把它作爲一個答案。) – Dirk

+0

從DllMain做這些複雜的事情是一個免費的崩潰或死鎖票。閱讀[MSDN對DllMain的評論](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v = vs.85).aspx)以供參考。爲什麼你需要注入DLL來上傳文件? – hamstergene

+0

這是我在更改DLLMain()到DllMain()後得到的錯誤 錯誤LNK2005:_DllMain @ 12已經在MSVCRTD.lib(dllmain.obj) – Faheem

回答

4

由於Dirk已經聲明,DLL入口點被命名爲DllMain(),而不是DLLMain()。對於DllMain()簽名是:在User32.dll中或GDI32.DLL

...通話功能:

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL, 
    DWORD fdwReason, 
    LPVOID lpvReserved 
); 

Best Practices for Creating DLLs ,你永遠不應該從內部的DllMain()執行以下任務。有些功能加載另一個DLL,它可能無法初始化...

MessageBox()User32.dll實現,因此這個可能是DllMain()出現不被調用的可能原因。

DllMain()執行任何耗時的任務是不明智的,因爲它會阻止應用程序加載任何其他需要的DLL,因爲加載程序鎖定在DllMain()中時保持不變。相反,產生一個線程來執行任何耗時的任務。鏈接文件建議不要使用CreateThread(),但僅在涉及同步時使用。

+1

+1中定義並添加了[某些原因在您的操作中不要做任何可怕的事情DllMain](http://blogs.msdn.com/b/oldnewthing/archive/2004/01/27/63401.aspx)以及[在DllMain中不要做任何可怕事情的另一個原因:無意的死鎖](http:// blogs.msdn.com/b/oldnewthing/archive/2004/01/28/63880.aspx) –

+0

返回類型也應該是'BOOL',儘管這可能並不重要。 – Dirk

+0

+1 IIRC因爲應用程序已經運行,如果注入的DLL的所有依賴項已經滿足,那麼這些限制已經不再適用,並且你可以自由地使用香蕉。這可能僅適用於進程附加,但取決於線程本地初始化。 –