我已经构建了一个通过APIHiJack挂钩到Win32 TextOut函数的应用程序。启动应用程序时,将按预期注入DLL,并成功调用新的TextOut函数。
目前,我正在努力解决这个问题,并且需要一些指导。
1)如果某些应用程序已关闭,它们不会向DLL发送FreeLibrary(?)调用以取消挂起和清除。这是正常的,如果是这样,通常如何处理?
2)更重要的是,如果我的应用程序因任何原因崩溃,应用程序仍然会出现钩子和崩溃,因为我的新TextOut函数不再存在。
我试图枚举所有进程并找到哪些进程包含DLL(几乎是挂钩技术的反向过程)但是它似乎永远不会找到与挂钩时一样多的注入点,因此钩住的应用程序崩溃
非常感谢提前。
答案 0 :(得分:0)
应用程序two major ways
终止:
ExitProcess():当他们使用ExitProcess()时,会调用FreeLibrary()
(以及THREAD_DETACH
中的DLLMAIN
。
TerminateProcess():但是当应用程序使用TerminateProcess()时,它会立即终止而不进行任何清理。
我的解决方案是挂钩TerminateProcess()
进行我需要的清理 - 特别刷新我的日志文件的缓冲区并关闭它们。
但是: TerminateProcess()
我的终止表示严重错误,应用程序可能不稳定。
答案 1 :(得分:-1)
1)不,但你会在DllMain中获得THREAD_DETACH。
2)如果您的钩子代码验证您的服务器是否正在运行,如果不是,它应该执行钩子函数的默认行为。如果您的处理程序崩溃,它将使主机应用程序崩溃。如果您的服务器应用程序崩溃,您可以避免主机应用程序崩溃,以验证服务器是否正在运行。您可以使用事件或Pid验证它。