eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: panlik (+2 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Протекторы —› Статическая трассировка кода
. 1 . 2 . 3 . 4 . 5 . 6 . >>
Посл.ответ Сообщение

Ранг: 68.6 (постоянный)
Статус: Участник

Создано: 11 декабря 2017 18:39 · Поправил: Boostyq New!
Цитата · Личное сообщение · #1

Всем привет,
Изучаю x86 драйвер, он защищен с помощью vmp
Случай достаточно простой, только некоторые функции мутированы (обфусцированы?), даже нет внешней упаковки
Для того чтобы посмотреть обфускацию целиком, нужна трасса от и до
Дебажить его у меня нет возможности, да и вообще хочу попробовать сделать это статически
Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций (операции стека, прыжки, вызовы), который бы "выполнял" код до тех пор пока не встретиться выход из функции
Правда не ясно что делать c вызовами API, stdcall мы же очищаем стек, но вот с другими соглашениями?
Дело даже не в проте, а вообще в целом
Я пыталась делать парсер конкретных команд под конкретный прот, но дело в том, что это не возможно реализовать, ибо число нелогичных приемов может быть очень большое, поэтому нужно спуститься на самый нижний уровень, для того чтобы выполнять код как сам процессор это делает
Возможно кто-то даст дельный совет, может кто-то уже делал подобное?
Так же я пыталась найти псевдо-код, как процессор выполняет команды, т.к. вмпрот любит использовать редкие команды, может у кого то есть линки?
Спасибо

Ранг: 44.8 (посетитель)
Статус: Участник

Создано: 11 декабря 2017 18:44 New!
Цитата · Личное сообщение · #2

google: symbolic execution. Есть вполне рабочие движки на руби, питоне, жабе, и даже нативные

| Сообщение посчитали полезным: Boostyq



Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 11 декабря 2017 19:01 New!
Цитата · Личное сообщение · #3

SegFault

Как вы себе представляете кернел код на питоне ?

Это сразу сломает ось, это вообще возможно запустить в км в принципе ?

> Так же я пыталась найти псевдо-код, как процессор выполняет команды

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

> Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций

Виртуальную машину, а точнее визор - да, это способ.)

Ранг: 68.6 (постоянный)
Статус: Участник

Создано: 11 декабря 2017 19:10 · Поправил: Boostyq New!
Цитата · Личное сообщение · #4

difexacaw пишет:
Тоесть получается что вы не знаете что псевдокод описан в манах по архитектуре, тоесть их никогда не видели(основы). Тогда вы эту задачу решить не сможите, если не знаете базовую архитектуру. В таком случае как можно пытаться снять кернел протектор, это невозможно. У вас скилл не достаточный для данной работы.

Спасибо за ответ
Я не спорю, что знания совсем не полные, я за обучение в процессе
Но мне кажется я недостаточно верно выразилась
Я не собираюсь эмулировать код, исполнять его как либо, а лишь написать инструмент, который проследит маршрут кода от и до
Архитектура только x86, как основной инструмент ида с питоном
И конечно я понимаю инструкции, но мне гораздо проще читать например код, чем документацию, т.е. не "retn - возврат", а "eip = *(uint32_t *)esp; esp += 4;"
Конечная цель лишь получение трассы от и до у конкретной функции, для дальнейшего статического анализа


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 11 декабря 2017 19:19 New!
Цитата · Личное сообщение · #5

Boostyq

А в чём тогда проблема ?
Ставите ловушку и накапливайте лог в бд. С чем именно проблема ?
Как установить ловушку ?
Понятно что получится бд огромного размера и она будет бесполезной, но задача как я понял просто снять трассу.

Ранг: 409.2 (мудрец)
Статус: Участник

Создано: 11 декабря 2017 20:55 · Поправил: dosprog New!
Цитата · Личное сообщение · #6

На основании чeго будут выполняться ветвления?

Это абсурд.

И название темы дурацкое - как трассировка может быть статической?

| Сообщение посчитали полезным: gggeorggge


Ранг: 68.6 (постоянный)
Статус: Участник

Создано: 11 декабря 2017 21:17 · Поправил: Boostyq New!
Цитата · Личное сообщение · #7

dosprog пишет:
На основании чeго будут выполняться ветвления?

Это абсурд.


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

Ранг: 0.0 (гость)
Статус: Участник

Создано: 11 декабря 2017 22:00 · Поправил: Модератор New!
Цитата · Личное сообщение · #8

Boostyq пишет: Ничего не должно исполнятся

