不能卸载java_无法卸载注入的DLL
我've written a dll in C which I' m通過 CreateRemoteThread() 注入C控制臺程序 .
C程序只需調(diào)用 Sleep(INFINITE) ,基本上充當注入的dll的主機 .
這是DllMain:
HINSTANCE thisDllHandle = NULL;
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD entryReason, void *impLoad)
{
switch (entryReason)
{
case DLL_PROCESS_ATTACH:
{
thisDllHandle = hInstance;
HANDLE thread = (HANDLE)_beginthreadex(NULL, 0, Boss, NULL, 0, NULL);
if (thread) CloseHandle(thread);
}
}
return TRUE;
}
通過 CreateRemoteThread() 創(chuàng)建的線程然后返回,我的Boss線程是運行此dll代碼的唯一線程 .
如果我然后告訴Boss退出,清理后調(diào)用 FreeLibraryAndExitThread(thisDllHandle, 0); - 線程退出但dll仍然在我的主機進程中加載 .
使用Brandon在here的答案中的想法,我讓主程序告訴我加載了哪些模塊并顯示模塊的 GlblcntUsage 和 ProccntUsage . 注入dll后,計數(shù)為1.在 FreeLibraryAndExitThread() 之后,計數(shù)為零 - 但仍然加載了dll!為什么?
順便說一下,如果我改為調(diào)用 FreeLibrary(thisDllHandle) ,主機程序崩潰(如預期的那樣),但dll會被卸載 .
EDIT
總結一下我要做的事情:我試圖通過創(chuàng)建一個加載我的dll的遠程線程在遠程進程中注入一個dll;該DLL生成另一個運行相同dll代碼的線程,并且原始線程退出;然后我想要該線程卸載DLL并退出 .
雖然試圖減少代碼以便發(fā)布它以響應@David Heffernan的評論,我設法讓它工作 - 通過在調(diào)用 FreeLibraryAndExitThread 之前讓退出的線程調(diào)用 FreeLibrary . 但是我真的很了解這些東西 . 我不是很直白:
獲取遠程進程的句柄 .
在自己的kernel32模塊中獲取 LoadLibraryW 的地址 .
在遠程進程中分配內(nèi)存,將[dll的路徑]寫入所述內(nèi)存 .
在遠程進程句柄上調(diào)用 CreateRemoteThread ,將步驟2中的地址作為起始地址傳入,將步驟3中的地址作為參數(shù)傳入 .
這會導致遠程進程中的線程使用 LoadLibraryW 加載我的dll . 當我的Dll被加載時,它啟動一個新線程(參見前面的DllMain代碼),它在我的dll中運行一些其他函數(shù)(這個其他函數(shù)中的內(nèi)容不重要 - 我可以讓它睡10秒然后調(diào)用 FreeLibraryAndExitThread ,然后行為是一樣的) . 我遠程創(chuàng)建的原始線程在LoadLibraryW返回時死亡 . 所以現(xiàn)在只有一個線程運行我的dll代碼 .
當該線程調(diào)用 FreeLibraryAndExitThread 時,我希望我的dll從遠程進程中卸載,因為該線程已釋放庫并退出 . 但是dll仍然被加載,并且只有釋放它兩次它才會卸載 .
總結
以上是生活随笔為你收集整理的不能卸载java_无法卸载注入的DLL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java instraction_Jav
- 下一篇: java http服务端例子_简单的用