Русский / Russian English / Английский

Сейчас на форуме: yashechka, cppasm, DagalProject (+3 невидимых)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 eXeL@B —› Основной форум —› Упаковка DLL x64 в Windows 10 с Control Flow Guard (CFG)
Посл.ответ Сообщение

Ранг: 9.0 (гость)
Статус: Участник

Создано: 5 марта 2020 17:21 New!
Цитата · Личное сообщение · #1

Делаю упаковщик x64 DLL.

Проверяю работоспособность через rundll32 dllname,funcname. Успешно загружается внутри с помощью LoadLibraryExW, потом следом rundll32 вызывает GetProcAddress для указанного экспорта (funcname) и в этот момент получаю exception в глубине GetProcAddress. Оказывается, что ее ловит CFG - Control Flow Guard в Windows 10, а именно исключение вызывает функция LdrControlFlowGuardEnforced().

На Windows 7 всё работает, выключаю защиту эксплоитов в Windows 10 - тоже всё работает.

Упакованную DLL загружаю через VirtualAlloc. Каждой секции проставляются нужные атрибуты с помощью VirtualProtect.

Вопрос, что делать???

Проставка флага /NXCOMPAT:NO для упакованного(на диске) и неупакованного файла(в памяти) ничего не дает.

Ранг: 65.5 (постоянный)
Статус: Участник

Создано: 5 марта 2020 18:30 New!
Цитата · Личное сообщение · #2

IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG после распаковки восстанавливаете? Целиком?
Как вариант, если не сохраняются CFGшные поля из IMAGE_LOAD_CONFIG_DIRECTORY можно попробовать снять IMAGE_DLLCHARACTERISTICS_GUARD_CF в pe-хидере.
Лучше покажите пример исходного файла и упакованного.

Ранг: 9.0 (гость)
Статус: Участник

Создано: 5 марта 2020 20:20 New!
Цитата · Личное сообщение · #3

RamMerlabs пишет:
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG после распаковки восстанавливаете?

Это директории нет у неупакованного файла.

RamMerlabs пишет:
можно попробовать снять IMAGE_DLLCHARACTERISTICS_GUARD_CF

Этого флага тоже нет у упакованного файла.


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 5 марта 2020 21:36 New!
Цитата · Личное сообщение · #4

cracker888

Поэтому и защита срабатывает. Значит нужно отключить.

Ранг: 37.2 (посетитель)
Статус: Участник

Создано: 5 марта 2020 23:46 New!
Цитата · Личное сообщение · #5

cracker888 пишет:
выключаю защиту эксплоитов в Windows 10 - тоже всё работает

А вы пробовали готовые упаковщики/протекторы? Может они тоже не будут работать с этой защитой и проблема не в вашем коде?

Ранг: 65.5 (постоянный)
Статус: Участник

Создано: 6 марта 2020 00:40 · Поправил: RamMerlabs New!
Цитата · Личное сообщение · #6

>>Проверяю работоспособность через rundll32 dllname,funcname
Попробуйте грузить DLL своим лоадером, без rundll.


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 6 марта 2020 00:47 New!
Цитата · Личное сообщение · #7

RamMerlabs

При включённой CFG любая передача управления приведёт к int29, своим или не своим без разницы. mrdata секция не протекчена ядром, можно переписать любые данные, обнулить указатель на карту в частности, это если совсем по тупому делать, не разбираясь как работает защита

| Сообщение посчитали полезным: cracker888


Ранг: 9.0 (гость)
Статус: Участник

Создано: 6 марта 2020 00:55 New!
Цитата · Личное сообщение · #8

difexacaw пишет:
При включённой CFG любая передача управления приведёт к int29, своим или не своим без разницы. mrdata секция не протекчена ядром, можно переписать любые данные, обнулить указатель на карту в частности, это если совсем по тупому делать, не разбираясь как работает защита

А вот это уже очень близко, и действильно ловлю int 29. А что Вы имеете ввиду под передачей управления? И да, как обнулить указатель на карту, где этот указатель хранится, он для DLL или для EXE? Сейчас хочется может даже по тупому)))

Добавлено спустя 2 минуты
RamMerlabs пишет:
Попробуйте грузить DLL своим лоадером, без rundll.

У меня к сожалению есть такое требование.

user99 пишет:
А вы пробовали готовые упаковщики/протекторы? Может они тоже не будут работать с этой защитой и проблема не в вашем коде?

