Сейчас на форуме: (+9 невидимых) |
eXeL@B —› Протекторы —› VMProtect (Туторы, скрипты, плагины, ...) |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 14 . 15 . >> |
Посл.ответ | Сообщение |
|
Создано: 18 марта 2010 11:56 · Поправил: kioresk · Личное сообщение · #1 Решил создать отдельную тему по VMProtect'у, чтобы собирать в одном месте информацию по этому проту и обсуждать детали. Для начала ответ на самый распространенный вопрос. 1. Почему OllyDbg вылетает при запуске программы, защищенной VMProtect'ом? Потому что VMProtect использует баг с переполнением буфера в старых версиях dbghelp.dll, из-за которого отладчик падает. Чтобы обойти его необходимо исправить баг в dbghelp.dll или положить в папку отладчика новую версию файла dbghelp.dll, который можно взять из комплекта Debugging Tools for Windows: Добавлено Microsoft включил дистрибутив Debugging Tools в состав пакета Windows SDK (который весит достаточно прилично), поэтому вот альтернативные ссылки на: 1. 2. |
|
Создано: 11 октября 2015 23:47 · Личное сообщение · #2 |
|
Создано: 12 октября 2015 02:48 · Личное сообщение · #3 mazaxak, если интересует именно распаковка (без вм), то в принципе в нем супер тяжелого ничего нет. ОЕП найти не сложно, как иат восстановить видел в каком-то туторе LCF-AT, причем написано очень даже не плохо. Про инлайн я писал тутор. Другое дело если программа защищена с вм. По виртуальной машине прота вообще не густо. А если разработчик защитил вм, т.к. написано в хелпе протектора, то труба. В этом случае и оеп можно не найти. |
|
Создано: 12 октября 2015 03:33 · Личное сообщение · #4 Djeck пишет: если интересует именно распаковка (без вм) В смысле распаковка других, а не вмпрота ? Или все кроме виртуальной машины вмпрота ? Протекторы с виртуальной машиной обычно снимал, прикручивая начальные байты по шаблонам. В Execryptor обычно так можно легко сдампить прогу, не изучая саму машину его, а все восстановить по шаблонному началу, подсматривая в стек и регистры. |
|
Создано: 12 октября 2015 05:32 · Личное сообщение · #5 mazaxak пишет: В смысле распаковка других, а не вмпрота Нет именно вмпрот. Я о том, что без покрытия участков кода виртуальной машиной вмпрот не так силен. mazaxak пишет: Протекторы с виртуальной машиной обычно снимал, прикручивая начальные байты по шаблонам. В Execryptor обычно так можно легко сдампить прогу, не изучая саму машину его, а все восстановить по шаблонному началу, подсматривая в стек и регистры. В вмпроте не так всё легко Вм там действительно сильная, но это моё личное мнение. |
|
Создано: 12 октября 2015 11:00 · Личное сообщение · #6 Djeck пишет: В вмпроте не так всё легко Вм там действительно сильная, но это моё личное мнение. Да без машины обычно снять не сложно, а когда она есть вроде ведь пытаются прикрутить эту секцию, в распакованной проге ведь код уже будет весь в хлам ? Кстати возможно ли при наличии машины получить нормальный код, а то прогу распаковываешь, а из-за этой машины сложно его потом анализировать. |
|
Создано: 12 октября 2015 12:06 · Личное сообщение · #7 Если мне не изменяет память (давно протом не занимался), то там достаточно найти оеп, востановить импорт и сдампить образ. Вм находится в секции протектора (а не в выделенной области памяти), поэтому там нужно лишь немного поправить несколько адресов и прога должна работать. Для примера возьми скрипт от вышеуказанной дамы и распакуй им прот с вм. mazaxak пишет: Кстати возможно ли при наличии машины получить нормальный код, а то прогу распаковываешь, а из-за этой машины сложно его потом анализировать Нормальный код получить возможно, для этого нужно анализировать код машины, смотреть регистры и т.д., а потом приводить это в порядок. Вот с этим как раз и проблемы, т.к. вмпорт имеет достаточно сильную машину, плюс ко всему ещё и регистры шифрует. Скажем так - анализировать эту вм, работа не для слабонервных. А все интересные места в программах обычно под вм. |
|
Создано: 13 октября 2015 03:20 · Личное сообщение · #8 |
|
Создано: 13 октября 2015 03:47 · Личное сообщение · #9 |
|
Создано: 13 октября 2015 13:38 · Личное сообщение · #10 |
|
Создано: 13 октября 2015 22:18 · Личное сообщение · #11 |
|
Создано: 02 марта 2016 21:12 · Поправил: Electric Wind · Личное сообщение · #12 Не знаю какую версию я смотрел, но там заметны характерные паттерны, без которых программа работать в принципе не может: запись данных в память/стек, чтение данных из памяти/стека, также ret для создания call-а, а 8 байтами выше адресс возврата. sse, разумеется не виртуализирован. В итоге лишь следить за вызовами с выделением памяти, а когда доходит до примитива записи/чтения - знать че это за память и ловить что пишет/читает. Обычно запись это финальная инструкция mov [reg64_1+reg64_2], reg64_3, а как он там прятался и тайком вычислял секретное значение ваще по-барабану. Математика/условные переходы действительно не знаю как реализованы(через стек наверняка, как ему ещё быть...). Ещё наверное, есть уникальные примитивы и инстанс(когда несколько раз используется разными чуваками). Поэтому желательно иметь graph view как в ида, но вот чтоб не скакать по всему файлу(из-за адского кол-ва jmp), а чтобы примитивы с кодом+мусором были сразу все на экране по нодам разложены, чтоб красивенько так. В итоге весь код можно восстановить чуть ли не автоматически если ещё и эмулировать и память + сторонние память-аллокаторы если импортируются, но нужен виртуальный процессор. Есть такой(x64)? Потому как переходы между примитивами обычно jmp reg64(нужно высчитывать рантайм) и ещё cheatengine нифига не можеть трейсить эту вм, в конце вываливается на инструкции add [rax],al. Че-то сбивается... именно на мусоре вм... Поэтому спрашиваю, чтобы самому не делать. |
|
Создано: 02 марта 2016 23:30 · Личное сообщение · #13 |
|
Создано: 03 марта 2016 03:33 · Личное сообщение · #14 Electric Wind можешь использовать эмулятор x86_64 от ntldr: https://exelab.ru/f/action=vthread&forum=6&topic=19688&page=0#12 Пример инициализации, выполнения 1-й инструкции (расположенной по адресу instrAddr) и возврата конечного EIP (который будет после выполнения инструкции). bool EmuInit() { emu_stack = (char *) pStack; ZeroMemory(emu_stack, sizeof(pStack)); params.flags = 0; params.limit = 0; params.mode = EMU_MODE_32; params.on_interrupt = win32_int_callback; params.on_resolveip = win32_resolve_ip; params.do_loadmem_8 = win32_loadmem_8; params.do_loadmem16 = win32_loadmem16; params.do_loadmem32 = win32_loadmem32; params.do_loadmem64 = win32_loadmem64; params.do_savemem_8 = win32_savemem_8; params.do_savemem16 = win32_savemem16; params.do_savemem32 = win32_savemem32; params.do_savemem64 = win32_savemem64; params.custom_ops[ID_SYSENTER].new_op = win32_sysenter; ctx.regs_seg.CS = 0x1B; ctx.regs_seg.DS = 0x23; ctx.regs_seg.ES = 0x23; ctx.regs_seg.FS = 0x3B; ctx.regs_seg.GS = 0; ctx.regs_seg.SS = 0x23; ctx.regs_gen.EFL = 0x202; ctx.params = ¶ms; ctx.regs_gen.EAX = 0x12345671; ctx.regs_gen.ECX = 0x12345672; ctx.regs_gen.EDX = 0x12345673; ctx.regs_gen.EBX = 0x12345674; ctx.regs_gen.EBP = 0x12345675; ctx.regs_gen.ESP = u32t(emu_stack + STACK_SIZE/2); ctx.regs_gen.ESI = 0x12345677; ctx.regs_gen.EDI = 0x12345678; return true; } DWORD EmuExecInstr(DWORD instrAddr, struct INSTRUCTION *instr) { ctx.regs_gen.EIP = u32t(instrAddr); ctx.jumped = false; int status = emu_execute(&ctx, instr); return ctx.regs_gen.EIP; } | Сообщение посчитали полезным: Gideon Vi, Electric Wind, 4kusNick, bizkitlimp |
|
Создано: 03 марта 2016 06:15 · Личное сообщение · #15 |
|
Создано: 03 марта 2016 11:05 · Поправил: VodoleY · Личное сообщение · #16 Electric Wind а вы пробовали теорию читать? типа как VMSweeper работает.. (плагин для девиртуализации VMProta).. ток вы так бодро топик подняли.. а то без вас 6 месяцев не обновлялся.. script_kidis да почемуже везде ОН.. просто везде ЕГО просят за 200 рублей снять.. вот поэтому и ОН ЗЫ. не надо бутать распаковку и девиртуализацию. если вмпрот навешен сверху(тырили чужую прогу) то это совсем другая песня Добавлено спустя 14 минут https://exelab.ru/f/action=vthread&forum=13&topic=15906&page=0#1 это для желающих поработать с вмпротом ЗЫЫ.. немного офтопа.. но как по мне очень уместно XXX: Здравствуйте . Игра рассчитана на одноядерный процессор , как сделать , чтобы игра шла на всех ядрах на многоядерном процессоре , а то она грузит только одно ядро и из-за этого плохо идет . Говорят ее как-то Переписывают , если в это так , то как это сделать ? YYY: берем исходный код игры у разработчиков. Анализируем код, пишем новый код с учетом многопоточности. И вуаля всё работает как нужно. XXX: Куда писать этот код , как его списать ? ZZZ: (facepalm) BBB: парень, зря ты сюда зашел) ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: script_kidis, Electric Wind |
|
Создано: 03 марта 2016 13:30 · Личное сообщение · #17 |
|
Создано: 03 марта 2016 13:43 · Поправил: VodoleY · Личное сообщение · #18 DenCoder а никто не говорит что это панацея. вопрос был в понимании принципа. я чудесно пользовался свипером использую от него только распознование примитивов.. чтоб руками их не чистить ЗЫ. а дрова то тут причем? чем это тебе не exe.. один хрен анализ статический. Вообще странные вопросы.. от человека который по рылся в вмпроте ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 03 марта 2016 15:18 · Личное сообщение · #19 VodoleY VodoleY пишет: ЗЫ. а дрова то тут причем? чем это тебе не exe.. один хрен анализ статический. Вообще странные вопросы.. от человека который по рылся в вмпроте Это были не вопросы! А в применении к дровам хочешь сказать, что можно также воспользоваться олькой и свипером? То есть, я правильно понимаю, что твой подход - 1) дёрнул из дрова коды хендлеров, 2) переложил их в exe, 3) под олькой запустил sweeper и дёрнул все по очереди. Так? Если так, то минусы в подходе: 1) возможны привилегированные мусорные инструкции, на что надо писать также и хендлер исключения, в котором корректно обходить такие 2) по времени работа с копипастой кода для 80 примитивов одной вм занимает больше, чем ручное распознание Возможен у тебя подход номер 2 - 1) корректно переделать дров в exe, 2) запустить под олькой со свипером минусы: 1) возможны привилегированные мусорные инструкции, на что надо писать также и хендлер исключения, в котором корректно обходить такие 2) стоит позаботиться как-то запретить все вызовы внешних функций, ибо в дрове, переделанном в exe, они не работают Вариант подхода 2.1 - то же самое, как и в п.2, но составляем свою ленту, чтоб дёрнуть все примитивы по очереди. Минусы: 1) как и выше хм... и кажется, только один минус... но это не так: 2) для некоторых примитивов, работающих с "вм-регистрами" по сути понадобится угадать декодинг заранее, чтоб не писать ещё хендлеров для обработки исключительный ситуаций Ну и главный минус всех подходов в применении к дровам - ГЕМОРНО!!! Принципы вариантов данного подхода - имеем дебаггер, но один хрен анализ статический Почему бы не поменять местами - не имеем дебаггер, но анализ один хрен динамический?! Добавлено спустя 1 минуту Или я не понимаю ваших проблем? ----- IZ.RU |
|
Создано: 03 марта 2016 15:30 · Поправил: srm60171 · Личное сообщение · #20 >>возможны привилегированные мусорные инструкции vmp такое не генерирует, а в софте лично я встречал максимум mov eax, crX; wrmsr; sti; cli; in; out Спец примитив есть только на PushCr0 и PopCr0 Остальное это выход из вм + инструкция + возврат в вм (VMSweeper это вполне нормально обрабатывает) Никакие спец обработчики исключений не нужны, крах - рестарт, Shift + F1 и поехали дальше. Импорт у дрова прибивается, полезли во вне - крах - рестарт и .. Так что дров нормально можно разбирать. Я уж не говорю про написание заглушек функций ядра, с таким удается даже общаться с отлаживаемым драйвером (эмитируя IRP например). |
|
Создано: 03 марта 2016 15:31 · Поправил: DenCoder · Личное сообщение · #21 DenCoder пишет: 2) для некоторых примитивов, работающих с "вм-регистрами" по сути понадобится угадать декодинг заранее, чтоб не писать ещё хендлеров для обработки исключительный ситуаций Не совсем корректно написал... и в теории этот минус можно устранить... Но дело в том, что для всех способов все используемые ленты нужно прогнать, чтоб найти адреса выходов. Это возможно и для дрова, конечно... и вмсвиппер тут остаётся инструментом в руках профессионала. Но это ничем не лучше визуал студии с вмтрейсером, а также без возможностей автоматизации даже в зачатках таковой... Добавлено спустя 9 минут srm60171 пишет: Так что дров нормально можно разбирать. А виндовый дров под ARM? Добавлено спустя 12 минут srm60171 пишет: Я уж не говорю про написание заглушек функций ядра, с таким удается даже общаться с отлаживаемым драйвером (эмитируя IRP например) Ну да, каждый по-своему спец, конечно... но есть ограниченность использования вмсвиппера, что делает его временным инструментом ввиду отсутствия альтернатив. Правда, бывает, что ничто так не постоянно, как временное ----- IZ.RU |
|
Создано: 03 марта 2016 15:44 · Поправил: srm60171 · Личное сообщение · #22 |
|
Создано: 04 марта 2016 09:09 · Личное сообщение · #23 DenCoder пишет: Или я не понимаю ваших проблем? а где я писал что у меня проблемы? Добавлено спустя 10 минут более того.. я вобщем считаю что полный девирт кода (не путать с отдельными кусками кода) это весьма трудоемкий и в 99проц случаев не благодарный труд. Тем более создание утилит полной автоматизации процесса. в тех редких 1 проц. случаев, когда у заказчика позволяет бюджет, или желание размять мозг все сводиться к одному и тому же сценанирю 1. находим главный цикл ВМ 2. декодим таблицу примитивов 3. по желанию строим трассу выполнения, разбирая ленту.. либо в динамике (дебагером) либо в статике.. не суть важно 4. в случае вмпрота.. чешем репу с пермутацией кода .. 5. выдираем ключевое алго, и пишем заказчику.. давай бабало ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... | Сообщение посчитали полезным: Electric Wind |
|
Создано: 04 марта 2016 15:05 · Личное сообщение · #24 VodoleY пишет: чешем репу с пермутацией кода Блин, у меня нет на неё (конкретно, мутацию в вмпроте 2.x) аллергии VodoleY пишет: я вобщем считаю что полный девирт кода... не благодарный труд. Тем более создание утилит полной автоматизации процесса. Никого не переубеждаю! Но решение этой задачи, хоть она и неблагодарная, вполне может принести пользу ) ----- IZ.RU |
Ранг: 419.0 (мудрец), 647thx Активность: 0.46↗0.51 Статус: Участник "Тибериумный реверсинг" |
Создано: 06 марта 2016 10:44 · Личное сообщение · #25 |
|
Создано: 06 марта 2016 10:50 · Личное сообщение · #26 |
|
Создано: 06 марта 2016 12:22 · Личное сообщение · #27 ELF_7719116 пишет: VMSweeper под x64 - миф или реальность? Vamit пишет: Да всё просто, анализ кода, девиртуализация и декомпиляция базируются на полном разборе всех вариантов асм инструкций, в х64 - другие инструкции, следовательно под каждую их них должен быть написан свой обработчик. А среда анализа - это Олька 1.10 со своим асмом и дизасмом, Свипер же не законченная прога, а плагин, который базируется на конкретном SDK под Ольку... вот и весь ответ. |
|
Создано: 06 марта 2016 13:53 · Личное сообщение · #28 На китайском форуме - http://www.52pojie.cn/thread-394179-1-1.html я нашел информацию о скрипте [OllyScript] VMProtect 2.12.3 IAT. Он, судя по размеру в 165.18 KB, достаточно большой, и с многими прибамбасами (если посмотреть выложенные скриншоты). Однако скачать мне его не удалось, поскольку там нужна регистрация на китайском языке. Возможно у кого-либо имеется этот скрипт, или возможность скачать его.. | Сообщение посчитали полезным: Jaa |
|
Создано: 07 марта 2016 18:26 · Личное сообщение · #29 |
|
Создано: 07 марта 2016 22:36 · Личное сообщение · #30 |
|
Создано: 08 марта 2016 00:41 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 ... 14 . 15 . >> |
eXeL@B —› Протекторы —› VMProtect (Туторы, скрипты, плагины, ...) |