Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› Определение валидности команды в коде
Посл.ответ Сообщение


Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 09 сентября 2010 17:06
· Личное сообщение · #1

Доброго всем времени суток.
Бывают случаи, когда очень трудно отличить реальную команду call _offset(например) от случайного мусора. Тот же hiew довольно достоверно показывает в таком случае, что такой-то адрес указывает в середину такой-то команды, т.е. искомый байт 0xE8 не является командой call _offset.
Интересует принцип подобного определения.
Я думаю, что делается дизасм с какой-нибудь точной точки (например OEP) и далее сохраняются все перекрёстные обращения. Потом ищется ближайшая точка к искомому адресу, чтобы начать отууда дизасм и вероятно определить, является ли искомый адрес настоящей командой или это так сказать "междометие"

Я прав? Если нет, то как это сделать?

-----
the Power of Reversing team





Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 09 сентября 2010 17:22
· Личное сообщение · #2

Только полным анализом кода, думаю... как это делает IDA
иначе любой к любому "валидному" кусоку кода можно обращаться как к просто данным, и что до него никогда не дойдет выполнение Ваш способ никак не определит

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 09 сентября 2010 17:57
· Личное сообщение · #3

DillerInc
С какой целью интересуешься? Делается через анализатор, как верно отметил Isaev. У меня есть код, который это делает.




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 09 сентября 2010 19:09 · Поправил: DillerInc
· Личное сообщение · #4

int пишет:
С какой целью интересуешься?

...всё банально. Меня запарила ситуация, когда мусорные команды call _offset приводят в падению исследуемого процесса. Возникающее исключение в ряде случаев не доходит до уровня ring3, и обработчик перехвата KiUED не получает управления.

Isaev пишет:
Только полным анализом кода, думаю... как это делает IDA

...а тогда как это делает хиев? Он явно не тратит столько времени на анализ, как IDA...

-----
the Power of Reversing team




Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 09 сентября 2010 19:31
· Личное сообщение · #5

DillerInc пишет:
не тратит столько времени на анализ, как IDA

А это и не требуется. В IDA долго работает FLIRT, да и без FLIRT'а криво реализовано, что в IDA, что в OllyDbg.




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 09 сентября 2010 20:31
· Личное сообщение · #6

Хорошо, как тогда выглядит полный анализ кода?

-----
the Power of Reversing team





Ранг: 68.0 (постоянный), 6thx
Активность: 0.060
Статус: Участник

Создано: 10 сентября 2010 09:31
· Личное сообщение · #7

А что если использовать дизасм длин и каждый оператор проверять на наличие call xxxxxxxx, переходить по адресу и там уже анализировать?



Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 10 сентября 2010 12:25
· Личное сообщение · #8

Можно еще глянуть в UPX-сорцы, как они там решают проблему "фильтрации", для этого поискать функции в имени которых *ilter*




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 10 сентября 2010 16:05
· Личное сообщение · #9

В общем, поступило предложение использовать эвристический анализ.
Т.е. дизасмить исследуемое место с разных смещений и смотреть, где будет более правдоподобный расклад.
В этом случае дело упирается в создание необходимой эвристики. Помнится, кто-то на форуме постил про определение мусорного кода по специфическим командам. Только я не помню, где это пост мог быть и кто его делал.

-----
the Power of Reversing team




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 10 сентября 2010 17:29
· Личное сообщение · #10

Нужно по многим признакам определять. Например по валидности смещения, принадлежность адреса модулям и пр. Если анализ кода, то например в UM не должно быть привилегированных инструкций, текстовых строк и пр. Сложная здача, но решаемая.



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 10 сентября 2010 17:32
· Личное сообщение · #11

DillerInc
>Меня запарила ситуация, когда мусорные команды call _offset приводят в падению исследуемого процесса.
> Возникающее исключение в ряде случаев не доходит до уровня ring3, и обработчик перехвата KiUED не получает управления.

В общем случае это инвалидация стека. Сегмента стека или смещения. Это решается восстановлением стека из менеджера фолтов ядра(KdpStub etc.).



Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 10 сентября 2010 17:57
· Личное сообщение · #12

DillerInc
ты собираешься решать подобное статически или в уже запущеном процесс и остановленном на какой-либо точке ?




Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 10 сентября 2010 18:35
· Личное сообщение · #13

sys_dev, процесс запущен, в него внедрена либа, которая получает в определённый момент управление и начинает обработку.
Clerk пишет:
Например по валидности смещения, принадлежность адреса модулям и пр.

...это есть, но невсегда спасает. Поэтому и нужен анализ кода.

-----
the Power of Reversing team




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 10 сентября 2010 18:52
· Личное сообщение · #14

