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

instw0

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

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

Indy

Ветеран
Сообщения
117
Реакции
69
mak

Посмотрел версию 3.1.2, это совсем не то:

312.png
- две ловушки и cpuid(1).Ecx.31 обычно маркирует гипер. Вот только если его сбросить, либо загрузить хостовые значения, всё равно палит вирту. Никаких замеров по времени и sysenter нет..

Обнаружился косяк в движке, почему то на ловушке в лог не выводится следующая инструкция. Тут ловушка срабатывает: popf/rdtsc :(
 
Последнее редактирование:
  • Понравилось
Реакции: mak

ClockMan

Мудрец
Сообщения
19
Реакции
491
Смотрите инструкции типа
CPUID
NOP
при работе на нормальной машине адрес исключения будет на CPUID, при разных визорах адрес будет на NOP
 
  • Понравилось
Реакции: mak

mak

Соломенные сандалии
Администратор
Сообщения
861
Реакции
654
@ClockMan, было уже

GetSystemFirmwareTable - https://docs.microsoft.com/en-us/wi...pi-getsystemfirmwaretable?redirectedfrom=MSDN
MORE VM DETECTION - https://www.gironsec.com/blog/2017/08/more-vm-detection/ (GetSystemFirmwareTable)

hypervision tips and tricks - Generally, when a hypervisor encounters a VM exit, it is because it needs to emulate the effects of an instruction, be it CPUID, RDMSR, or ENCLS. Due to ineffective wording in Intel's Software Developer's Manual, most assume that the only necessary action to be taken is to update the guest's registers or inject an exception. There are many times, however, where this is not the case. Hidden all the way in section 32.2.1 of volume 3 is this sentence:
"If a VMM emulates a guest instruction that would encounter a debug trap (single step or data or I/O breakpoint), it should cause that trap to be delivered."
Я думаю, что DBI легко задетектил бы сингл степ, но по логам выше этого нет, в этом и вопрос. Вот этот пример для Ноп инструкции - https://github.com/MoePus/BadTrap, но как видно, в логе его нет. Это может быть любая другая стилс анти вм техника, которую завиртуализировали, не обязательно от протектора.

Хотя если есть детект на старой версии
Посмотрел версию 3.1.2, это совсем не то
то вероятно, что-то пропустили.
 

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

Indy

Ветеран
Сообщения
117
Реакции
69
Ловушка срабатывает после исполнения инструкции, push 0x302 - popfd - cpuid(rdtsc) - mop: ловушка на nop, так на хосте и на варе к примеру. Адрес ловушки 5EC7D5 это ноп после rdtsc. Это у меня просто баг, при обработке ловушек инструкция скипается и не попадает в лог декодера, надо будет пофиксить..

На вирте anyrun не корректно выполняется ловушка, хост/варя:

tsc.png

anyrun:

0d8b797d-bd4f-401a-a10c-f9d8df5e17f5.jpeg
 
Последнее редактирование:

Indy

Ветеран
Сообщения
117
Реакции
69
Сравнил 4 лога для 3.5.1:

4.png

- получается #DB на rdtsc используется для обнаружения трассировки(отладчика), а не вирты. Вирту палит cpuid(1), если значения подменить на хосте с вари(кроме ecx.31), то срабатывает детект. После cpuid лог не выводится, тк заканчивается трансляция(начинается прямое исполнение), что бы не вводить задержки.
 

Indy

Ветеран
Сообщения
117
Реакции
69
Починил обработку ловушек, дошло до сигнатуры^ :)

Только трудность возникает:

if *EDX = ("VMware") then
*EDX <- 0
mm.png

- эта область не файловая проекция, её нельзя открыть на запись и нет отображения c W.

Интересно откуда строка эта берётся, сервисы не вызываются..
 

mak

Соломенные сандалии
Администратор
Сообщения
861
Реакции
654
@Indy, смахивает на https://github.com/changeofpace/Self-Remapping-Code - https://github.com/changeofpace/Self-Remapping-Code/releases/download/v1.0/SelfRemappingCode.exe