Самый простой вариант, это берете эмулятор, самый обычный хоть на базе capstone и к эмулятору добавляете ядерные заглушки, есть и статические альтернативы dbi, но там много кодить, очень много.
Настраиваете контекст и эмулируете необходимую вам функцию. Можно допилить pintrace.
Проект от которого можно оттолкнуться https://github.com/marcusbotacin/BranchMonitoringProject
если что то совсем простое, как выше уже писали сойдет symbolic execution.

| Сообщение посчитали полезным: Boostyq



Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 01:09 New!
Цитата · Личное сообщение · #9

Тут аналогичная задача, только немного для иных целей --> Link <--

Ну как я и говорил, почему не поставить обычную ловушку и трассировать через классический TF/branch trace не понятно. В км прикрутить классические дби врядле получится, оно всё еле ровно в юм работает


Ранг: 660.7 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 12 декабря 2017 02:43 New!
Цитата · Личное сообщение · #10

Boostyq пишет:

Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций (операции стека, прыжки, вызовы), который бы "выполнял" код
И
Я не собираюсь эмулировать код, исполнять его как либо

Воу-воу, так будет эмуляция или нет?

Для того чтобы посмотреть обфускацию целиком, нужна трасса от и до

От начала функции и до её конца? После вмпрота? О, ну тогда у меня для вас плохие новости.

Правильно Клерк пишет - не будет такая эмуляция работать. Вы забываете, что в ядре есть много своего АПИ, есть свои структуры и даже fs указывает совсем не туда, куда в юзермоде. Всё ядро будете эмулировать?


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 03:02 · Поправил: difexacaw New!
Цитата · Личное сообщение · #11

ARCHANGEL

Задача ведь в выделении кода, целиком процедур. Для этого нужно найти точки входа, исходные адреса для формирования cfg. Трассировка это лишь способ получить эти входы, причём она обеспечивает хорошее покрытие.

Ранг: 0.0 (гость)
Статус: Участник

Создано: 12 декабря 2017 03:32 New!
Цитата · Личное сообщение · #12

ARCHANGEL пишет: Всё ядро будете эмулировать?

чем вариант pemu плох? api совместимо с pin.


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 08:29 New!
Цитата · Личное сообщение · #13

difexacaw пишет:
Для этого нужно найти точки входа, исходные адреса для формирования cfg. Трассировка это лишь способ получить эти входы, причём она обеспечивает хорошее покрытие.

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

| Сообщение посчитали полезным: Gideon Vi, sendersu, VodoleY


Ранг: 68.6 (постоянный)
Статус: Участник

Создано: 12 декабря 2017 11:46 · Поправил: Boostyq New!
Цитата · Личное сообщение · #14

То что дал SegFault полезно, только как я поняла, проблема в том, что нужны входные данные и в зависимости от них, каждый условный прыжок пойдет по одному из 2 вариантов
В то время как мне нужны все ветви, т.е. весь код который может исполнятся при вызове данной функции
Я понимаю, что там могут быть обманные прыжки в никуда, которые никогда не выполняются, но этого я пока не вижу, я делаю это для простой обфускации
Вообще тема сложная для меня, и я хочу начать хотя бы с этого
Поэтому пробую писать скрипт для иды, который управляет стеком, работает с esp, ebp (остальные регистры наверное тоже придется добавить), следит за eip до тех пор пока точка выхода не будет после вызова
Code:
  1. .text:00013978 014                 push    ecx // <--- здесь начинаем
  2. .text:00013979 018                 push    edx
  3. .text:0001397A 01C                 call    Protected2 // тут код уходит в доп. секцию
  4. .text:0001397F 014                 jmp     short loc_1398A // >--- здесь останавливаемся

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


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 12:17 · Поправил: Vamit New!
Цитата · Личное сообщение · #15

Boostyq пишет:
.text:0001397A 01C call Protected2 // тут код уходит в доп. секцию

А кто сказал что это вызов функции? В вмпроте практически любой call сначала надо рассматривать как jmp и анализировать код дальше и только если будет из него возврат на следующую инструкцию или он ссылается на чистый код в программной секции, то это call.
Boostyq пишет:
но в моем случае только обфускация

Если функи только обфусцированы и отсутствует виртуализация, то такой код очень просто восстанавливается из под вмпрота руками и головой.

Ранг: 68.6 (постоянный)
Статус: Участник

Создано: 12 декабря 2017 12:24 · Поправил: Boostyq New!
Цитата · Личное сообщение · #16

Vamit пишет:
А кто сказал что это вызов функции? В вмпроте практически любой call сначала надо рассматривать как jmp и анализировать код дальше и только если будет из него возврат на следующую инструкцию или он ссылается на чистый код в программной секции, то это call.

