2014-10-09 134 views
0

我想從另一個程序調用進程,這個進程是我通過DLL注入的進程。第一個,我們加載庫「Client.dll」的工作非常完美,它由DllMain中的MessageBox Debug(DLL_PROCESS_ATTACH)播種。遠程進程無法啓動

一旦將DLL加載到程序中,我嘗試從Client.dll調用MainThread函數,但是使用相同的方法(複製,粘貼,編輯)不起作用。兩者都張貼在下面,誰能告訴我爲什麼?我已經從MainThread中刪除所有代碼,但出於調試原因。

這裏是主線程:

void MainThread(void * Arguments) 
{ 
    MessageBoxA(NULL, "MainThread Started!", "bla", MB_OK); //Not Shown 
    for (;;) 
    { 
     //This loop is here for the main program loop. 
    } 
    _endthread(); 
} 

這是我如何加載Client.dll並嘗試調用爲主線,牢記實際注射的作品,但不是主線程的起點。

bool InjectDLL(DWORD ProcessID, const char* Path) 
{ 
    HANDLE Handle = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID); 
    if (!Handle) 
    { 
     std::cout << "Could not access process! Inject Failed!"; 
     return false; 
    } 

    LPVOID LoadLibraryAddress = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); 
    LPVOID Allocate = VirtualAllocEx(Handle, NULL, strlen(Path), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL); 

    HANDLE Thread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibraryAddress, Allocate, 0, NULL); 
    WaitForSingleObject(Thread, INFINITE); // WAIT FOREVER! 
    VirtualFreeEx(Handle, Thread, strlen(Path), MEM_RELEASE); 

    //Start DLL Main Thread 
    LPVOID MainThreadAddress = (LPVOID)GetProcAddress(GetModuleHandleA("Client.dll"), "MainThread"); 
    Allocate = VirtualAllocEx(Handle, NULL, 0, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 
    WriteProcessMemory(Handle, Allocate, Path, strlen(Path), NULL); 

    HANDLE MainThread = CreateRemoteThread(Handle, NULL, NULL, (LPTHREAD_START_ROUTINE)MainThreadAddress, Allocate, 0, NULL); 
    WaitForSingleObject(MainThread, INFINITE); // Wait for Main Thread to start 
    VirtualFreeEx(Handle, MainThread, strlen(Path), MEM_RELEASE); 

    CloseHandle(MainThread); 
    CloseHandle(Thread); 
    CloseHandle(Handle); 
    return true; 
} 

感謝任何能夠幫助的人。

回答

1

我沒有看到任何錯誤檢查 - 特別是在您提取「MainThread」地址的情況下。這是否成功?

爲了達到此目的,您需要通過.DEF文件或使用__declspec(dllexport)從您的DLL中明確導出「MainThread」。有關詳細信息,請參閱this SO lin k。

+0

這是問題,謝謝。 儘管我現在已經導出了MainThread函數,並且添加了檢查來確保它獲取它仍然不能獲取的地址。 我正在使用模塊定義文件,並創建一個.lib。也許我需要包括這個?對不起,我是一個新手,我並不特別想用庫來初始化一個函數。 如果您有任何建議或需要幫助的信息,請回復。不過,我會看到更多的消息來源,謝謝。 – user1591117 2014-10-09 17:47:59

+1

對你的DLL運行dumpbin/exports - 這會給你一個你所有導出的函數的列表,包括任何類型的名字修改。從該命令輸出的名稱將是您想在任何GetProcAddress()調用中指定的名稱。你可以通過用「C」連接定義你的導出函數(例如extern「C」void MainThread(){})來刪除一些錯誤。 – Bukes 2014-10-09 18:02:55

+0

謝謝,花了我一段時間,讓我的頭靠近它。儘管我現在有了,但也要感謝你的指導。謝謝你的時間! – user1591117 2014-10-09 19:16:59