Надо попробовать.


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 6 марта 2020 01:10 New!
Цитата · Личное сообщение · #9

cracker888

CFG/CFI защита локальна, принцип в том, что локально в процессе нельзя выполнить косвенное ветвление(CFG) или возврат(CFI) на не определённый указатель. Для удаленной записи же процесс полностью открыт и можно что угодно изменить.

> где этот указатель хранится

Открой дизом с символами да посмотри сам, mrdata секция она локально протектится от записи.

А при включённой защите падать будет во всё нэйтиве, там на каждом углу проверки


Ранг: 583.6 (!)
Статус: Участник
_Вечный_Студент_

Создано: 6 марта 2020 01:21 · Поправил: plutos New!
Цитата · Личное сообщение · #10

difexacaw пишет:
mrdata секция она локально протектится от записи


Есть такая Windows API function used to change protections on .mrdata called LdrProtectMrdata( bProtect )
может она пригодится?


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 6 марта 2020 01:23 New!
Цитата · Личное сообщение · #11

plutos

NtProtectVi обёрнутая RWL синхронизацией. Ну да в символах такая есть.

Ранг: 142.8 (ветеран)
Статус: Участник

Создано: 6 марта 2020 06:23 New!
Цитата · Личное сообщение · #12

UPX этому коневоду уже предлагали?

| Сообщение посчитали полезным: ClockMan



Ранг: 556.5 (!)
Статус: Участник
оптимист

Создано: 6 марта 2020 09:00 New!
Цитата · Личное сообщение · #13

Топикастор ь малварь пишет а тут все бросились ему помогать.........

| Сообщение посчитали полезным: ajax



Ранг: 87.2 (постоянный)
Статус: Участник

Создано: 6 марта 2020 09:23 New!
Цитата · Личное сообщение · #14

ClockMan пишет:
малварь пишет


Ну тут сыглы, иначе как может срабатывть CFG в длл, у которой ее нет. И вообще ни разу не видел, чтобы CFG срабатывал где-то в GetProcAddress, обычно он работает при передаче управления коду, которого нет в битовой карте CFG модуля.


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 6 марта 2020 12:21 · Поправил: difexacaw New!
Цитата · Личное сообщение · #15

Apocalypse

LdrGetProcedureAddressForCaller -> LdrpResolveProcedureAddress -> LdrpGetProcedureAddress -> LdrControlFlowGuardEnforced(TRUE) -> RtlpxLookupFunctionTable(FAIL) -> int29.

| Сообщение посчитали полезным: ajax


Ранг: 9.0 (гость)
Статус: Участник

Создано: 6 марта 2020 13:34 New!
Цитата · Личное сообщение · #16

difexacaw пишет:
LdrControlFlowGuardEnforced(TRUE)

Пытался отредактировать эту функцию и указатели которые узаются в ней, но потом всё падает(


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 6 марта 2020 14:39 New!
Цитата · Личное сообщение · #17

cracker888

Для выяснения причин падений давно изобрели отладчик.

Ранг: 9.0 (гость)
Статус: Участник

Создано: 6 марта 2020 18:32 New!
Цитата · Личное сообщение · #18

difexacaw пишет:
Для выяснения причин падений давно изобрели отладчик.

Я просто не уверен, что копание в ntdll принесет мне какие-то плоды. Вобщем хукнул GetProcAddress, она успешна отработала, а потом DLL-ка упала в какой-то оконной функции и также int 29, кароч надо копать защиту...


Ранг: 331.0 (мудрец)
Статус: Участник

Создано: 6 марта 2020 18:44 New!
Цитата · Личное сообщение · #19

cracker888

Оно и должно упасть, при любом обратном вызове(косвенное ветвление) пройдёт проверка указателя в карте.

Ранг: 9.0 (гость)
Статус: Участник

Создано: 10 марта 2020 20:32 New!
Цитата · Личное сообщение · #20

difexacaw пишет:
Оно и должно упасть, при любом обратном вызове(косвенное ветвление) пройдёт проверка указателя в карте.

А как оно падает, если в DLL нет Load Config Directory, я так понял CFG работает при поддержке компилятора, а также заполняется необходимая информация в PE-файле, а именно в Load Config Directory. Почему падает-то? О_О
 eXeL@B —› Основной форум —› Упаковка DLL x64 в Windows 10 с Control Flow Guard (CFG)

Видеокурс ВЗЛОМ