Сейчас на форуме: (+9 невидимых) |
eXeL@B —› Протекторы —› Декомпилятор ВМ |
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 ... 23 . 24 . >> |
Посл.ответ | Сообщение |
|
Создано: 03 марта 2010 12:33 · Личное сообщение · #1 Вашему вниманию предлагаются наработки по декомпиляции ВМ. Проект на сегодняшний день для меня завершен, но жаль если результат "ляжет на полку", может кому-нибудь и пригодится. Предлагаю сначала ознакомиться с обзором, и если будет интерес то могу выложить и сам плагин, или здесь или в личку заинтересованным лицам, каким образом, пока ещё не решил... Но если кто-либо ожидает увидеть "автоматическое чудо", то сразу скажу - его нет. Для того чтобы получить результат нужна ручная предварительная работа: - с исследуемой программы должна быть снята упаковка - точки входа в ВМ находятся вручную - возможно неоднократное "жамкание" клавиш в OllyDbg, а возможно и модификация кода, чтобы попасть в нужное место, в зависимости от защищенной функции - необходимо вручную прицепить к программе требуемый секцию - запись результатов в файл это тоже ручная работа, но уже более приятная Не всё гладко обстоит с определением реализаций ВМ, на сегодняшний день примерно каждая третья реализация автоматом не определяется, приходится под неё модернизировать плагин, т.к. не могу сразу предусмотреть все случаи "издевательств" ВМ с кодом примитивов. Лучше дела с восстановлением "исходного" кода защищенных функций - 70% нормально восстанавливается, хотя во многом это зависит от самой структуры функции. Таким образом, если будет заинтересованность и помощь в нахождении подобных ситуаций, то проект может быть доведен до релизной стадии. ЗЫ: Речь идет об Ореановских машинах. Нигде специально не упоминал. 9c41_03.03.2010_CRACKLAB.rU.tgz - VMSweeperLst.rar ----- Everything is relative... |
|
Создано: 02 августа 2011 10:15 · Личное сообщение · #2 |
|
Создано: 03 августа 2011 11:13 · Личное сообщение · #3 Новая версия Исправлено: 1. Ошибка переполнения текстового буфера при формировании длинных выражений, что приводило к исключению на стадии анализа кода. ----- Everything is relative... | Сообщение посчитали полезным: Gideon Vi, Ultras, huckfuck, daFix, obfuskator, SReg, neprovad, m0bscene, _ruzmaz_, NikolayD, ClockMan, BAHEK, TrueLies, Yotun, DimitarSerg |
|
Создано: 03 августа 2011 21:41 · Поправил: neprovad · Личное сообщение · #4 Vamit в предыдущем файле, выложенном мной, на адресе Code:
Добавление: При подпытке декомпиляции с адреса 41517E выдается ошибка "unknown identifier in mov byte ptr ds:[rvm_30], 0xFD" Как быть с такой ситуацией? Code:
215a_03.08.2011_EXELAB.rU.tgz - 406251.trc |
|
Создано: 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... | Сообщение посчитали полезным: DimitarSerg, _ruzmaz_, daFix, Airenikus, Ultras, Yotun, SReg, huckfuck, ClockMan, Gideon Vi, m0bscene, YDS, yagello, obfuskator, stas_02, Maximus, BoOMBoX |
|
Создано: 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... | Сообщение посчитали полезным: obfuskator, SReg, HandMill, r_e, _ruzmaz_, Gideon Vi, Maximus, huckfuck, yagello, neprovad, BAHEK, gena-m, Ultras, kioresk, daFix, Yotun, stas_02, NikolayD, Dart Raiden, ClockMan, vnekrilov, Bronco, DimitarSerg |
|
Создано: 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 —› Протекторы —› Декомпилятор ВМ |