Comments 63
UFO just landed and posted this here
Вот тоже неплохой вариант с примером инжектора вдобавок, правда на ассемблере http://goo.gl/EY9sg
0
Когда я переходил на *nix-системы, я испытал небольшой шок от того, насколько проще там осуществлять перехват библиотечных функций. Всё встроено в системные загрузчики исполняемых файлов и контролируется установкой переменных окружения (LD_PRELOAD, DYLD_INSERT_LIBRARIES, etc).
+10
Более того, там это и не нужно чаще всего — взяли исходники, почитали, поправили, собрали. Удобно, не поспоришь. Но ведь и в Windows надо уметь что-то делать.
+3
Далеко не всё можно просто взять и пересобрать. Геморрой ещё тот порою. И не всё открыто.
+2
Более того, там это и не нужно чаще всегоНу для штук вроде fakeroot незаменимо. Помимо этого есть всякие padsp, socksify, v4l2compat.so и прочие, эмулирующие для софта несколько иное програмное окружение, чем то, в котором он реально находится.
+3
Даже догадываюсь почему. Всякие хакеры давно облюбовали винду для испытания всяких гадостей. Вполне естественно, что мелкософт с этим посильно борется, повышая планку сложности реализации хука. Т.е. реализовать хук либо сложно, либо дорого :-).
0
Да нет. Просто в форточках (которые до Win2K были «набором 32-битных расширений и графической оболочкой для 16-битного патча для 8-битной ОС, изначально созднанной для 4-битного микропроцессора») изначально никакой функциональности для перехвата чего либо (ну кроме SetWindowsHookEx) предусмотрено не было. В итоге народ начал изобретать велосипеды, т. к. проблему надо было решать, а нормально она решается только вставкой джампа на свой код в начале функции с предварительным дизассемблированием её кода на предмет получения длины замещаемых команд, дабы их потом перед переходом обратно выполнить. Удаление гланд через прямую кишку, в общем, как это обычно с форточками и бывает.
+4
Подменить либу там действительно легко, но как же перехватить вызов метода и заменить его на свой? Развлекаться с SystemTap'ом или DTrace?
0
Вызов чего? Вы про перехват методов библиотечных плюсовых классов? Если да, то смотрите сырцы SkypeTab, я там, вроде как, адекватно это сделал и без плясок с бубном.
0
Лучше бы рассказали как это сделать бесплатно.
-7
Извините, вы коммерческий софт пишете, или что? Вам в любом случае придётся раскошелиться на MS Authenticode, т. к. антивирусы с большим подозрением относятся к софту, выполняющему перехваты функций и при этом не имеющему цифровой подписи. Если же софт некоммерческий, то для такого использования есть бесплатная версия.
+6
Мне интересно для развития.
0
Интересно для развития — используйте версию для некоммерческого использования. В чём проблема?
+8
Читаете с нужного адреса пару десятков байт (максимальная длина команды в x86 в районе 15, если не ошибаюсь со всеми префиксами. Берете абсолютно любой дизассемблер длин, или полноценный и смотрите сколько команд затрет ваш jmp ptr длинной в 5 байт. Копируете эти команды в другое место, за ними пишете еще один jmp обратно (с учетом затертых команд). После этого пишете в нужном месте jmp на себя.
Вместо jmp addr(0xEB) можно использовать связку push const/ret. Выходит тоже самое.
еще как вариант — установить собственный обработчик векторного или структурного прерывания, и в нужных местах вписать int3/int1/ud2 или прочие команды, вызываюшие exception. Обрабатываете его, и прыгаете куда вам надо.
Таким же способом можно поставить аппаратный breakpoint через регистры dr0-dr3,dr7, тогда по факту вообще никакого патча не будет.
Вместо jmp addr(0xEB) можно использовать связку push const/ret. Выходит тоже самое.
еще как вариант — установить собственный обработчик векторного или структурного прерывания, и в нужных местах вписать int3/int1/ud2 или прочие команды, вызываюшие exception. Обрабатываете его, и прыгаете куда вам надо.
Таким же способом можно поставить аппаратный breakpoint через регистры dr0-dr3,dr7, тогда по факту вообще никакого патча не будет.
+2
И я уж молчу про то, что в нормальных приложениях адреса API берутся из IAT. Таким образом будет достаточно подменить там адрес функции на адрес своего обработчика.
IAT можно найти распарсив MZ-PE заголовок
IAT можно найти распарсив MZ-PE заголовок
0
В тексте есть 3 ссылки на другие статьи и библиотеки. Статьи хорошие, библиотеки бесплатные. Но на мой взгляд, и статьи и библиотеки существенно сложнее изложенного материала.
+2
1. Не «лучше», а " расскажите, пожалуйста".
2. Вроде как рассказали достаточно
2. Вроде как рассказали достаточно
+3
Вам достаточно. Про подмену средствами WinAPI не говорится.
«В этой статье мы рассмотрим замену колеса у машины. Покупаем колесо, едем на шиномонтаж, нам меняют колесо». Супер.
«В этой статье мы рассмотрим замену колеса у машины. Покупаем колесо, едем на шиномонтаж, нам меняют колесо». Супер.
+1
Да, не говорится. В начале статьи сразу и говорят, что эта статья будет выгодно отличаться от остальных минимальностью захламления сложностями. При этом даются ссылки на более подробные статьи, посмотрите их…
+2
Вместо перехвата SendMessage можно попробовать сделать GetWindowsLong\SetWindowsLong с параметром WNDPROC. И точно так же обрабатывать SETTEXT
0
Хуки — это хаки. Пускай заранее предусмотренные архитектурой, но хаки. Вызывающий код о них ничего не знает. Посылка сообщений «честнее».
+1
Данный конкретный пример можно сделать кучей способов (в том числе и посылкой сообщения). Есть многое, что посылкой сообщения сделать нельзя, а хуками можно.
+4
Если хуки предусмотрены архитектурой. Или архитектура не может внешним хукам противодействовать.
0
Ага, вот так что-нибудь сделают хуками, а пользователи потом третируют разработчика исходного софта — откуда, дескать, у меня там глюки. У нас был пример несколько лет назад. В программе использовался встроенный движок скрипта для автоматизации некоторых действий. Касперский со своими хуками влезал, чтобы проверить этот скрипт и вылетал с громким треском (он-то думал, что это Internet Explorer...). А выглядело так, что на ровном месте падает наша программа.
+2
Извините, но #include «C:\Program Files\Microsoft Research\Detours Express 3.0\src\detours.h» — это аццкий ад, хоть и приложение тестовое. Для таких вещей в студии есть Additional Include Derictories.
+2
Рекомендую madCodeHook(http://www.madshi.net/madCodeHookDescription.htm), помимо того что эта библиотека хучит она еще умеет инжектить во все вновь запущенные процессы. Очень удобная вещь
+1
А существует ли что-нибудь подобное для C#?
+1
Да в майкрософте совсем обалдели: за про версию (с поддержкой х64 и разрешением на коммерческое использование) просят, тарам-пам-пам, 10К долларов. И это при том, что сама библиотека занимает всего 250Кб кода (пусть, 500 с учетом отсутствия х64 в express edition). При чем написана она в достаточно примитивном стиле. Беда, в общем :(
+2
Сколько просят — это их дело… мне вот интересно, её покупают?
0
Мы покупали.
Писать дизассемблер для x64 было затратнее по деньгам и времени.
Хотя добавлю, что дизассемблер в detours довольно паршивенький — увидит jmp в первых 5 байтах функции — и ква.
Попадалась недавно с виду неплохая бесплатная библиотечка от одного из крупных вендоров — найти не могу.
Писать дизассемблер для x64 было затратнее по деньгам и времени.
Хотя добавлю, что дизассемблер в detours довольно паршивенький — увидит jmp в первых 5 байтах функции — и ква.
Попадалась недавно с виду неплохая бесплатная библиотечка от одного из крупных вендоров — найти не могу.
0
Нашел
Pin is a tool for the dynamic instrumentation of programs
Pin is provided free of charge by Intel
Еще и кросс-платформенно. Никто не испытывал?
Pin is a tool for the dynamic instrumentation of programs
Pin is provided free of charge by Intel
Еще и кросс-платформенно. Никто не испытывал?
0
А как это Вы ценность продукта в строках кода меряете? По Вашему, любая строка кода — хоть в студенческой лабе, а хоть в автопилоте шаттла — одинаково стоит? Плюсы и минусы Detours честно описаны в статье, равно как и ссылки на альтернативные решения. ИМХО Detours прекрасен в качестве учебной библиотеки, он не вываливает на неподготовленного юзера горы системной информации. А вот в реальных проектах я бы использовал что-то другое (цена всё-таки аргумент).
+1
Я же читал исходники :) единственная более-менее стоящая вещь там — дизассемблер, и то весьма средненького качества (выше уже писали), кроме того есть бесплатные аналоги. Например, я для тех же целей использовал «медиану», один день допиливания дал возможность перехватывать все что угодно. Так что не стоит оно таких денег.
0
Я некоторое время назад начал писать свой небольшой фреймворк для установки хуков на API, чтобы можно было сделать что-то типа:
Конечно, она не дотягивает по могуществу до великого творения от микрософт, зато маленькая, открытая и моя )).
Сейчас он работает на x32, хотя и не очень стабильно, да и код ещё бяка, но если всё пойдёт нормально и ко мне не наведается птица обломинго то через пару месяцев появится и x64 версия.
Кому интересно — может посмотреть здесь
auto& hook = SD_HP_CREATE_HOOK( MessageBoxA, "user32.dll" );
hook.setActive(true);
hook.setCallback( boost::bind( consoleMsg, _3 ) );
Конечно, она не дотягивает по могуществу до великого творения от микрософт, зато маленькая, открытая и моя )).
Сейчас он работает на x32, хотя и не очень стабильно, да и код ещё бяка, но если всё пойдёт нормально и ко мне не наведается птица обломинго то через пару месяцев появится и x64 версия.
Кому интересно — может посмотреть здесь
0
Описание:
>> sd poroject free libs
щто? sd? poroject?
Ну прям 1-2 фразы на русском, а еще лучше с примерами использования (пусть даже еще не существующими, но то, как ожидается) — было бы заметно приятнее.
>> sd poroject free libs
щто? sd? poroject?
Ну прям 1-2 фразы на русском, а еще лучше с примерами использования (пусть даже еще не существующими, но то, как ожидается) — было бы заметно приятнее.
0
Официальная библиотека для написания костылей? Внедрять чужой код в адресное пространство другого кода? Да хотя это еще ничего, раньше было принято вообще свои конфиги в c:\windows сваливать и системные библиотеки dll заменять. Уиндоуз-разработчики, они такие… особенные.
-4
Как ньюфаг, очень рад таким постам. Вдруг проявился интерес к ассемблеру и работе windows «за ширмой». И такие вещи как понимание вызовов функций и их перехват очень в этом помогает. Спасибо!
+2
я один неправильно прочитал заголовок с первого раза?
+1
Вот сейчас сижу мучаюсь, никак не могу понять почему функцию в вашем примере хукает, а ReleaseDC никак не хочет…
0
Трейнеры для взрослых :-)
0
Кстати, теперь Detours опенсорсный. Мб Вы уже в курсе, но я только вот заметил.
github.com/microsoft/Detours/tree/master
github.com/microsoft/Detours/tree/master
0
Sign up to leave a comment.
Хуки — это просто