1

我已经构建了一个通过 APIHiJack 连接到 Win32 TextOut 函数的应用程序。当应用程序启动时,DLL 会按预期注入,并且我的新 TextOut 函数被成功调用。

目前,我正在努力解决两个关于移除钩子的问题,并希望得到一些指导。

1) 如果某些应用程序已关闭,它们不会向 DLL 发送 FreeLibrary(?) 调用以取消挂钩和清理。这是否正常,如果是,通常如何处理?

2) 更重要的是,如果我的应用程序因任何原因崩溃,应用程序仍然会出现预期的挂钩和崩溃,因为我的新 TextOut 函数不再存在。

我试图枚举所有进程并找到哪些进程包含 DLL(几乎是挂钩技术的逆过程),但它似乎从来没有找到像挂钩时那么多的注入点,因此挂钩的应用程序崩溃了。

提前谢谢了。

4

2 回答 2

0

应用程序必须two major ways终止:

  • ExitProcess():当他们使用 ExitProcess() 时会FreeLibrary()被调用(并且THREAD_DETACH在 中DLLMAIN)。

  • TerminateProcess():但是当应用程序使用 TerminateProcess() 时,它会立即终止而不进行任何清理。

我的解决方案是挂钩TerminateProcess()并进行我需要的清理 - 特别是刷新我的日志文件的缓冲区并关闭它们。

但是:与我的终止TerminateProcess()表示严重错误并且应用程序可能不稳定。

于 2014-06-25T14:08:07.877 回答
-1

1) 不,但您将在 DllMain 中获得一个 THREAD_DETACH。

2)如果您的挂钩代码验证您的服务器是否正在运行,如果没有,它应该执行挂钩函数的默认行为。如果您的处理程序崩溃,它将使主机应用程序崩溃。如果您的服务器应用程序崩溃,您可以避免主机应用程序崩溃验证服务器是否正在运行。您可以使用事件或 Pid 验证它。

于 2013-12-04T18:32:28.377 回答