Сейчас на форуме: (+9 невидимых) |
![]() |
eXeL@B —› Протекторы —› VMProtect (Туторы, скрипты, плагины, ...) |
<< 1 ... 9 . 10 . 11 . 12 . 13 . 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. ![]() |
|
Создано: 14 сентября 2016 16:01 · Личное сообщение · #2 |
|
Создано: 14 сентября 2016 17:18 · Личное сообщение · #3 zolodei пишет: поставил, происходит ошибка, может галочки, не так поставил? ещё галку на NtSetInformationThread ![]() |
|
Создано: 14 сентября 2016 17:32 · Личное сообщение · #4 |
|
Создано: 20 сентября 2016 01:04 · Личное сообщение · #5 А как поставить "Set memory breakpoint on access" на секцию кода 00401000 в "Memory map" в версий OllyDBG v2.01? И не подскажите, как сделать, чтоб в "Memory map OllyDBG v2.01" секций отображались как в "Memory map OllyDBG v1.10"? ![]() ![]() |
|
Создано: 20 сентября 2016 21:14 · Личное сообщение · #6 ///offtop/// интересно если какое либо онлайн П0 будет снабжено adware модулем по сбору инф.и отправке на сервер автора П0 в режиме демо но при покупке в режиме фул этот модуль будет отключён,далее данную поделку накроют вм и отправят на vtotal то работникам АВ компаний придётся изучить данный софт и выдвинуть вердикт через минут 5 мы увидим результат,я предпологаю его оставят как полезное ПО и не станут разворачивать и глядеть что в нутри потому что нет времяни на всё это прав ли я или нет? ![]() |
|
Создано: 21 сентября 2016 00:44 · Личное сообщение · #7 script_kidis пишет: прав ли я или нет? Не прав ----- Research For Food ![]() |
|
Создано: 21 сентября 2016 03:40 · Личное сообщение · #8 script_kidis, на первичной проверке уйдёт, как adware downloader, т.к. подозрительная активность на лицо. Копаться в вм для этого не нужно. ![]() |
|
Создано: 21 сентября 2016 04:22 · Личное сообщение · #9 |
|
Создано: 28 октября 2016 07:47 · Личное сообщение · #10 модуль проги, (dll), залочен vmp (файл1), унпакер выкинул два файла (DLLLoader.exe) и (ххх.clm.module), прога и модуль работают только с S..SEL.ck, как определить кто из этих двух просит ключег? если лоадер то чем прикрутить другой лоад к модулю? лоадер есть, почему унпакер разрезал длл? ![]() ![]() |
|
Создано: 28 октября 2016 12:29 · Личное сообщение · #11 |
|
Создано: 28 октября 2016 18:12 · Личное сообщение · #12 Подкидываю модуль в прошу предыдущих версию без сенса ключ просит модуль, а так как модуль разделился на лоадер и подпрограмму и возникает вопрос кто из них. Есть базовые модули из прошлой версии проги без сенса, унпакуются так же на две части, чем срастить лоадер из баз версии с подпрогр с новой? Чтоб целое получилось? ![]() |
|
Создано: 14 ноября 2016 02:57 · Поправил: alexcoder1 · Личное сообщение · #13 Привет всем! Оказывается на днях поломал VMProtect. Сделал это, конечно, через одно место, сначала сделал, а затем разбирался что же такое ломал. Заранее прошу прощения если мои методы покажутся топорными. Начну изложение. Исследование пациента и поиск OEP. Распаковка секций программы происходит внутри виртуальной машины ее байт-кодом. В момент когда искал OEP, я этого еще не понимал, думал просто жуткая обфускация. Поэтому поступил следующим способом. В OllyDbg поставил условные аппаратные бряки на версии GetModuleHandle(Ex,A,W) (в Olly 2.01). В условии указал [esp]>=401000&&[esp]<4d0000, остановка по условию. Бряк произошел на функции GetModuleHandleW. Вышел из функции и вуаля, я где-то в начале кода программы. Задампил процесс, загрузил дамп в IDA, текущий EIP использовал пока что в качестве OEP. В IDA при помощи перекрестных ссылок нашел вызов функции, из которой вызывается GetModuleHandleW, это и оказалось начало программы с настоящей EP. Зная OEP, поставил на него аппаратный бряк при следующем запуске Olly и я на месте. Теперь еще раз сделал дамп, но уже с настоящей OEP и загрузил его в IDA. На этот раз код раскрасился как новогодняя елка – определились сигнатуры Delphi, а после применения FLIRT определилось почти все. Передо мной не стояла задача снятия протектора, нужно было исследовать метод генерации кода. Поэтому импорт не восстанавливал и не получал рабочую версию программы, хотя с восстановлением импорта были бы проблемы. Протектор (я пока еще не знал какой) заменяет все вызовы API на ближние вызовы в свою секцию, где пропускает их через свою обфускационную матрицу, в которой заново формирует стек для вызова и уже потом вызывает функцию API. Я не придумал ничего лучше чем залогировать все вызовы API по библиотекам. Для этого определяется список статически импортируемых модулей (на момент загрузки программы). Для каждого модуля для конкретной ОС определяются импортируемые функции. То есть, если программа исследуется на 7ке, то и адреса функций нужно получать на 7ке. Я применил DependencyWalker. Открываем в нем исследуемую программу, и по очереди переходим к каждой импортируемой библиотеке. В окне экспортируемых функций библиотеки выделяем их все, нажимаем Ctrl+A, Ctrl+C, создаем текстовый файл с именем этой библиотеки обязательно в формате kernel32.dll.txt, user32.dll.txt и т.д. и в эти файлы заносим имена соответствующих функций этих библиотек. Далее все эти имена нужно преобразовать в списки точек останова для Olly Breakpoint Manager v0.1. Все эти txt файлы должны находиться в одной папке. Я написал программу (просьба не пинать за ужасный стиль программирования, быдлокодер из меня знатный), исходник в файле kernel.cpp, обычное Win32 приложение. Она по очереди открывает все txt файлы в своей папке, построчно читает из них имена функций, ищет эту функцию в dll с именем до .txt и преобразовывает найденный адрес в точку останова для Olly Breakpoint Manager v0.1. То есть например был файл kernel32.dll.txt с содержимым: Code:
… Получили kernel32.dll.obp: Code:
… Нужно только ввести букву, которой кодируются флаги Pause program (never, on condition, always), log expression, log arguments, как они кодируются можно почитать в описании к плагину. Каждый бит отвечает за какой-то переключатель, эти биты складываются в байт и ASCII-символ этого байта и передается программе Для чего служат параметры, указанные через двоеточия, строки останова также можно также ознакомиться в описании плагина. Условие [ESP]<40000000 необходимо поскольку без него логирутся вызовы всех функций, даже когда они вызываю друг друга из разных системных библиотек, это сильно замедляет программу и усложняет анализ. Одна беда: Olly Breakpoint Manager v0.1 по умолчанию не позволяет ставить условия на точки останова! Поэтому пришлось его модифицировать, чтобы понимал. Но сделал только на половину – на чтение из файла (такое я ленивое существо). Данный плагин идет с исходниками, нужно только заменить модифицированный файл olly_bp_man.c. Кстати, Olly Breakpoint Manager я тестировал под Olly 1.10. Итак, когда плагин скомпилирован и подключен, сформированы все obp файлы, загружаем в olly исследуемую программу, и по очереди загружаем в плагин obp-файлы (все сразу не советую, слишком замедляется программа, может сработать защита по времени исполнения). Переходим в Log, перенаправляем его в файл, я использовал kernel32.txt для функций kernel32.dll и так далее, и запускаем программу. В результате получаем примерно следующий лог: Code:
При помощи регулярных выражений отделяем название функции и адрес ее вызова и в IDA вручную меняем их. Их, кстати, получилось не более двух сотен разных на все библиотеки. Теоретически после этого шага можно восстанавливать импорт, но я не стал. Когда определены сигнатуры функций Delphi при помощи FLIRT и вызовы WinAPI, я начал искать вычисление кода. Flirt даже определил метод Click кнопки регистрации, я поставил бряк на метод @Controls@TControl@GetText$qqrv, определенный им же. И вот тут то меня ждал сюрпайз. После получения введенного кода управление передавалось на нечто жутко обфусцированное и непонятное. После нескольких попыток протрассировать это вручную стал думать. В результате использовал инструмент Trace into из olly 2. Трассировал с аппаратными бряками. Проверка кода заняла более 300K инструкций x86! Начал изучать эти логи. Сначала пытался удалить незначащие инструкции и разобраться с алгоритмом, обнаружил что они часто повторяются, даже писал программу, которая удаляет строки из лога с EIP незначащих команд (эта программа промежуточное звено, потом она выпадает, и становится ненужной). Это немного сократило код и позволило найти общие закономерности, в частности начало каждой виртуальной команды. Затем начал разбирать что же делают эти команды. Оказалось виртуалка – это стековая машина по типу сопроцессора. Кроме стека есть область памяти, которую я назвал блоком регистров, состоящая из 16ти 32-х битных ячеек памяти. Все это хозяйство организовано в реальном стеке программы. На вершину стека виртуалки всегда указывает EBP. ESI играет роль EIP виртуальной машины. (Нет никакой гарантии, что в другой программе назначение регистров останется таким же). Основные команды: положить в стек числа разной разрядности, извлечь, косвенно положить (по адресу из вершины), косвенно извлечь (адрес в памяти и извлекаемое значение на вершине стека). Основными математико-логическими операциями являются NAND (Not-And) и ADD. Есть еще умножение, деление. Математические и логические операции могут производиться над 32-х битными целыми и 16-ти битными (я их назвал half). После каждой математической или логической операции кроме результата в стек записываются и флаги процессора. Практически всегда они извлекаются из стека в блок регистров и затем затираются, но при проверке условия как раз при помощи флагов и формируется адрес перехода. Условных переходов нет, есть только безусловный переход на адрес из вершины стека, а этот адрес уже формируется по флагам операций. Таким образом мне удалось вычислить для каждой виртуальной команды адреса eip ее реальных команд. В среднем на одну виртуальную команду приходится 60-100 реальных. Поэтому написал программу, которая заменяет блоки реальных команд на виртуальные, она находится в файле module1.vb, и которая для всех команд вытаскивает из текста их реальные операнды и результаты работы команд. Также кроме непосредственной замены сделал небольшую оптимизацию: после всех математических команд удалял извлечение флагов и помечал куда извлекается в комментарии математической/логической команды и явно пустые команды помечал в начале знаком #(на всякий случай не удалял). В результате получился подобный листинг: Code:
![]() |
|
Создано: 14 ноября 2016 02:59 · Поправил: alexcoder1 · Личное сообщение · #14 Code:
В команде указан ее адрес (ESI), удобно ставить аппаратный бряк на доступ к этой ячейки и опа – мы остановились в нужном месте. PUSH/POP/ADD/NOTAND/SHL/SHR/DIV/MUL… понятно из названия. Суффикс M – команда работает с локальной памятью (блок регистров) или в команде или в комментариях указан адрес регистра Суффикс I (PUSHI) – записать в стек непосредственное значение, хранится в самой команде Суффикс HALF – команда работает с половинным (16 бит) числом. Суффикс T или никакого – команда работает с 32-х битным числом. Суффикс INDIRECT – откуда загружать или куда выталкивать значение находится в вершине стека (а уже в команде или комментарии указано что, откуда и куда) Суффикс BYTE – команда работает с байтом (но в стеке или блоке регистров он все равно будет занимать 2 байта, а использоваться только один). Полный список команд можно посмотреть в module1.vb. Каждый регексп в начале – это команда. Но для другой программы эти данные нужно будет получать заново, поскольку адреса реальных команд будут другими, мусорные команды также будут другими. Таким образом список из 300000+ команд превратился всего в несколько тысяч, которые уже можно исследовать. Еще полезной функцией может оказаться логирование всех команд без операндов. Этот способ хуже поддается анализу, но он намного быстрее. Заключается в следующем. У меня, к примеру каждая команда начинается кодом, в котором производится выборка и декодирование: Code:
Далее за retn 44 выполняется сама команда. Эта команда имеет всегда один адрес. На него во втором Olly можно поставить аппаратный бряк с экспрешном типа: _CMD=[ESP], _ESI=ESI,_EBP=EBP,S1=[EBP],S2=[EBP+4],S3=[EBP+8],S4=[EBP+0C] Получается лог: Code:
А затем при помощи fnames.vb получается лог вида Code:
Числа в стеке в перевернутом виде как они находятся в памяти. Такой метод у меня позволил одним махом вычислить в каких участках программы используется виртуализация. Вспомогательные программы писались на vb.net и Си. Приношу свои извинения за сумбурность изложения и быдлокод. Добавлено спустя 1 минуту Что-то не вижу аттача с файлами, еще раз прикрепляю ![]() ![]() |
|
Создано: 14 ноября 2016 10:35 · Личное сообщение · #15 |
|
Создано: 24 ноября 2016 02:47 · Поправил: djdram · Личное сообщение · #16 наткнулся на 64 разрядное приложение накрыто VMP помниться игрался с olly и скриптом от LCF-AT а тут кинулся а olly та уже не та ) 64 разрядные не хочет... судя по всему стоит проверка на отладчик, приложение консольное на C++ Detect-It-Easy https://yadi.sk/i/mV2qr4cQzLTat Отладчик https://yadi.sk/i/mMQBMQGVzLTmj Само приложение https://yadi.sk/d/P8Tyza-NzLUmW есть возможность у кого нибудь глянуть может по горячим следам кто что вспомнит как снять, или уходить в чтиво из поста выше по 64 разрядным я так понимаю пока не много инфы.. ![]() |
|
Создано: 24 ноября 2016 08:16 · Личное сообщение · #17 djdram пишет: Само приложение 29/56 детектов на вирустотале. Zcash miner накрыли вмпротом? o_O djdram пишет: 64 разрядным я так понимаю пока не много инфы.. в паблике вроде нету по декомпиляции 64 битного вмпрота, а самому что-то такое пилить - лень до неприличия. Приходится работать напрямую, без снятия, как в игрушках с денувой. С денувой в качестве антидебага для х64дбг помогает scylla hide, и titanhide (+ тулза для отключения патчгварда). ![]() |
|
Создано: 15 декабря 2016 19:42 · Личное сообщение · #18 Приведенный Djeck'ом на стр. 5 в пакете VMProtect_Inline пример запакованного анпакми Unpackme_vmp.exe ловит у меня в системе WinXP отладчик уровня ядра и требует его выгрузить. Вопрос: а что это такое и как это сделать? Когда я отключил в примере обнаружение отладчика, анпакми распаковался автоматически скриптом от LCF-AT и в WinXP, где распаковывался, запускается без разговоров, а на Win7 выдаёт строчку с access violation, но дальше работает: идёт видео и музыка! ![]() |
|
Создано: 15 декабря 2016 19:53 · Личное сообщение · #19 ksol пишет: скриптом от LCF-AT и в WinXP, где распаковывался, запускается без разговоров, а на Win7 выдаёт строчку с access violation скрирь LCF-AT многого не учитывает ----- IZ.RU ![]() |
|
Создано: 15 декабря 2016 20:15 · Личное сообщение · #20 |
|
Создано: 16 декабря 2016 00:43 · Личное сообщение · #21 |
|
Создано: 16 декабря 2016 19:36 · Личное сообщение · #22 Попытался поправить IAT, но всё не просто! Скрипт находит ОЕР=46D008, а в конце своей работы перенастраивает программу на новую ОЕР=ЕЕ13А0 в созданную им секцию. В туторе Djeck загоняет в Scylla 1-ю ОЕР. Изменение в заголовке PE header адрес ЕР хотя и останавливает в OllyDbg на нужном адресе, но ведёт к АВОСТу. -------------------------------------- DenCoder пишет: делайте с вашим файлом что хотите Ваше сообщение требует ещё распаковки! ![]() |
|
Создано: 21 декабря 2016 14:46 · Поправил: Chris · Личное сообщение · #23 ksol пишет: скриптом от LCF-AT и в WinXP, где распаковывался, запускается без разговоров, а на Win7 выдаёт строчку с access violation Это одна из распространённых проблем работы скрипта. Сама LCF-AT на такой же вопрос отвечает так: "so unpacked VMP files can make trouble to run them on other OS.Problems for this can be any wrong found & fixed APIs (can happen if random 4 byte opcode are same as a API does use).Lets say the XP opcode of GetModuleHandle API was found somewhere then this location gets fixed by script and filled by reading and settings imports which are same on your Unpack OS if dll was also loaded with same base.If you now run it on other OS then the location gets also filled with actually system address of GetModuleHandle API which is a other address = other opcodes but if this location is really no API location and VMP does access this location then you get a problem.But this just happens rarly but could be one reason which you can keep in your mind. If you the script does ask you about the OEP rebuild then do this at the OEP address or at the end of the resource section (if used) before it does jump to OEP.Remember that you have to find the right OEP address if the script didn't find it (check videos again).So you also don't need to dump or fix your target so the script does this already. The last part about CPUID etc you need to check by yourself if you do test your dump on other OS / Systemconfiguration.If such checks are used then you need to find the right check locations and patch them with the datas you got at same address on your unpack OS." ![]() |
|
Создано: 23 декабря 2016 18:10 · Личное сообщение · #24 |
|
Создано: 11 января 2017 18:29 · Личное сообщение · #25 ===== Найти украденные байты ==== LCF-AT в туторе VMProtect Ultra Unpacker рассматривает анпакми VMProtect 1.70.4 . Запустив свой скрипт, анпакми выходит на инструкцию вблизи ОЕР. Скрипт сообщает, что байты вблизи ОЕР украдены. Автор по стеку, и ещё по чему-то, о чём он не говорит, ухитряется найти их, но как он это сделал - не показывает, лишь приводит результат. Видно, он как-то восстановил их ассемблерный код - это самый главный момент! А дальше более или менее понятно: компилирование, вставил в свободное место и передал им управление. Может кто знает и скажет какая здесь стратегия поиска?! ![]() |
|
Создано: 29 января 2017 00:51 · Личное сообщение · #26 Нужна помощь ! Попалась на днях прога, накрытая VMпротом. Нормально сдампилась, OEP неукраден, IAT виртуализирован, но ручками прекрасно восстановился. Остались кое-какие функции виртуализированными. Попробовал натравить на это дело VMSweeper 1.5, но декомпилятор вылетает на простых инструкциях типа CMOVx, CWD, SCAS, AAD, XLAT и других ![]() Может кто подскажет другой декомпилятор под этот прот и желательно под 2-ю ольку(она более удобна в работе, по-моему) ![]() |
|
Создано: 29 января 2017 01:22 · Личное сообщение · #27 |
|
Создано: 29 января 2017 01:36 · Личное сообщение · #28 |
|
Создано: 29 января 2017 05:56 · Личное сообщение · #29 LazyCat пишет: Vamit больше не развивает свой продукт в топе по VMSweeper было указано, что: Vamit пишет: WMSweeper доведен до релиза 2.0, успех полной декомпиляции вмпрота с созданием исходного кода составляет более 90%. *скип* Новой версии Свипера в свободном доступе по определенным причинам не будет но если кому-то что-то потребуется декомпильнуть - обращайтесь. Vamit пишет: Так, по просьбам на декомпиляцию, чтобы не тратить ни мое ни ваше время: 1. выкладываем только нужный файл и либы для него, если такие имееются, ссылки на полный софт мне не нужны и инсталлировать его я всё равно не буду 2. сообщаем ОЕП и адреса декомпилируемых фунок, искать всё это в проге я тоже не буду 3. оказываю помощь только в декомпиляции фунок и предоставляю их исходный код, всё остальное дело ваших рук и головы 4. будьте готовы на скромное вознаграждение 5. если не предоставлена нужная информация, то реагировать на такие запросы так же не буду Vamit пишет: Наконец-то появилось время и реальная необходимость заняться новыми версиями вмпротекта. Начиная с версии 3.0 вмпрот имеет новую безцикловую вм. Изменения настолько серьезны что нужно писать новый анализатор вм до промкода. ![]() |
|
Создано: 04 февраля 2017 15:57 · Поправил: Haoose-GP · Личное сообщение · #30 [ По просьбам трудящихся удалено... =( ] Vamit Зачем протектор распространять в форуме протекторов? Хм... ![]() |
|
Создано: 04 февраля 2017 17:03 · Личное сообщение · #31 Haoose-GP И зачем же здесь протекторы распространять ![]() ----- Everything is relative... ![]() |
<< 1 ... 9 . 10 . 11 . 12 . 13 . 14 . 15 . >> |
![]() |
eXeL@B —› Протекторы —› VMProtect (Туторы, скрипты, плагины, ...) |