1

我的 exe 依赖于 ntdll、user32 和 kernel32。我将这些 dll 保存为本地副本并将第一个字母更改为“V”。然后我将 exe 的 Import dll 名称编辑为来自 kernel32 的 Vernel32.dll。通过在本地空间中加载 vernel32.dll,该应用程序可以正常工作。接下来,我将 exe 的导入 dll 规范编辑为 vtdll 作为 ntdll,该进程从本地加载 vtdll,运行其代码并在 vtdll 指令上引发 _stackhash 异常。

我需要它来开发我的应用程序以捆绑所有 Windows 依赖项。有没有人有任何想法,为什么 ntdll 不能在本地空间运行。

4

4 回答 4

2

我发现“捆绑”系统 DLL 的想法不是一个好主意。

首先,将这些 DLL 与您的应用程序一起重新分发是非法的。几秒钟后您应该明白,一个 DLL 可以创建一些全局对象,而使用同一个 DLL 的两个副本(vtdll.dll 和 ntdll.dll)是行不通的。您没有编写如何修改 dll 的导入。如果你在磁盘上执行它是非法的,而且它会破坏文件的签名(打开任何 dll 的文件属性并查看“数字签名”选项卡)。

如果您确实想尝试使用不同的系统 dll 副本,您可以通过创建名为 myapp.exe 的文件来更好地使用 DLL 重定向(请参阅http://msdn.microsoft.com/en-us/library/ms682600.aspx ) .local 其中 myapp.exe 是您的应用程序的名称。为此,可能需要删除一些条目HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。您应该了解,在此之后您的计算机将运行缓慢,我建议在虚拟机内进行此类实验,如果不再启动,您可以轻松恢复。

于 2010-07-07T13:21:37.240 回答
2

不!您不能尝试替换 ntdll。它被内核映射到每一个进程中,甚至可能在你的任何代码被加载之前。它与内核有着复杂的联系。它知道所有正确的系统调用号。尝试使用 NT 5.1 中的 ntdll,它会在 NT 6.1 上崩溃。ntdll 承载系统调用进入和退出代码。内核用户回调调度程序代码。内核知道地址的线程启动函数。用户异常调度程序。用户 APC 处理程序。我可以继续,但我不会。

I don't see why you're trying to "bundle" these DLLs with your program. There is no way a Windows install won't have these DLLs. And that's ZERO chance for ntdll.dll since I don't see how without the session manager and CSR you are going to run your program in the first place.

于 2010-07-09T12:45:08.463 回答
0

谢谢你提供的详情。它帮助我对它进行了研究。

我没有为我自己的应用程序捆绑 dll。我正在为现有的应用程序提供 Windows 跨平台独立性解决方案。

我尝试了您发布的所有应用程序的 dll 重定向技术。它适用于除 NTdll 和 User32.dll 之外的所有 dll

User32.dll: 它只从本地空间而不是内核空间加载 user32.dll。我确认了。但在执行其指令时,会导致空地址访问异常(c0000005),错误模块名称为 StackHash_5964

ntdll: 启动时的应用程序,它从system32加载ntdll并再次从本地空间加载ntdll,这可能会导致您所说的错误(全局对象共享冲突)这只发生在ntdll而不是user32.dll。

有什么办法可以让我们只加载一次ntdll(仅从本地空间)并避免本地空间中user32.dll引起的错误。

于 2010-07-08T11:21:11.280 回答
0

我尝试了您发送的参考资料,结果如下。

User32.dll

我无法构建具有以下这些功能的 user32.dll。IsThreadDesktopComposited = user33.IsThreadDesktopComposited, User32InitializeImmEntry = user33.User32InitializeImmEntry 它产生链接器错误(未解析的外部符号“IsThreadDesktopComposited”)

因此,我在 user32.dll 中的 800 个函数中留下了 100 个这样的函数。DLL终于建好了。然后我将 dll 与 user33.dll 一起放置在本地空间中。在运行应用程序时,它说未找到 100 个丢失的函数过程入口点。

ntdll.dll

我尝试删除已知的 dll。但它无法用于修改或删除操作。我只能阅读。我是管理员并以管理员身份运行 regedit。

是否可以为 ntdll 或 user32.dll 执行此类实现。我想,我会重复多次。感谢你的帮助。但是,如果您有任何其他方法或任何建议可以提出,那将不胜感激

于 2010-07-09T12:35:47.003 回答