Pull to refresh

Comments 63

UFO landed and left these words here
Вот тоже неплохой вариант с примером инжектора вдобавок, правда на ассемблере http://goo.gl/EY9sg
Когда я переходил на *nix-системы, я испытал небольшой шок от того, насколько проще там осуществлять перехват библиотечных функций. Всё встроено в системные загрузчики исполняемых файлов и контролируется установкой переменных окружения (LD_PRELOAD, DYLD_INSERT_LIBRARIES, etc).
Более того, там это и не нужно чаще всего — взяли исходники, почитали, поправили, собрали. Удобно, не поспоришь. Но ведь и в Windows надо уметь что-то делать.
Далеко не всё можно просто взять и пересобрать. Геморрой ещё тот порою. И не всё открыто.
Более того, там это и не нужно чаще всего
Ну для штук вроде fakeroot незаменимо. Помимо этого есть всякие padsp, socksify, v4l2compat.so и прочие, эмулирующие для софта несколько иное програмное окружение, чем то, в котором он реально находится.
Даже догадываюсь почему. Всякие хакеры давно облюбовали винду для испытания всяких гадостей. Вполне естественно, что мелкософт с этим посильно борется, повышая планку сложности реализации хука. Т.е. реализовать хук либо сложно, либо дорого :-).
Да нет. Просто в форточках (которые до Win2K были «набором 32-битных расширений и графической оболочкой для 16-битного патча для 8-битной ОС, изначально созднанной для 4-битного микропроцессора») изначально никакой функциональности для перехвата чего либо (ну кроме SetWindowsHookEx) предусмотрено не было. В итоге народ начал изобретать велосипеды, т. к. проблему надо было решать, а нормально она решается только вставкой джампа на свой код в начале функции с предварительным дизассемблированием её кода на предмет получения длины замещаемых команд, дабы их потом перед переходом обратно выполнить. Удаление гланд через прямую кишку, в общем, как это обычно с форточками и бывает.
Подменить либу там действительно легко, но как же перехватить вызов метода и заменить его на свой? Развлекаться с SystemTap'ом или DTrace?
Вызов чего? Вы про перехват методов библиотечных плюсовых классов? Если да, то смотрите сырцы SkypeTab, я там, вроде как, адекватно это сделал и без плясок с бубном.
Перехват там делается банальным объявлением своей реализации и загрузчик её подтянет. Единственное, надо выяснить имя символа для получения адреса оригинала, но его можно посмотреть либо в самом бинарнике, либо пнуть dladdr.
Лучше бы рассказали как это сделать бесплатно.
Извините, вы коммерческий софт пишете, или что? Вам в любом случае придётся раскошелиться на MS Authenticode, т. к. антивирусы с большим подозрением относятся к софту, выполняющему перехваты функций и при этом не имеющему цифровой подписи. Если же софт некоммерческий, то для такого использования есть бесплатная версия.
Мне интересно для развития.
Интересно для развития — используйте версию для некоммерческого использования. В чём проблема?
Читаете с нужного адреса пару десятков байт (максимальная длина команды в x86 в районе 15, если не ошибаюсь со всеми префиксами. Берете абсолютно любой дизассемблер длин, или полноценный и смотрите сколько команд затрет ваш jmp ptr длинной в 5 байт. Копируете эти команды в другое место, за ними пишете еще один jmp обратно (с учетом затертых команд). После этого пишете в нужном месте jmp на себя.
Вместо jmp addr(0xEB) можно использовать связку push const/ret. Выходит тоже самое.
еще как вариант — установить собственный обработчик векторного или структурного прерывания, и в нужных местах вписать int3/int1/ud2 или прочие команды, вызываюшие exception. Обрабатываете его, и прыгаете куда вам надо.
Таким же способом можно поставить аппаратный breakpoint через регистры dr0-dr3,dr7, тогда по факту вообще никакого патча не будет.
спасибо, что объяснили!
И я уж молчу про то, что в нормальных приложениях адреса API берутся из IAT. Таким образом будет достаточно подменить там адрес функции на адрес своего обработчика.
IAT можно найти распарсив MZ-PE заголовок
Эм. А дотнетовские приложения использующие P/Invoke с каких пор перестали быть нормальными? Не говоря уже о всяких древностях на VB6.
В тексте есть 3 ссылки на другие статьи и библиотеки. Статьи хорошие, библиотеки бесплатные. Но на мой взгляд, и статьи и библиотеки существенно сложнее изложенного материала.
1. Не «лучше», а " расскажите, пожалуйста".
2. Вроде как рассказали достаточно
Вам достаточно. Про подмену средствами WinAPI не говорится.
«В этой статье мы рассмотрим замену колеса у машины. Покупаем колесо, едем на шиномонтаж, нам меняют колесо». Супер.
Да, не говорится. В начале статьи сразу и говорят, что эта статья будет выгодно отличаться от остальных минимальностью захламления сложностями. При этом даются ссылки на более подробные статьи, посмотрите их…
Спасибо кеп. Но для того, чтобы понять, что тут таки не WinAPI а сторонняя библиотека, приходится пол статьи читать. Это бесит.
Продублирую для Вас ссылки из начала статьи: раз, два. Там Вам расскажут и про домкраты, и про секретные гайки и о том, как это делать ночью в темноте для чужой машины.
Моя статья предназначена для того, кому сразу читать не статьи сложно.
Вместо перехвата SendMessage можно попробовать сделать GetWindowsLong\SetWindowsLong с параметром WNDPROC. И точно так же обрабатывать SETTEXT
Хуки — это хаки. Пускай заранее предусмотренные архитектурой, но хаки. Вызывающий код о них ничего не знает. Посылка сообщений «честнее».
Данный конкретный пример можно сделать кучей способов (в том числе и посылкой сообщения). Есть многое, что посылкой сообщения сделать нельзя, а хуками можно.
Если хуки предусмотрены архитектурой. Или архитектура не может внешним хукам противодействовать.
Ага, вот так что-нибудь сделают хуками, а пользователи потом третируют разработчика исходного софта — откуда, дескать, у меня там глюки. У нас был пример несколько лет назад. В программе использовался встроенный движок скрипта для автоматизации некоторых действий. Касперский со своими хуками влезал, чтобы проверить этот скрипт и вылетал с громким треском (он-то думал, что это Internet Explorer...). А выглядело так, что на ровном месте падает наша программа.
UFO landed and left these words here
Да, хуки очень легко использовать не верно. Вот даже Касперский с Интелом иногда ошибаются. Тем не менее, их можно использовать и правильно. Хорошие библиотеки могут иногда в этом помочь.
UFO landed and left these words here
Отличный ответ! программировать можно правильно… а можно неправильно :-)
И я даже больше скажу! Программировать правильно — это более правильно, чем делать это неправильно!
:)
Извините, но #include «C:\Program Files\Microsoft Research\Detours Express 3.0\src\detours.h» — это аццкий ад, хоть и приложение тестовое. Для таких вещей в студии есть Additional Include Derictories.
Я в курсе. Это был бы еще один скриншот и 3 строки текста. В статье вообще многим пожертвовано в ущерб простоте и краткости. И всё равно мне кажется излишне сложно и длинно вышло…
Рекомендую madCodeHook(http://www.madshi.net/madCodeHookDescription.htm), помимо того что эта библиотека хучит она еще умеет инжектить во все вновь запущенные процессы. Очень удобная вещь
А существует ли что-нибудь подобное для C#?
Делаете в шарпе либу, экспортирующую функции через секцию PE-файла, используете описанный в статье метод.
Хотя, тут в DllMain всё это, придётся писать небольшой враппер.
Да в майкрософте совсем обалдели: за про версию (с поддержкой х64 и разрешением на коммерческое использование) просят, тарам-пам-пам, 10К долларов. И это при том, что сама библиотека занимает всего 250Кб кода (пусть, 500 с учетом отсутствия х64 в express edition). При чем написана она в достаточно примитивном стиле. Беда, в общем :(
Сколько просят — это их дело… мне вот интересно, её покупают?
Мы покупали.
Писать дизассемблер для x64 было затратнее по деньгам и времени.
Хотя добавлю, что дизассемблер в detours довольно паршивенький — увидит jmp в первых 5 байтах функции — и ква.
Попадалась недавно с виду неплохая бесплатная библиотечка от одного из крупных вендоров — найти не могу.
А как это Вы ценность продукта в строках кода меряете? По Вашему, любая строка кода — хоть в студенческой лабе, а хоть в автопилоте шаттла — одинаково стоит? Плюсы и минусы Detours честно описаны в статье, равно как и ссылки на альтернативные решения. ИМХО Detours прекрасен в качестве учебной библиотеки, он не вываливает на неподготовленного юзера горы системной информации. А вот в реальных проектах я бы использовал что-то другое (цена всё-таки аргумент).
Я же читал исходники :) единственная более-менее стоящая вещь там — дизассемблер, и то весьма средненького качества (выше уже писали), кроме того есть бесплатные аналоги. Например, я для тех же целей использовал «медиану», один день допиливания дал возможность перехватывать все что угодно. Так что не стоит оно таких денег.
Я некоторое время назад начал писать свой небольшой фреймворк для установки хуков на API, чтобы можно было сделать что-то типа:

auto& hook = SD_HP_CREATE_HOOK( MessageBoxA, "user32.dll" );
hook.setActive(true);
hook.setCallback( boost::bind( consoleMsg, _3 ) );

Конечно, она не дотягивает по могуществу до великого творения от микрософт, зато маленькая, открытая и моя )).

