gpt4 book ai didi

c++ - 如何在不链接 kernel32.dll 和 ntdll.dll 的情况下运行 PE 镜像

转载 作者:可可西里 更新时间:2023-11-01 13:13:12 24 4
gpt4 key购买 nike

我试图写一个 peloader。我首先将可执行镜像及其所有依赖的dll(包括kernel32.dll和ntdll.dll)加载到内存中,处理所有导入地址表,重写所有需要重定位的数据。

然后我按顺序调用所有图像的入口点。我从 ntdll.dll 的入口点得到返回码 0,但 kernel32.dll 返回 0xC0000000。当我尝试调用可执行镜像的入口点时,程序崩溃了。

我知道windows系统在创建进程时已经将ntdll.dll和kernel32.dll加载到进程内存中。我的问题是如何将 ntdll.dll 和 kernel32.dll 的另一个拷贝加载到内存中,并将我的模块链接到拷贝。

我做了一个实验:1. 复制ntdll.dll -> a.dll

  1. 复制 kernel32.dll -> b.dll
  2. 修改PE镜像文件b.dll,使其不依赖ntdll.dll而是依赖a.dll
  3. 编写一个简单的程序a.exe,修改PE镜像文件a.exe,使其不依赖于kernel32.dll,而是依赖于b.dll
  4. 运行a.exe,程序崩溃

是否可以让a.exe正常运行?

这是我关于堆栈溢出的第一个问题,对不起我糟糕的英语。谢谢。

最佳答案

我认为你做不到。 kernel32.dll 和 ntdll.dll,AFAIK 不可重定位。也就是说,MS 从它们中删除了重定位信息,因为它们已经加载到每个进程中,因此它们分配的地址始终可用,这是设计的。

因此,如果您尝试将它们加载到不同的地址,那么它们会崩溃。理论上你可以尝试为他们重建重定位信息……但我不会打赌。

我的问题是:为什么不能使用预加载的 kernel32/ntdll?为什么你觉得你需要私有(private)拷贝?在我看来,您应该将它们视为系统 API,因此不要理会它们。

关于c++ - 如何在不链接 kernel32.dll 和 ntdll.dll 的情况下运行 PE 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7481572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com