Антиотладка Vmprotect

instw0

Новичок
Сообщения
38
Реакции
1
Всем привет! Попробовал потрассировать последний vmprotect в x64dbg с модулем TitanHide... Отладчик уходит в какой то бесконечный цикл, есть какие то технологии или инструменты этот победить?

Антиотладка Vmprotect - Оффтоп
 

Sp1n

Мудрец
Сообщения
177
Реакции
96
Vamit

Не опциями, а системно. Запрос времени будет возвращать номер запроса, а не время. Это если таймеры источник rnd. То есть получится два клона апп.

- isa: tsc, cpuid
- сервисное время.

Это что просто детектить и эмулить.

PID etc тоже можно заменить, адр прост. клонировать, отключить ядерный рандом.
 
Последнее редактирование:

not_srd17

Новичок
Сообщения
81
Реакции
52
Vamit

Не опциями, а системно. Запрос времени будет возвращать номер запроса, а не время. Это если таймеры источник rnd. То есть получится два клона апп.

- isa: tsc, cpuid
- сервисное время.

Это что просто детектить и эмулить.

PID etc тоже можно заменить, адр прост. клонировать, отключить ядерный рандом.
Рандом может базироваться на обычных констанах с сидом, внутри виртуалки. Каждый билд "скомпилированный" через VMP - имеет уникальный набор констант и ключей.

Два клона у тебя никогда не получаться, что уж говорить, в каждом билде рандомизированно всё. Начиная с констант для крипта/декрипта, и заканчивая положением регистров.
 

DX0

Новичок
Сообщения
414
Реакции
85
Покопался в логах, короче засада. Это походу не решаемая задача без наглядного графа, прикинул как его реализовать.

На том семпле сыпет 11к pushf, найти нужный пока нереал, это если проверка идет через флаги.

Посмотрел ввод данных:
Посмотреть вложение 1391

- ожидаемо идет линейная выборка p-code с ветвлениями в нем. Откинул последние два десятка страниц с лин. выборкой(справа). Так тоже ничего не выйдет.

Такого рода задачи, где нет датасета нечем решать :(

Про рандом так никто не ответил, есть ли смысл попытаться отключить?
Можно искать еще таким способом:
1) Найти все pushfd
2) Прочитать состояние флагов
4) Пробежатся по коду и найти все call-ы и jmp-ы, потом отсеить повторяющие call-ы и jmp-ы(можно обойтись и без этого, хотя нужно, так ты исключишь множество повторении)
5) Зависти счетчик для каждого pushfd и считать сколько раз он вызывается на каждом участке кода
6) И искать флаги в тех местах, где меньше все он вызывался определив это по счетчику
Ну, соответственно нужно написать свой отладчик, чтобы читать флаги и ставить бряки на каждом pushfd

Можно счетчик сделать при помощи бряков, это если не использовать call, jmp.

Если call r32 такие, и jmp r32 , то на них можно тоже поставить бряки и ловить все адреса на которые прыгает и вызывает.

Если это протектор, то может стоять защита на целостность кода, тогда тебе нужно будет читать постояно все регистры чтобы определить адрес участка памяти, который читает CRC калькулятор и стирать бряк в том месте, где он читает, потом ставить обратно.
Проблема только в том, что это очень медленно, но работает.
Логично, зачем сталобыть программе читать свой код, значит это какая-то защита.

В любом случае будь зашифрованный адрес или нет, все равно раноли поздно протектор адрес положет в регистр, потому как это требует синтаксис языка ассемблера
Будь там ModRM вида lea, mov, stosb и тд все равно узнаешь.

Главное решить вопрос с защитой целостности кода, а остальное это ерунда, тогда можно многое узнать.

Вариантов множество, это только один из них.

Можно при помощи счетчиков найти еще участки кода(где pushfd), которые не вызываются, достаточно отсеить все нули в счетчике.

Все зависит от конкретной задачи!!

Есть один трюк, который я нашел путем долгого лазанью в VMProtect, при помощи которого можно быстро выходить с долгих, бесконечных jmp-ов циклов. Ну я его потом покажу, потому как нужно показывать его, может видео скорее всего запишу покажу. Работает на 99%.

Немножко кодинга и трюк работает.

Я щас как раз занимаюсь https://www.elcomsoft.ru/archpr.html этой программой, там защиту поменяли.
 
Последнее редактирование:

Sp1n

Мудрец
Сообщения
177
Реакции
96
not_srd7

> Рандом может базироваться на обычных констанах с сидом

Так ведь сид тоже константа. Откуда взяться рандому, если нет его источника??

Гуи конечно проблема, оконные события мб таким источником.

DX0

> искать флаги в тех местах, где меньше все он вызывался

Если это общая alu операция, то такой критерий np.

> нужно написать свой отладчик

Не нужно, есть DBI.

> Будь там ModRM вида lea, mov

Что такое modrm?

> Вариантов множество

Какие есчо есть?
 

DX0

