Сейчас на форуме: (+5 невидимых) |
eXeL@B —› Протекторы —› Статическая трассировка кода |
. 1 . 2 . 3 . 4 . 5 . 6 . >> |
Посл.ответ | Сообщение |
|
Создано: 11 декабря 2017 18:39 · Поправил: Boostyq · Личное сообщение · #1 Всем привет, Изучаю x86 драйвер, он защищен с помощью vmp Случай достаточно простой, только некоторые функции мутированы (обфусцированы?), даже нет внешней упаковки Для того чтобы посмотреть обфускацию целиком, нужна трасса от и до Дебажить его у меня нет возможности, да и вообще хочу попробовать сделать это статически Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций (операции стека, прыжки, вызовы), который бы "выполнял" код до тех пор пока не встретиться выход из функции Правда не ясно что делать c вызовами API, stdcall мы же очищаем стек, но вот с другими соглашениями? Дело даже не в проте, а вообще в целом Я пыталась делать парсер конкретных команд под конкретный прот, но дело в том, что это не возможно реализовать, ибо число нелогичных приемов может быть очень большое, поэтому нужно спуститься на самый нижний уровень, для того чтобы выполнять код как сам процессор это делает Возможно кто-то даст дельный совет, может кто-то уже делал подобное? Так же я пыталась найти псевдо-код, как процессор выполняет команды, т.к. вмпрот любит использовать редкие команды, может у кого то есть линки? Спасибо ----- В облачке многоточия |
|
Создано: 11 декабря 2017 18:44 · Личное сообщение · #2 google: symbolic execution. Есть вполне рабочие движки на руби, питоне, жабе, и даже нативные | Сообщение посчитали полезным: Boostyq |
|
Создано: 11 декабря 2017 19:01 · Личное сообщение · #3 SegFault Как вы себе представляете кернел код на питоне ? Это сразу сломает ось, это вообще возможно запустить в км в принципе ? > Так же я пыталась найти псевдо-код, как процессор выполняет команды Тоесть получается что вы не знаете что псевдокод описан в манах по архитектуре, тоесть их никогда не видели(основы). Тогда вы эту задачу решить не сможите, если не знаете базовую архитектуру. В таком случае как можно пытаться снять кернел протектор, это невозможно. У вас скилл не достаточный для данной работы. > Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций Виртуальную машину, а точнее визор - да, это способ.) ----- vx |
|
Создано: 11 декабря 2017 19:10 · Поправил: Boostyq · Личное сообщение · #4 difexacaw пишет: Тоесть получается что вы не знаете что псевдокод описан в манах по архитектуре, тоесть их никогда не видели(основы). Тогда вы эту задачу решить не сможите, если не знаете базовую архитектуру. В таком случае как можно пытаться снять кернел протектор, это невозможно. У вас скилл не достаточный для данной работы. Спасибо за ответ Я не спорю, что знания совсем не полные, я за обучение в процессе Но мне кажется я недостаточно верно выразилась Я не собираюсь эмулировать код, исполнять его как либо, а лишь написать инструмент, который проследит маршрут кода от и до Архитектура только x86, как основной инструмент ида с питоном И конечно я понимаю инструкции, но мне гораздо проще читать например код, чем документацию, т.е. не "retn - возврат", а "eip = *(uint32_t *)esp; esp += 4;" Конечная цель лишь получение трассы от и до у конкретной функции, для дальнейшего статического анализа ----- В облачке многоточия |
|
Создано: 11 декабря 2017 19:19 · Личное сообщение · #5 |
|
Создано: 11 декабря 2017 20:55 · Поправил: dosprog · Личное сообщение · #6 На основании чeго будут выполняться ветвления? Это абсурд. И название темы дурацкое - как трассировка может быть статической? | Сообщение посчитали полезным: gggeorggge |
|
Создано: 11 декабря 2017 21:17 · Поправил: Boostyq · Личное сообщение · #7 dosprog пишет: На основании чeго будут выполняться ветвления? Это абсурд. Привет Ничего не должно исполнятся Суть в том, чтобы сохранить трассу для конкретной функции со всеми ветвлениями Просто протекторы часто мешают кусочки кода и сложно по ним ориентироваться, где-то они разбросаны по доп. секции, так же бывает, что одни и те же участки используются несколькими защищенными функциями, однако если будет цельная трасса, можно это как-то изучать ----- В облачке многоточия |
|
Создано: 11 декабря 2017 22:00 · Поправил: Модератор · Личное сообщение · #8 Boostyq пишет: Ничего не должно исполнятся Самый простой вариант, это берете эмулятор, самый обычный хоть на базе capstone и к эмулятору добавляете ядерные заглушки, есть и статические альтернативы dbi, но там много кодить, очень много. Настраиваете контекст и эмулируете необходимую вам функцию. Можно допилить pintrace. Проект от которого можно оттолкнуться https://github.com/marcusbotacin/BranchMonitoringProject если что то совсем простое, как выше уже писали сойдет symbolic execution. | Сообщение посчитали полезным: Boostyq |
|
Создано: 12 декабря 2017 01:09 · Личное сообщение · #9 Тут аналогичная задача, только немного для иных целей Ну как я и говорил, почему не поставить обычную ловушку и трассировать через классический TF/branch trace не понятно. В км прикрутить классические дби врядле получится, оно всё еле ровно в юм работает ----- vx |
|
Создано: 12 декабря 2017 02:43 · Личное сообщение · #10 Boostyq пишет: Возможно идея глупая, но что если написать упрощенный процессор с обработкой нужных инструкций (операции стека, прыжки, вызовы), который бы "выполнял" код И Я не собираюсь эмулировать код, исполнять его как либо Воу-воу, так будет эмуляция или нет? Для того чтобы посмотреть обфускацию целиком, нужна трасса от и до От начала функции и до её конца? После вмпрота? О, ну тогда у меня для вас плохие новости. Правильно Клерк пишет - не будет такая эмуляция работать. Вы забываете, что в ядре есть много своего АПИ, есть свои структуры и даже fs указывает совсем не туда, куда в юзермоде. Всё ядро будете эмулировать? ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 12 декабря 2017 03:02 · Поправил: difexacaw · Личное сообщение · #11 |
|
Создано: 12 декабря 2017 03:32 · Личное сообщение · #12 |
|
Создано: 12 декабря 2017 08:29 · Личное сообщение · #13 difexacaw пишет: Для этого нужно найти точки входа, исходные адреса для формирования cfg. Трассировка это лишь способ получить эти входы, причём она обеспечивает хорошее покрытие. При пакетной виртуализации функций это дохлый номер. Вы никогда не найдете реальную точку входа в функцию, т.к. её просто нет - каждая вызываемая функция исполняется внутри вм без выхода из неё. ----- Everything is relative... | Сообщение посчитали полезным: Gideon Vi, sendersu, VodoleY |
|
Создано: 12 декабря 2017 11:46 · Поправил: Boostyq · Личное сообщение · #14 То что дал SegFault полезно, только как я поняла, проблема в том, что нужны входные данные и в зависимости от них, каждый условный прыжок пойдет по одному из 2 вариантов В то время как мне нужны все ветви, т.е. весь код который может исполнятся при вызове данной функции Я понимаю, что там могут быть обманные прыжки в никуда, которые никогда не выполняются, но этого я пока не вижу, я делаю это для простой обфускации Вообще тема сложная для меня, и я хочу начать хотя бы с этого Поэтому пробую писать скрипт для иды, который управляет стеком, работает с esp, ebp (остальные регистры наверное тоже придется добавить), следит за eip до тех пор пока точка выхода не будет после вызова Code:
Я понимаю, что при полной защите вмп все гораздо сложнее, но в моем случае только обфускация Вот почему я не говорю эмуляция, это просто трассировка кода ----- В облачке многоточия |
|
Создано: 12 декабря 2017 12:17 · Поправил: Vamit · Личное сообщение · #15 Boostyq пишет: .text:0001397A 01C call Protected2 // тут код уходит в доп. секцию А кто сказал что это вызов функции? В вмпроте практически любой call сначала надо рассматривать как jmp и анализировать код дальше и только если будет из него возврат на следующую инструкцию или он ссылается на чистый код в программной секции, то это call. Boostyq пишет: но в моем случае только обфускация Если функи только обфусцированы и отсутствует виртуализация, то такой код очень просто восстанавливается из под вмпрота руками и головой. ----- Everything is relative... |
|
Создано: 12 декабря 2017 12:24 · Поправил: Boostyq · Личное сообщение · #16 Vamit пишет: А кто сказал что это вызов функции? В вмпроте практически любой call сначала надо рассматривать как jmp и анализировать код дальше и только если будет из него возврат на следующую инструкцию или он ссылается на чистый код в программной секции, то это call. Именно поэтому я пытаюсь написать трейсер, потому что у вмпрота слишком много трюков которые неочевидны Code:
Однако тут я точно уверена, так как этот кусочек кода находится в нормальной функции, а уже при вызове уходит в секцию прота ----- В облачке многоточия |
|
Создано: 12 декабря 2017 12:27 · Личное сообщение · #17 shellstorm Вы об этом ----- Stuck to the plan, always think that we would stand up, never ran. |
|
Создано: 12 декабря 2017 12:36 · Личное сообщение · #18 Boostyq пишет: Однако тут я точно уверена, так как этот кусочек кода находится в нормальной функции, а уже при вызове уходит в секцию прота Вы ошибаетесь, т.к. вмпрот присутствует не только в своих секциях, но и во всех других секциях вместо кусков сожранных им. Приведенный вами код это обфусцированный вызов апи функции PsGetCurrentProcessId ----- Everything is relative... |
|
Создано: 12 декабря 2017 12:43 · Личное сообщение · #19 |
|
Создано: 12 декабря 2017 14:42 · Поправил: shellstorm · Личное сообщение · #20 ARCHANGEL пишет: Вы об этом --> pemu <-- ? Да, этот, есть еще варианты с виртуализацией. Boostyq пишет: проблема в том, что нужны входные данные и в зависимости от них, каждый условный прыжок пойдет по одному из 2 вариантов Эта задача относится к фаззингу (при неизвестных входящих параметрах) и покрытию кода. У этого чувака http://shell-storm.org/ (автор triton) доходчиво и доступно рассмотрены эти квесты. | Сообщение посчитали полезным: bartolomeo |
|
Создано: 12 декабря 2017 15:02 · Поправил: Boostyq · Личное сообщение · #21 shellstorm пишет: Эта задача относится к фаззингу (при неизвестных входящих параметрах) и покрытию кода. У этого чувака http://shell-storm.org/ (автор triton) доходчиво и доступно рассмотрены эти квесты. Вы имеете ввиду исполнять тритоном с указанием параметров, но множество раз и случайными? ----- В облачке многоточия |
|
Создано: 12 декабря 2017 15:11 · Личное сообщение · #22 Boostyq пишет: Вы имеете ввиду исполнять тритоном с указанием параметров, но множество раз и случайными? Нет, имею ввиду, что там есть теория с практическими примерами использования symbolic execution, dbi, etc. Сложность заключается в падениях, вы хотите покрыть все ветви кода, но не все из них рабочие, а движки не боги писали, падают, поэтому нужно пилить систему откатов с сохранением промежуточных результатов. |
|
Создано: 12 декабря 2017 18:18 · Поправил: difexacaw · Личное сообщение · #23 Vamit Имелось ввиду точки входа в любой исполняемый код(который исполняет cpu), будь там хеловорд, драйвер или вм, разницы нет. Да и вспомните как задача в которой вы участвовали была решена(тот самый вмпрот) - визор выделил(накопил) EP, на основе их через конструктор был сформирован cfg, к нему применена свёртка и на выхлопе массив ваших вм обработчиков, не смотря на огромное число выборок shellstorm На 86 есть весьма быстрые и стабильные моторы, так что думаю принципиально реализация не проблема вовсе. Думаю просто вы и тс не знаете с чего начать, не видите общей картины ----- vx |
|
Создано: 12 декабря 2017 18:39 · Личное сообщение · #24 difexacaw пишет: На 86 есть весьма быстрые и стабильные моторы Например? Только плиз, без ваших моторов. Не знаю ни одного стабильного движка, а знаю их много. Вот здесь уточню, речь не о частичном покрытии, а о полном, оно в свою очередь зависит от множества факторов, частично проблемы с неполными данными можно решить через фаззинг или посредством солвера, но на это требуется огромное количество времени. В качестве примера приведу псевдокод: hash = hash_data(read_user_data_value()); if hash == hash_function() { address = function_decrypt(); goto address; } в расшифрованной функции может быть куча ветвлений, но здесь есть зависимость от данных и динамического исполнения. Частичное покрытие сделать не сложно, но ТС хочет полное. |
|
Создано: 12 декабря 2017 18:48 · Личное сообщение · #25 shellstorm Ну а чем вам тот же кайт не устраивает(конструктор/билдер), это хороший 86 мотор. Их не так много, что бы выбирать. Да, я не использовал AVL деревья, обычные списки для работы с cfg. Но даже без этого, это весьма шустрый мотор, который не крешит и в км. Это просто как пример, что давно есть стабильные обкатанные моторы. И для трассировки например то же. Полноценные решения. При желании это всё собирается быстро и отлаживается без проблем. Но тут вопрос в ином имхо. Нужно общее понимание, механизм, какие иснтрументы и для чего. Этого всего нет. А поэтому не имея опыта что то собрать врядле получится. А пилить визоры и конструкторы для км по мойму затея в данном случае провальная. Добавлено спустя 4 минуты shellstorm > в расшифрованной функции может быть куча ветвлений, но здесь есть зависимость от данных и динамического исполнения. Визор/трассировка даёт локальный cfg, тоесть EP для построения полного возможного графа конструктором. Всё что не включено в динамик и как следствие статик cfg не относится к работе апп, это не вызывается и не используется, например часть индекса массива векторов, которая никогда не вызывается, а таким образом не нужна и исключается. В случае вмп это и не нужно. ----- vx |
|
Создано: 12 декабря 2017 19:05 · Личное сообщение · #26 difexacaw пишет: Визор/трассировка даёт локальный cfg, тоесть EP для построения полного возможного графа конструктором Это не то, для построения подобной карты в IDA полно скриптов в том числе есть и заточенные для анализа VM, но это частичное покрытие, но в коде встречаются и jmp reg, что с этим делать при неполных данных? | Сообщение посчитали полезным: difexacaw |
|
Создано: 12 декабря 2017 19:14 · Поправил: difexacaw · Личное сообщение · #27 |
|
Создано: 12 декабря 2017 19:20 · Личное сообщение · #28 |
|
Создано: 12 декабря 2017 19:39 · Поправил: difexacaw · Личное сообщение · #29 |
|
Создано: 12 декабря 2017 19:59 · Поправил: Boostyq · Личное сообщение · #30 difexacaw пишет: А причём тут ида, это унылый юм парсер. jmp reg я выше описал. Лайкну вам за то, что у нас одинаковый ход мыслей. Он будет рассчитан верно, если на его генерацию не влияют входные данные Я пока не буду много говорить, не хочу показаться глупой Получится - хорошо, если нет - то просто плюс к знанию ассемблера А так, трейсер поддерживает чтение из стека/дб и запись в стек, скоро буду тестировать, но очень много вариаций инструкций, нужны не все, но многие --- Такс, ида дает неплохой апи по дизасму, но отвратительный при работе с выражениями типа [ebp+ecx-2C4h] Реализовала обработку простых команд JMP, J*, CALL, RET, PUSH, POP, но описать даже одну команду ADD с таким апи сложно Вообщем буду искать движок способный работать с этим проще, или писать что-то свое, чтобы любое выражение просто преобразовывалось в виртуальный адрес и если он относится к виртуальному стеку/статическому адресу/контексту, то записывать/читать в соответствующем месте ----- В облачке многоточия |
. 1 . 2 . 3 . 4 . 5 . 6 . >> |
eXeL@B —› Протекторы —› Статическая трассировка кода |