Именно поэтому я пытаюсь написать трейсер, потому что у вмпрота слишком много трюков которые неочевидны
Code:
  1. Вызов PsGetCurrentProcessId:
  2. .MMQ0:00026F2A 00C                 push    ds:PsGetCurrentProcessId
  3. .MMQ0:00026F30 010                 pop     dword ptr [esp+44]
  4. .MMQ0:00026F34 00C                 push    edx
  5. .MMQ0:00026F35 010                 mov     [esp+8], bh
  6. .MMQ0:00026F39 010                 mov     [esp], dx
  7. .MMQ0:00026F3D 010                 push    dword ptr [esp+48]
  8. .MMQ0:00026F41 014                 retn    52
  9. Прыжок:
  10. .MMQ0:00026EDC 004                 push    dword ptr [esp]
  11. .MMQ0:00026EDF 008                 lea     esp, [esp+30h]
  12. .MMQ0:00026EE3 -28                 call    sub_41076
  13. .MMQ0:00026EE8 -28                 stc

Однако тут я точно уверена, так как этот кусочек кода находится в нормальной функции, а уже при вызове уходит в секцию прота


Ранг: 660.7 (! !)
Статус: Участник
ALIEN Hack Team

Создано: 12 декабря 2017 12:27 New!
Цитата · Личное сообщение · #17

shellstorm

Вы об этом --> pemu <-- ?


Ранг: 325.8 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 12:36 New!
Цитата · Личное сообщение · #18

Boostyq пишет:
Однако тут я точно уверена, так как этот кусочек кода находится в нормальной функции, а уже при вызове уходит в секцию прота

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

Ранг: 68.6 (постоянный)
Статус: Участник

Создано: 12 декабря 2017 12:43 New!
Цитата · Личное сообщение · #19

Vamit пишет:
Вы ошибаетесь, т.к. вмпрот присутствует не только в своих секциях, но и во всех других секциях вместо кусков сожранных им.
Приведенный вами код это обфусцированный вызов апи функции PsGetCurrentProcessId

Спасибо, уже установлено

Ранг: 0.0 (гость)
Статус: Участник

Создано: 12 декабря 2017 14:42 · Поправил: shellstorm New!
Цитата · Личное сообщение · #20

ARCHANGEL пишет: Вы об этом --> pemu <-- ?

Да, этот, есть еще варианты с виртуализацией.

Boostyq пишет: проблема в том, что нужны входные данные и в зависимости от них, каждый условный прыжок пойдет по одному из 2 вариантов

Эта задача относится к фаззингу (при неизвестных входящих параметрах) и покрытию кода.
У этого чувака http://shell-storm.org/ (автор triton) доходчиво и доступно рассмотрены эти квесты.

| Сообщение посчитали полезным: bartolomeo


Ранг: 68.6 (постоянный)
Статус: Участник

Создано: 12 декабря 2017 15:02 · Поправил: Boostyq New!
Цитата · Личное сообщение · #21

shellstorm пишет:
Эта задача относится к фаззингу (при неизвестных входящих параметрах) и покрытию кода.
У этого чувака http://shell-storm.org/ (автор triton) доходчиво и доступно рассмотрены эти квесты.

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

Ранг: 0.0 (гость)
Статус: Участник

Создано: 12 декабря 2017 15:11 New!
Цитата · Личное сообщение · #22

Boostyq пишет: Вы имеете ввиду исполнять тритоном с указанием параметров, но множество раз и случайными?

Нет, имею ввиду, что там есть теория с практическими примерами использования symbolic execution, dbi, etc.
Сложность заключается в падениях, вы хотите покрыть все ветви кода, но не все из них рабочие, а движки не боги писали, падают, поэтому нужно пилить систему откатов с сохранением промежуточных результатов.


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 18:18 · Поправил: difexacaw New!
Цитата · Личное сообщение · #23

Vamit

Имелось ввиду точки входа в любой исполняемый код(который исполняет cpu), будь там хеловорд, драйвер или вм, разницы нет. Да и вспомните как задача в которой вы участвовали была решена(тот самый вмпрот) - визор выделил(накопил) EP, на основе их через конструктор был сформирован cfg, к нему применена свёртка и на выхлопе массив ваших вм обработчиков, не смотря на огромное число выборок

shellstorm

На 86 есть весьма быстрые и стабильные моторы, так что думаю принципиально реализация не проблема вовсе. Думаю просто вы и тс не знаете с чего начать, не видите общей картины

Ранг: 0.0 (гость)
Статус: Участник

Создано: 12 декабря 2017 18:39 New!
Цитата · Личное сообщение · #24

difexacaw пишет: На 86 есть весьма быстрые и стабильные моторы