Сейчас он работает на x32, хотя и не очень стабильно, да и код ещё бяка, но если всё пойдёт нормально и ко мне не наведается птица обломинго то через пару месяцев появится и x64 версия.
Кому интересно — может посмотреть здесь
Описание:
>> sd poroject free libs
щто? sd? poroject?

Ну прям 1-2 фразы на русском, а еще лучше с примерами использования (пусть даже еще не существующими, но то, как ожидается) — было бы заметно приятнее.
Здесь — test\hookproc\HookProcTest.cpp все примеры, работающие на текущий момент, описание действительно стоит поправить, просто не планировал это публиковать нигде, пока эту статью не увидел.
Официальная библиотека для написания костылей? Внедрять чужой код в адресное пространство другого кода? Да хотя это еще ничего, раньше было принято вообще свои конфиги в c:\windows сваливать и системные библиотеки dll заменять. Уиндоуз-разработчики, они такие… особенные.
Вы что-то совсем всё в одну кучу попутали.
Ах, простите, посмотрел Ваш профиль — Вам можно.
После ваших слов тоже полюбопытствовал. Ни фига себе, стрелку осциллографа рейтингометра зашкалило :-)
Как ньюфаг, очень рад таким постам. Вдруг проявился интерес к ассемблеру и работе windows «за ширмой». И такие вещи как понимание вызовов функций и их перехват очень в этом помогает. Спасибо!
я один неправильно прочитал заголовок с первого раза?
Вот сейчас сижу мучаюсь, никак не могу понять почему функцию в вашем примере хукает, а ReleaseDC никак не хочет…
Only those users with full accounts are able to leave comments. Log in, please.