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;
}
感謝任何能夠幫助的人。
這是問題,謝謝。 儘管我現在已經導出了MainThread函數,並且添加了檢查來確保它獲取它仍然不能獲取的地址。 我正在使用模塊定義文件,並創建一個.lib。也許我需要包括這個?對不起,我是一個新手,我並不特別想用庫來初始化一個函數。 如果您有任何建議或需要幫助的信息,請回復。不過,我會看到更多的消息來源,謝謝。 – user1591117 2014-10-09 17:47:59
對你的DLL運行dumpbin/exports - 這會給你一個你所有導出的函數的列表,包括任何類型的名字修改。從該命令輸出的名稱將是您想在任何GetProcAddress()調用中指定的名稱。你可以通過用「C」連接定義你的導出函數(例如extern「C」void MainThread(){})來刪除一些錯誤。 – Bukes 2014-10-09 18:02:55
謝謝,花了我一段時間,讓我的頭靠近它。儘管我現在有了,但也要感謝你的指導。謝謝你的時間! – user1591117 2014-10-09 19:16:59