DillerInc
Ну давайте подумаем. Допустим имеется инструкция Call rel32(0xE8) в модуле. Это ветвление должно быть валидно если:
o Смещение находится в текущем модуле.
o Смещение находится в пределах кодосекций модуля.
o Первые инструкции процедуры должны уменьшать ссылку на стек(push, call etc., http://files.virustech.org/indy/Code/StBal/StBal.asm
o В пределах процедуры не должно быть подобных инвалидных ветвлений, привилегированных инструкций, системных инструкций(smsw, sidt etc.), перезагрузок сегментных регистров, ссылок на данные за пределами модуля и пр. Для такого анализа необходимо создать полноценный граф, с помощью базавого эта задача не может быть решена оптимальным способом.

> процесс запущен, в него внедрена либа, которая получает в определённый момент управление и начинает обработку.
Подробнее опишите.



Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 10 сентября 2010 23:35
· Личное сообщение · #15

DillerInc
Вы можете сделать допущения:
1) это стандартный бинарь после компиллера и там изратов, как после крипторов нет
2) Вы можете определить точки вызовов АПИ-функций

Теперь что это дает:
1) Делать анализ эмулируя работу функций передающих исполнение, но!!! обходя все возможные участки код по каким может пройти процессор если сработают те или иные условия. Будете знать где выполняется код, а где нет. Своего рода ИДА-про в трейсере подсвечивает синим "я тут был" )

2) Можно попытаться найти ближайший вызов АПИ-шки и от этого АПИ-вызова эмулить.

3) Если вы в dll-ке, то вероятно она чтото экспортирует. Значит можно определить в границах какой экспортируемой ф-ции вы находитесь. Зная это уже необязательно трейсить весь модуль, а можно сразу же от начала экспортируемой.

4) Походу "трейсинга" можно смотреть куда идут прыжки? Может вообще в "космос", тогда чтото нето



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 11 сентября 2010 00:31
· Личное сообщение · #16

sys_dev пишет:
Если вы в dll-ке, то вероятно она чтото экспортирует.

Некоторые вирусы используют экспорт для того, чтобы ломать дизассемблеры. IDA тоже умом не отличается на таких файлах (кого-то это удивляет?). Короче всё можно сделать, главное аккуратно. И не тупо набор правил закинуть, а дать им приоритет.

DillerInc
Всё зависит от того, какая задача у вас стоит. Не стоит тратить время на создание универсального решения, если вашей целью не является создание отладчика, например. Если речь, скажем, о StarForce, то там всё гораздо проще.



Ранг: 57.1 (постоянный), 3thx
Активность: 0.040
Статус: Участник

Создано: 11 сентября 2010 00:47
· Личное сообщение · #17

>>Некоторые вирусы используют экспорт для того, чтобы ломать дизассемблеры
Есно дело, всегда есть какие-то ограничения и все зависит в какой ситуации мы находимся и для каких задач пишется решение! Где-то хватит тупизны, это будет решать задачу и быстро написано, а где-то нужно по-интелектуальней и там затраты в человеко-часах оправданы!



Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 11 сентября 2010 01:15
· Личное сообщение · #18

> Некоторые вирусы используют экспорт для того, чтобы ломать дизассемблеры.
По мойму самый норм способ это разбить граф. Тоесть выполнить ветвление не на начало иснтрукции.



Ранг: 101.0 (ветеран), 344thx
Активность: 1.150
Статус: Участник

Создано: 11 сентября 2010 11:58
· Личное сообщение · #19

Clerk пишет:
Тоесть выполнить ветвление не на начало иснтрукции.

Такое есть в Armadillo (наверно тоже в каком-то вирусе идею взяли). Там очень интересный криптор. Но динамическую деобфускацию ещё никто не отменял.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 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




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 11 сентября 2010 14:06
· Личное сообщение · #21

int
Все идеи лично мои. У меня принцип не копипаста

mak




Ранг: 237.0 (наставник), 20thx
Активность: 0.130
Статус: Участник
sysenter

Создано: 11 сентября 2010 15:03
· Личное сообщение · #22

mak
отпишись в аську. дело есть.

-----
продавец резиновых утёнков





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 11 сентября 2010 21:40
· Личное сообщение · #23

Я делал так. Вычислял адрес, куда ведет call, дизассемблил n-инструкций, пропуская лупы, jcc, колы и смотрел на инструкции, если дизасм нормально отработал и нет инструкций ring0, очень редко встречающихся и явно кривых, то считал, что это валидный call. Довольно криво, но работало с точностью до 80%.

-----
Yann Tiersen best and do not fuck





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 13 сентября 2010 10:48
· Личное сообщение · #24

Ну, вы навалили...
Искомые процедуры - переходники протектора (для импорта, для краденого кода). В них полиморф и прочая хрень.
В общем, намёки понял. Благодарю за варианты. Когда что-нибудь дельное напишу, то отпишусь сюда.

P.S. PE_Kill, с возвращением.

-----
the Power of Reversing team



 eXeL@B —› Программирование —› Определение валидности команды в коде
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати