微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

卸载注入的DLL时FreeLibraryAndExitThread崩溃程序

我正在写一个注入到游戏中的DLL,以便玩弄一些逆向工程。 有一段时间,当我修改程序时,我能够成功地注入,popup和重新注入。 我正在使用FreeLibraryAndExitThread来卸载。

在将XInput添加到程序后,我可以捕获用户input,当我调用FreeLibraryAndExitThread时,游戏会崩溃。 从这篇文章中 ,我猜测使用XInput在我卸载时会在程序中留下一些“活的” ,这就是导致崩溃的原因。 对于如何解决这个问题,我真的很茫然。

这是退出程序崩溃的代码

XINPUT_STATE state; ZeroMemory(&state,sizeof(XINPUT_STATE)); //The problematic line of code bool gamepad = XInputGetState(0,&state) == ERROR_SUCCESS; WORD buttonsHeld = state.Gamepad.wButtons; WORD buttonspressed = (~prevIoUsButtonState) & state.Gamepad.wButtons; WORD buttonsReleased = prevIoUsButtonState & (~state.Gamepad.wButtons);

当我移除对XInputGetState的调用时,一切正常,我可以卸载DLL而不会崩溃。

如何将读取和写入redirect到一个variables?

用于查看ELF文件格式的窗口中的任何工具/软件?

使用'as'来组装Mips的Linux Binutils

Windows内核 – 有没有像ExGetPoolsForTag(pool_tag)?

获取一个程序的值

这就是我如何呼吁程序卸载和退出

FreeLibraryAndExitThread(hDLL,0);

其中hDLL是来自DllMain的参数hinstDLL 。 我也试过GetModuleHandleEx而不是使用hinstDLL 。

我的猜测是:

使用XInputGetState使我的程序为XInput或者另外一个DLL加载

XInputGetState正在创build一些引用到我的DLL被调用时,当我删除我的DLL,它试图访问不再存在的内存。

编辑:我做了一些挖掘和问题似乎是添加到XInputGetState调用导致我的DLL加载XINPUT1_4.dll 。 我试图使用FreeLibrary卸载它,但是这是行不通的。

编辑:我缩小了一些 – 事实certificate,访问冲突是由游戏中的一些线程试图返回到XINPUT1_4.dll的代码,这是卸载,使其崩溃的一部分引起的。 我不知道如何解决这个问题。

最终编辑:这是一个简单的修复,我不得不调用LoadLibrary(L"XINPUT1_4.dll")为导致问题的DLL。

反编译ac dll使用pinvoke on

哪个linux进程处理系统调用

探索应用程序文件的逆向工程目的

了解Windows系统调用调度程序?

如何将x86 DLL从WOW64进程注入到x64进程

这是解决方案:

问题是调用XInputGetState导致我的DLL自动加载XINPUT1_4.dll ,当我调用FreeLibraryAndExitThread时,我的DLL卸载也强制XInput DLL卸载。 程序中的代码(可能来自XInput 1.4中的一个线程)试图执行不再存在的代码,导致访问冲突。

所以解决的办法是在初始化我的DLL的线程后调用LoadLibrary(L'XINPUT1_4.dll') ,这样当我的DLL被卸载时,XInput DLL会留在内存中,因为LoadLibrary增加引用计数。

(当一个DLL的引用计数达到0时,它将被卸载,当你第一次加载它时,它被初始化为1,LoadLibrary将它加1,并且调用FreeLibraryAndExitThread将它减1。因此当所有的操作完成时,它的引用计数就是上面的0,并保留在内存中,因为我的DLL被卸载)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