This program remaps its image to prevent the page protection of pages contained in the image from being modified via NtProtectVirtualMemory.

Self-Remapping Code
Summary
This program remaps its image to prevent the page protection of pages contained in the image from being modified via NtProtectVirtualMemory.

Motivation
This technique can be utilized as an anti-debugging and anti-dumping mechanism.

Implementation
The remapping technique uses the following strategy:
  1. The image is copied to an executable buffer referred to as the 'remap region'.
  2. The remap routine inside the remap region is located and invoked.
  3. The remap routine creates a page-file-backed section to store the remapped image.
  4. The remap routine maps a view of the entire section and copies the contents of the image to the view. This view is then unmapped.
  5. The remap routine maps a view for each pe section in the image using the relative virtual address of the pe section as the section offset for the view. Each view is mapped using the 'SEC_NO_CHANGE' allocation type to prevent page protection changes.
  6. The remap routine completes and execution returns to the remapped image.
The following tables are examples of the memory layout of an image before and after it has been remapped using this technique:

Before
Address Size Info Type Protect Initial
================================================================================
0000000140000000 0000000000001000 selfremappingcode.exe IMG -R--- ERWC-
0000000140001000 000000000000F000 Reserved (0000000140000000) IMG ERWC-
0000000140010000 0000000000002000 ".text" IMG ER--- ERWC-
0000000140012000 000000000000E000 Reserved (0000000140000000) IMG ERWC-
0000000140020000 0000000000002000 ".rdata" IMG -R--- ERWC-
0000000140022000 000000000000E000 Reserved (0000000140000000) IMG ERWC-
0000000140030000 0000000000001000 ".data" IMG -RW-- ERWC-
0000000140031000 000000000000F000 Reserved (0000000140000000) IMG ERWC-
0000000140040000 0000000000001000 ".pdata" IMG -R--- ERWC-
0000000140041000 000000000000F000 Reserved (0000000140000000) IMG ERWC-
0000000140050000 0000000000001000 ".rsrc" IMG -R--- ERWC-
0000000140051000 000000000000F000 Reserved (0000000140000000) IMG ERWC-

After
Address Size Info Type Protect Initial
================================================================================
0000000140000000 0000000000001000 MAP -R--- -R---
0000000140010000 0000000000002000 MAP ER--- ER---
0000000140020000 0000000000002000 MAP -R--- -R---
0000000140030000 0000000000001000 MAP -RW-- -RW--
0000000140040000 0000000000001000 MAP -R--- -R---
0000000140050000 0000000000001000 MAP -R--- -R---

Requirements
  • Each pe section in the image must be aligned to the system allocation granularity. This program uses the /ALIGN linker option to achieve this alignment.


Force Page Protection - https://github.com/changeofpace/Force-Page-Protection

Summary

This x64dbg plugin sets the page protection for memory mapped views in scenarios which cause NtProtectVirtualMemory to fail.
Motivation
NtProtectVirtualMemory will fail for memory mapped views with valid arguments in these scenarios:
  1. The view is mapped with the undocumented allocation type: SEC_NO_CHANGE (0x00400000).
  2. The desired protection is incompatible with the view's initial protection. Example: trying to set the protection for a view with an initial protection of PAGE_READONLY to PAGE_EXECUTE_READWRITE.
  3. The view and/or backing section are created using large pages (unconfirmed / not currently supported).
A process can utilize these cases as an anti-patching mechanism. A demo of this can be found here.
This plugin defeats this technique by remapping the view with the desired protection.

Usage
Added Commands

  • ForcePageProtection
  • fpp
Syntax
ForcePageProtection [address, protection]

This command attempts to set the page protection for the memory region that contains address. The protection argument is interpretted as a hex value representing a PAGE_* constant.1 If no arguments are specified, the address is set to the active address in the disassembly view, and the protection is set to PAGE_EXECUTE_READWRITE (0x40).

