Я построил приложение, которое подключается к функции Win32 TextOut через APIHiJack. Когда приложения запускаются, DLL вводится, как и ожидалось, и моя новая функция TextOut вызывается успешно.
В настоящее время есть две проблемы, с которыми я борюсь в отношении удаления крючка, и я хотел бы получить некоторые рекомендации.
1) Если некоторые приложения закрыты, они не отправляют вызов FreeLibrary (?) В DLL для отсоединения и очистки. Это нормально и если да, то как с этим обычно справляются?
2) Что еще более важно, если мое приложение по какой-либо причине аварийно завершает работу, приложения по-прежнему сталкиваются с ошибками, как и ожидалось, поскольку моя новая функция TextOut больше не существует.
Я попытался перечислить все процессы и найти, какие из них содержат DLL (в значительной степени обратный процесс техники перехвата), но кажется, что никогда не удается найти столько точек внедрения, сколько при перехвате и, следовательно, сбой перехваченных приложений.
Спасибо заранее.
Приложения имеют two major ways
прекратить:
ExitProcess (): Когда они используют ExitProcess (), то FreeLibrary()
называется (и THREAD_DETACH
в DLLMAIN
).
TerminateProcess (): Но когда приложение использует TerminateProcess (), оно немедленно завершается без каких-либо очисток.
Мое решение — подключить TerminateProcess()
Сделайте необходимые очистки — особенно очистите буферы моих файлов журнала и закройте их.
но: Прекращение с TerminateProcess()
Мой указывает на серьезную ошибку, и приложение может быть нестабильным.
1) Нет, но вы получите THREAD_DETACH в DllMain.
2) Если ваш код подключения проверяет, работает ли ваш сервер, и если нет, он должен выполнять поведение подключенной функции по умолчанию. Если ваш обработчик аварийно завершает работу, это приводит к сбою хост-приложения. Если ваше серверное приложение дает сбой, вы можете избежать сбоя хост-приложения, проверяя, работает ли сервер. Вы можете проверить это, используя события или Pid.