【问题标题】:Is there an allocate winapi call in x86 EXEs?x86 EXE 中是否有分配 winapi 调用?
【发布时间】:2013-01-28 15:51:45
【问题描述】:

如何在 C++ 编译的 EXE 中处理分配?如果您没有代码,分配管理器是否已融入应用程序,从而无法跟踪分配/取消分配?或者是否有 WinAPI 调用或类似的内存分配?

【问题讨论】:

  • 当您从VMMap 启动应用程序时,该应用程序被检测为跟踪各个内存分配(Heep*、Alloc*、malloc)以及相关的调用堆栈了解函数地址,您可以了解 EXE 中分配发生的位置

标签: c++ memory memory-management x86 opcodes


【解决方案1】:

内存分配的基础确实是一些 WinAPI 调用(通常是 Heap 功能)。这些“隐藏”在operator newmalloc 以及其他相关功能的后面。您应该能够识别对堆函数的调用,但在原始堆和实际内存分配调用之间可能有几层函数。

编辑:显然,如果程序被编译为使用 C 运行时作为 .DLL,则实际执行分配的代码根本不在可执行文件中 - 它会在 DLL 中。

当然,编写代码的程序员很可能: 1. 没有使用 C/C++,在这种情况下,所有的赌注都被取消了。 2. 以某种方式编写自己的内存管理版本,例如使用VirtualAlloc

【讨论】:

  • 假设我在 IDA Pro 中打开了一个 EXE,有没有办法识别这种分配?
  • 这取决于 - 我刚刚添加了更多信息。寻找 malloc、new、realloc 之类的东西。或“堆”或“分配”。
  • 因为这是一个 XY 问题,你问如何做 Y,因为你想做 X,你认为 Y 将是前进的方向[就像问汽车修理工如何失去一个轮子当你有一个爆胎时螺母 - 后来意识到你需要抬起汽车以防止在你卸下车轮时它掉下来],如果你澄清你实际想要达到的目标可能会有所帮助。
  • 我只是想了解在我没有代码的 EXE 中进行分配的位置。我在问这是否容易实现并试图了解它是如何工作的。
  • 如果您有相当多的经验,那当然是可能的。根据大小、样式和应用程序的一般编写方式,即使有经验也可能不容易!为什么你特别关心分配是我要问的更多。
【解决方案2】:

一般情况下,分配函数由你的C运行库提供。该库又是由您的供应商编写的。 Microsoft 的 Visual C++ 可能会使用 Windows 内核例程来实现分配,但您应该查看文档和/或询问您的供应商。

【讨论】:

  • 假设我在 IDA Pro 中打开了一个 EXE,有没有办法识别这种分配?
  • 可能只是从加载 mscvrt.dll 符号签名开始。如果二进制文件没有经过高度优化或混淆,您可能会发现导入的外部文件,如 .. 'malloc' :)
  • 我会从STraceNT 之类的东西开始检查系统调用。或者,您可以使用某种 DLL 资源管理器(“Dependency Walker”?)查看是否可以在 C 运行时 DLL 中找到相关的库函数并对其进行反汇编。
【解决方案3】:

通常两者兼而有之。普通代码通过标准库中内置的堆管理器分配内存。反过来,这会从操作系统分配更大的内存块,然后允许其余代码从那个大块分配更小的内存。

堆管理器是否实际在应用程序中取决于它是如何编译和链接的。如果它在 DLL 中使用标准库,那么它将使用标准库 DLL 中的代码。如果它静态链接到标准库,那么堆管理器代码将链接到可执行文件本身。

【讨论】:

  • 假设我在 IDA Pro 中打开了一个 EXE,有没有办法识别这种分配?
  • @Geotarget:来自操作系统的分配通常会以调用VirtualAllocHeapAlloc 等结束。程序内部的分配通常会以调用malloccalloc 结束、::operator new
  • 这些调用的残余在 EXE 中是否容易看到?例如malloc - 可以在 EXE 中轻松发现吗?
  • @Geotarget:是的,通常。 IDA Pro 通过标准库知道对malloc 的调用通常会被标记为这样(即,代码将读取类似push some_val; call _malloc
猜你喜欢
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多