无法获取从 msvcrt.dll 导出的内部 CRT 函数的地址

Couldn't get the address of internal CRT functions exported from the msvcrt.dll

提问人:Antoine Hazebrouck 提问时间:11/23/2022 更新时间:11/23/2022 访问量:64

问:

我目前正在做一个个人项目:一个 32 位 PE 加载器

我做了很多研究,并遵循了一些非常有趣的教程,例如:
https://bidouillesecurity.com/tutorial-writing-a-pe-packer-part-1/
https://0xrick.github.io/win-internals/pe8/#initparse

很快,我的项目的主要目标是将 32 位 PE 加载并执行到内存中
为此,我完成了以下步骤:

  • 分配相当于我的 32 位 PE 的图像大小 (SizeOfImage) 的内存量(在我的情况下为 calc.exe)
  • 在内存中加载我的 PE 的标头
  • 在内存中加载我的 PE 的部分
  • 加载我的 PE 使用的 dll 函数
  • 执行搬迁
  • 在每个部分上设置正确的权限
  • 执行我的 PE 的入口点

我点击了上面的两个链接,但是我收到一个错误,我无法运行calc.exe(“C:\Windows\SysWOW64\calc.exe”)。

经过几个小时的调查,我意识到我无法获取从 msvcrt.dll 导出的几个函数的地址。事实上,GetProcAddress 函数向我返回了其中三个的错误代码 127。他们来了:

  • __p__fmode
  • __p__commode
  • _except_handler4_common

多亏了 Microsoft 文档,我意识到这些函数是内部 CRT 函数和函数宏。我不得不承认,我没有完全理解它们的用途,以及是否与我的问题有真正的联系。
来源:https://learn.microsoft.com/en-us/cpp/c-runtime-library/internal-crt-globals-and-functions?view=msvc-170

PS:我在 Windows 11 下,我在 Visual Studio 2022 上编码,我没有更改默认编译选项。

C DLL 移植可执行 crt getprocaddress

评论

0赞 John Bollinger 11/23/2022
是的,宏没有地址,实际上也没有任何运行时标识。它们在编译时具有全部效果。“内部函数”可能意味着几件事,但大多数都与无法从单独的模块获取函数的地址一致,事实上,也无法在另一个模块中出于任何目的通过名称引用它。“另一个模块”将包括 ,所以我怀疑这些问题对你来说是一个红鲱鱼。calc.exe
0赞 Antoine Hazebrouck 11/24/2022
@JohnBollinger 谢谢你的回答。你认为我的加载器不工作导致 Visual Studio 2022 的默认编译选项吗?还是导致我的操作系统版本(我使用的是 Windows 11)?事实上,通过复制和粘贴这些教程项目的源代码,我无法执行 calc.exe。回到宏函数,我怎样才能在我的加载器中使用它们(因为 GetProcAddress 返回我一个错误)?
0赞 John Bollinger 11/24/2022
对不起,我不准备猜测为什么你的装载机不工作。对于宏,当且仅当存在该宏的范围内定义时,才能使用该宏。对于您所询问的第三方宏,通常通过包含适当的头文件来获得此类定义。每个宏的使用都是在编译时处理的 -- 在生成的可执行代码中不保留对任何宏的引用。
0赞 ssbssa 11/24/2022
我的副本确实有这 3 个函数,并将它们返回给我就好了。msvcrt.dllGetProcAddress
0赞 Antoine Hazebrouck 11/25/2022
@ssbssa请问您的编译选项是什么?

答: 暂无答案