2

我正在将一个 DLL 注入目标进程以在玩 MMORPG 时充当助手(当前功能将按键转换为鼠标点击,因为 MMORPG 要求用户移动鼠标以获得某些功能,这是我鄙视的。)

假设我出于某种原因想取消注入我的 DLL,我该怎么做?这种方法干净吗?

bool running = true;
while (running) // This is the only thread I'm using, and it is running in "realtime"
{
    // Do keyboard handing stuff in switch statement
    case keys.EscapeKey: // If the escape key is pressed
        running = false; // Set the running bool to false, and break the loop
        break;
}

这干净吗?线程结束了,我的 dll 本身是否“未注入”?还是它仍然徘徊并继续消耗我在注入时分配的内存?

谢谢乔什

4

2 回答 2

2

我假设您使用了 CreateRemoteThread,其起始地址设置为 LoadLibrary,并且您在注入的 DLL 的 DllMain 中启动了一个线程。

首先,在 DllMain DLL_PROCESS_ATTACH 中将 DLL 的 HMODULE 保存在一个全局变量中。

其次,当您希望线程退出并卸载 Dll 时,将此 HMODULE 传递给 FreeLibraryAndExitThread。

谨防!你不能留下“活代码”,也就是说,没有回调地址传递给任何 API,如果在卸载后触发回调,那将立即崩溃(或更糟)。

于 2013-11-12T17:14:11.890 回答
1

基本上 Dll 会在主线程结束时自动从进程中分离,除非你将它发送到无限循环,所以是的,你做对了

您可以放置​​一个MessageBox事件DLL_PROCESS_DETACH以查看它是否被调用

于 2013-11-12T16:20:44.803 回答