Pull to refresh

Comments 20

Спасибо. Все очень понятно расписано. В вашем примере адрес оригинальной функции ищется через GetProcAddress, но он возвращает адрес только из списка экспортируемых функций, что делать, если нужно подменить функцию которой нет в списке?
К сожалению, указанным в статье способом доступ к такой функции получить нельзя. Можно дизассемблировать dll, понять где находится код нужной вам функции и заменить его своим.
А как вы вообще предполагаете ее искать? Можно по сигнатуре.
• Контроль входящего http-траффика и подмена «взрослого» контента на более безобидный.

Ээээ… да? Это так теперь делается? Да и остальной список задач меня заинтересовал даже больше, чем статья. Не потому что статья плохая, просто я Рихтера читал :)

Это один из способов, посмотрите на Fiddler :)

Ну, Fiddler и WireShark это инструменты мониторинга и отладки трафика. Не, ясно-понятно, что молотком можно и саморезы закручивать. Но это бы можно было в список задач и писать: перехват вызовов WinSocks-функций или чего там ещё. А так это провокация, я считаю. Но тонкая. Я ж вот заинтересовался, хотя Рихтера читал. :)

А Fiddler разве не как прокси себя регистрирует? Не раз сталкивался с тем, что если Fiddler некорректно закрыть, то он не отписывает себя из прокси и потом нет сети в тех приложениях, которые используют общесистемные настройки прокси.

Здесь описан простой, но проблемный способ установки хука.

На время выполнения оригинальной функции хук снимается. Поэтому рекурсивные вызовы не будут захуканы. Если несколько потоков выполняются параллельно, пока один поток зашёл в функцию, остальные потоки ходят в неё в обход хука (особенно плохо, если на этом строятся функции безопасности, вроде фильтрации трафика).

Ну и, если сильно не повезёт, при одновременном обращении к функции из разных потоков, можно словить Access Violation, когда восстановлена только часть оригинального начала функции, а другой поток на неё передал управление.

Подтверждаю. Для того чтобы сделать нормально, потребуется как минимум подключать дизассемблер длин инструкций, чтобы не сломать оригинальную логику своими JMP.


Конечно большинство функций из Windows библиотек имеют в своем теле некий stub, как раз для таких вещей, но все же остается ненулевая вероятность "порвать" опкоды оригинальной функции.


Ну и неплохо было бы упомянуть про Microsoft Detours, раз уж диалог идет об inline hooking'е.

Microsoft Detours немного отдельная тема. Я хотел показать сам процесс, Detours по сути это все скрывает. Более того коммерческая версия (и работа с архитектурой x64) стоят 10K $, поэтому интерес к этой библиотеке у меня поугас :)
Есть бесплатные альтернативы (даже опенсорсные), самые интересные из которых EasyHook и Deviare-InProc.
Да, именно цель статьи и была показать что установка хука не такое уж сложное дело, попытаться дать направление куда мыслить тем кто только начал интересоваться указанной темой.

Про многопоточность вы абсолютно правы. Указанный пример не рассчитан на нее. Вообще умение установить описанный вами хук достаточно нетривиальное.
«5. Наша библиотека инъектирована в адресное пространство постороннего потока.»
тут наверное хотели сказать
«5. Наша библиотека инъектирована в адресное пространство постороннего процесса».
материал изложен просто и доступно, тем кто действительно будет заинтересован данной темой — с легкостью найдут более подробное изложение нужных им тематик.
Один маленький вопрос: DEP (Data Execution Prevention) включен или нет?
DEP тут ни на что не влияет.
Указанные методы не сработает с защищенными процессами (например edge). Есть решения данной проблемы?
UFO just landed and posted this here
Небольшое дополнение, в адресное пространство процесса в которое мы инжектируемся должна быть загружена Kernel32.dll иначе CreateRemoteThread вызовет ошибку обращения по несуществующему адресу. А с включенным ASLR такой трюк вообще не пройдет.
Sign up to leave a comment.