2013-12-04 3 views
1

Я создал приложение, которое подключается к функции Win32 TextOut через APIHiJack. Когда приложения запускаются, DLL вводится как ожидалось, и моя новая функция TextOut вызывается успешно.Unhooking API Hook с использованием APIHijack

В настоящее время есть две проблемы, с которыми я борюсь за удаление крючка и хотел бы получить некоторые рекомендации.

1) Если некоторые приложения закрыты, они не отправляют вызов FreeLibrary (?) В DLL, чтобы отцепить и очистить. Это нормально, и если да, то как это обычно происходит?

2) Что еще более важно, если приложение по какой-либо причине аварийно завершает работу, приложения все еще имеют крючок и сбой, как и ожидалось, поскольку моя новая функция TextOut больше не существует.

Я попытался перечислить все процессы и найти, какие из них содержат DLL (в значительной степени обратный процесс метода привязки), но он никогда не находит столько точек инъекции, сколько при подключении и, следовательно, подключенных приложений (ов) авария.

Большое спасибо заранее.

+0

Что вы имели в виду с моим «приложением» код, который вы ввели в другой процесс? – user743414

ответ

-1

1) Нет, но вы получите THREAD_DETACH в DllMain.

2) Если код вашего крючка проверяет, работает ли ваш сервер, а если нет, он должен выполнять поведение функции hooked по умолчанию. Если ваш обработчик завершится с ошибкой, это приведет к сбою приложения-хозяина. Если ваше серверное приложение аварийно завершает работу, вы можете избежать сбоя приложения-хоста, проверяя, работает ли сервер. Вы можете проверить его с помощью событий или с помощью Pid.

+0

Нет, вы не получите THREAD_DETACH в DllMain в каждом случае. Иногда приложения заканчиваются немедленно, особенно когда они используют 'TerminateProcess()' для завершения. – boboes

0

Приложения имеют two major ways прекратить:

  • ExitProcess(): Когда они используют ExitProcess(), то FreeLibrary() называется (и THREAD_DETACH в DLLMAIN).

  • TerminateProcess(): Но когда приложение использует TerminateProcess(), оно немедленно прекращается без каких-либо очищений.

Мое решение IST зацепить TerminateProcess() сделать уборок мне нужно - специально промывочные буферы моих файлов журналов и закрывающие их.

but: Остановить с TerminateProcess() Мое указать серьезную ошибку и приложение может быть нестабильным.