Example
Given the following virtual address space for a process:

Address Size Type Protection
00000000`00010000 00000000`00010000 MAP -RW--
00000000`00020000 00000000`0000C000 PRV ERW--
00000000`00030000 00000000`00004000 MAP -R---
00000000`00040000 00000000`00001000 MAP -R---
...

ForcePageProtection 32000, 40
Will attempt to set all pages in the range 30000 - 33FFF to PAGE_EXECUTE_READWRITE.
 
  • Понравилось
Реакции: Indy

Indy

Ветеран
Сообщения
117
Реакции
69
mak

Я тоже сразу подумал что моей методой 15-го года проекцию блочит, там другое оказалось. Проецирует physicalmemory секцию, отсюда и строки вари появляются:

pm.png

- просто сбрасывается ZF, если выборка этих строк.
 
  • Понравилось
Реакции: mak

Indy

Ветеран
Сообщения
117
Реакции
69
Победил я его, была трабла - управление прыгало в нули(ret -> 0), оказалось так происходит если из cpuid не возвращать инфу :)

Вот два лога, приложения и накрытого 351:

Код:
0xFA8 NT 0x7C817064 NtSetInformationThread
------ EP 0x415757 ------
0xFA8 NT 0x7C80A4CB NtQueryPerformanceCounter
0xFA8 PERFC at 0x421885
0xFA8 NT 0x7C925D42 NtQuerySystemInformation

0x524 NT 0x582580 NtRaiseHardError
0x524 NT 0x7C80A4CB NtQueryPerformanceCounter
0x524 PERFC at 0x421885
0x524 NT 0x7C925D42 NtQuerySystemInformation
- EP приложения, NtRaiseHardError это прот выводит сообщение про регу.

cpuid(1) слишком много, без трассы никак детект не обойти, увы только гипер/дби.

id.png
 

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

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

instw0

Новичок
Сообщения
29
Реакции
1
Ребят, а как обойти "Xmode Code" в методах анти дби?
 

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

  • Понравилось
Реакции: mak

Indy

Ветеран
Сообщения
117
Реакции
69
instw0

Вот пример.

Как решать - так это сама суть использования таких инструментов. Они применяются для решения текущей задачи. Тоесть это не годами работает, а собирается налету много раз пока задача не будет решена. Под визором проходит эмуляция, тайминг к примеру можно вернуть любой за пол часа и все эти таблицы китайские со статой профайлом кэшами пойдут лесом.

X-mode тоже какая то чушь. В базовых манах на архитектуру имеются таблицы, в которых описана раскодировка modrm нп в зависимости от мода, а режим определяется процессорной средой, так нп кодовая битовая последовательность это функция мода, впрочем как и адресная трансляция. Но это мелочи всё, dbi сразу обнаружит причину неработы апп, мой например может такое картами исполнения сделать. Сразу будет найден код который палит трансляцию, а если он найден то эмулировать можно любые интерфейсы.

Есть метод сервисных обратных вызовов, про это много тем и примеров моих. Это отлично работает как анти дебаг, юзер отладчиком такое не пройти из за изменяющегося гуя не эмулить, эта техника большая проблема.

Смена мода(compat/legacy/64) - для дби вызов будет эмулирован, так что не проблема.

https://wasm.in/threads/stek-tenevyx-kalbehkov.25135/#post-299296
https://exelab.one/forum/крэки-обсуждения/29514-2-22109

А есчо мы живём в симуляции, я так думаю :)
 
Последнее редактирование:

instw0

Новичок
Сообщения
29
Реакции
1
instw0

Вот пример.

Как решать - так это сама суть использования таких инструментов. Они применяются для решения текущей задачи. Тоесть это не годами работает, а собирается налету много раз пока задача не будет решена. Под визором проходит эмуляция, тайминг к примеру можно вернуть любой за пол часа и все эти таблицы китайские со статой профайлом кэшами пойдут лесом.

