带GCC的逆向工程C代码-march=i686

带GCC的逆向工程C代码-march=i686,c,gcc,assembly,reverse-engineering,C,Gcc,Assembly,Reverse Engineering,这是我的C代码: int test(int x, int y){ int val=4*x; if (y>0){ if (x<y) val=x-y; else val=x^y; } else if (y<-2) val=x+y; return val; } 这是我得到的S文件(仅计算部分): 我的问题是:我可以使用上面的S文件返回完全相同的C代码吗?我的意思完全一样。例如,我是否可以确定val的默认值为4*

这是我的C代码:

int test(int x, int y){
    int val=4*x;
    if (y>0){
        if (x<y) val=x-y;
        else val=x^y;
    }
    else if (y<-2) val=x+y;
    return val;
}
这是我得到的S文件(仅计算部分):

我的问题是:我可以使用上面的S文件返回完全相同的C代码吗?我的意思完全一样。例如,我是否可以确定
val
的默认值为
4*x
(C代码的第2行)?我可以确定每个
if
语句的测试表达式吗


我真的需要你的帮助。谢谢你

在这种情况下,您可以发现每个寄存器对应一个变量:

  • %eax
    -
    var
  • %ebx
    -上下文临时变量
  • %ecx
    -
    x
  • %edx
    -
    y
如果标识符的意思是“精确”,则只有在名为“symbol table”的特殊结构出现时才有可能。(使用GCC中的
-g
标志编译)

无论如何,您应该知道,编译器始终可以优化代码。这意味着,在本例中,您的代码被更改为另一个具有相同数学含义的代码。如果您的代码是反向翻译的,那么应该是这样的

int test(int x, int y) {
    int val;
    if (y > 0) {
        if (x < y)
            val = x - y;
        else
            val = x ^ y;
    } else {
        if (y < -2)
            val = x + y;
        else
            val = 4 * x;
    }
    return val;
}
int测试(int x,int y){
int-val;
如果(y>0){
if(x

如果不希望进行优化,请使用标志
-O0
而不是
-O1

否。例如,无法确定变量名称。谢谢。实际上,这是我正在读的一本书上的练习题。书中的解决方案建议您确实可以使用上面的汇编代码来获得原始的C代码,因为GCC总是遵循一些特定的规则。例如,对于C中的“if”语句,编译器将首先考虑“否则”。这就解释了“jle L2”但是,即使这是真的,我仍然不能向后转换第6-12行和第14-17行,因为在这里编译器使用I66并且似乎同时考虑这两种情况…任何人都对这些部分的翻译有什么想法?这是使用条件指令的优化技巧。这样一来,树枝就少了。您可能知道分支会导致性能损失。所以您的意思是无法翻译这些部分?但是,我认为您可以。对试着编译你的代码和我的代码,然后最后一个
if
语句被
if(y>=-2)val=4*x替换;else val=x+y。GCC的足迹虽小但意义重大。如果你完全熟练,也许这是可能的。
pushl   %ebx
movl    8(%esp), %ecx
movl    12(%esp), %edx
testl   %edx, %edx
jle     L2
movl    %ecx, %eax
subl    %edx, %eax
movl    %edx, %ebx
xorl    %ecx, %ebx
cmpl    %edx, %ecx
cmovge  %ebx, %eax
jmp     L4

L2:
leal    0(,%ecx,4), %eax
addl    %edx, %ecx
cmpl    $-2, %edx
cmovl   %ecx, %eax

L4:
popl    %ebx
ret
int test(int x, int y) {
    int val;
    if (y > 0) {
        if (x < y)
            val = x - y;
        else
            val = x ^ y;
    } else {
        if (y < -2)
            val = x + y;
        else
            val = 4 * x;
    }
    return val;
}