我经常在反编译程序的每个函数的开头都有一些这样的代码:
iVar1 = 0x42;
puVar2 = local_10c;
while (iVar1 != 0) {
iVar1 = iVar1 + -1;
*puVar2 = 0xcccccccc;
puVar2 = puVar2 + 1;
}
网络搜索中的 0xcccccccc 似乎与“未初始化的内存”有关,但我没有看到带有此总括代码的链接。
它是什么?它有什么目的?为什么每个函数都有它作为“模板”?
我经常在反编译程序的每个函数的开头都有一些这样的代码:
iVar1 = 0x42;
puVar2 = local_10c;
while (iVar1 != 0) {
iVar1 = iVar1 + -1;
*puVar2 = 0xcccccccc;
puVar2 = puVar2 + 1;
}
网络搜索中的 0xcccccccc 似乎与“未初始化的内存”有关,但我没有看到带有此总括代码的链接。
它是什么?它有什么目的?为什么每个函数都有它作为“模板”?
0xCCint 3在x86体系结构中代表,这是用于software breakpoint调试器实现的特殊中断。
因此,此代码将内存设置为用于调试目的的int 3中断。想象一下,代码意外地跳转到某个随机位置。如果存在一些垃圾字节,则行为未定义。
但是,在这种跳转访问int 3指令的情况下,它只会software breakpoint在调试器中引起,从而阻止 udefined 行为的发生,并向您显示发生了一些奇怪的跳转并在此时停止执行,就像您在那里设置断点的情况一样.
注意:移动0xCCCCCCCC只是将4连续字节设置为0xCC.
这可能是 Visual C++ 在调试构建设置中编译的代码。在这种情况下,编译器会生成用字节 0xCC 填充所有堆栈变量的代码,以便在调试期间可以清楚地看到任何未初始化的值。另见https://stackoverflow.com/a/11865164