X-mode тоже какая то чушь. В базовых манах на архитектуру имеются таблицы, в которых описана раскодировка modrm нп в зависимости от мода, а режим определяется процессорной средой, так нп кодовая битовая последовательность это функция мода, впрочем как и адресная трансляция. Но это мелочи всё, dbi сразу обнаружит причину неработы апп, мой например может такое картами исполнения сделать. Сразу будет найден код который палит трансляцию, а если он найден то эмулировать можно любые интерфейсы.

Есть метод сервисных обратных вызовов, про это много тем и примеров моих. Это отлично работает как анти дебаг, юзер отладчиком такое не пройти из за изменяющегося гуя не эмулить, эта техника большая проблема.

Смена мода(compat/legacy/64) - для дби вызов будет эмулирован, так что не проблема.

https://wasm.in/threads/stek-tenevyx-kalbehkov.25135/#post-299296
https://exelab.one/forum/крэки-обсуждения/29514-2-22109

А есчо мы живём в симуляции, я так думаю :)
Инди, спасибо за развернутый ответ. Щас буду курить все выходные

instw0

Вот пример.

Как решать - так это сама суть использования таких инструментов. Они применяются для решения текущей задачи. Тоесть это не годами работает, а собирается налету много раз пока задача не будет решена. Под визором проходит эмуляция, тайминг к примеру можно вернуть любой за пол часа и все эти таблицы китайские со статой профайлом кэшами пойдут лесом.

X-mode тоже какая то чушь. В базовых манах на архитектуру имеются таблицы, в которых описана раскодировка modrm нп в зависимости от мода, а режим определяется процессорной средой, так нп кодовая битовая последовательность это функция мода, впрочем как и адресная трансляция. Но это мелочи всё, dbi сразу обнаружит причину неработы апп, мой например может такое картами исполнения сделать. Сразу будет найден код который палит трансляцию, а если он найден то эмулировать можно любые интерфейсы.

Есть метод сервисных обратных вызовов, про это много тем и примеров моих. Это отлично работает как анти дебаг, юзер отладчиком такое не пройти из за изменяющегося гуя не эмулить, эта техника большая проблема.

Смена мода(compat/legacy/64) - для дби вызов будет эмулирован, так что не проблема.

https://wasm.in/threads/stek-tenevyx-kalbehkov.25135/#post-299296
https://exelab.one/forum/крэки-обсуждения/29514-2-22109

