Сейчас на форуме: (+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... |
|
Создано: 14 апреля 2012 20:11 · Личное сообщение · #2 |
|
Создано: 14 апреля 2012 20:13 · Личное сообщение · #3 |
|
Создано: 14 апреля 2012 22:36 · Личное сообщение · #4 r99 Вот было написано полтора года назад: Создано: 3 ноября 2010 16:11:00 · Поправил: Vamit · Личное сообщение · Правка · Стереть #6 Разобрана последняя опция ВмПротекта - Проверка целостности кода Этот алгоритм запускается перед выходом из ВМ для вызова процедуры CALL. Сначала в стек помещаются три адреса (всё это делается под ВМ): 1. Адрес возврата в следующую секцию ВМ после отработки процедуры. 2. Адрес обфускированного кода в котором осуществляется вызов процедуры. 3. Адрес обфускированного кода в котором выполняется дешифрация ресистров CPU. Делается это следующим образом (сокрытие констант не учитываю): - адрес 1 непосредственно записывается в стек - производится восстановление начального кода по этому адресу Code: 01ABEDDC: rvm_хх = 0x01A1CB84 // адрес 01ABEE59: [rvm_хх] = 0x68 01ABEF49: [rvm_хх + 1] = 0x32A8E094 01ABF012: [rvm_хх + 5] = 0xE8 01ABF116: [rvm_хх + 6] = 0xFFFF9500 - адрес 2 непосредственно записывается в стек - этот адрес модифицируется, если CRC неправильная или не модифицируется, если CRC правильная, следующим образом: а). берется случайное число Code: 01AB6B09: rdtsc 01AB6B8F: xor eax, 0xA221 01AB6CAE: div eax, 0x0056 01AB6D45: mul edx, 0x0009 б). берутся параметры проверки кода и считается CRC Code: 01AB6E2E: svm_134 = 0x01A16F39 // адрес структур 01AB6E3F: rvm_0C = eax + svm_134 // адрес кодированного адреса проверяемого кода, eax из пункта а) 01AB6EFF: svm_143 = rvm_0C + 4 // адрес длины кода 01AB702E: svm_155 = xor [rvm_0C], 0x03447E8F // декодирование адреса проверяемого кода 01AB7050: svm_157 = crc svm_155, [svm_143] // параметры: адрес кода и его длина (байт) в). к CRC прибавляется константа из структуры Code: 01AB709B: svm_161 = rvm_0C + 5 // адрес константы 01AB70A6: svm_162 = svm_157 + [svm_161] г). полученный результат svm_162 (при правильной CRC он равен нулю) прибавляется к адресу 2. - повторяются все теже действия с адресом 2 для адреса 3 (значение адреса структур другое и конечно же случайное число другое) - перед выходом из ВМ хешируются все регистры CPU - осуществляется выход из ВМ на адрес 3 - выполнение кода по адресу 3 - расхеширование регистров - выполнение кода по адресу 2 - вызов требуемой функции - выполнение кода по адресу 1 - вход в новую секцию ВМ Надеюсь написал понятно... ----- Everything is relative... А прога из которой это взято выкладывалась вместе со Свипером примерно в то же время. ----- Everything is relative... | Сообщение посчитали полезным: r99 |
|
Создано: 15 апреля 2012 08:46 · Поправил: r99 · Личное сообщение · #5 |
|
Создано: 30 сентября 2012 17:48 · Личное сообщение · #6 |
|
Создано: 01 октября 2012 15:58 · Личное сообщение · #7 BoRoV Тогда найти причину почему не дошло, в принципе функции можно декомпилить кусками (от входа в вм до выхода из неё), а затем эти куски склеивать вручную, конечно, всё это геморно, но при восстановлении кода одной проги мне попались под вмпротом MMX инструкции, которые Олькин асм/дизасм вообще не распознает - пришлось декомпилить кусками, но в итоге восстановленные функи получились работоспособными... Ещё можно поиграть опциями декомпиля и границами секций вм и кода. ----- Everything is relative... |
|
Создано: 01 октября 2012 16:08 · Личное сообщение · #8 Vamit, а как это сделать если причиной того, что декомпиляция не доходит до создания финальной секции является то, что олька просто закрывается во время декомпиляции (это происходит не только у меня и не только на моей программе). ----- Лучше быть одиноким, но свободным © $me | Сообщение посчитали полезным: schokk_m4ks1k |
|
Создано: 01 октября 2012 17:40 · Личное сообщение · #9 |
|
Создано: 02 октября 2012 10:16 · Личное сообщение · #10 Новая версия VmProtect Добавлено: 1. Обработчик "пустого" выхода из ВМ. 2. Декомпиляция табличных переходов (switch конструкции). 3. Обработка невиртуализованной инструкции sbb. BoRoV Попробуй последнюю версию... ----- Everything is relative... | Сообщение посчитали полезным: -Sanchez-, VodoleY, NikolayD, crc1, sendersu, daFix, huckfuck, vnekrilov, schokk_m4ks1k, _ruzmaz_, SReg, BoRoV, Gideon Vi, tihiy_grom, obfuskator, kioresk, m0bscene, Ultras |
|
Создано: 02 октября 2012 13:22 · Личное сообщение · #11 Vamit пишет: Попробуй последнюю версию... Уже лучше, олька не закрывается, но возникает следующее на той же ф-ии. Олька подвисает, но в хелпе сказано, что нужно подождать в таком случае, ну я ждал, ждал, ждал и через час у меня закончилось терпение. Открываю лог, а там следующая картина: Code:
И так еще ~300000 пустых секций. ----- Лучше быть одиноким, но свободным © $me |
|
Создано: 02 октября 2012 15:03 · Личное сообщение · #12 Хоть кто нить может быть сможет показать, как это вообще работает,м? Я уже даже молчу о том, что в реальной программе вы такого бреда не увидите ff04_02.10.2012_EXELAB.rU.tgz - Project.rar |
|
Создано: 02 октября 2012 15:18 · Личное сообщение · #13 |
|
Создано: 02 октября 2012 15:22 · Личное сообщение · #14 Vamit как код вытащить из под вм, пусть даже(!) такими опциями | Сообщение посчитали полезным: schokk_m4ks1k |
|
Создано: 02 октября 2012 16:26 · Личное сообщение · #15 |
|
Создано: 02 октября 2012 16:27 · Личное сообщение · #16 SReg Всё уже 200 раз расписано: 1. Находим ОЕП 2. Брякаемся на ней, Analyze all VM reference 3. Берем Postponed точку, доходим до неё 4. Давим F1 5. Если вм будет распознана, то начнется декомпиляция 6. Дальнейщее зависит от умений обращаться со Свипером и понимания процесса виртуализации. ----- Everything is relative... |
|
Создано: 02 октября 2012 16:36 · Личное сообщение · #17 Vamit да в том-то и дело что умений обращаться со свипером нет вот я попытался прогу у SReg'a декомпильнуть. Посмотрите, всё ли правильно я понял ? Code:
|
|
Создано: 02 октября 2012 16:36 · Личное сообщение · #18 |
|
Создано: 02 октября 2012 16:42 · Поправил: Vamit · Личное сообщение · #19 tihiy_grom Да, всё правильно, получен почти чистый исходный код, небольшая ручная доводка и всё ОК. 001506D9: iEAX = imul edx, efl // $100 * дворд в стеке = $100 * $300 = $30000 001506EE: rvm_34 = iEFL // 001506F7: edx = iEDX // = что за 3 записи - я хз 001506FD: eax = iEAX mul/div инструкции имеют результаты (iREG) в нескольких регистрах, которые затем могут использоваться или нет, в лог пишутся все результаты, а далее видно, что используется только eax да в том-то и дело что умений обращаться со свипером нет Если нет, то они приобретаются только желанием, а иногда и нелегким трудом... ----- Everything is relative... |
|
Создано: 02 октября 2012 17:05 · Личное сообщение · #20 Vamit пишет: Если нет, то они приобретаются только желанием, а иногда и нелегким трудом... Полностью согласен с Vamit. Сам столкнулся с одной программой, при восстановлении кода которой возникли сложности. Несколько раз проконсультировался с Vamit. И, в итоге, кое-что получилось. Просто нужно терпение и понимание того, что делается |
|
Создано: 02 октября 2012 17:07 · Личное сообщение · #21 Vamit пишет: Если нет, то они приобретаются только желанием, а иногда и нелегким трудом... 146% согласен но вот эта запись ... Code:
логичнее было предположить, что в стек просто пушится какой-то дворд по адресу, полученному из этих трёх слагаемых и вот как догадаться что на самом деле это последовательность двух команд? Code:
где можно почитать что за команды выводит свипер в лог? |
|
Создано: 02 октября 2012 17:52 · Личное сообщение · #22 tihiy_grom Я уже это говорил, но повторю - основная проблема Свипера - распознавание соответствия регистров вм и ЦПУ. Здесь push [ebp + 0xFFFFFFF8 + rvm_3C] Свипер определил, что результат операции попал в регистр флагов, но так как операция прямого присвоения флагам отсутствует то присвоением им делается через push/pop 001505EB: push [ebp + 0xFFFFFFF8 + rvm_3C] 00150040: popfd на самом деле здесь используется другой регистр, но вот какой определить затруднительно, иногда вручную приходится определять регистры методом исключения уже используемых... Короче, чтобы правильно (100%) восстановить код функции с учетом всех регистров нужно отбросить последние секции после Свипера и делать это самим (руками и головой), начиная с первой полной (включающей все зоны) секции - это Section a09 remove antidump, если она есть или любая другая перед зонами регистров в конце лога Code:
Для правильного определения соответствия регистров нужно знать: 1. Все регистры на входе в вм (файл EntryExit1_xxxxx.map) 2. Все регистры на выходе из вм (файл EntryExit1_xxxxx.map) 3. Все регистры на любых переходах и метках (файл Trans1_xxxxx.map) а также иногда заглядывать в файл Reloc1_xxxxx.map и прыгать из него в основной trc файл для определения "ложного" регистра на переходах. вот небольшой кусочек последовательности ручного восстановления регистров Code:
цифры - индексы регистров rvm но если ещё учесть, что не все инструкции (в зависимости от их модификаций) могут быть девиртуализованы Свипером, то нужно ещё знать все шаблоны девиртуализации инструкций, чтобы сделать её вручную. Итог простой - с наскока эту вм даже с наличием инструмента не взять... где можно почитать что за команды выводит свипер в лог? Где-то в теме я расписывал что и в каком файле и в какой секции лежит... ----- Everything is relative... |
|
Создано: 02 октября 2012 18:00 · Личное сообщение · #23 |
|
Создано: 02 октября 2012 18:11 · Личное сообщение · #24 |
|
Создано: 02 октября 2012 21:11 · Личное сообщение · #25 |
|
Создано: 01 ноября 2012 18:21 · Поправил: Kuzya69 · Личное сообщение · #26 |
|
Создано: 01 ноября 2012 19:40 · Поправил: Vamit · Личное сообщение · #27 |
|
Создано: 01 ноября 2012 20:01 · Поправил: Kuzya69 · Личное сообщение · #28 Vamit Ну я по другому поступил. Нашел пустую зону в области ВМ. И перенес туда эти 5 строк из зоны основного кода. А в таблице хенндлеров пересчитал адреса на эту пустую зону. Просто та зона и является зоной кода. Пересекутся тогда. Щас пытаюсь понять, что у меня получилось. Трудно в первый раз разбираться в незнакомых аббревиатурах. У меня кстати выскакивают такие сообщения по очереди, везде "да" надо отвечать? c08b_01.11.2012_EXELAB.rU.tgz - Message Sweeper.JPG |
|
Создано: 01 ноября 2012 21:25 · Личное сообщение · #29 Kuzya69 Насчет сообщений, первое говорит о том, что Свипер обнаружил пакетный вызов функций (из одной виртуализованной вызывается другая виртуализованная без выхода из вм), если ответить "Да", то Свипер тело вызываемой функи декомпилирует и вставит внутрь вызывающей, если ответить нет то Свипер оформит вызов функи через call <адрес в вмпроте> и вызываемую декомпилить не будет. Но отдельно тело вызываемой (пакетной) функи в теле проги имеется, только найти его нужно будет самостоятельно, т.к. отдельно оно уже не вызывается. Второе сообщение к Свиперу вообще не относится. ----- Everything is relative... |
|
Создано: 01 ноября 2012 21:39 · Поправил: Kuzya69 · Личное сообщение · #30 Вроде больше и ошибок никаких не было, и перезагрузиться Свипер не предлагал. Вроде как все тип-топ. Просто все стоит как-будто закончилось. Но в логе последние только "Section a04". Я так понимаю, надо Свипер как-то подтолкнуть, чтоб дальше декомпилил? Или это надо теперь на "внутренний калл", на который ругался, свипер переключать, а потом продолжать эту вм декомпилить? |
|
Создано: 01 ноября 2012 21:46 · Личное сообщение · #31 |
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . 16 . 17 . 18 . 19 ... 23 . 24 . >> |
eXeL@B —› Протекторы —› Декомпилятор ВМ |