Сейчас на форуме: (+5 невидимых) |
eXeL@B —› Протекторы —› VMProtect 3.2: запуcтить приложение и остановить его на указанном адресе |
<< . 1 . 2 . 3 . |
Посл.ответ | Сообщение |
|
Создано: 22 ноября 2018 10:47 · Личное сообщение · #1 Доступ к оригинальному коду приложения защищенного любым протектором до недавнего времени выполнялся довольно просто - любой дебагер с защитой от антидебага и далее дело техники, поиск ОЕП, бряк и дамп. Сейчас же протекторы сделали шаг вперед и вся защита от антидебага уже не действует. Конкретный пример, вмпрот версии 3.2 + x64dbg + ScillaHide дает отрицательный результат что при прямом старте, что при аттаче. Драйверный же TitanHide на Windows 10 вообще не удается установить. Пока найдено такое решение вопроса - запуск приложения, дамп его процесса, загрузка в дебаг/дизасм и реверс кода. Довольно хорошая утилитка для этого имеется, например Была тут одна интересная тема от Инде по поиску ЕП, но он её закрыл. В принципе, я думаю, эту задачу его визору решить по силам, только нужно изменить формулировку, не искать ОЕП, т.к. в общем случае её может и не быть, а довести приложение до заданного адреса. ----- Everything is relative... |
|
Создано: 06 декабря 2018 23:19 · Личное сообщение · #2 |
|
Создано: 06 декабря 2018 23:40 · Поправил: difexacaw · Личное сообщение · #3 gggeorggge Спасибо. Я имел ввиду иное. Такой кусок можно и отладчиком выдрать. Как оно работает в целом, в реальном времени и есчо скажите, не важны нюансы, но оно под данной тулзой доходит до запуска, тоесть пин проходит слой пакера ? Добавлено спустя 16 минут Vamit Если оно работает, то можно свернуть. ----- vx |
|
Создано: 07 декабря 2018 00:12 · Личное сообщение · #4 Vamit пишет: То что ты писал - это частично и сидит оно далеко и глубоко, после микст кода, и это далеко ещё не всё, а разбирать код в середине вм не зная ни истинных регистров, ни инструкций способны только мозахисты Ну да в небо ткнул и угадал........ только почему-то с начала года все ипутся и не могут победить антиотладку как только дерматолаг засунул сиськи под вм, а что там смотреть антидамп, проверку целостности, детект виртуал боксов? так там ничего нового...... ----- Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли. |
|
Создано: 07 декабря 2018 00:32 · Поправил: difexacaw · Личное сообщение · #5 |
|
Создано: 07 декабря 2018 01:50 · Личное сообщение · #6 |
|
Создано: 07 декабря 2018 07:14 · Поправил: gggeorggge · Личное сообщение · #7 Vamit пишет: Да вы чего, по таким трассам изучать защиту, 55 * 5078 ~= 280тыс инструкций говна, из них будет чистого кода порядка 1000 инструкций. Это просто пример полной трассировки, никто не мешает превратить это в компактный трейс. Вот в такой например: opcode 0x5f12c8 0x604fcb Read 0 = *(UINT32*)0012FBA4 0 Write *(UINT32*)0012FAE8 = 0 opcode 0x5e6c0c 0x604fc6 Read 0x12ff98 = *(UINT32*)0012FBA8 0 Write *(UINT32*)0012FB04 = 0x12ff98 opcode 0x5ef943 0x604fc1 Read 0x400000 = *(UINT32*)0012FBAC 0 Write *(UINT32*)0012FAFC = 0x400000 opcode 0x5f1ea6 0x604fbc Read 0x7c809bd7 = *(UINT32*)0012FBB0 0 Write *(UINT32*)0012FB20 = 0x7c809bd7 |
|
Создано: 07 декабря 2018 07:54 · Поправил: plutos · Личное сообщение · #8 difexacaw пишет: Антидамп"(анклав, подмена данных через их выборку) пожалуйста обьясните, что означает термин "анклав" в данном контексте и откуда он взялся, а то я уже совсем запутался. В общепринятом смысле "анклав" - это территория одного государства, полностью окруженная территорией другого. Разнобой в терминологии ведет к непониманию и недоразyмениям. ----- Give me a HANDLE and I will move the Earth. |
|
Создано: 07 декабря 2018 08:46 · Поправил: difexacaw · Личное сообщение · #9 plutos Есть 4-ре публикации на васме. Суть в том, что память(те данные в ней) существует лишь при её выборке(data fetch). Выборка может быть отслежена и изменена на уровне потока инструкций. Тогда выборка изменяется и таким образом реализуется софтверный анклав. Это не существующая область памяти, либо обычно иная, нежели та, которая адресуется. А так как виртуальный" блок формируется при самой выборке, то никаким образом его нельзя прочитать без выборки в том же режиме. Примеров было достаточно. Добавлено спустя 40 минут plutos Были обсуждения про не ясное описание. Если углубиться в тех. детали, то это работает следующим образом. Адресная трансляция выполняется на уровне декодера инструкций, у неё есть формат - modrm. Адрес кодируется в самой инструкции. Любой тулз, который орабатывает поток инструкций(те каждую) использует адресный декодер. Это вм или например отладчик не важно - на основе опкода(точнее формата) формируется эффективный адрес. Далее если изменить какую то часть адресной компоненты, то линейный адрес меняется. К примеру очень давно был мотор, который смещал адреса через сегментацию, используя LDT. Адресная компонента может измяться двумя путями - по контексту или по кодировке инструкции. В первом случае для реализации нужен эмулятор, так как адресный регистр может быть приёмником данных(reader), нп: add r,[r]. Во втором случае изменяется поле modrm в инструкции, добавляется адресное смещение. Тогда первой проблемы нет, а обращение происходит в заданную память. В случае защиты памяти от чтения адрес смещается на временный буфер, в который дешифруется читаемый блок. Именно это всё я имел ввиду, говоря про вм. Так как у вм есть адресный декодер. Она может быть элементарно изменена для реализации анклавов. Но и проблемы там есть, которые не резолвятся для области с указателями, те в целом пе так нельзя обработать по простому. ----- vx | Сообщение посчитали полезным: plutos |
|
Создано: 07 декабря 2018 09:50 · Поправил: Vamit · Личное сообщение · #10 никто не мешает превратить это в компактный трейс Да, упростить конечно можно всё, что упрощаемо, но только дело в другом, любой трейс не покрывает весь код, а если он ещё и системозависим, то на каждой операционке будет свой трейс. Исходный код нелинейной функции из трейса никогда не получить. ----- Everything is relative... |
|
Создано: 07 декабря 2018 09:58 · Личное сообщение · #11 |
|
Создано: 07 декабря 2018 12:32 · Личное сообщение · #12 |
|
Создано: 07 декабря 2018 15:07 · Поправил: difexacaw · Личное сообщение · #13 |
|
Создано: 07 декабря 2018 15:54 · Поправил: Vamit · Личное сообщение · #14 difexacaw Да вот оно ----- Everything is relative... |
|
Создано: 07 декабря 2018 16:45 · Поправил: difexacaw · Личное сообщение · #15 |
|
Создано: 07 декабря 2018 17:01 · Личное сообщение · #16 |
|
Создано: 07 декабря 2018 17:07 · Личное сообщение · #17 |
|
Создано: 07 декабря 2018 21:25 · Поправил: Vamit · Личное сообщение · #18 Вот извращенцы, они взяли функу с вызовом sysenter добавили к ней обработку аргументов, микст код (что он делает ещё не разобрал), оформили всё это отдельным примитивом, его завиртуализовали и всунули в ленту пикода вызывающей вм. Получилась двухуровневая вм. Добавлено спустя 12 минут Вот оно тельце этого примитива Code:
----- Everything is relative... |
|
Создано: 07 декабря 2018 22:01 · Поправил: difexacaw · Личное сообщение · #19 |
|
Создано: 07 декабря 2018 22:20 · Поправил: Vamit · Личное сообщение · #20 difexacaw Что за ерунду ты пишешь, call 0x015835B1 и call far 0x33:0x01D043F4 никак не связаны и находятся в разных ветках исполнения, а внутри этого вызова call far 0x33:0x01D043F4 входят в х64 код и выходят из него там же. Вот только декомпильнуть его не могу, там все под вм, а свипер х64 код не декомпилит. Добавлено спустя 21 минуту Вот он в микст коде вход 64х разрядную вм Code:
А инструменты под х64 у меня ещё не написаны, нет ни деобфускатора, ни декомпилятора((… Ладно, пока будем разбираться без этого, ещё условие выбора есть (а от чего оно зависит пока не ясно) или через sysenter идет или через микст код. ----- Everything is relative... |
|
Создано: 08 декабря 2018 00:15 · Личное сообщение · #21 |
|
Создано: 08 декабря 2018 05:11 · Личное сообщение · #22 |
|
Создано: 08 декабря 2018 10:00 · Личное сообщение · #23 Добавил в тело примитива комментарии (пост #18) для лучшего понимания Видимо, зависит от проверки, работает на WOW64, тогда можно делать переход в x64 и там вызов, либо на нативной x86, тогда вызов напрямую. Полностью согласен, в микст коде должна быть та же часть что и приведенная ниже в х86 коде, аргументы же в стеке вм общие. ----- Everything is relative... |
|
Создано: 14 декабря 2018 18:08 · Личное сообщение · #24 Вот тут Можно его грузить хоть в Ида, хоть в любой другой дебагер, изучать код и вырабатывать противодействие антиотладке. В общем делайте с ним всё что хотите, только прошу о разобранных и изученных функах сообщать в тему. Код должен быть рабочим, но Свипер не идеален, т.ч. могут встречаться ошибки, о них так же прошу сообщать. ----- Everything is relative... | Сообщение посчитали полезным: ClockMan, v00doo, plutos |
|
Создано: 16 декабря 2018 01:44 · Личное сообщение · #25 вопрос наверное наивный, но все же лучше спросить, чем жить в заблуждении, ведь за спрос не бьют в нос. Этот file ProtectVmp32.exe это результат работы Свипера над другим файлом, который в свою очередь был подвергнут VMProtect? Я правильно понимаю? Если "да", то можно выложить тот самый первоначальный файлик? Хотелось бы самому проследить всю цепочку преобразований, так до меня легче доходит. А если "нет", то пожалуйста, поправте! ----- Give me a HANDLE and I will move the Earth. |
|
Создано: 16 декабря 2018 02:27 · Личное сообщение · #26 plutos Да, это exe одной реальной проги, глянь в свойства файла, увидишь название. На семёрке не взлетает на SYSENTER ----- Research For Food | Сообщение посчитали полезным: plutos |
|
Создано: 16 декабря 2018 10:49 · Поправил: Vamit · Личное сообщение · #27 это результат работы Свипера над другим файлом, который в свою очередь был подвергнут VMProtect? Я правильно понимаю? Неправильно, это первоначальный файл, защищенный вмпротом 3.2, с добавленной секцией в которой весь восстановленный код вплоть до ОЕП. ЕП файла осталась оригинальная, первый вход в вм заменен на jmp в восстановленный код, все ссылки на данные реальны, они обработке не подвергались и расположены на своих местах. На семёрке не взлетает на SYSENTER Да, тут есть пара ошибок, эту функу из виртуализованного примитива добавлял вручную, короче нужно первый аргумент из стека выгружать в eax, и сдвигать стек на +8, примерно вот так Code:
Но на Вин10 sysenter не работает, для неё тестируется другое решение. Добавлено спустя 1 час 18 минут При изучении защиты можно использовать наработки Добавлено спустя 1 час 49 минут Может кто знает, что означает старшее слово для syscall вызовов Code:
по маске 0x7FFF находится номер системного вызова, флаг 0x8000 определяет режим, если установлен то вызов через микст код syscall для Wow64 систем, если сброшен, то вызов через sysenter, а вот старшее слово для Wow64 систем мне неизвестно. Добавлено спустя 7 часов 35 минут Вот рабочее решение для syscall и sysenter одном пакете для любой операционки, кому нужно можете изменить код в файле Code:
----- Everything is relative... | Сообщение посчитали полезным: daFix |
|
Создано: 17 декабря 2018 11:13 · Поправил: Vamit · Личное сообщение · #28 Первая проверка на Вин10, которая ловит дебагер Code:
при наличии дебагера NtQueryInformationProcess возвращает 0, при его отсутствии 0xC0000353 -STATUS_PORT_NOT_SET Добавлено спустя 22 минуты Вторая проверка отключает отладчик от исследуемого процесса Code:
Добавлено спустя 1 час 45 минут Восстановленная функция 02838DC0 VmpUnpackSection не работает, вместо неё нужно вызывать оригинальную функу по адресу 01CF9BBA Добавлено спустя 2 часа 7 минут Следующая проверка, которая ловит дебагер, вызывается после распаковки кода секций Code:
----- Everything is relative... | Сообщение посчитали полезным: HandMill, mak, plutos |
|
Создано: 17 декабря 2018 20:51 · Личное сообщение · #29 Code:
А дебагер эту сэпшн не ловит ли сам? И не совсем понятно как это робит. В TF 0 или 1 (без и с трэйсом) OR'им с V86FLAGS_TRACE (1) и получаем 1, popf, на rdtsc должно single step exception, её ловит дбг не уходя в __except. Или не ловит? Меня б насторожило шо софт сэпшны ставит... или оно там с кучой мусора, мол на сэпшн, ройся? Обход вроде у Скиллы норм, передавай singlestep сэпшн софту (он тогда идёт в свой __except) и пряч DRx, так? |
|
Создано: 17 декабря 2018 21:15 · Поправил: difexacaw · Личное сообщение · #30 hash87szf Ну а что тут не понятно, устанавливается TF и в ловушке проверяется дебаг контекст. Так как в ловушке никаких проверок нет, то способ вызова исключения значения не имеет. Рассчитано(#DB) на то, что отладчик сам обработает трап, тем самым не передав управление для обработки ловушки. push/pop это морф/макро, нужно что бы сохранить часть контекста, но при этом установить флажок(TF). Иначе было бы push 0x100/popfd. > пряч DRx А как он их спрячет, если не может мониторить сервисный шлюз(так как он судя по всему перемещён в памяти), те сервисный запрос контекста, нп NtGetContextThread Добавлено спустя 19 минут Vamit Что же вы копаетесь в такой мелочи, в штатных способах детекта отладчика, это ведь плагины делают А что бы вы делали если бы был допустим замер дельты по системному таймингу, те например вызываем ловушку и прерывание, затем измеряем время обработки и их отношение. Результат будет однозначный - дельта в сотни/тысячи крат, при этом без вызова нтапи ----- vx |
|
Создано: 17 декабря 2018 22:59 · Личное сообщение · #31 |
<< . 1 . 2 . 3 . |
eXeL@B —› Протекторы —› VMProtect 3.2: запуcтить приложение и остановить его на указанном адресе |