А есчо мы живём в симуляции, я так думаю :)
я че то пока сходу не догоняю как сэмулировать с помощью intel pin`а это ...

ребят, есть какие нибудь рекомендации, как можно отладить код с использованием техники " Heaven's Gate"? Отладчик типо WinDbg это очень долго
 

mak

Соломенные сандалии
Администратор
Сообщения
861
Реакции
654
@instw0, привет, что значит, очень долго? Отладка есть отладка :coffee:

Только ядерный отладчик может нормально обрабатывать подобную ситуацию, альтернативно можно использовать IDA Pro с костылями, выбрать WinDBG, тогда можно потрасировать код, но сам код не определяется как 64 битный, поэтому выглядит страшно, в оригинале:
masm:
x64 SEGMENT EXECUTE USE64

    .x64
    
    mov eax,DWORD ptr [rsp+8]
    mov r10,QWORD ptr [rax]
    shr r10,16
    mov QWORD ptr [rax],r10
    
    retf

x64 ENDS
В IDAPro
masm:
x64:00403000 x64 segment para public 'CODE' use32
x64:00403000 assume cs:x64
x64:00403000 ;org 403000h
x64:00403000 assume es:FLAT, ss:FLAT, ds:FLAT, fs:nothing, gs:nothing
x64:00403000 mov     eax, [esp+8]
x64:00403004 dec     esp
x64:00403005 mov     edx, [eax]
x64:00403007 dec     ecx
x64:00403008 shr     edx, 10h
x64:0040300B dec     esp
x64:0040300C mov     [eax], edx
x64:0040300E retf
x64:0040300E ; ---------------------------------------------------------------------------
x64:0040300F align 200h
Можно ли в Иде переназначить формат этого участка? Эксперты, подскажите :)
 
  • Понравилось
Реакции: Indy

Indy

Ветеран
Сообщения
117
Реакции
69
mak

WD автоматически определяет мод и со всеми работает. По сравнению с ним всякие олли и прочие юзер отладчики крайне не удобны и это не полноценные поделки с удобным гуем. В иду скриптов напихали как в банку сюрстрёминга, это всё не стабильно не удобно костыли. Ида диз это инструмент для анализа в статике.

Как говорил покойный Грейт не так страшен чёрт как его малюют". Но это же сколько лет прошло.. раньше он был командным, я новые версии не видел, но думаю там гуй интерфейсы уже не нуждаются в изучении командного вбивать токены на каждую манипуляцию.

instw0

dbi не годятся", вд слишком сложно долго.. ну так и задача не простая, её просто не решить. Тут вроде было что то про вмп и переключение в 64. Готового нет увы, зачем вообще браться за сложное, если заранее известно что это решать нечем ??
Реши какой нибудь upx для начала что бы это вручную отладчиком не втыкать. Тогда как то наметится направление как и чем такое решать.

По ссылки выше про мой крэкми глянь в сурках тоже переключение compat/64, что бы юзер отладчик такое не прошёл. Для тебя может новое, но для меня отладчик просто удобный инструмент для наблюдения за апп, вся работа пишется и собирается. Вот только для compat(wow) это просто никак не сделать, придётся выйти в 64 мод, там перестроить контекст и есчо что либо сделать. А не просто тк оно меняется в версиях, регистры например. В любом случае по простому не получится, может если взять какую то вирту, бош мб что то и выйдет, но я про это ничего не знаю, в любом случае придётся в добавок пройти слой ядерной вирты, затем системной что бы хоть как то добраться к потоку. Такой способ я помню лишь один, пара людей с wood j00ru использовали вирту для поиска утечек памяти в ядре. На сколько понимаю обычной виртой такое не сделать, тк там пакетное исполнение для оптимизации(vmx). Это всё дико сложное по мухам из пушки стрелять :)
 
Последнее редактирование:

Indy

Ветеран
Сообщения
117
Реакции
69
Bronco

Переключение режима через jmp far. Так же как это система делает, вроде в этой теме было. Ну да память не подводит вот. С картинками(справа внизу ошибка отладчика, раскодировка без учёта смены мода; не вд я это смотрел 64dbg наверно), просто нигде больше подробности не обсуждали реверсили :)

Я думал ты хотя бы читаешь темы :(
 
Последнее редактирование:

Bronco

Мудрец
Сообщения
76
Реакции
338
Я думал ты хотя бы читаешь темы
хз..мне пока не встречалось, поэтому не парюсь. по скринам там хер поймёшь где код аппа, только в шапке окна вижу что дамп х32.
я уже и не помню когда дебажил подобные приложения.
 

ChVL

Новичок
Сообщения
17
Реакции
12
Есть Target, с разрабами которой многолетняя взаимная "любовь" типа кто - кого. До последнего времени они использовали VMProt 3.0 - 3.5 (именно так определяли РЕ сканеры). А вот с последними версиями они запулили мяч в мою сторону: или сменили версию VMProt'a, или изменили (добавили) какие-то его опции. Теперь DiE v.303 определяет как VMProtect (1.x), а Exeinfo PE v.0.0.6.6 поступает честнее: Unknown EXE [CRC Set]. Ещё в карте памяти вместо обычных двух появились три секции: .vmp0, vmp1 и vmp2. Но самое паскудное то, что Olly со стронгом или x64dbg с ScyllaHide теперь палятся! Пробовал пошевелить галочки - безрезультатно.
Может кто встречался с такой байдой? Куда копать?
 
Верх Низ