所以我有这个dll:
#include <Windows.h>
#include <iostream>
HMODULE myhModule;
DWORD __stdcall EjectThread(LPVOID lpParameter) {
Sleep(100);
FreeLibraryAndExitThread(myhModule,0);
}
DWORD WINAPI MainThread(LPVOID param) // our main thread
{
AllocConsole(); // enables the console
freopen("CONIN$", "r", stdin); // makes it possible to output to output to console with cout.
freopen("CONOUT$", "w", stdout);
while (true) {
Sleep(100);
if (GetAsyncKeyState(VK_DELETE) & 1) {
cout << "[+] Attempting dll unload" << endl;
Sleep(800);
break;
}
}
FreeConsole();
CreateThread(NULL, 0, EjectThread, NULL, 0, 0);
return false;
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if(ul_reason_for_call == DLL_PROCESS_ATTACH) {// gets runned when injected
myhModule = hModule;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MainThread, NULL, 0, 0); // creates our main thread
return TRUE;
}
return FALSE;
}
说明:
[加载dll时,我们正在创建一个myhModule
变量,以便能够为其分配dll的基址,然后创建一个主线程,该主线程将创建一个线程,调用ejectThread函数,该线程应使用[按下myhModule
键时,将显示FreeLibraryAndExitThread
和VK_DELETE
方法。
遇到的步骤和错误:
因此,我用注入器将dll注入到进程内,然后,如果按Delete键,它将卸载dll,但是出现访问冲突错误,告诉我无法在内存位置访问该进程。
错误:
Exception thrown at 0x1CD62194 in process.exe: 0xC0000005: Access violation executing location 0x1CD62194.
我在这里做错了什么,为什么会引发access violation
错误?
提前感谢。
当您从DLL创建线程时-当然,在线程运行时一定不能卸载DLL。您需要在创建线程之前添加对DLL的引用。这可以通过调用GetModuleHandleExW
函数来完成。当线程退出时-我们必须自由引用DLL-这是通过GetModuleHandleExW
完成的。而这需要every dll线程。
所以通常,创建线程的代码必须在下一个
FreeLibraryAndExitThread
并且必须在线程末尾调用
FreeLibraryAndExitThread
注意,这必须在EjectThread和MainThread以及任何其他线程之内。