Ручная прогрузка kernel32 и ntdll

Тема в разделе "WASM.WIN32", создана пользователем Aids, 23 окт 2011.

  1. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Выполняю следующие действия.
    1)Выделяю память равную SizeImage с атрибутами чтения, записи, исполнения VirtualAlloc.
    2)Настраиваю релоки.
    3)Настраиваю импорт. Загружаю в импорте библиотеки LoadLibrary и нахожу функции по именам и ординалам
    4)Выполняю DllEntry(ImageBase,1,0,0)
    В результате такой работы часть функций работают, но не все. Например CreateThread, GlobalAlloc работают. А вот на CreateProcessA валится.

    Dll написаные мной таким способом прогружаются нормально. А вот у системных похоже что то ещё не проинициализировал.

     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    есть смысл их подгружать вручную? они и так уже находятся в вашем процессе... ntdll.dll вообще есть во свех процессах... если этот алгоритм предполагает обход какой-нить левой защиты, то эта защита - полный гуан... вообще с системными dll есть свои заморочки... например, насколько я помню, динимическая база у них появилась только с ASLR (то есть до ASLR библиотека должна располагаться по строго определенной базе)... кроме того вполне возможно ядерный загрузщик того же ntdll.dll инициализирует ей какие-то глобальные переменные для модуля... вообще надо глубоко копать в этом вопросе, и скорее всего придется копать отладчиком... возвращаемся к первому вопросу, а оно вам надо в принципе и зачем оно вам надо?)
     
  3. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Rel
    Ну например снять хуки в usermode, и усложнить анализ кода (в OllyDbg ни одной экспортируемой функции не будет видно с символическим названием)

    Вот меня и интересуют эти заморочки. Возможно кто то реализовал уже подобную штуку. И сталкивался с этим
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    эти цели можно решить проще... обойти хуки своими трамплинами (пролог функции можно узнать считав файл с диска), если это сплайсинг... про модификацию IAT мы похоже не говорим... про анализ кода - динамический импорт по хеш-значению имени функции и хеш-значению имени библиотеки...
     
  5. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Rel
    это у меня уже сделано.
    не. трамплины не красиво.

    Уж лучше потереть хуки загрузкой оригинальной dll в то же адресное пространство. Конечно это не гарантирует что хуки не будут поставлены снова, но в большинстве случаев это работает.

    Но пока я всё же хочу прогрузить kernel32 и ntdll самостоятельно.
     
  6. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    хуки тереть ваще смысла нет, подгрузите код нужный рядом ;)
     
  7. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    valentin_p
    почему нет смысла тереть?

    >подгрузите код нужный рядом ;)
    то есть?
     
  8. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    то есть если вы (я не в коем случае не подумал что это обход для win7) пишете (я не в коем случае не подумал что это вирус) программу с обходом хуков - нет смысла убивать загруженные либы. загрузите их копии(имя-это сигнатура для механизма раздачи хуков - если вы в шоке) или часть либы(думайте сами)
     
  9. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    кстати лол - а как загрузить либу без ntdll ? помнить номера сервисов для всех виндов? мне кажется вам надо еще посидеть с отладчиком в руках. вы видимо не подумали о том что подгружаемые в процессе исполнения модули будут тут же похуканы снова -> обходите этот механизм, а не изобретайте как загрузить без всего (что иногда бессмысленно ибо r3) ну вы поняли
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    кстати лол... о чем вы говорите? ntdll.dll есть всегда, ее не может не быть... а загрузить лругую либу можно и без ее использования... модули загружаемые снова? модуль не может загрузиться два раза в один процесс штатными средствами, на то есть "база данных загрузчика", как говорил незабвенный Инде Клерк...


    не, ну ради Бога... и кстати, если некоторые функции работают, а некоторые нет, я бы первым делом проверил функицю настраивающую релоки, но почти наверняка дело не в этом...
     
  11. valentin_p

    valentin_p New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2011
    Сообщения:
    382
    вы не поняли о чем я.
     
  12. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    valentin_p
    Может я не правильно сформировал свой вопрос? Но ntdll и kernel32 загружены. Я не собираюсь полностью загружать либу. А лишь хочу создать её копию в адресном пространстве. И все вызовы выполнять к этой копии. А не к оригинальной kernel32.dll
     
  13. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    а вы поняли о чем сабж?

    вообще то, что ты написал в первом сообщении отличается от "полностью загружать либу" только добавлением в "базу данных загрузчика")) в любом случае надо отладчиком смотреть, из-за чего падает...
     
  14. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    Rel
    Понятно что нужно смотреть отладчиком. Поэтому я и задал тут вопрос, чтобы сэкономить время на поиск причины ошибки. Думаю кто то здесь на форуме реализовывал данный метод.

    Я не уверен достаточно ли настроить релоки и импорт у копии библиотеки что бы она нормально функционировала?
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Aids
    Для dll, с которыми ядро по фиксированным адресам работает, (коими, если я правильно помню, как раз и являются ntdll.dll и kernel32.dll) недостаточно.
     
  16. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
  17. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    Aids
    ставим бряк на KiUserExceptionDispatcher, колаем CreateProcesA = ловим креш, рассматриваем что там было не проинициализировано...делов то.
     
  18. Aids

    Aids New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2007
    Сообщения:
    275
    кто знает что за зверь BasepAppCertDllsList? у меня эта переменная равна 0. Одна из причин почему падает CreateProcessA
     
  19. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    BasepAppCertDllsList - на скок помню это список длл-ок с реестра которые подгружает парент для проверки можно ли запускать текущую ехе на данной машине. Это двусвязный список и он должен указывать (когда пустой) сам на себя что bLink что fLink.

    Код (Text):
    1. mov     eax, offset _BasepAppCertDllsList       ;7C8858D0
    2. push    offset _gcsAppCert
    3. mov     dword_7C8858D4, eax
    4. mov     _BasepAppCertDllsList, eax
    вот так он инитится на ХР сп3. Почему он не проинитился у вас во время загрузки длл _BaseDllInitialize() нужно смотреть.
     
  20. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Что это такое, ответили выше.

    Во-первых, ты уверен, что вызвал точку входа kernel32.dll? Если да, то что она вернула? Во-вторых, я не уверен, что библиотеки ntdll.dll и kernel32.dll вообще можно загружать повторно, они на это не рассчитаны. Тут надо внимательно изучить их код в части инициализации (это всё есть в исходниках Windows 2000), как минимум. В худшем случае их инициализацию придётся выполнять полностью вручную, а это прилично работы.