Сейчас на форуме: (+9 невидимых) |
![]() |
eXeL@B —› Протекторы —› Декомпилятор ВМ |
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 ... 23 . 24 . >> |
Посл.ответ | Сообщение |
|
Создано: 03 марта 2010 12:33 · Личное сообщение · #1 Вашему вниманию предлагаются наработки по декомпиляции ВМ. Проект на сегодняшний день для меня завершен, но жаль если результат "ляжет на полку", может кому-нибудь и пригодится. Предлагаю сначала ознакомиться с обзором, и если будет интерес то могу выложить и сам плагин, или здесь или в личку заинтересованным лицам, каким образом, пока ещё не решил... Но если кто-либо ожидает увидеть "автоматическое чудо", то сразу скажу - его нет. Для того чтобы получить результат нужна ручная предварительная работа: - с исследуемой программы должна быть снята упаковка - точки входа в ВМ находятся вручную - возможно неоднократное "жамкание" клавиш в OllyDbg, а возможно и модификация кода, чтобы попасть в нужное место, в зависимости от защищенной функции - необходимо вручную прицепить к программе требуемый секцию - запись результатов в файл это тоже ручная работа, но уже более приятная Не всё гладко обстоит с определением реализаций ВМ, на сегодняшний день примерно каждая третья реализация автоматом не определяется, приходится под неё модернизировать плагин, т.к. не могу сразу предусмотреть все случаи "издевательств" ВМ с кодом примитивов. Лучше дела с восстановлением "исходного" кода защищенных функций - 70% нормально восстанавливается, хотя во многом это зависит от самой структуры функции. Таким образом, если будет заинтересованность и помощь в нахождении подобных ситуаций, то проект может быть доведен до релизной стадии. ЗЫ: Речь идет об Ореановских машинах. Нигде специально не упоминал. ![]() ----- Everything is relative... ![]() |
|
Создано: 02 августа 2011 10:15 · Личное сообщение · #2 |
|
Создано: 03 августа 2011 11:13 · Личное сообщение · #3 Новая версия Исправлено: 1. Ошибка переполнения текстового буфера при формировании длинных выражений, что приводило к исключению на стадии анализа кода. ----- Everything is relative... ![]() |
|
Создано: 03 августа 2011 21:41 · Поправил: neprovad · Личное сообщение · #4 Vamit в предыдущем файле, выложенном мной, на адресе Code:
Добавление: При подпытке декомпиляции с адреса 41517E выдается ошибка "unknown identifier in mov byte ptr ds:[rvm_30], 0xFD" Как быть с такой ситуацией? Code:
![]() ![]() |
|
Создано: 04 августа 2011 05:19 · Личное сообщение · #5 |
|
Создано: 04 августа 2011 05:41 · Личное сообщение · #6 |
|
Создано: 04 августа 2011 10:19 · Поправил: Vamit · Личное сообщение · #7 neprovad находится переход в vm как я могу судить по своим знаниям. На этом eip плагин выдает что не может распознать вм. Не каждый переход в сегмент вм является точкой входа в вм, это могут быть: - промежуточные возвраты, т.к. тело вм может быть частично размещено на месте съеденного кода программы (уходят в статус Cancelled) - обработка съеденного импорта (восстанавливается в пределах реализованного) - обработка съеденных (покриптованных) строк (Свипером не распознаются, уходят в статус Cancelled) Можно ли бороться с такой ошибкой своими силами или нет? Чтобы с чем-то бороться нужно сначала доказать, что в этом месте Свипер не прав, и должно быть тото и тото, проанализируйте созданные логи на этой точке и приведите достаточные аргументы своей правоты. При подпытке декомпиляции с адреса 41517E выдается ошибка "unknown identifier in mov byte ptr ds:[rvm_30], 0xFD" Как быть с такой ситуацией? В теме я уже ноднократно писал, что Свипер не идеален, всего лишь бета версия, если в логе декомпиляции вмпрота увидели секцию Section a12 final, то это очень хорошо - далее предстоит ручная работа по доводке кода или определелие по логам ситуации в чем Свипер ошибся. Узкие места декомпиляции кода вмпрота так же уже озвучивались, могу повторить: - Сделана девиртуализация не всех асм инструкций, а может быть и не всех вариантов одной инструкции. - Основная проблема - определение соответствия регистров вм и cpu. Реализованный алгоритм не совершенен, но другого так никто и не предложил. Читаем ----- Everything is relative... ![]() |
|
Создано: 05 августа 2011 12:48 · Поправил: mak · Личное сообщение · #8 |
|
Создано: 23 августа 2011 10:05 · Личное сообщение · #9 |
|
Создано: 31 августа 2011 19:34 · Личное сообщение · #10 Пытаюсь посмотреть AS3 Sorcerer 1.35 ( Code:
![]() |
|
Создано: 01 сентября 2011 09:29 · Личное сообщение · #11 |
|
Создано: 01 сентября 2011 11:14 · Личное сообщение · #12 Vamit пишет: Выложи прогу (по приведенному линку без регистрации не скачать) и сообщи ОЕП, тогда в ближайшее время сделаю, тем более у меня уже почти завершена очередная версия Свипера. прога тут: уже закракана практически (крак потрохов VMprot'а использован не мой, я только лишние референсы на ВМ убрал, импорт перестроил и кое-что почистил). Точка входа проги - чистая, интересующий вызов ВМ по адресу 6687D0. Программа-то работоспособна, но таскать останки ВМпрота как-то некрасиво. Полезная программа, кстати - декомпилятор ActionScript 3 (Flash) ![]() |
|
Создано: 01 сентября 2011 17:37 · Личное сообщение · #13 Новая версия Добавлено: 1. CodeVirtualizer: Удаление инициализированного, но не используемого регистра RVM_TMP. 2. CodeVirtualizer: Коррекция вершины стека ВМ при его расширении. 3. CodeVirtualizer: Коррекция дна стека ВМ при входе в промежуточный сеанс ВМ. 4. CodeVirtualizer: Вывод в trc файл адреса входа в следующий сеанс ВМ. 5. Обработка операции neg в константных выражениях. 6. Обработчик исключения переполнения при эмуляции инструкций div и idiv. 7. Улучшен определитель числа аргументов вызываемых функций, т.к. OllyDbg иногда это делает неправильно. 8. Одновременная обработка константных выражений размещенных в паре регистров xL - xH. 9. Уменьшение размера восстановленного кода за счет удаления необязательного ds: префикса. 10. VmProtect: Улучшен анализатор алгоритма кодирования пикода в цикле ВМ. 11. VmProtect: Обработчик FPU инструкции fsubr. 12. В ручном режиме работы удалено окно "Stop on EntryCall". Исправлено: 1. Условный переход из примитива ВМ на начало цикла ВМ не является завершением примитива. 2. Анализ OF флага на расширенных байтовых переменных. ----- Everything is relative... ![]() |
|
Создано: 02 сентября 2011 19:44 · Личное сообщение · #14 |
|
Создано: 20 октября 2011 16:05 · Личное сообщение · #15 |
|
Создано: 20 октября 2011 17:17 · Личное сообщение · #16 |
|
Создано: 26 октября 2011 17:16 · Поправил: Nightshade · Личное сообщение · #17 |
|
Создано: 02 ноября 2011 16:59 · Личное сообщение · #18 r99 пишет: при восстановлении импорта вместо FF 15 ... пишет FF 25 ... и довольно часто Дошло время и до твоего файлика... Приведи конкретные адреса вызовов АПИ, которые ты считаешь что декомпиль восстановил неправильно (достаточно двух-трех), а то их в списке несколько тысяч... проверять все я не буду... Nightshade По твоему запросу всё сделал... Следующая версия будет декомпилить твой файл - но не на 100%... ----- Everything is relative... ![]() |
|
Создано: 03 ноября 2011 10:38 · Личное сообщение · #19 |
|
Создано: 03 ноября 2011 18:08 · Поправил: Vamit · Личное сообщение · #20 Новая версия Добавлено: 1. CodeVirtualizer: Улучшено распознавание примитива CMC. 2. CodeVirtualizer: Добавлена обработка инструкции setne. 3. CodeVirtualizer: Улучшено распознавание старших байтовых регистров (ah, ch, dh, bh). 4. VmProtect: Реализована обработка смещения кода ВМ (relocation VM code). 5. VmProtect: Обработчики FPU инструкций fst, fisub. Исправлено: 1. CodeVirtualizer: Вставка прямых асм инструкций в исходный код. 2. VmProtect: Перемещение оператора изменения флагов к своим флагам. 3. VmProtect: Восстановление импорта, иногда вместо call [api] восстанавливалось jmp [api]. ----- Everything is relative... ![]() |
|
Создано: 15 ноября 2011 20:20 · Поправил: JeRRy/SND · Личное сообщение · #21 |
|
Создано: 28 ноября 2011 21:34 · Личное сообщение · #22 Не распознается примитив Code:
Код Code:
Можно это исправить? ![]() |
|
Создано: 29 ноября 2011 12:17 · Личное сообщение · #23 Nightshade Привет! Если уж начал писать багрепорт, то довел бы его до конца... ![]() 1. Нужна конечная трасса кода примитива из trc файла (обфусцированный код примитива из Ольки не нужен) 2. Нужна полная логика работы примитива до входа в следующий цикл интерпретатора вм. Логика приведенного куска: push [ebp] ebp += 4 retn т.е. если я правильно составил логику работы этого примитива, то такого примитива я не знаю... ----- Everything is relative... ![]() |
|
Создано: 29 ноября 2011 16:11 · Личное сообщение · #24 |
|
Создано: 29 ноября 2011 16:15 · Личное сообщение · #25 |
|
Создано: 29 ноября 2011 20:01 · Личное сообщение · #26 |
|
Создано: 29 ноября 2011 20:40 · Личное сообщение · #27 |
|
Создано: 30 ноября 2011 10:45 · Личное сообщение · #28 Nightshade Я бы сказал, что это случай когда в виртуализированной функе есть вызов другой виртуализированной функи. Этого не может быть, т.к.: 1. Отсутствуют аргументы. 2. Отсутствует восстановление реального контекста проги (регистры и стек) а вызывать из виртуализованного пространства реальную функцию, хотя и виртуализованную, да ещё и в другом сеансе вм не завершив при этом текущий сеанс - это нонсенс... ----- Everything is relative... ![]() |
|
Создано: 01 декабря 2011 11:02 · Поправил: Nightshade · Личное сообщение · #29 Файлы http://sderni.ru/96372 Интересует вызов 02EEC9B9 Посмотри сам что это upd1 Убрал некоторые примитивы из таблицы - получил такую трассу Code:
![]() |
|
Создано: 06 декабря 2011 10:39 · Поправил: Nightshade · Личное сообщение · #30 Vamit Потрассировал обработчик. Получилось такое edx = [ebp] ebp += 4 push 0x02F1B781 push edx ret 02F1B781 9C PUSHFD 02F1B782 C70424 B9077641 MOV DWORD PTR SS:[ESP],417607B9 02F1B789 ^ E9 ACE1FFFF JMP 02F1993A 02F1993A 8D6424 04 LEA ESP,DWORD PTR SS:[ESP+4] 02F1993E E9 61AC0000 JMP 02F245A4 02F245A4 66:0FA3C3 BT BX,AX 02F245A8 8D47 50 LEA EAX,DWORD PTR DS:[EDI+50] 02F245AB 60 PUSHAD 02F245AC F9 STC 02F245AD 39C5 CMP EBP,EAX 02F245AF 68 A32CCFA7 PUSH A7CF2CA3 02F245B4 9C PUSHFD 02F245B5 ^ E9 E621FFFF JMP 02F167A0 02F167A0 9C PUSHFD 02F167A1 8D6424 2C LEA ESP,DWORD PTR SS:[ESP+2C] 02F167A5 ^ 0F87 E2B6FFFF JA 02F11E8D - прыжок идет Как я понял код по 02F1B781 это просто обычный jmp на начало цикла. Т е другого он ничего не делает. -------------------------------------------------------------------- 02F11E8D: cmd = [picode] 02F11E92: cmd ^= hash 02F11E9B: cmd += 1 02F166B9: cmd rol= 7 02F166BE: cmd = ~cmd 02F166CE: hash ^= cmd 02F1FCA7: handle = [cmd * 4 + 0x02F10AC5] 02F1FCB7: handle ^= 0xA3B77605 02F1FCBE: handle += 0xF2EEA000 Upd Сравнил логи и то что в отладчике. Второй опкод ленты расшифровывает неверно. Скорее всего кривой хеш. ![]() |
|
Создано: 11 января 2012 17:02 · Личное сообщение · #31 |
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 ... 23 . 24 . >> |
![]() |
eXeL@B —› Протекторы —› Декомпилятор ВМ |