Например? Только плиз, без ваших моторов. Не знаю ни одного стабильного движка, а знаю их много. Вот здесь уточню, речь не о частичном покрытии, а о полном, оно в свою очередь зависит от множества факторов, частично проблемы с неполными данными можно решить через фаззинг или посредством солвера, но на это требуется огромное количество времени.
В качестве примера приведу псевдокод:
hash = hash_data(read_user_data_value());
if hash == hash_function()
{
address = function_decrypt();
goto address;
}
в расшифрованной функции может быть куча ветвлений, но здесь есть зависимость от данных и динамического исполнения. Частичное покрытие сделать не сложно, но ТС хочет полное.


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 18:48 New!
Цитата · Личное сообщение · #25

shellstorm

Ну а чем вам тот же кайт не устраивает(конструктор/билдер), это хороший 86 мотор. Их не так много, что бы выбирать. Да, я не использовал AVL деревья, обычные списки для работы с cfg. Но даже без этого, это весьма шустрый мотор, который не крешит и в км. Это просто как пример, что давно есть стабильные обкатанные моторы. И для трассировки например то же. Полноценные решения. При желании это всё собирается быстро и отлаживается без проблем.

Но тут вопрос в ином имхо. Нужно общее понимание, механизм, какие иснтрументы и для чего. Этого всего нет. А поэтому не имея опыта что то собрать врядле получится. А пилить визоры и конструкторы для км по мойму затея в данном случае провальная.

Добавлено спустя 4 минуты
shellstorm

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

Визор/трассировка даёт локальный cfg, тоесть EP для построения полного возможного графа конструктором. Всё что не включено в динамик и как следствие статик cfg не относится к работе апп, это не вызывается и не используется, например часть индекса массива векторов, которая никогда не вызывается, а таким образом не нужна и исключается. В случае вмп это и не нужно.

Ранг: 0.0 (гость)
Статус: Участник

Создано: 12 декабря 2017 19:05 New!
Цитата · Личное сообщение · #26

difexacaw пишет: Визор/трассировка даёт локальный cfg, тоесть EP для построения полного возможного графа конструктором

Это не то, для построения подобной карты в IDA полно скриптов в том числе есть и заточенные для анализа VM, но это частичное покрытие, но в коде встречаются и jmp reg, что с этим делать при неполных данных?

| Сообщение посчитали полезным: difexacaw



Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 19:14 · Поправил: difexacaw New!
Цитата · Личное сообщение · #27

shellstorm

А причём тут ида, это унылый юм парсер. jmp reg я выше описал. Лайкну вам за то, что у нас одинаковый ход мыслей.

Ранг: 0.0 (гость)
Статус: Участник

Создано: 12 декабря 2017 19:20 New!
Цитата · Личное сообщение · #28

difexacaw пишет: А причём тут ида, это унылый юм парсер.

ТС пишет: Архитектура только x86, как основной инструмент ида с питоном.
В данной задаче IDA это UI с батарейками, а сам движок можно подключить любой, хоть ваш кайт, подключив его к трассировочным интерфейсам IDA.


Ранг: 316.1 (мудрец)
Статус: Участник

Создано: 12 декабря 2017 19:39 · Поправил: difexacaw New!
Цитата · Личное сообщение · #29

shellstorm

Короче говоря, посмотрим что получится, но а пока я не вижу предмета или задачи для обсуждения

Ранг: 68.6 (постоянный)
Статус: Участник

Создано: 12 декабря 2017 19:59 · Поправил: Boostyq New!
Цитата · Личное сообщение · #30

difexacaw пишет:
А причём тут ида, это унылый юм парсер. jmp reg я выше описал. Лайкну вам за то, что у нас одинаковый ход мыслей.

Он будет рассчитан верно, если на его генерацию не влияют входные данные
Я пока не буду много говорить, не хочу показаться глупой
Получится - хорошо, если нет - то просто плюс к знанию ассемблера
А так, трейсер поддерживает чтение из стека/дб и запись в стек, скоро буду тестировать, но очень много вариаций инструкций, нужны не все, но многие
---
Такс, ида дает неплохой апи по дизасму, но отвратительный при работе с выражениями типа [ebp+ecx-2C4h]
Реализовала обработку простых команд JMP, J*, CALL, RET, PUSH, POP, но описать даже одну команду ADD с таким апи сложно
Вообщем буду искать движок способный работать с этим проще, или писать что-то свое, чтобы любое выражение просто преобразовывалось в виртуальный адрес и если он относится к виртуальному стеку/статическому адресу/контексту, то записывать/читать в соответствующем месте
. 1 . 2 . 3 . 4 . 5 . 6 . >>
 eXeL@B —› Протекторы —› Статическая трассировка кода

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS