Выполняю следующие действия. 1)Выделяю память равную SizeImage с атрибутами чтения, записи, исполнения VirtualAlloc. 2)Настраиваю релоки. 3)Настраиваю импорт. Загружаю в импорте библиотеки LoadLibrary и нахожу функции по именам и ординалам 4)Выполняю DllEntry(ImageBase,1,0,0) В результате такой работы часть функций работают, но не все. Например CreateThread, GlobalAlloc работают. А вот на CreateProcessA валится. Dll написаные мной таким способом прогружаются нормально. А вот у системных похоже что то ещё не проинициализировал.
есть смысл их подгружать вручную? они и так уже находятся в вашем процессе... ntdll.dll вообще есть во свех процессах... если этот алгоритм предполагает обход какой-нить левой защиты, то эта защита - полный гуан... вообще с системными dll есть свои заморочки... например, насколько я помню, динимическая база у них появилась только с ASLR (то есть до ASLR библиотека должна располагаться по строго определенной базе)... кроме того вполне возможно ядерный загрузщик того же ntdll.dll инициализирует ей какие-то глобальные переменные для модуля... вообще надо глубоко копать в этом вопросе, и скорее всего придется копать отладчиком... возвращаемся к первому вопросу, а оно вам надо в принципе и зачем оно вам надо?)
Rel Ну например снять хуки в usermode, и усложнить анализ кода (в OllyDbg ни одной экспортируемой функции не будет видно с символическим названием) Вот меня и интересуют эти заморочки. Возможно кто то реализовал уже подобную штуку. И сталкивался с этим
эти цели можно решить проще... обойти хуки своими трамплинами (пролог функции можно узнать считав файл с диска), если это сплайсинг... про модификацию IAT мы похоже не говорим... про анализ кода - динамический импорт по хеш-значению имени функции и хеш-значению имени библиотеки...
Rel это у меня уже сделано. не. трамплины не красиво. Уж лучше потереть хуки загрузкой оригинальной dll в то же адресное пространство. Конечно это не гарантирует что хуки не будут поставлены снова, но в большинстве случаев это работает. Но пока я всё же хочу прогрузить kernel32 и ntdll самостоятельно.
то есть если вы (я не в коем случае не подумал что это обход для win7) пишете (я не в коем случае не подумал что это вирус) программу с обходом хуков - нет смысла убивать загруженные либы. загрузите их копии(имя-это сигнатура для механизма раздачи хуков - если вы в шоке) или часть либы(думайте сами)
кстати лол - а как загрузить либу без ntdll ? помнить номера сервисов для всех виндов? мне кажется вам надо еще посидеть с отладчиком в руках. вы видимо не подумали о том что подгружаемые в процессе исполнения модули будут тут же похуканы снова -> обходите этот механизм, а не изобретайте как загрузить без всего (что иногда бессмысленно ибо r3) ну вы поняли
кстати лол... о чем вы говорите? ntdll.dll есть всегда, ее не может не быть... а загрузить лругую либу можно и без ее использования... модули загружаемые снова? модуль не может загрузиться два раза в один процесс штатными средствами, на то есть "база данных загрузчика", как говорил незабвенный Инде Клерк... не, ну ради Бога... и кстати, если некоторые функции работают, а некоторые нет, я бы первым делом проверил функицю настраивающую релоки, но почти наверняка дело не в этом...
valentin_p Может я не правильно сформировал свой вопрос? Но ntdll и kernel32 загружены. Я не собираюсь полностью загружать либу. А лишь хочу создать её копию в адресном пространстве. И все вызовы выполнять к этой копии. А не к оригинальной kernel32.dll
а вы поняли о чем сабж? вообще то, что ты написал в первом сообщении отличается от "полностью загружать либу" только добавлением в "базу данных загрузчика")) в любом случае надо отладчиком смотреть, из-за чего падает...
Rel Понятно что нужно смотреть отладчиком. Поэтому я и задал тут вопрос, чтобы сэкономить время на поиск причины ошибки. Думаю кто то здесь на форуме реализовывал данный метод. Я не уверен достаточно ли настроить релоки и импорт у копии библиотеки что бы она нормально функционировала?
Aids Для dll, с которыми ядро по фиксированным адресам работает, (коими, если я правильно помню, как раз и являются ntdll.dll и kernel32.dll) недостаточно.
Вот нашёл код, который видимо работал на XP, но на Win7 x86 такая же проблема как и у меня при вызове CreateProcesA http://slesh.name/?act=articles&subact=show&nid=12
Aids ставим бряк на KiUserExceptionDispatcher, колаем CreateProcesA = ловим креш, рассматриваем что там было не проинициализировано...делов то.
кто знает что за зверь BasepAppCertDllsList? у меня эта переменная равна 0. Одна из причин почему падает CreateProcessA
BasepAppCertDllsList - на скок помню это список длл-ок с реестра которые подгружает парент для проверки можно ли запускать текущую ехе на данной машине. Это двусвязный список и он должен указывать (когда пустой) сам на себя что bLink что fLink. Код (Text): mov eax, offset _BasepAppCertDllsList ;7C8858D0 push offset _gcsAppCert mov dword_7C8858D4, eax mov _BasepAppCertDllsList, eax вот так он инитится на ХР сп3. Почему он не проинитился у вас во время загрузки длл _BaseDllInitialize() нужно смотреть.
Что это такое, ответили выше. Во-первых, ты уверен, что вызвал точку входа kernel32.dll? Если да, то что она вернула? Во-вторых, я не уверен, что библиотеки ntdll.dll и kernel32.dll вообще можно загружать повторно, они на это не рассчитаны. Тут надо внимательно изучить их код в части инициализации (это всё есть в исходниках Windows 2000), как минимум. В худшем случае их инициализацию придётся выполнять полностью вручную, а это прилично работы.