Сейчас на форуме: (+9 невидимых) |
eXeL@B —› Протекторы —› Декомпилятор ВМ |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 23 . 24 . >> |
Посл.ответ | Сообщение |
|
Создано: 03 марта 2010 12:33 · Личное сообщение · #1 Вашему вниманию предлагаются наработки по декомпиляции ВМ. Проект на сегодняшний день для меня завершен, но жаль если результат "ляжет на полку", может кому-нибудь и пригодится. Предлагаю сначала ознакомиться с обзором, и если будет интерес то могу выложить и сам плагин, или здесь или в личку заинтересованным лицам, каким образом, пока ещё не решил... Но если кто-либо ожидает увидеть "автоматическое чудо", то сразу скажу - его нет. Для того чтобы получить результат нужна ручная предварительная работа: - с исследуемой программы должна быть снята упаковка - точки входа в ВМ находятся вручную - возможно неоднократное "жамкание" клавиш в OllyDbg, а возможно и модификация кода, чтобы попасть в нужное место, в зависимости от защищенной функции - необходимо вручную прицепить к программе требуемый секцию - запись результатов в файл это тоже ручная работа, но уже более приятная Не всё гладко обстоит с определением реализаций ВМ, на сегодняшний день примерно каждая третья реализация автоматом не определяется, приходится под неё модернизировать плагин, т.к. не могу сразу предусмотреть все случаи "издевательств" ВМ с кодом примитивов. Лучше дела с восстановлением "исходного" кода защищенных функций - 70% нормально восстанавливается, хотя во многом это зависит от самой структуры функции. Таким образом, если будет заинтересованность и помощь в нахождении подобных ситуаций, то проект может быть доведен до релизной стадии. ЗЫ: Речь идет об Ореановских машинах. Нигде специально не упоминал. 9c41_03.03.2010_CRACKLAB.rU.tgz - VMSweeperLst.rar ----- Everything is relative... |
|
Создано: 14 мая 2010 16:08 · Личное сообщение · #2 mak пишет: Если в ответ будет какая то реакция хотябы иногда В принципе реакция на любой ответ есть, иногда, правда и не явная, но если работа идет, о чем я постоянно информирую - то это и является реакцией. то администрация краклаб предоставит организацию твоему проекту ... За предложение спасибо, только хотелось бы понять - администрация краклаб в чьем лице? почему бы не вывести функции деобфускации, для асма в отдельные возможности плагина ??? Я уже упоминал, что как таковой функции деобфускации нет, каждый обработчик анализатора/декомпилятора строит код таким образом, что берет из него только то, что нужно, остальное отпадает за ненадобностью. Для понимания общего принципа работы декомпилятора я готовлю небольшой обзор по методам обработки им используемым. Это возможно ? Конечно, здесь ничего невозможного нет, только надо правильно поставить задачу и цель. Вопросы: зачем это делать, и что делать дальше с "чистым" кодом, т.к. записать его на место обфускированного проблематично. Понимаете, мне (декомпилятору) этот "чистый" код в явном виде не нужен, он все равно преобразуется дальше в промежуточный код, главное определить его функциональность..., короче - ждите обзор по декомпилятору. ----- Everything is relative... |
|
Создано: 14 мая 2010 17:08 · Личное сообщение · #3 Vamit пишет: Есть такое дельное предложение, я готов сделать этот проект открытым для ограниченного круга заинтересованных людей, которые способны, могут и готовы помогать и вижу это в создании приватного SVN, но нужен ресурс и организатор. "приватный" свн как бы есть, жди ответа кто этим свн управляет, может и организуется ) ----- Лучше быть одиноким, но свободным © $me |
|
Создано: 14 мая 2010 20:21 · Личное сообщение · #4 BoRoV пишет: "приватный" свн как бы есть Это хорошо, жду, но ещё хотелось бы приватный топик на форуме для общения участников проекта. Поймите правильно, это не "аппетип приходит во время еды, которой пока ещё и нет", просто есть аналогичный опыт работы с другими проектами, наличие Свн, места общения и кол-ва участников не больше 3-5 значительно повышает эффективность разработки ПО, при условии, что каждый из участников заинтересован в конечном результате. ----- Everything is relative... |
|
Создано: 14 мая 2010 20:34 · Личное сообщение · #5 |
|
Создано: 14 мая 2010 23:16 · Личное сообщение · #6 Coderess пишет: Мне кажется не нужно таких крайних мер, пусть все будет видимо Этот топик, я думаю, останется. А описывать здесь конкретные варианты решения некоторых специфичных для кода проблем не имеет смысла, т.к. палка то о двух концах, как говорил int топик читают не только реверсеры, но и разработчики защит... дальнейший смысл ясен. Общаться через другие средства личку, аську и т.д. не айс, т.к. все участники проекта должны видеть это сообщение. ----- Everything is relative... |
|
Создано: 15 мая 2010 07:59 · Личное сообщение · #7 |
|
Создано: 15 мая 2010 17:25 · Личное сообщение · #8 Обещанная статейка по внутренностям декомпилятора. 2479_15.05.2010_CRACKLAB.rU.tgz - DecompilerInside.rar ----- Everything is relative... |
|
Создано: 15 мая 2010 17:59 · Личное сообщение · #9 |
|
Создано: 15 мая 2010 19:49 · Личное сообщение · #10 ARCHANGEL пишет: Я так понимаю - в шапке более старая версия. Да, там только декомпилятор CodeVirtualizer анализаторов никаких нет, но вся структура декомпиляции и методы обработки те же. А ссылку на новую можно? На новую что? Если плагин, то последняя выложенная версия 1.2, что он может есть в посте, 1.3 еще не готов, нужно доделать декомпилятор VMProtect. ----- Everything is relative... |
|
Создано: 05 августа 2010 09:42 · Поправил: Vamit · Личное сообщение · #11 После продолжительного затишья в теме, но не в работе, можно подвести итоги практически пройденного этапа - Виртуализация инструкций CPU ВмПротектом и их практическая девиртуализация. На сегодняшний день девиртуализованы практически все основные инструкции CPU, в большинстве их вариаций как по размеру операндов, так и по типам операндов. Построены универсальные шаблоны девиртуализации инструкций, в большинстве они охватывают все вариации операндов, но некоторые инструкции требуют отдельных шаблонов на разные вариации, например, на строковые инструкции MOVS, LODS и другие используется по три шаблона в зависимости от размера операнда (BYTE, WORD, DWORD). Для определения алгоритмов виртуализации было написано около 200 тестовых примеров с использованием конкретных инструкций, затем эти примеры были обработаны ВмПротектом с разными опциями преобразования кода - виртуализация, мутация, шифрация регистров и скрытие констант. Далее полученные файлы обрабатывались Декомпилятором и проводился анализ виртуализации, на основе этого строились шаблоны и выполнялась практическая девиртуализация инструкций. Основные общие принципы виртуализации инструкций (VmProtect): 1. Измененение основного представления инструкции. Большинство инструкций имеют следующий формат или схожий с ним - code dst, src; где code - мнемоника инструкции, dst - входной операнд и одновременно операнд результата, src - входной операнд. За реальными примерами далеко ходить не нужно - add x, y; dec x и т.д. movs и аналогичные тоже попадают в эту категорию, т.к. имеют вполне реальные "скрытые" операнды. Любая из этих инструкций, вернее её составная часть, представляется ВмПротектом следующим образом - dst = code src1, src2; Отсюда видно, что входной операнд и операнд результата разделены, таким образом осуществляется скрытие регистров CPU, т.к. на очередном присвоении они могут поменять свое месторасположение в регистрах ВМ. 2. Флаги CPU. Флаги, где это возможно, отделены от инструкций и обрабатываются отдельно. Даже "невиртуализованные" инструкции, которые имеют отдельный примитив, состоят из нескольких блоков - сама инструкция + блок обработки флагов. Примеры - rcl, mul и другие. 3. Разбивка инструкции на составляющие части. Простые логические инструкции виртуализованы через NOR примитив, арифметические - через ADD, некоторые инструкции сдвига - через SHLD, SHRD. Все остальные инструкции виртуализуются через эти простые составляющие. Отдельно стоят инструкции условных переходов, т.к. здесь виртуализация затрагивает не только саму инструкцию, но и окружающий код в точке перехода и в точке метки перехода, но об этом в следующий раз... Приведу один шаблон виртуализации инструкции RCL, где svm - стековая, а rvm - регистровая переменные: Code:
----- Everything is relative... |
|
Создано: 08 августа 2010 03:38 · Личное сообщение · #12 |
|
Создано: 08 августа 2010 11:39 · Поправил: Vamit · Личное сообщение · #13 Виртуализация переходов в VMProtect Немного терминологии - каждый переход имеет две точки, назовем их так - точка ветвления и точка слияния. Условный переход в точке ветвления имеет два пути - прямой и переход. В точке ветвления происходит разрыв хеширования пикода, т.е. ключ хеширования в этой точке заново инициализируется адресом следующего пикода. В точке слияния разрыва хеширования пикода не происходит, для соблюдения этого условия имеется специальный алгоритм. Следовательно, прямого продолжения пикода в точке ветвления не происходит и выйти на прямой путь или переход можно только через примитив Cmd_Jmp (условный или безусловный). Пример: Code:
label1 - точка ветвления, label2 - точка слияния. В точке ветвления имеем два пути - переход или прямой путь. В точке ветвления условно можно получить два адреса продолжения выполнения пикода - по переходу или по прямому пути. Условно потому, что в точке ветвления ВмПротект вычисляет только один адрес в зависимости от состояния нужных флагов, а затем следует безусловный переход на этот адрес. Т.е. этот пример с точки зрения ВмПротекта на лету (в ходе выполнения) будет превращен в две модификации для обоих путей - перехода и прямого пути, соответственно: Code:
Code:
Теперь о том, как это конкретно работает - перед условным переходом ВмПротект записывает последовательно в стек два кодированных адреса, которые впоследствии превратятся в адреса переходов - direct и jmp. Далее производится анализ нужных флагов, причем анализ может проводиться как на установку, так и на сброс флагов, в результате анализа берется один из кодированных адресов из стека, производится его декодирование и происходит переход на этот адрес. Таким образом парные (дуальные) переходы, например jz и jnz и т.д., представлены 8 комбинациями (по 4 на каждый): используется адрес перехода в стеке - 1 или 2, фактические флаги - установлены или сброшены, код проверяющий флаги - на установку или сброс и фактический переход - direct или jmp. Проанализировав все эти комбинации, можно 100% точно установить условие перехода в исходном коде. Но это ещё не всё - вокруг точек ветвления и слияния ВмПротект строит определенные зоны, до точки - зона сохранения контента ВМ (регистры), после точки зона восстановления контента ВМ (регистры), причем восстановление проводится в регистры отличные от сохраненных, таким образом обеспечивается дополнительная защита по сокрытию регистров CPU. Есть ещё одна особенность зоны сохранения контента перед точкой слияния, в ней корректируется ключ хеширования таким образом, чтобы он в точке слияния равнялся адресу пикода, таким образом устраняется разрыв хеширования пикода в точке слияния. В заключение - пара листингов: 1. Незначительно модифицированый промкод (до девиртуализации) Code:
2. Девиртуализованный декомпилятором код Code:
3. А это исходный код, который был защищен Code:
чтобы получить его, как видно, осталось совсем немного - нужно сделать три шага: - произвести поглощение стековых переменных (svm) - восстановить цепочку соответствий регистров CPU регистрам ВМ (rvm) - ассемблировать этот условный код ----- Everything is relative... |
|
Создано: 18 августа 2010 16:19 · Личное сообщение · #14 Последние три шага сделаны, вот исходный код куска защищенной функции, полученный декомпилятором: Code:
----- Everything is relative... |
|
Создано: 18 августа 2010 16:38 · Личное сообщение · #15 |
|
Создано: 18 августа 2010 18:17 · Личное сообщение · #16 Ещё рано обольщаться, побеждена только виртуализация, которую в чистом виде в реальных прогах навряд-ли встретишь, на очереди другие опции вмпрота и их комбинации - мутация, мутация + виртуализация, сокрытие констант и шифрация регистров, вот когда будут полностью восстановлены несколько реальных защищенных функций - тогда можно говорить и о тестировании... А пока научитесь лучше снимать вмпрот как защиту с файла и получать рабочий дамп, т.к. большинство запросов связаны именно с этим, а декомпилятор в этом деле никому не поможет, а уже затем переходить к восстановлению тел функций... ----- Everything is relative... |
|
Создано: 19 августа 2010 18:06 · Личное сообщение · #17 |
|
Создано: 20 августа 2010 09:30 · Личное сообщение · #18 Bronco Какая разница сколько ВМ, они ведь не сидят друг на друге а работают последовательно. А рабочий дамп - имеется ввиду под дебагером, OllyDbg в частности, когда прога уже распакована по своим сегментам и можно выполнять её код, это необходимо для работы декомпилятора. ----- Everything is relative... |
|
Создано: 07 сентября 2010 17:15 · Личное сообщение · #19 провел сегодня день с Vamit в аське рассматривая ВМ Протек, ну как бы несмотря на то что это еще в процессе я был поражен. Правда без автора на линии работать пока сложно, НО местами его детище творит чудеса ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 10 октября 2010 18:55 · Поправил: Vamit · Личное сообщение · #20 Декомпилирован первый реальный сеанс вмпротекта. Вот результат: Code:
----- Everything is relative... |
|
Создано: 10 октября 2010 19:11 · Личное сообщение · #21 |
|
Создано: 10 октября 2010 19:13 · Личное сообщение · #22 |
|
Создано: 10 октября 2010 19:15 · Личное сообщение · #23 |
|
Создано: 11 октября 2010 01:22 · Поправил: daFix · Личное сообщение · #24 |
|
Создано: 11 октября 2010 08:10 · Личное сообщение · #25 Если кто не понял - это декомпилированный код старенькой версии самого вмпрота, начиная с ОЕП. daFix пишет: Когда появится в доступе? Ответ в посте №16 на этой странице. Это же только первый реальный код... всё ещё обязательно создание дампа не знаю что это такое - какой заход в вм хотим декомпилировать, тот и должен быть доступен в Ольке цепляние секции виртуальной машины это для декомпиляции обязательно, но для кода совсем не смертельно... ----- Everything is relative... |
|
Создано: 11 октября 2010 08:59 · Личное сообщение · #26 daFix Создание дампа не обязательно. Но это декомпилер, а не распаковщик. Поэтому нужно найти адрес на котором программа будет после распаковки и брякнуться там. После этого вызовы ВМ можно расчистить. daFix пишет: цепляние секции виртуальной машины Бред... Вы когда-нибудь снимали вмпротект? Какие ещё дампы секций? Вмпрот в отличие от многих своих братьев хранит ВМ не в выделенной памяти, а в своих же секциях. О каком цепляние секции виртуальной машины может идти речь? |
|
Создано: 11 октября 2010 09:07 · Поправил: ClockMan · Личное сообщение · #27 |
|
Создано: 11 октября 2010 10:37 · Личное сообщение · #28 Vamit, int, ClockMan, извините, думал что он хранит виртуалку в выделенной памяти int пишет: Создание дампа не обязательно. Но это декомпилер, а не распаковщик. Поэтому нужно найти адрес на котором программа будет после распаковки и брякнуться там. После этого вызовы ВМ можно расчистить. Спасибо за разъяснение int пишет: Вы когда-нибудь снимали вмпротект? Да, но без опции виртуальной машины ----- Research For Food |
|
Создано: 11 октября 2010 12:44 · Личное сообщение · #29 |
|
Создано: 11 октября 2010 13:06 · Личное сообщение · #30 |
|
Создано: 11 октября 2010 13:08 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 23 . 24 . >> |
eXeL@B —› Протекторы —› Декомпилятор ВМ |