Сейчас на форуме: -Sanchez- (+9 невидимых)

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

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

Создано: 05 марта 2020 17:21
· Личное сообщение · #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 для упакованного(на диске) и неупакованного файла(в памяти) ничего не дает.



Ранг: 73.1 (постоянный), 130thx
Активность: 0.040.23
Статус: Участник

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

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



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

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

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

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

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

cracker888

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

-----
vx




Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

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

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

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



Ранг: 73.1 (постоянный), 130thx
Активность: 0.040.23
Статус: Участник

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

RamMerlabs

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

-----
vx


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

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

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

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

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

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

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

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

cracker888

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

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

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

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

-----
vx





Ранг: 622.6 (!), 521thx
Активность: 0.330.89
Статус: Участник
_Вечный_Студент_

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

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


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

-----
Give me a HANDLE and I will move the Earth.





Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

plutos

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

-----
vx




Ранг: 145.8 (ветеран), 190thx
Активность: 0.140.36
Статус: Участник

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

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

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


Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

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

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

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.


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


Ранг: 88.2 (постоянный), 111thx
Активность: 0.070.01
Статус: Участник

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

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


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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

Apocalypse

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



-----
vx


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

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

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

difexacaw пишет:
LdrControlFlowGuardEnforced(TRUE)

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

cracker888

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

-----
vx




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

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

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

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




Ранг: 337.5 (мудрец), 348thx
Активность: 2.112.42
Статус: Участник

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

cracker888

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

-----
vx




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

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

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

А как оно падает, если в DLL нет Load Config Directory, я так понял CFG работает при поддержке компилятора, а также заполняется необходимая информация в PE-файле, а именно в Load Config Directory. Почему падает-то? О_О


 eXeL@B —› Основной форум —› Упаковка DLL x64 в Windows 10 с Control Flow Guard (CFG)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати