Сейчас на форуме: Magister Yoda, johnniewalker, Kybyx, vsv1, r0lka, -Sanchez-, testrev1337 (+3 невидимых) |
eXeL@B —› Крэки, обсуждения —› Кривые хуки системных библиотек |
Посл.ответ | Сообщение |
|
Создано: 25 февраля 2011 22:30 · Поправил: Smon · Личное сообщение · #1 Всем доброго времени суток! Неоднократно встречал не особо умные хуки на системных функциях из kernel32, user32, advapi и т.п. Это когда хук ставится вписыванием long jmp (E9h) в начало функции, что зачастую бывает критично для совместимости, подобные были например в более ранних версиях KIS и KAV (до 8ки) или в небезызвестном CryptoPro CSP. Адекватные хуки пишутся например в таблицу экспорта библиотеки, через дрова, ну и прочими вариациями. Вопрос - есть ли надёжный и простой способ определения, захучена ли вообще заданная системная библиотека таким костыльным способом или нет? Есть конечно вариант проверять начала всех функций из экспорта (вплоть до дизасма нескольких инструкций) и проверка их на переходы за пределы библиотеки, но это долго и не совсем ясно с реализацией и надёжностью метода - ведь системные библы имеют и форварды друг в друга. Да и медленно это очень. Неужели rku юзает именно такой способ ? PS: вариант мапить "вручную" системные библиотеки в процессе, обрабатывать релоки, и сравнивать crc двух аналогичных секций кода конечно есть, но опять таки он довольно муторен в реализации, хотя похоже и понадежней чем дизасм. ----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels | Сообщение посчитали полезным: mikus |
|
Создано: 25 февраля 2011 22:59 · Личное сообщение · #2 Описать код графом и сравнить его с оригинальным. Иначе никак. | Сообщение посчитали полезным: mikus |
|
Создано: 25 февраля 2011 23:08 · Личное сообщение · #3 Что касается паблик RkU, то он очевидно сравнивает 1-е 5 байт с оригиналом, т.к. если поставить джамп дальше он его не увидит. ----- продавец резиновых утёнков | Сообщение посчитали полезным: mikus |
|
Создано: 26 февраля 2011 08:13 · Личное сообщение · #4 ИМХО только мапить, настраивать релоки и сравнивать первые N байт начала функций. ----- Yann Tiersen best and do not fuck | Сообщение посчитали полезным: mikus |
|
Создано: 26 февраля 2011 10:49 · Личное сообщение · #5 |
|
Создано: 26 февраля 2011 11:30 · Личное сообщение · #6 |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 26 февраля 2011 11:39 · Поправил: ELF_7719116 · Личное сообщение · #7 |
|
Создано: 26 февраля 2011 11:56 · Личное сообщение · #8 |
|
Создано: 26 февраля 2011 12:15 · Личное сообщение · #9 ClockMan пишет: И высчитываются легко тк обычно указывают за пределы секции кода бибблиотеки,поэтому умный хук ставится по опосля 3-4 комманд ;) Я говорил о подмене адреса в экспорте, а опосля 3-4 команд это те же костыли и грабли что и непосредственно в самое начало. Про чексумму тоже уже думал, как раз из за релоков не подходит такой вариант, хотя конечно и можно попробовать переобработать релоки в копии на базу которая прописана в хидере. Похоже вариант с мапом, обработкой релоков и последующим сравнением всё же наиболее правильный и надёжный. ----- "Пусть видят, что мы не шутим. Стволы для понта, ножи для дела" Lock, Stock & Two Smoking Barrels |
|
Создано: 26 февраля 2011 12:43 · Личное сообщение · #10 Smon пишет: Неоднократно встречал не особо умные хуки на системных функциях из kernel32, user32, advapi и т.п.Это когда хук ставится вписыванием long jmp (E9h) в начало функции Не особо умные - это те разработчики, что ставят такие хуки не обрабатывая rel32 команды и еще те, которые эти хуки пытаются убрать не проверив не похукано ли сверху. Отсюда и проблемы совместимости. На 32х битных виндах начиная с XP SP1 предусмотрен специальный механизм хотпатчей для постановки безопасных хуков сплайсом, для этого заменяем mov edi, edi на jmp $-5, и в нопах находящихся перед функцией прописываем long jmp куда надо. Smon пишет: Адекватные хуки пишутся например в таблицу экспорта библиотеки, через дрова, ну и прочими вариациями. Вот только такие хуки можно ставить лишь в момент загрузки библиотеки. После уже поздно. Еще они не ловят вызов функций библиотеки из её самой же. Smon пишет: Вопрос - есть ли надёжный и простой способ определения, захучена ли вообще заданная системная библиотека таким костыльным способом или нет? Есть конечно вариант проверять начала всех функций из экспорта (вплоть до дизасма нескольких инструкций) и проверка их на переходы за пределы библиотеки, но это долго и не совсем ясно с реализацией и надёжностью метода Реализация тривиальна: идем по одной инструкции вниз до ret или rel32 команды, переходим по jmp rel8, не забываем ограничить число проверяемых команд чтоб не попасть в бесконечный цикл. Кода то тьфу. Smon пишет: Похоже вариант с мапом, обработкой релоков и последующим сравнением всё же наиболее правильный и надёжный. +100, вариант самый правильный и не так сложен как кажется. Только если задача - искать особо хитрые руткиты, то надо озаботиться низкоуровневым чтением файлов с диска, а то туда могут подставлять что надо. ----- PGP key |
|
Создано: 26 февраля 2011 12:49 · Личное сообщение · #11 Smon > как раз из за релоков не подходит такой вариант Всё подходит, просто нужно дельту пересчитать. Смотрим: Code:
Тоесть смещение для поправки вычисляется на основе базы из хидера, ну это понятно. Значит на время вызова этой функции туда нужно закрузить необходимое значение. Функа не экспортируется, но легко находится по двум инструкция [push 0xC000007B] - [push 0xC0000018] передающим статусы. Тоесть фиксим имя уже загруженного модуля в загрузчике, загружаем его есчо раз через LdrLoadDll(), при этом перехватываем LdrRelocateImage() например установив на неё брейк или протрассировав загрузчик. |
|
Создано: 26 февраля 2011 13:11 · Личное сообщение · #12 |
|
Создано: 26 февраля 2011 13:12 · Личное сообщение · #13 |
|
Создано: 26 февраля 2011 13:17 · Личное сообщение · #14 |
|
Создано: 26 февраля 2011 13:31 · Личное сообщение · #15 Clerk пишет: Зачем его писать, если он уже есть непосредственно готовый бинарный Затем, чтобы работало. Поиск неэкспортируемых функций по сигнатурам это мега-ахтунг, такое допустимо если иначе вообще никак. Я вот даже недокументированные в MSDN функции стараюсь использовать лишь по большой нужде, очень способствует отсутствию проблем. ----- PGP key |
|
Создано: 26 февраля 2011 13:48 · Личное сообщение · #16 ntldr > Поиск неэкспортируемых функций по сигнатурам это мега-ахтунг Мегатупость это писать загрузчики, делая всё вручную. И искать не нужно ничего, если используется трассировка загрузчика, то для каждого процедурного ветвления проверять в стеке строку (00 00 00 00 18 00 00 C0 7B 00 00 C0). Тоесть псевдокод более чем прост: Code:
> Я вот даже недокументированные в MSDN функции стараюсь использовать лишь по большой нужде, очень способствует отсутствию проблем. Вручную работать с пе-форматом это есчо большее зло, так как он может меняться. |
|
Создано: 26 февраля 2011 14:02 · Личное сообщение · #17 Не буду спорить, пусть каждый делает по своему, представления о качестве кода приходят с опытом написания серьезных программ с фидбеком и нормальным тестированием. Если у вас тысячи пользователей, у всех всё работает и нигде не глючит - честь вам и хвала. ----- PGP key |
|
Создано: 26 февраля 2011 15:38 · Личное сообщение · #18 |
eXeL@B —› Крэки, обсуждения —› Кривые хуки системных библиотек |
Эта тема закрыта. Ответы больше не принимаются. |