某些可执行文件的每个 ghidra 反编译函数中带有 0xcccccccc 的模板代码

逆向工程 反编译器 吉德拉
2021-06-23 16:55:48

我经常在反编译程序的每个函数的开头都有一些这样的代码:

iVar1 = 0x42;
  puVar2 = local_10c;
  while (iVar1 != 0) {
    iVar1 = iVar1 + -1;
    *puVar2 = 0xcccccccc;
    puVar2 = puVar2 + 1;
  }

网络搜索中的 0xcccccccc 似乎与“未初始化的内存”有关,但我没有看到带有此总括代码的链接。

它是什么?它有什么目的?为什么每个函数都有它作为“模板”?

2个回答

0xCCint 3x86体系结构中代表,这是用于software breakpoint调试器实现的特殊中断

因此,此代码将内存设置为用于调试目的的int 3中断想象一下,代码意外地跳转到某个随机位置。如果存在一些垃圾字节,则行为未定义。

但是,在这种跳转访问int 3指令的情况下,它只会software breakpoint在调试器中引起,从而阻止 udefined 行为的发生,并向您显示发生了一些奇怪的跳转并在此时停止执行,就像您在那里设置断点的情况一样.

注意:移动0xCCCCCCCC只是将4连续字节设置0xCC.

这可能是 Visual C++ 在调试构建设置中编译的代码。在这种情况下,编译器会生成用字节 0xCC 填充所有堆栈变量的代码,以便在调试期间可以清楚地看到任何未初始化的值。另见https://stackoverflow.com/a/11865164