Сейчас на форуме: (+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... |
|
Создано: 11 октября 2010 13:50 · Личное сообщение · #2 |
|
Создано: 11 октября 2010 16:39 · Личное сообщение · #3 |
|
Создано: 11 октября 2010 17:18 · Личное сообщение · #4 |
|
Создано: 07 ноября 2010 21:23 · Личное сообщение · #5 Подскажите по началу (входу в вм) у themida - плагин проверяет какие-то конкретные признаки валидности входа а-ля: jmp _l1 _l1: push XXXXX; jmp vm учитывая мусор в коде или надо руками чуток расчистить этот мусор pushad\popad и т.п. и только потом F1? А то плагин выдает что не там мол находимся, хотя я отлично вижу что место входа в вм верное. |
|
Создано: 07 ноября 2010 21:41 · Личное сообщение · #6 neprovad пишет: Подскажите по началу (входу в вм) у themida Темиду плагин декомпилировать не умеет, возможно только нахождение точек входа в эту вм через Find all reference. neprovad пишет: или надо руками чуток расчистить этот мусор руками ничего расчищать не надо, если распознает вм на точке входа, то начинает её декомпиляцию ----- Everything is relative... |
|
Создано: 08 ноября 2010 23:57 · Личное сообщение · #7 |
|
Создано: 09 ноября 2010 09:09 · Поправил: Vamit · Личное сообщение · #8 neprovad пишет: программу с themida (или выложить) на которой можно "поупражняться" Поупражняться в чем, в нахождении точек входа? Мне проще выложить декомпиль в текущем состоянии, а там - пробуйте сами. Но сразу могу сказать - конечного результата по декомпиляции вмпрота ещё нет, но ковыряние в коде с ним значительно упрощается... ----- Everything is relative... |
|
Создано: 09 ноября 2010 14:32 · Личное сообщение · #9 Вот это можно опробовать. Если будет падать с какой-либо ошибкой, то ищем в созданных файлах строку с #ERROR#, в ней будет всё сказано... 6801_09.11.2010_CRACKLAB.rU.tgz - VMSweeper13beta.rar ----- Everything is relative... |
|
Создано: 16 ноября 2010 18:02 · Поправил: drin · Личное сообщение · #10 тестил на двух программах с CV, в обоих случаях ошибки: на тестовой программе такого содержимого: Code:
вывалилось с: Code:
на CheckVirtualizer.exe входящем в комплект CV Code:
в обоих случаях использовалась последняя версия CV - 1.3.8, если нужно могу выслать самих жертв... P.S.: есть возможность тестить на последних лицензионных версиях WinLicense |
|
Создано: 17 ноября 2010 14:52 · Поправил: Vamit · Личное сообщение · #11 Восстановлен первый реальный код из полностью съеденного вмпротом ОЕПа: Code:
----- Everything is relative... |
|
Создано: 17 ноября 2010 16:13 · Личное сообщение · #12 |
|
Создано: 04 декабря 2010 12:27 · Поправил: Vamit · Личное сообщение · #13 Очередная версия VMSweeper 1.3 (beta 12): - полное восстановление импорта после VMProtect - устранен сегмент .vm, к исследуемому файлу больше ничего цеплять не нужно - улучшен поиск точек входа в вм - улучшено распознавание типов вм - shortcut Shift+F1 упрощает продолжение анализа кода вм - увеличено общее быстродействие при всех операциях - повышен процент успешной декомпиляции кода под VmProtect (успешная для меня - когда более 50% кода распознано и восстановлено автоматически, а 100% восстановление кода пока возможно только в 5-10% случаев и только на некоторых версиях VmProtect, а каких неизвестно т.к. он о себе не сообщает) - обновлено Руководство пользователя, с которого и следует начать... ЗЫ: Смотрим пост №20... ----- Everything is relative... |
|
Создано: 04 декабря 2010 23:11 · Личное сообщение · #14 |
|
Создано: 05 декабря 2010 15:13 · Личное сообщение · #15 |
|
Создано: 05 декабря 2010 21:03 · Личное сообщение · #16 |
|
Создано: 05 декабря 2010 21:42 · Личное сообщение · #17 |
|
Создано: 06 декабря 2010 00:26 · Личное сообщение · #18 |
|
Создано: 06 декабря 2010 00:34 · Поправил: m0bscene · Личное сообщение · #19 |
|
Создано: 06 декабря 2010 17:37 · Поправил: Vamit · Личное сообщение · #20 Кое-что исправлено... 8857_06.12.2010_CRACKLAB.rU.tgz - WMSweeper13beta13.rar ----- Everything is relative... | Сообщение посчитали полезным: DGX, _ruzmaz_, Gideon Vi |
|
Создано: 06 декабря 2010 21:54 · Личное сообщение · #21 |
|
Создано: 07 декабря 2010 00:46 · Поправил: Airenikus · Личное сообщение · #22 |
|
Создано: 07 декабря 2010 10:33 · Поправил: Vamit · Личное сообщение · #23 Так... пошла волна вопросов, попытаюсь их минимизировать по стадиям обработки. Инструмент ещё не совершенен, сообщений об ошибках может быть много, но посты типа Airenikus кроме мусора никакой инфы не дают, хотя если заглянуть в логи и трейсы, то почти на 100% можно определить причину появления ошибки - для кого я их делал такими подробными??? Если хотите разобраться в своей проге, то приложите усилия для понимания логов и трейсов, там ничего сложного нет и всё прозрачно. Теперь пройдусь по стадиям обработки: 1. Analyse all VM references. Процесс должен пройти 100% весь код, восстановить весь импорт, включая ИАТ и вызовы/обращения к АПИ функциям. Должное внимание следует уделить заданию диапазонов адресов кода и вм, от их правильности зависит вся дальнейшая работа. Эти диапазоны могут охватывать более одной секции файла и могут перекрываться. По диапазону кода пояснения не требуются - это рабочий диапазон кода программы. Требования к диапазону вм - охватить им все места размещения вм. Критические части ВМ, которые обязательно должны находиться внутри этого диапазона: - начальный адрес ленты пикода - таблица обработчиков примитивов А так как вмпротект занимает собой все свободные места в проге, то диапазон вм может быть от начала кода до конца файла. Но следует учитывать, чем шире этот диапазон, тем больше мусора (ложных точек входа) будет найдено, но ничего пропущено не будет, если дипазон вм задать уже (по сегментам вм), то возможен пропуск как точек входа, так и импорта и в дальнейшем можем получить сообщения о нераспознаваемости частей вм. Если во время работы этого процесса получаем сообщение об ошибке, то первым делом ищем в последних логах/трейсах строку с #ERROR# и сообщаем о ней. 2. Decode VM. Этот процесс состоит из нескольких частей: - Определение типа вм. Должно быть 100% распознавание - в случае ошибки смотрим файлы Regs_ххх и Stack_xxx, и если знаем теорию, а без неё здесь делать нечего, то понимаем причину ошибки. - Определение цикла вм и её параметров - начального адреса ленты пикода и таблицы обработчиков. В случае ошибки - смотри выше... - Декодирование цикла вм и всех обработчиков. ФПУ обработчики пока не реализованы. Любая ошибка 100% локализуется по логам и трейсам. - Создание промкода. В статусе имеем "VMS: Creating intermediate code... " - всё должно работать и код должен создасться рабочим. За исключением некоторых случаев - хардсвичи двух типов не обрабатываются, если они виртуализованы вм, также возможны ошибки при определении сложных ветвлений внутри функции. - Декомпиляция промкода. В статусе имеем "VMS: Decompiling intermediate code... ". Сложностей здесь быть не должно, если промкод построен правильно. - Получение исходного кода. Здесь только в 5-10% случаев можно получить полностью восстановленный код. Все стадии этого процесса есть в логах - иногда небольшая ручная доработка позволяет получить исходный код. Напоследок я скажу: В результате работы заинтересованы вы, а не я, поэтому бесполезно мне писать только сообщение об ошибке, я их и так все знаю. Каждый ваш файл прогнать под дебагером я не имею возможности, поэтому или разбирайтесь сами или сообщайте действительно полезную инфу - что по такой-то и такой-то причине эта часть анализа не прошла... Успехов... PS: VMSweeper настоятельно рекомендую запускать под реальной системой, на виртуальных машинах типа VMWare возможны ошибки в работе - причина их неизвестна... ЗЫЗЫ: Если после поиска всех ссылок вы хотите декомпилировать функции, то нужно выполнить перезапуск Ольки, сохранив предварительно таблицу ссылок в текстовом файле, в противном случае возможны сбои в работе, т.к. под восстановленным импортом может оказаться часть вм!!! ----- Everything is relative... |
|
Создано: 07 декабря 2010 19:10 · Поправил: Ultras · Личное сообщение · #24 С разрешения Vamit, публикую небольшой step-by-step tutorial по успешной декомпиляции свипером защищенных ф-ий. Основная цель: минимизация ошибок на этапе декомпиляции. Прежде чем писать багрепорт автору, внимательно пробегитесь по описанным ниже шагам, может быть вы что-то упустили в очередной раз Подготовка: - Перед началом работы обновите dbghelp.dll до самой свежей версии. - Для целей декомпиляции рекомендуется иметь отдельную сборку OllyDbg с минимальным нужным набором плагинов (например только Phantom и VMSweeper). - Убедитесь что у вас установлена последняя версия свипера (версию проверяем в окне About плагина). Итак приступим: 1. Загружаем программу в OllyDbg и добираемся до OEP или останавливаемся близко к ней, главный момент здесь – это данные программы не должны быть еще инициализированы! 2. Запускаем "Analyse all VM references". Указываем диапазон секции кода и VM и жмем ОК. 3. После анализа свипер предложит восстановить импорт: вводим начальный адрес расположения переходников и предположительно конечный. Если конечный адрес задать неверно то свипер сообщит о невозможности расположения некоторых восстановленных переходников -> надо будет увеличивать конечную границу и повторять анализ. 4. После анализа и восстановления импорта сохраняем лог найденных референсов (Reference VM Window) в файл и перезапускаем программу, чтобы восстановленный импорт не нарушил логику ВМ! 5. Ну вот мы опять на OEP или рядом. По логу референсов находим интересующие нас ф-ии (помечены как Postponed) и начинаем декомпиляцию: для этого желательно брякнуться на нужной ф-ии, либо принудительно установить на нее EIP (New origin here). Жмем F1. Запустился декомпилятор… 6. На перезапуски программы отвечаем OK. Перед продолжением декомпиляции, после перезапусков, важно находиться всегда в одной и той же точке программы, например OEP: брякнулись на OEP, нажали Shift+F1, свипер отработал и предложил перезапуск, мы опять на OEP, опять Shift+F1 и тд. Если в процессе создания свипером промежуточного кода вылетел эксепшен, то рестартуем программу и продолжаем по Shift+F1. 7. Если всё сделали правильно то доберетесь до конца декомпиляции. Небольшие замечания по ходу декомпиляции: - На предложенный свипером реанализ кода – всегда жмем ОК. - В некоторых случаях может потребоваться указание в качестве начала границы VM - начало секции кода (например в Delphi программах). Для этого сначала рекомендуется провести анализ с узким диапазоном границ VM, сохранить окно референсов, затем расширить границы сегмента VM и повторить анализ. При таком анализе отложенных (Postponed) ф-ий будет много, поэтому работу по декомпиляции ведем по нашему сохраненному вначале окну референсов. - Перед анализом ВМ ссылок рекомендуется закрыть окошко CPU, а после можно открывать. Это слегка ускорит процесс. Удачной декомпиляции! ----- .[ rE! p0w4 ]. | Сообщение посчитали полезным: Vamit |
|
Создано: 09 декабря 2010 16:50 · Личное сообщение · #25 Происходит ошибка во время "VMS: Decompiling intermediate code... " последнее, что появляется в строке статуса перед ошибкой, заканчивается на: a12 final Содержание ошибки: Unknown identifier in mov rvm_14, 0x10140000 Число 0x10140000 это адрес AntiDump секции. При попытке декомпиляции другой функции в этой проге, та же ошибка в том же месте, меняется только номер переменой rvm_XX . Во 2-й проге, тоже, та же ошибка в том же месте. Содержание ошибки: Unknown identifier in mov rvm_04, 0x01390000 В ней также число 0x01390000 это адрес AntiDump секции. Analyse all VM references. по сегментам вм в обеих прогах делался как вы и рекомендовали для вмпрота, от начала кода до конца файла. |
|
Создано: 09 декабря 2010 18:04 · Личное сообщение · #26 заканчивается на: a12 final То что вы видите a12 - это уже хорошо, а после него идут скорее не ошибки, а недоработки, например, вмпротовский антидампинг не обрабатывается. Постарайтесь по а12 пройтись со смыслом, если там сложные выражения, типа этого - 0015068A: esi = [((shl [__$esp + 2], 0x08)) + rvm_14 + 0xFFFFFFFE | (not {shr [rvm_14 + 0xFFFFFFFE], 0x07}, {shr [rvm_14 + 0xFFFFFFFE], 0x07}) + 0x0001], то это говорит о том, что не прошла девиртуализация, можно подняться в сторону меньших а.. и посмотреть причину этого. Но уже в таком виде смысл операций можно уловить, если же это представляет сложность, то никто не мешает проверить некоторые действия по промкоду, после окончания декомпиляции eip стоит на переходе в него, F7 и вперед.... И помните, на данном этапе 100% декомпиляции я не обещал ----- Everything is relative... | Сообщение посчитали полезным: m0bscene, ClockMan, VodoleY |
|
Создано: 15 декабря 2010 18:14 · Личное сообщение · #27 |
|
Создано: 15 декабря 2010 21:21 · Поправил: Bronco · Личное сообщение · #28 файл 1A18BC9.trc вышел почти на 2 mb, надеюсь что последних строк, из него, хватит: Code:
//впечатляет кол-во промкода... add: декомпилил с vm_oep = 1A18BC9, ПК не разбирал, но свип одну системную функу проскочил (GetVersion) ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
|
Создано: 16 декабря 2010 08:32 · Личное сообщение · #29 Bronco Удивительное рядом, но оно мне не дано... Попробовал декомпилить с этого адреса - 1A18BC9, трейс получил 350кб, а затем исключение... Назови свои условия декомпиляции. Вообще-то это промежуточный вход в ВМ, но не каждый промежуточный вход может успешно декомпилиться, всё зависит от состояния стека..., декомпилить нужно начинать с первоначального входа в ВМ. Эта точка отсутствует в списке Postponed, не знаю, как ты на неё вышел, но это не ОЕП. Если всё сделано правильно, то ручной работы по файлу практически нет, ну кроме как создать дампинг, пройтись ImpRec'ом, отрезать лишние секции с уже не нужной ВМ... ----- Everything is relative... |
|
Создано: 16 декабря 2010 09:16 · Личное сообщение · #30 Vamit пишет: отрезать лишние секции с уже не нужной ВМ... Code:
файлО с косяками, у оригинала те же траблы, хз может из-за отсутсвия дата_кабеля и т.д... Vamit пишет: это не ОЕП версия защиты не старше 2 линейки, ( импорт, инты, jmp_vm_oep), если правильно снять дамп, то он работает и без востановленого импорта. Vamit пишет: Назови свои условия декомпиляции. снимал трейсы с оригинала...))) ----- Чтобы юзер в нэте не делал,его всё равно жалко.. |
|
Создано: 16 декабря 2010 10:43 · Личное сообщение · #31 Bronco пишет: файлО с косяками, у оригинала те же траблы, хз может из-за отсутсвия дата_кабеля и т.д... Не важно, файл работает - основное окно проги появляется, а более ничего и не нужно. версия защиты не старше 2 линейки Да, по моему мнению, там вмпрот 1.8 если правильно снять дамп, то он работает и без востановленого импорта. Это понятно, но файл дан не как распакми, а как пример, на котором можно протестировать работоспособность Свипера и с его помощью 100% восстановить весь съеденный импорт и стартапкод, от которого практически ничего не осталось. снимал трейсы с оригинала Я спрашивал про Свипер: твои диапазоны адресов кода и вм. И ещё во-первых, хотелось бы понять причину, почему ты декомпилил не Postponed точку, а какой-то промежуточный вход в ВМ? А во-вторых, почему у нас с тобой разные результаты декомпиляции одного и того же адреса. ----- Everything is relative... |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 23 . 24 . >> |
eXeL@B —› Протекторы —› Декомпилятор ВМ |