Сейчас на форуме: tyns777 (+4 невидимых) |
eXeL@B —› Программирование —› Определение валидности команды в коде |
Посл.ответ | Сообщение |
|
Создано: 09 сентября 2010 17:06 · Личное сообщение · #1 Доброго всем времени суток. Бывают случаи, когда очень трудно отличить реальную команду call _offset(например) от случайного мусора. Тот же hiew довольно достоверно показывает в таком случае, что такой-то адрес указывает в середину такой-то команды, т.е. искомый байт 0xE8 не является командой call _offset. Интересует принцип подобного определения. Я думаю, что делается дизасм с какой-нибудь точной точки (например OEP) и далее сохраняются все перекрёстные обращения. Потом ищется ближайшая точка к искомому адресу, чтобы начать отууда дизасм и вероятно определить, является ли искомый адрес настоящей командой или это так сказать "междометие" Я прав? Если нет, то как это сделать? ----- the Power of Reversing team |
|
Создано: 09 сентября 2010 17:22 · Личное сообщение · #2 |
|
Создано: 09 сентября 2010 17:57 · Личное сообщение · #3 |
|
Создано: 09 сентября 2010 19:09 · Поправил: DillerInc · Личное сообщение · #4 int пишет: С какой целью интересуешься? ...всё банально. Меня запарила ситуация, когда мусорные команды call _offset приводят в падению исследуемого процесса. Возникающее исключение в ряде случаев не доходит до уровня ring3, и обработчик перехвата KiUED не получает управления. Isaev пишет: Только полным анализом кода, думаю... как это делает IDA ...а тогда как это делает хиев? Он явно не тратит столько времени на анализ, как IDA... ----- the Power of Reversing team |
|
Создано: 09 сентября 2010 19:31 · Личное сообщение · #5 |
|
Создано: 09 сентября 2010 20:31 · Личное сообщение · #6 |
|
Создано: 10 сентября 2010 09:31 · Личное сообщение · #7 |
|
Создано: 10 сентября 2010 12:25 · Личное сообщение · #8 |
|
Создано: 10 сентября 2010 16:05 · Личное сообщение · #9 В общем, поступило предложение использовать эвристический анализ. Т.е. дизасмить исследуемое место с разных смещений и смотреть, где будет более правдоподобный расклад. В этом случае дело упирается в создание необходимой эвристики. Помнится, кто-то на форуме постил про определение мусорного кода по специфическим командам. Только я не помню, где это пост мог быть и кто его делал. ----- the Power of Reversing team |
|
Создано: 10 сентября 2010 17:29 · Личное сообщение · #10 |
|
Создано: 10 сентября 2010 17:32 · Личное сообщение · #11 DillerInc >Меня запарила ситуация, когда мусорные команды call _offset приводят в падению исследуемого процесса. > Возникающее исключение в ряде случаев не доходит до уровня ring3, и обработчик перехвата KiUED не получает управления. В общем случае это инвалидация стека. Сегмента стека или смещения. Это решается восстановлением стека из менеджера фолтов ядра(KdpStub etc.). |
|
Создано: 10 сентября 2010 17:57 · Личное сообщение · #12 |
|
Создано: 10 сентября 2010 18:35 · Личное сообщение · #13 |
|
Создано: 10 сентября 2010 18:52 · Личное сообщение · #14 DillerInc Ну давайте подумаем. Допустим имеется инструкция Call rel32(0xE8) в модуле. Это ветвление должно быть валидно если: o Смещение находится в текущем модуле. o Смещение находится в пределах кодосекций модуля. o Первые инструкции процедуры должны уменьшать ссылку на стек(push, call etc., o В пределах процедуры не должно быть подобных инвалидных ветвлений, привилегированных инструкций, системных инструкций(smsw, sidt etc.), перезагрузок сегментных регистров, ссылок на данные за пределами модуля и пр. Для такого анализа необходимо создать полноценный граф, с помощью базавого эта задача не может быть решена оптимальным способом. > процесс запущен, в него внедрена либа, которая получает в определённый момент управление и начинает обработку. Подробнее опишите. |
|
Создано: 10 сентября 2010 23:35 · Личное сообщение · #15 DillerInc Вы можете сделать допущения: 1) это стандартный бинарь после компиллера и там изратов, как после крипторов нет 2) Вы можете определить точки вызовов АПИ-функций Теперь что это дает: 1) Делать анализ эмулируя работу функций передающих исполнение, но!!! обходя все возможные участки код по каким может пройти процессор если сработают те или иные условия. Будете знать где выполняется код, а где нет. Своего рода ИДА-про в трейсере подсвечивает синим "я тут был" ) 2) Можно попытаться найти ближайший вызов АПИ-шки и от этого АПИ-вызова эмулить. 3) Если вы в dll-ке, то вероятно она чтото экспортирует. Значит можно определить в границах какой экспортируемой ф-ции вы находитесь. Зная это уже необязательно трейсить весь модуль, а можно сразу же от начала экспортируемой. 4) Походу "трейсинга" можно смотреть куда идут прыжки? Может вообще в "космос", тогда чтото нето |
|
Создано: 11 сентября 2010 00:31 · Личное сообщение · #16 sys_dev пишет: Если вы в dll-ке, то вероятно она чтото экспортирует. Некоторые вирусы используют экспорт для того, чтобы ломать дизассемблеры. IDA тоже умом не отличается на таких файлах (кого-то это удивляет?). Короче всё можно сделать, главное аккуратно. И не тупо набор правил закинуть, а дать им приоритет. DillerInc Всё зависит от того, какая задача у вас стоит. Не стоит тратить время на создание универсального решения, если вашей целью не является создание отладчика, например. Если речь, скажем, о StarForce, то там всё гораздо проще. |
|
Создано: 11 сентября 2010 00:47 · Личное сообщение · #17 >>Некоторые вирусы используют экспорт для того, чтобы ломать дизассемблеры Есно дело, всегда есть какие-то ограничения и все зависит в какой ситуации мы находимся и для каких задач пишется решение! Где-то хватит тупизны, это будет решать задачу и быстро написано, а где-то нужно по-интелектуальней и там затраты в человеко-часах оправданы! |
|
Создано: 11 сентября 2010 01:15 · Личное сообщение · #18 |
|
Создано: 11 сентября 2010 11:58 · Личное сообщение · #19 |
|
Создано: 11 сентября 2010 13:22 · Личное сообщение · #20 Clerk пишет: > Некоторые вирусы используют экспорт для того, чтобы ломать дизассемблеры. По мойму самый норм способ это разбить граф. Тоесть выполнить ветвление не на начало иснтрукции. The State-Enhanced Control Flow Graph + эмуляция , в обоих используется дизасм , все прекрасно работает. Твой КФГ это может ? Ты его вроде для примерных целей делал. П.С. Помойму у тебя др скоро ?! С наступающим ДР =) Знак девы весьма скандальный знак , но я сам дева DillerInc Посмотри док ниже , клерк верно сказал , на уровне команд асм, все достаточно просто , анализ полный без графа это не анализ , а в таких случаях Се КФГ хорошее решение , правда я к этому использую еще эмулятор заточенный на детекцию лишних команд и раскручивания кода. 8c0c_11.09.2010_CRACKLAB.rU.tgz - SECFG.pdf ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube |
|
Создано: 11 сентября 2010 14:06 · Личное сообщение · #21 |
|
Создано: 11 сентября 2010 15:03 · Личное сообщение · #22 |
|
Создано: 11 сентября 2010 21:40 · Личное сообщение · #23 Я делал так. Вычислял адрес, куда ведет call, дизассемблил n-инструкций, пропуская лупы, jcc, колы и смотрел на инструкции, если дизасм нормально отработал и нет инструкций ring0, очень редко встречающихся и явно кривых, то считал, что это валидный call. Довольно криво, но работало с точностью до 80%. ----- Yann Tiersen best and do not fuck |
|
Создано: 13 сентября 2010 10:48 · Личное сообщение · #24 |
eXeL@B —› Программирование —› Определение валидности команды в коде |