Загрузка dll в свой процесс

Тема в разделе "WASM.BEGINNERS", создана пользователем piligmindo, 3 дек 2019.

  1. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Доброго времени!

    Пытаюсь загрузить в свой процесс kernel32.dll, делаю так:

    Код (Text):
    1.    
    2. HANDLE hFile = CreateFile("C:\\Windows\\SysWOW64\\kernel32.dll",
      
    3. GENERIC_READ,
      
    4. 0,
      
    5. NULL,
      
    6. OPEN_EXISTING,
      
    7. FILE_ATTRIBUTE_NORMAL,
      
    8. NULL);
    9.  
    10. GetFileSizeEx(hFile, &fsz);
    11.  
    12. NtAllocateVirtualMemory(NtCurrentProcess(),
      
    13. &Buffer,
      
    14. 0,
      
    15. &sz,
      
    16. MEM_COMMIT | MEM_RESERVE,
      
    17. PAGE_READWRITE);
    18.  
    19. ReadFile(hFile, Buffer, fsz.LowPart, &ReturnLength, NULL);
    20.  
    21. NtCreateSection(&hSection,
      
    22. SECTION_ALL_ACCESS,
      
    23. NULL,
      
    24. 0,
      
    25. PAGE_READONLY,
      
    26. SEC_IMAGE,
      
    27. hFile);
    28.  
    29. NtMapViewOfSection(hSection,
    30. NtCurrentProcess(),
    31. &sectionBaseAddress,
    32. NULL,
    33. NULL,
    34. NULL,
    35. &viewSize,
    36. 1,
    37. NULL,
    38. PAGE_EXECUTE_READWRITE);
    39.  
    В итоге функции отрабатывают, последняя падает с ошибкой 40000003. Я не понимаю, где ошибка. Может у кого то есть код, который может dll в процесс загрузить?
     
    Последнее редактирование: 3 дек 2019
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Для NtMapViewOfSection 0x40000003 это не ошибка в строгом значении этого слова, STATUS_IMAGE_NOT_AT_BASE - указывает лишь на то, что образ был размещён в VM процесса не по желаемому образом адресу и его (образа) ImageBase был изменён. Для наглядности посмотрите любым сканером VM прогцесса (тем же VMMap например) - грузится ли образ и по какому адресу.
     
    Последнее редактирование: 3 дек 2019
  3. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Тогда я не понимаю, что происходит. Но в карте памяти не отображается dll в отладчике. В чем может быть беда?
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    sectionBaseAddress = 0, а также viewSize = 0 или актуальный размер образа перед вызовом NtMapViewOfSection. и NtAllocateVirtualMemory и ReadFile здесь лишние, NtCreateSection выделяет память и читает файл сама.
     
  5. Indy_

    Indy_ Well-Known Member

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

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

    Код (Text):
    1. //  Values are 32 bit values layed out as follows:
    2. //
    3. //   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    4. //   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
    5. //  +---+-+-+-----------------------+-------------------------------+
    6. //  |Sev|C|R|     Facility          |               Code            |
    7. //  +---+-+-+-----------------------+-------------------------------+
    8. //
    9. //  where
    10. //
    11. //      Sev - is the severity code
    12. //
    13. //          00 - Success
    14. //          01 - Informational
    15. //          10 - Warning
    16. //          11 - Error
    17. //
    18. //      C - is the Customer code flag
    19. //
    20. //      R - is a reserved bit
    21. //
    22. //      Facility - is the facility code
    23. //
    24. //      Code - is the facility's status code
    > Но в карте памяти не отображается dll в отладчике.

    Отладчик берёт инфу из юзер загрузчика, если модуль спроецирован, это не значит что он загружен.
    --- Сообщение объединено, 3 дек 2019 ---
    > Может у кого то есть код, который может dll в процесс загрузить?

    Изначально не верный подход к решению задачи. Сложность системы растёт, просто не реально повторить загрузчик. Либо загружай из файла через его апи, либо симулируй section-object, для загрузки из памяти. Примеры есть, но врядле пока ты там что либо поймёшь :preved:
     
    piligmindo и RamMerLabs нравится это.
  6. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Пофиксил, не работает... Точнее, все так же нет образа в памяти.

    Это 3-е кольцо, не ядро.

    Я не понимаю, как тогда его загрузить в свой процесс, что бы им воспользоваться? Или как его найти тогда? Может я ищу не там? Но в любом сканере памяти нет dll.
     
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    >>C:\\Windows\\SysWOW64\\kernel32.dll
    вы случайно не в 64битный процесс пытаетесь загрузить 32битную DLL? :)
     
  8. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Я думаю, что все как то проще. Вот здесь написано:
    https://www.first.org/resources/pap...e-Evasion-Trend-Bypassing-User-Mode-Hooks.pdf

    Section Remapping. [Nt]CreateFile() + NtCreateSection(..., SEC_IMAGE, ...) + ZwMapViewOfSection()
    --- Сообщение объединено, 3 дек 2019 ---
    Нет. ОС x64, файл, который загружает - x86.
     
    q2e74 нравится это.
  9. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    >>Нет. ОС x64, файл, который загружает - x86.
    Ну так в этом случае kernel32 уже спроецирован загрузчиком и повторного проецирования не происходит. аналогично для ntdll
     
  10. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Задача как раз в том, что бы было 2 копии.
     
  11. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Тогда грузите не SEC_IMAGE, а SEC_COMMIT и разбирайте вручную секции, делайте релокацию, настраивайте импорты и т.д:)
     
  12. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    [​IMG]
    https://ibb.co/0mT0Bcv
    Стоп, а это не он часом?) // заменил на ntdll

    Не, не он(
     
  13. Indy_

    Indy_ Well-Known Member

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

    > Evasion-Trend-Bypassing-User-Mode-Hooks.pdf

    Незачем читать всякую чушь. Там обход" заключается в копировании уже спроецированного образа, он вне загрузчика и может работать как копия(те перемещён в памяти, а оригинальный образ настроен - например загружен импорт(IAT)). Нет смысла что то скрывать в памяти, ты не сможешь это сделать. Есть способы, но они слишком сложны - подмена локальной выборки, для этого приложение должно исполняться под визором, тогда можно выполнить подмену/симуляцию. Это сложная тема, не нужно лезть в то, что не понимаешь :punish:
     
    q2e74 нравится это.
  14. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Что бы нечать понимать, надо лезть)

    Значит, нужно просто скопировать получается?
     
  15. Indy_

    Indy_ Well-Known Member

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

    Там описано копирование, те можно переместить в памяти уже загруженный образ. Так как адресация всегда релатив(относительная) в пределах секций, то остаётся лишь пофиксить указатели(fixup's). Но эта копия будет вне загрузчика, ты не сможешь вызвать никакие апи для работы с ней.
     
  16. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    И не забывайте про CFG на 8.1+ - его битовую карту копирование не исправит, соответственно вызов функций из копии вывалит прогу в unhandled exception.
     
    Indy_ нравится это.