![]() |
eXeL@B —› Вопросы новичков —› Что делать дальше, когда деобсфуцировал код хендлеров в ВМ? |
Посл.ответ | Сообщение |
|
Создано: 30 октября 2012 01:30 · Личное сообщение · #1 Вобщем разобрал ВМ. Удалил "мусор" из хендлеров. Запускаешь трассировку, да, размер кода заметно уменьшился. Но мешают остатки от Главного обработчика - main handler (который как раз и вычисляет кому передать управление в следующем цикле ВМ ). Да и все равно даже если не обращать внимание на него, код получается немного запутанный. Трудно понять где условные переходы, хотя можно. Вобщем подскажите, как полностью очистить код от ВМ, чтоб получился вменяемый ассемблерный код? Я предполагаю, надо создавать секцию. Помещать туда "чистые" хендлеры в порядке следования на ленте закодированного кода, составлять таблицу хендлеров в зависимости от нового размещения, и уже потом разбираться с переходами? Хотя мне кажется, что я в корне не прав. ![]() |
|
Создано: 30 октября 2012 01:43 · Личное сообщение · #2 |
|
Создано: 30 октября 2012 01:50 · Личное сообщение · #3 |
|
Создано: 30 октября 2012 02:52 · Поправил: Kuzya69 · Личное сообщение · #4 Вот такого типа, как я понял, это кодевирт. Code:
Это не мой код, но у меня аналогичный, просто потерял флешку, и не могу с другого ноута пока свои наработки скопировать, а тот ноут у меня сети не знает. ![]() |
|
Создано: 30 октября 2012 10:02 · Поправил: VodoleY · Личное сообщение · #5 З.Ы, да очень похож на кодевирт, сначало код посмотрел, потом пост дочитал ![]() Скопировать хедлы конечно можно, это тот вариант, когда ты не можешь востанавливать сам код, без главного цикла, но тот же Vam-ит в Sweper воссаздает код, OreansUnVirtualizer тоже @Label_009BFF88 009BFFCD CLI 009BFFE2 PUSH EBP 009C0012 SHL EBP,0x2 009C0079 TEST EDI,EBX 009C00D0 XOR EBP,EAX 009C017F TEST EDX,EDI 009C0210 POP EBP 009C022F PUSH EBX 009C0257 XOR EBX,0xa4 009C02D5 OR BL,BL примрно так. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 30 октября 2012 10:20 · Личное сообщение · #6 |
|
Создано: 30 октября 2012 10:44 · Поправил: Kuzya69 · Личное сообщение · #7 Там по крайней мере 4 ВМ. С такими начальными телами. Так что получается это CISC. Я пока только одну ВМ раскурочил "на кубики". Code:
Нашел здесь-же на форуме ( http://www.exelab.ru/f/action=vthread&forum=13&topic=14863&page=0#14 ), какую-то утиль "depack.asm ". Не могу понять как ей пользоваться, и вообще что она делает? Насчет Sweper от Vam-ит, я честно признаюсь, я не понимаю, как им пользоваться, хоть-бы какой пример посмотреть. И что значит этот код, куда его размещать, и как запускать? Я так понимаю, что это "обратный" main handler, верно? ![]() |
|
Создано: 30 октября 2012 11:22 · Личное сообщение · #8 Kuzya69 очень тяжко куски выдертые из контекста анализировать. по всей видимости ты нашел вход в ВМ, т.е это инициализация, вроде. Попробуй разобраться с OreansUnVirtualizer. суть всех этих плагов след. 1. Сканирование области на вход в ВМ.(там где идет инициализация главного цикла, т.е код ДО НЕГО) 2. запуск распознования главного цикла и кодов примитивов, с их очисткой от мусора и обзывания их, т.е Кто что делает. 3. Востановление оригинального кода. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 30 октября 2012 11:47 · Поправил: Kuzya69 · Личное сообщение · #9 VodoleY по всей видимости ты нашел вход в ВМ Да я нашел все входы, во все 4 ВМ, нашел все переходы в ВМ вида Code:
По этим "const", определил все цепочки кодированных кодов (ленты пикода). По сигнатурам ВМ вида ... Code:
определил массивы таблиц хендлеров и регистров. В одной ВМ деобсфуцировал хендлеры. Но очень трудно выстроить "чистые" хендлеры в правильном порядке, так как заранее трудно просчитать следующий хендлер, особенно для неработающей ветки после условного перехода. Да и не знаю оптимального решения для внедрения этих "чистых" хендлеров в тело программы. Хочется понять как это делается руками, чтоб понять смысл, к тому-же автоматы тоже ошибаются иногда, и не зная принципа работы автомата, трудно будет потом разобраться в ошибке. ![]() |
|
Создано: 30 октября 2012 12:07 · Поправил: schokk_m4ks1k · Личное сообщение · #10 |
|
Создано: 30 октября 2012 14:08 · Личное сообщение · #11 |
|
Создано: 30 октября 2012 15:46 · Личное сообщение · #12 |
|
Создано: 30 октября 2012 15:55 · Личное сообщение · #13 |
|
Создано: 30 октября 2012 15:59 · Поправил: Veliant · Личное сообщение · #14 Я так понимаю все сводится к тому, что нужно строить дерево при декодировании ленты пикода, а потом уже из дерева генерировать нативный код, тогда и джампы будет проще считать. Вариант 2 - тупой, но простой. Посмотреть сколько максимально занимает места код после декодирования. Для всех остальных опкодов выравнивать на это же число NOP'ами. Тогда будет проще считать смещение куда прыгать. ![]() |
|
Создано: 31 октября 2012 02:38 · Поправил: Kuzya69 · Личное сообщение · #15 BoRoV Дампили вм и прикручивали обратно. Мне так не интересно, я пытаюсь код уменьшить как только можно. Уж слишком много там интересных моментов, которые хочется отследить. Тоесть надо понять всю программу. И повключать все, что скрыто от обывателя. Veliant ...нужно строить дерево... Да вот тут уж совсем задачка не для "рук и бумажки". Хотя время меня не ограничивает, для себя делаю. А вот второй вариант уже прикольнее, когда карту переходов построю, потом можно будет и от НОП-ов избавиться, там проще будет. Главное чтоб какая-нибудь защита не спалила. Но пока вроде спокойно чистил хендлеры в запущенной программе (а заодно и проверял). ![]() |
|
Создано: 31 октября 2012 03:29 · Личное сообщение · #16 |
|
Создано: 31 октября 2012 11:31 · Поправил: VodoleY · Личное сообщение · #17 Kuzya69 ну я уважаю то, что ты пытаешся сделать. даже ВАМит писал о том, что свипер, для тех, кто может руками открутить ВМ. т.е. надо понимать как оно работает (свипер тоже не идеален, но хорошо помогает). Итак, смотри. Если ты хочешь попытаться руками востанавливать код тебе надо будет след. вещи. 1. Найти входы в ВМ.. 2 Определить главный цикл, и алго декодирования ленты. 3. найти, почистить, и пообзывать примитивы. 4. ну тут самое интересное, сделать сопоставление стековых переменных с внутренними регистрами ВМ и реальными регистрами. 5. востанавливать исходный код, заменяя команды из ленты (код примитива+параметры ) на исходный асм код. З.Ы, я год назад юзал OreansUnVirtualizer у него был глюк, некоторые комманды криво востанавливал, так вот руками допиливать и приходилось. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 31 октября 2012 13:42 · Поправил: Kuzya69 · Личное сообщение · #18 VodoleY Получается 3 задачи я уже сделал. (для одной ВМ). Да и машина у меня простая получилась. Не заметил я в ней стековых переменных. Там над таблицей хэндлеров, выделено место (нет хэндлеров с именами 0000-0013h). Туда и размещаются значения виртуальных регистров. Меня такой расклад, даже больше устраивает, при трассировке проще будет, чем с регистрами. Хотя с этим я может и поторопился. Составлю весь код, тогда и точно скажу. А вот про 5 пунктик вашей цитаты: востанавливать исходный код, заменяя команды из ленты (код примитива+параметры ) на исходный асм код. , можно поподробнее, как это делать правильно? И еще, что значит в этой фразе: некоторые комманды криво востанавливал слово "команды"? Хендлеры неправильно деобсфуцировал? Или исходный код неверно составлял? Этот-же вопрос и к kioresk-у относится. Вы тоже об этом-же написали. ![]() |
|
Создано: 31 октября 2012 14:44 · Личное сообщение · #19 |
|
Создано: 31 октября 2012 14:54 · Поправил: Veliant · Личное сообщение · #20 |
|
Создано: 31 октября 2012 15:03 · Поправил: VodoleY · Личное сообщение · #21 zeppe1in я противник промежуточного кода, это скорее вопрос деобфускации а не разбора ленты ВМ. , можно поподробнее, как это делать правильно? Например. у тебя есть примитив mov xx,xx в ленте у тебя обязаны быть параметры, откуда и куда. если это регистр-константа(как пример), то можно востановить 1ой командой. логично? это так чтоб ты понял. + все реальные регистры в любой ВМ заменены на стековые, осознай это + регистров ВМ может быть больше чем реальных Kuzya69 пишет: слово "команды"? Хендлеры неправильно деобсфуцировал? да.. просто код примитива, без названия что это такое З.Ы, проще всего попробывать написать маленькую прогу, по декоду ленты, используя уже распознанные примитивы(что одно из самых сложных задачь. детект примитивов имеется ввиду) ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 31 октября 2012 15:56 · Личное сообщение · #22 + все реальные регистры в любой ВМ заменены на стековые, осознай это Имеется ввиду, что перед операцией над содержимым виртуальных регистров, это содержимое сначала помещается в стек? Это и так ясно, но место-то, так скажем длительного хранения, все-равно остается не в стеке, на моей ВМ. Меня интересует момент, как технически подменять пи-код, нормальным кодом? Тоесть я обработал одну ленту (от входа в ВМ до выхода). Построил эквивалентный ей асм-код. Создал секцию, положил в нее получившееся творение с командой "retn" в конце. Дальше берем "прокладку" (прошу прощение за свою терминологию) вида. Code:
const1 - начало декодируемого пи-кода const2 - адрес входа в ВМ. Меняем на свое: Code:
Где const3 адрес начала нашего творения. Правильно я думаю, или есть более правильные пути? ![]() |
|
Создано: 31 октября 2012 16:02 · Личное сообщение · #23 VodoleY я противник промежуточного кода, это скорее вопрос деобфускации а не разбора ленты ВМ. Ну не скажи, это в простых вм может и так, а в нормальных - кто сказал что один примитив эквивалентен одной инструкции асм кода, даже в CodeVirtualizer не так, не говоря уже про другие вм, где одна реальная инструкция асм кода может состоять из нескольких десятков примитивов, здесь без промкода не обойтись... ----- Everything is relative... ![]() |
|
Создано: 31 октября 2012 16:05 · Личное сообщение · #24 Kuzya69 пишет: Правильно я думаю, или есть более правильные пути? Разберись с макросами из ThemidaSDK CODEREPLACE_START - CODEREPLACE_END; ENCODE_START - ENCODE_END VM_START - VM_END VM_START_WITHLEVEL(x) - VM_END как их пользуют в коде, которые из них ведут в ВМ, и что делается с заменяемым кодом между этими макросами ----- 127.0.0.1, sweet 127.0.0.1 ![]() |
|
Создано: 31 октября 2012 16:26 · Поправил: VodoleY · Личное сообщение · #25 Vamit человек пытается разобраться в сути ВМ. автоматизация и оптимизация немножко другая проблиматика. ВЫ во многом правы, но я не считаю промкод оптималным путем решения проблемы. Но это уже в офтоп. ВЫ по крайней мере сделали рабочий продукт и поклон ВАМ. Kuzya69, по большому счету 2 МБ текстового трейса помещаются в 40 комманд. так доходчиво? и ОКОВ прав. возьми напиши прогу. и накрой пару инструкций КодеВиртом, и посмотри что получится. ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 31 октября 2012 18:31 · Личное сообщение · #26 |
|
Создано: 31 октября 2012 18:50 · Личное сообщение · #27 zeppe1in это да. на 100проц. если делать полный самостоятельный инструмент. НО суть работы ВМ перед этим то надо понимать? я писал утлзу, на основ разобранных примитивов свипера, когда он еще спотыкался. декодируя ленту и получая логику.. криво но помогало.. вобщем спорно все это. НО декдодировать примитивы в автомате задачка еше та ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Что делать дальше, когда деобсфуцировал код хендлеров в ВМ? |