Упаковка DLL x64 в Windows 10 с Control Flow Guard (CFG)

Тема в разделе "WASM.WIN32", создана пользователем EvilPhreak1, 5 мар 2020.

  1. EvilPhreak1

    EvilPhreak1 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2020
    Сообщения:
    4
    Делаю упаковщик 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 для упакованного(на диске) и неупакованного файла(в памяти) ничего не дает.
     
  2. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    SetProcessValidCallTargets

    Если конечно проблема связана с тем, что получаемый адрес функции не нравится cfg.
     
  3. EvilPhreak1

    EvilPhreak1 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2020
    Сообщения:
    4
    А как ей пользоваться? В чем смысл этой функции? Достаточно замороченные параметры...
     
  4. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    LdrControlFlowGuardEnforced() проверяет(исключений непосредственно не создаёт) указатель на CF битмапу, используется ли она:

    Код (Text):
    1. LdrControlFlowGuardEnforced:
    2.     cmp cs:qword_18017A380, 0
    3.  
    4. LdrpValidateUserCallTarget:
    5.     mov rdx, cs:qword_18017A380
    6.     mov rax, rcx
    7.     shr rax, 9
    8.     mov rdx, [rdx+rax*8]
    Откуда карта туда загружается не понятно(LdrSystemDllInitBlock..). Можно попробовать штатные апи для отключения защиты вызвать, если не получится придётся либо разбираться в механизмах, либо переписать переменные.
     
  6. EvilPhreak1

    EvilPhreak1 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2020
    Сообщения:
    4
    Апи нету насколько я знаю, ну за исключением SetProcessValidCallTargets, но там как то всё сложно, хотя я глубоко не копал.

    Ну по хорошему Вы правы, надо сесть и всё разобрать, я надеялся услышать принцип стоящий за этой апи, глубоко не копал, но боюсь придется)
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    EvilPhreak1,

    У ionescu и в интерналс было описание меанизма, он довольно сложен, там ядерный интерфейс.

    LdrControlFlowGuardEnforced экспортится, обнули указатель и вуаля защиты нет.
     
  8. EvilPhreak1

    EvilPhreak1 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2020
    Сообщения:
    4
    А какой именно указатель? Извините за тупость)
    Попробовал обнулить cs:qword_18017A380, но падает всё...