Новичок
Сообщения
414
Реакции
85
@Sp1n,
ModRM(http://ref.x86asm.net/coder64.html#x58):
ModRM.png

У меня есть Intel-ловская документация и AMD-шная документация, мне сам SEN(Hiew) скидывал, я его попросил.

Насчет других идей: Я может покажу на примере
 

Прикрепленные файлы:

Последнее редактирование:

DX0

Новичок
Сообщения
414
Реакции
85
Вот еще документация которую мне скинул SEN: https://cloud.mail.ru/public/kf6L/jVn2pnZPq

Я бы добавил выше, но файл большой, так что пришлось загрузить на облако.
 

not_srd17

Новичок
Сообщения
81
Реакции
52
Так ведь сид тоже константа. Откуда взяться рандому, если нет его источника??
Ну да, только не забывай что в каждом билде они уникальны. Более того, рандомные константы как раз таки являются основой генерации хендлеров, ведь у VMP есть rolling key. У тебя ну никак не получится создать два идентичных бинарника, одинаковая логика на уровне сурца - да, одинаковая логика на уровне вм - такое не получится.

Слушай, или не слушай, один хрен, на практике же увидишь.
 
  • Понравилось
Реакции: mak

Sp1n

Мудрец
Сообщения
177
Реакции
96
not_srd17

> каждом билде они уникальны.

Так речь не про билды, а про билдер". Билды это уже следствие, я поэтому и говорил источник".

Практически реализуемо, примерно так:

1. Выключаем гуи как источник шума, имитируя его или мб можно вовсе без него.
2. Клонируем адресное пространство, отключив aslr.
3. Берем оригинал и копию на бинарную трансляцию, создав быстрый синхронный канал между трансляторами в двух апп.
4. На каждой итерации сравниваем состояние(контекст и/или ксумму памяти).
5. Можно разделить выполнение на части, привязанные к числу инструкций. Например к числу вызовов какой то апи и на этом временном промежутке сравнивать ксуммы, что бы найти изменение без трансляции.
6. Нужен межпоточный синхрон, иначе указатели и описатели будут разными, при их создании в потоках.
 
  • Понравилось
Реакции: mak

Sp1n

Мудрец
Сообщения
177
Реакции
96
DX0

> ModRM вида lea, mov, stosb

stos modrm не имеет, я поэтому и спросил)
 

not_srd17

Новичок
Сообщения
81
Реакции
52
not_srd17

> каждом билде они уникальны.

Так речь не про билды, а про билдер". Билды это уже следствие, я поэтому и говорил источник".

Практически реализуемо, примерно так:

1. Выключаем гуи как источник шума, имитируя его или мб можно вовсе без него.
2. Клонируем адресное пространство, отключив aslr.
3. Берем оригинал и копию на бинарную трансляцию, создав быстрый синхронный канал между трансляторами в двух апп.
4. На каждой итерации сравниваем состояние(контекст и/или ксумму памяти).
5. Можно разделить выполнение на части, привязанные к числу инструкций. Например к числу вызовов какой то апи и на этом временном промежутке сравнивать ксуммы, что бы найти изменение без трансляции.
6. Нужен межпоточный синхрон, иначе указатели и описатели будут разными, при их создании в потоках.
Ну тогда остаётся только гадать за счёт чего реализуется рандомизация в выходном билде. Придётся реверсить компилятор VMP, а это дело уж совсем гиблое. (Ты ж не думаешь что своим мини-проектом сможешь хоть как-то отследить состояние создание бинарника, особенно если штука которая создаёт бинарники накрыта куда лучше чем то, что оно создаёт)
 

Sp1n

Мудрец
Сообщения
177
Реакции
96
not_srd17

> остаётся только гадать

Зачем гадать и реверсить, если можно сравнивать, я выше описал примерный метод. Запрос с ядра данных или прочитает какой то счетчик, селектор обнулится к примеру - будет разница в состоянии.
 

DX0

Новичок
Сообщения
414
Реакции
85
@Sp1n, а точно, я перепутал, ты прав да, stos не ModRM!
 

Sp1n

Мудрец
Сообщения
177
Реакции
96
DX0

Вот счетчики pushf как ты хотел(что дальше?):
pushf.png

sum общее количество, new без повторений, rep: число повторений -- число адресов с такими повторами; те 2:92 pushf по адресу выполнилась 2 раза, таких адресов 92. Справа немного некорр. вывод в спешке, но не суть. Для консольной версии не успел глянуть.

Как выключить aslr хз, я что время было глянул ядро, глухо. Когда то решали, но не помню. Можно конечно список запрос:адрес завести или самому область найти, но быстрее патчем ядра.

План такой для начала - есть консольная версия, что упрощает задачу. Обработать tsc, отключить aslr, промониторить и отфильтровать сервисы. Если рандом останется, тогда разбирать isa.
 

dermatolog

Ветеран
Сообщения
34
Реакции
6
Оно? :whistle:
Код:
function OnBeforeCompilation()
    math.randomseed(0)
end
 

Sp1n

Мудрец
Сообщения
177
Реакции
96
dermatolog

Что делает randomseed() ?

Очевидно что не вводит константу, как в аргументах(0).
 

Sp1n

Мудрец
Сообщения
177
Реакции
96
А говорили что нет такой опции, кому верить..

Разница в файлах для опции антидебаг значительная, запущенные не успел глянуть. Вероятно так проверку не найти..
 
Верх Низ