Visual Studio 内存分配逆向工程

逆向工程 拆卸 二元分析 C++ 静态分析 编译器
2021-07-09 16:43:37

我使用 Visual Studio 2010 编译器编译此代码:

#include "stdafx.h"
#include <iostream>
int main() {
   int *p;
   p = new int(255);
   delete []p;
}

它的反汇编,不同于Dev C++。似乎它首先检查是否有足够的内存,然后开始分配。我对吗?

这是拆解:

在此处输入图片说明

在橙色节点中:

为什么esiedi推入堆栈?mov eax,0CCCCCCCCh以前在书中看到过,这条指令有什么作用?橙色节点突出显示的部分有什么作用?是否检查是否有足够的可用内存?

在蓝色节点中:

FFh等于255,你能解释一下内存是如何分配的吗?

1个回答

在尝试逆向工程之前,您可能需要阅读有关装配的信息。

  1. esi并被edi压入堆栈,因为编译器认为此例程会修改它们。(这是错误的,因为 onlyedi被使用。不过,安全总比抱歉好。)

  2. mov eax,0cccccccch将值 0CCCCCCCCh 移入寄存器 eax。这实际上是不言自明的。该说明本身并没有什么特别有用的功能,您在提出此类问题时应该小心。接下来的可以清楚地看出,该值被存储到局部变量区域中,用“已知”值填充它,而不是具有随机值。

    值 0CCCCCCCCh 用作标记,因此如果上下文是“它被存储在某处”,那么它的目的是捕获未初始化的指针。

  3. 再次,是时候进行组装复习了。第一个突出显示的行

    add esp, 4
    

    不是下面的说明部分,它的堆栈清理了以前的指令:在call

    线条mov [ebp+var_E0], eaxcmp [ebp+var_E0], 0什么都没有做任何形式的“分配”或“内存”!它所做的只是将eaxcall一个的返回值保存到一个局部变量中,然后测试该值是否为 0。那是样板生成的代码

    var_E0 = new (uint);
    if (var_E0 == 0)
       ...
    

    这是唯一的“检查”,并且仅尝试分配之后,而不是之前。

  4. “蓝色节点”:汇编程序中的代码执行 C++ 代码应该执行的操作。在之前(在对 的调用中为单个整数分配了空间,并且在蓝色节点中,它将值 255存储到新分配的内存中。如果您希望它分配 255 个字节:那么不。它执行 C++ 代码应该执行的操作,这在“new int(100)”做什么?以及被标记为重复的问题。push 4new