Загрузка Dll

Тема в разделе "WASM.NT.KERNEL", создана пользователем AntiB, 3 июл 2009.

  1. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Доброе время суток!
    У меня следующий вопрос:
    как с под драйвера можно загрузить в АП dll ? Много в гугле искал, толку мало (может плохо искал, хотя старался) подумал о варианте с RtlCreateUserThread и запись в процесс функции поиска базы ntdll.dll, потом Api: LdrLoadDll и потом уже загрузку dll в АП процесса, но вариант немного геморный (и есть маленькая проблема: нужно узнать размер функции для записи в АП, а как это сделать - хз, пишу на си). Еще нашел вариант с http://www.rsdn.ru/article/baseserv/InjectDll.xml, но тоже как бы не очень. Есть еще вариант хороший: MmLoadSystemImage, но проблема в том что она не экспортируется ядром, есть способы ее нахождения? И есть другие способы сделать загрузку?

    Заранее всем благодарен!
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
  3. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Проблема в том, что я хочу сделать внедрение к каждому процессу, по этому думаю нужно сделать перехвать NtCreateProcess, и как я понимаю для APC нужен поток или я ошибаюсь?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Для доставки пользовательской апк нужен не только поток, есчо нужно чтобы он вошёл в сервис в котором ожидание происходит, нормально есчо и с разрешением на доставку апк(Alertable), хотя последнее можно изменить. Либо можно поставить апк в очередь треда до его старта, в этом случае апк будет доставлена(LdrInitializeThunk -> LdrpInitialize -> NtTestAlert). Хотя апк будет доставлена уже после нотификации загруженных модулей, но перед вызовом указанного для треда Win32StartAddress.
    Альтернативой ядвляется захват контекста треда, либо захват указателей на обработчики, либо редирект из какогото места на диспетчер исключений(пользовательский либо ядерный не важно).
     
  5. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    тогда я не могу заюзать APC, так как NtCreateProcess не создает потоков, или я ошибаюсь?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Конечно, нужно ожидать создание треда какимлибо способом.
     
  7. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    уж луче создать поток который будет искать LdrLoadDll и загрузить dll, не считаете? Загвоздка в том, что не знаю как узнать размер функции на си
     
  8. patolog

    patolog New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    49
    можно в процесс инжектнуть шелкод, затем просплайсить чегото (скажем Sleep() или еще какуюто апишку)так, чтоб при вызове ф-ции вызывался шелкод. в шелкоде сделать

    {
    UnSplice()
    return LoadLibrary()
    }

    и останется только подождать совсем уже немного (главное похукать чтото реально частоиспользуемое)
    это как вариант.
    ну или как сделал один мой знакомый, сделать тоже самое, но в нотификаторе создания треда\процесса и просплайсить уже энтрипойнт треда\процесса
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    patolog
    Я собирал статистику, чаще всего вызывается ZwWaitForMultipleObjects, могут от этого плясать=)

    А вообще х..ня это.
    Если автору достаточно, чтобы дллка размещалась в АП процесса назначения согласно таблицы секций и всё (без записей в списке модулей и пр), тогда можно просто самому промапить ее туда через ZwCreateFile / ZwCreateSection (SEC_IMAGE) / ZwMapViewOfSection.

    Если дллка не находится в файле, тогда сэмулировать работу загрузчика, пройдясь по таблице секций и промапировав нужные секции либо из памяти через MmMapLockedPagesSpecifyCache, либо выделением места в процессе и копированием туда.
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    AntiB
    http://www.wasm.ru/forum/viewtopic.php?id=29934
     
  11. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Y_Mur
    Спасибо! понял как можно это реализовать.

    Great
    Нет, мне еще нужно чтобы был импорт, по этому простой мапинг секций - не прокатить

    patolog
    интересная идея, но я делаю перехват NtCreateProcess, а там есть только ntdll.dll и хорошо бы если сначала длл инициализировалась, а потом уже код
     
  12. Guest

    Guest Guest

    Публикаций:
    0
    Грузи DLL в адресное пространство через ZwAllocateVirtualMemory, пиши небольшой загрузчик на asm, грузи его, перед этим вшив нужные адреса, далее передавай ему управление любым удобным способом. Загрузчик настроит образ PE, там не много дел и создаст поток на EP, нужно только убедится что ntdll и kernel32 прошли инициализацию перед работой с ними.
     
  13. Guest

    Guest Guest

    Публикаций:
    0
    P.S. Не требуется грузить DLL с диска, можно носить ее в памяти дрова, просто прописывать в выделенную память и настраивать через загрузчик.
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    AntiB
    Ссылка по теме здесь. Не в точности то, что тебе нужно, но идею почерпнёшь, думаю.
     
  15. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    я думаю использовать еще один модуль на асм - плохая затея (есть печальный опыт), вот подумал сделать так:
    сделать выделение памяти ZwAllocateVirtualMemory, скопировать функцию загрузки (методом поиска базы ntdll.dll в PEB и функции LdrLoadDll, кстати такой метод будет работать под любой ОС? читал что в висте или 7 - не работает) и потом создать поток, только не експортируеться RtlCreateUserThread (или я ошибаюсь? если нет - то как можно найти ее, или как создать поток) и с помощью этого потока сделать загрузку dll в АП процесса

    Как смотрится этот вариант?
     
  16. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    x64
    ну некоторая часть кода - для меня интересная, но как загрузить и настроить dll или exe - я знаю как сделать, но вот с импортом - опять же проблемы, так как нужно его настроить (что не составляет проблемы, если есть LoadLibrary), а грузить все dll что нужны для текущей dll - согласитесь, глупо. Хотя кто я такой чтобы судить :)
     
  17. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Понял как сделать ZwCreateThread.