Почему загрузка Ntdll из локальной папки вызывает исключение? - PullRequest
1 голос
/ 07 июля 2010

Мой exe зависит от ntdll, user32 и kernel32. Я сохраняю эти dll как локальную копию и меняю первую букву как «V». Затем я редактирую имя dll импорта exe-файла как Vernel32.dll из kernel32. Приложение работает нормально, загружая vernel32.dll в локальном пространстве. Затем я редактирую спецификации dll для импорта из exe как vtdll как ntdll, процесс загружает vtdll из локальной системы, запускает свой код и выдает исключение _stackhash в инструкциях vtdll.

Мне это нужно для разработки моего приложения для объединения всех оконных зависимостей. Любое тело имеет какие-либо идеи, почему ntdll не может быть запущен в локальном пространстве.

Ответы [ 4 ]

2 голосов
/ 09 июля 2010

Нет!Вы не можете попробовать заменить ntdll.Он отображается ядром в каждом отдельном процессе, вероятно, еще до того, как какой-либо ваш код будет загружен.Он имеет сложную связь с ядром.Он знает все правильные номера системных вызовов.Попробуйте использовать ntdll из NT 5.1, и он потерпит крах в NT 6.1.ntdll содержит код входа и выхода из системного вызова.Код диспетчера обратного вызова пользователя ядра.Функция запуска потока, адрес которой ядро ​​знает.Диспетчер пользовательских исключений.Пользовательский обработчик APC.Я мог бы продолжать, но я не буду.

Я не понимаю, почему вы пытаетесь "связать" эти библиотеки DLL с вашей программой.Нет никакой возможности, чтобы установка Windows не имела этих библиотек DLL.И это нулевой шанс для ntdll.dll, так как я не вижу, как без менеджера сеансов и CSR вы в первую очередь собираетесь запустить свою программу.

2 голосов
/ 07 июля 2010

Я считаю, что идея "связывать" системную DLL не очень хорошая идея.

Прежде всего, незаконно распространять эти DLL вместе с вашим приложением.За несколько секунд вы должны понять, что DLL может создавать некоторые глобальные объекты, и использование двух копий одной и той же DLL (vtdll.dll и ntdll.dll) может не работать.Вы не написали, как вы изменили импорт DLL.Если вы делаете это на диске, это незаконно и, кроме того, оно нарушает сигнатуру файлов (откройте свойства файла любой из библиотек и посмотрите на вкладку «Цифровые подписи»).с разными копиями системных библиотек вы можете лучше использовать перенаправление DLL (см. http://msdn.microsoft.com/en-us/library/ms682600.aspx) через создание файлов с именем myapp.exe.local, где myapp.exe - имя вашего приложения. Может потребоваться удалить некоторыедля этого введите HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs. Вы должны понимать, что после этого ваш компьютер будет работать медленно, и я рекомендую проводить такие эксперименты лучше на виртуальной машине, которую можно легко восстановить, если она больше не будет загружаться.

0 голосов
/ 09 июля 2010

Я попробовал отправленные вами ссылки, и вот результаты.

User32.dll

Я не смог собрать user32.dll с этими функциями ниже. IsThreadDesktopComposited = user33.IsThreadDesktopComposited, User32InitializeImmEntry = user33.User32InitializeImmEntry Выдает ошибку компоновщика (неразрешенный внешний символ "IsThreadDesktopComposited")

Следовательно, я оставил 100 таких функций из 800 функций в user32.dll. DLL была построена окончательно. Затем я поместил DLL в локальном пространстве вместе с user33.dll. При запуске приложения говорится, что 100 точек входа в процедуру пропущенных функций не найдены.

Ntdll.dll

Я пытался удалить известные DLL. Но он недоступен для операций изменения или удаления. Я мог просто читать. Я администратор и управлял regedit в качестве администратора.

Можно ли сделать такие реализации для ntdll или user32.dll. Я предполагаю, я иду с повторными временами. Спасибо за вашу помощь. Но, если у вас есть какие-либо другие способы или предложения, которые вы можете сделать, это было бы признательно

0 голосов
/ 08 июля 2010

Спасибо за информацию. Это помогло мне провести исследование.

Я не собираю dll для своего приложения. Я делаю это для существующих приложений, чтобы обеспечить решение межплатформенной независимости Windows.

Я попробовал технику перенаправления dll, которую вы опубликовали, со всеми приложениями. Хорошо работает со всеми dll, кроме NTdll и User32.dll

User32.dll: Он загружает user32.dll только из локального пространства, а не из пространства ядра. Я подтвердил это. Но при выполнении его инструкций это приводит к исключению доступа с нулевым адресом (c0000005) с именем модуля ошибки StackHash_5964

Ntdll: Приложение при загрузке загружает ntdll из system32 и снова загружает ntdll из локального пространства, что может вызвать ошибку, как вы сказали (нарушение общего доступа к глобальным объектам) Это происходит только для ntdll, а не для user32.dll.

Есть ли способ, которым мы можем один раз загрузить ntdll (только из локального пространства) и избежать ошибок, вызванных user32.dll в локальном пространстве.

...