这是一个简单的程序,我已经粘贴了为x86_64生成的程序集以及C源代码。
int main()
{
4004b4: 55 push %rbp
4004b5: 48 89 e5 mov %rsp,%rbp
int array[10];
array[0] = 5;
4004b8: c7 45 d0 05 00 00 00 movl $0x5,-0x30(%rbp)
return 0;
4004bf: b8 00 00 00 00 mov $0x0,%eax
}
我知道程序反编译工具,如IDA-pro,dcc等,但我不知道这些程序如何能够找出像数组边界这样的细节。更一般地说,是否有任何方法可以找出只是看待汇编,
movl $0x5,-0x30(%rbp)
实际上是对int array[10]
的操作?我可以看到,如果程序是用-g
编译的,即使用调试信息,那么objdump
确实会显示源代码,我们可以解决它。当二进制文件缺少调试细节时,商业反编译器如何解决这个问题?
答案 0 :(得分:0)
我认为你不能在你的例子中找到答案。该功能中的代码太少了。
如果它是一个更大的函数,多次使用该数组,你可能会发现一些指向它的提示。像基地址+不同的偏移量弹出进出生成的机器代码。
弱假设:
for (i = 0; i < 10; i++)
array[i] = i * 2;
这将允许您通过查看生成的代码来假设您正在处理10个整数的数组。
更强的案例:
int *array = NULL;
array = malloc(10 * sizeof *array);
if (array == NULL)
return ENOMEM;
for (i = 0; i < 10; i++)
array[i] = i * 2;
这将使你确实处理10个整数的数组。
在您的情况下,您只有原始信息:函数在堆栈上分配10 * sizeof(int)字节。 (这实际上取决于优化器,但这是另一个主题)。
所有这些都是关于启发式和代码模式识别算法,像IDA这样的程序用来为您提供尽可能多的可靠信息。
其余的取决于反向者的体验。