查询一个简单程序的反编译

时间:2012-07-30 17:43:30

标签: reverse-engineering

这是一个简单的程序,我已经粘贴了为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确实会显示源代码,我们可以解决它。当二进制文件缺少调试细节时,商业反编译器如何解决这个问题?

1 个答案:

答案 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这样的程序用来为您提供尽可能多的可靠信息。

其余的取决于反向者的体验。