注入程序的dll 如何强制删除??
钩子dll ,挂的全局钩子,所以很多程序都会注入
在升级程序的时候,调用了UnhookWindowsHookEx后dll却经常还保留在其他程序的进程中
导致更新文件失败,
在想有没有什么方法可以强制删除dll,使得升级能够成功
或者有什么方法能够在调用UnhookWindowsHookEx之后dll能完全的退出所有的程序??
[解决办法]
dll注入,一般都是ViturlMalloc到对方进程开一个线程,然后在线程中把事先准备好的dll load进对方进程里。
所以,想要把LoadLibrary的效果除去的,需要用对应的FreeLibrary,但参数是一个问题,要得到这个模块的句柄值,即要把LoadLibrary返回的handle值发回来才行,进程间通信的方法还是很多的,简单点的话,可以在LoadLibrary之后把HMoudle的值,写入一个固定位置的txt里,然后要卸载dll的,去读这个txt。
得到HMoudle值后,再用VitrulMalloc开线程调用FreeLibrary即可。当然最好是dll的dllmain做点处理把函数替换回去,防止卸载不掉,或者卸载完成后,目标进程崩溃。
[解决办法]
全局消息钩子会注入GUI进程,在该进程窗口有某些动作时注入,UnhookWindowsHookEx 后,也不是立即就自动释放,而是在被注入窗口有某些动作时才释放。
没有方法能使全局消息钩子注入的DLL能受你控制地被释放,但有一个优化方案,就是你UnhookWindowsHookEx后广播一个消息,这样就能让被注入的进程在未进行任何动作时“尽量地”感知全局钩子已卸载。
但这也不能保证。
而你的需求和这其实没有关系,删除不了,可以改名。你可以尝试:
if (!覆盖成功)
{
原文件 改名为 原文件.old;
更新文件到 原文件;
原文件.old 标记为重启删除;
}
如果只是想更新,根本没必要非把原来的删除。
[解决办法]
dll注入,一般都是ViturlMalloc到对方进程开一个线程,然后在线程中把事先准备好的dll load进对方进程里。
所以,想要把LoadLibrary的效果除去的,需要用对应的FreeLibrary,但参数是一个问题,要得到这个模块的句柄值,即要把LoadLibrary返回的handle值发回来才行,进程间通信的方法还是很多的,简单点的话,可以在LoadLibrary之后把HMoudle的值,写入一个固定位置的txt里,然后要卸载dll的,去读这个txt。
得到HMoudle值后,再用VitrulMalloc开线程调用FreeLibrary即可。当然最好是dll的dllmain做点处理把函数替换回去,防止卸载不掉,或者卸载完成后,目标进程崩溃。
我LoadLibrary 之后挂完钩子之后就已经马上FreeLibrary了
不能马上FreeLibrary的,挂完钩子,你用于替换的函数都是在dll里的吧,你FreeLibrary之后,这些函数不就失效了么,达不到效果。如果这些函数是频繁使用的,那么你调用FreeLibrary时,由于dll中的函数正在使用中,那么FreeLibrary就会失败。
如果是FreeLibrary失败,可以用FreeLibraryAndExitThread强制退出。但也是要在,你不想再hook函数的时候调用,不然不仅hook也随之结束,被hook的进程可能也会立即崩溃。
但是我一直都是hook 之后就 freelibrary ,dll是有注入到程序中的,也运行正常,
freelibrary失败了呗,自己看返回值吧。
freelibrary 返回值是 1 是成功的
Return Values
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.
用这个试试吧,FreeLibraryAndExitThread。FreeLibrary即使成功了,也只是引用计数减一,如果使用的线程不退出,不会真正的卸载的。
你之前说的保存挂钩LoadLibrary 的那个dll handle ,在卸载钩子之后再去freelibrary 的方法我有试过了,但是效果跟LoadLibrary 之后 立即FreeLibrary 是一样的,
所以感觉应该就是hiroyukki说的情况
升级不能在开机启动后,钩子函数执行前才更新吗?
下载需要更新的程序,等到重启后判断有程序需要更新,则先执行更新程序,再挂载钩子。
升级重启 很不好啊
全局消息钩子会注入GUI进程,在该进程窗口有某些动作时注入,UnhookWindowsHookEx 后,也不是立即就自动释放,而是在被注入窗口有某些动作时才释放。
没有方法能使全局消息钩子注入的DLL能受你控制地被释放,但有一个优化方案,就是你UnhookWindowsHookEx后广播一个消息,这样就能让被注入的进程在未进行任何动作时“尽量地”感知全局钩子已卸载。
但这也不能保证。
而你的需求和这其实没有关系,删除不了,可以改名。你可以尝试:
if (!覆盖成功)
{
原文件 改名为 原文件.old;
更新文件到 原文件;
原文件.old 标记为重启删除;
}
如果只是想更新,根本没必要非把原来的删除。
谢谢,那你说的广播消息是怎么处理的呢,是遍历每个进程发消息?
发的又是什么消息 才能被被注入的进程感知呢?