簡體   English   中英

使用GCC -march = i686反向工程C代碼

[英]Reverse engineering C codes with GCC -march=i686

這是我的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;
}

這是我在GCC命令行中輸入的內容:

gcc -O1 -S -march=i686 test.c

這是我得到的S文件(只有計算部分):

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

我的問題是:我可以使用上面的S文件找回完全相同的C代碼嗎? 我的意思是完全一樣的。 例如,我可以確定val的默認值是4*x (C代碼的第2行)嗎? 我可以確定每個if語句的test-expression嗎?

我真的需要你的幫助。 謝謝!!!

在這種情況下,您可以發現每個寄存器對應一個變量:

  • %eax - var
  • %ebx - 上下文臨時變量
  • %ecx - x
  • %edx - y

如果對標識符的意思是“確切”,則只有在名為“符號表”的特殊結構時才有可能。 (在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;
}

如果您不想進行優化,請使用標志-O0而不是-O1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM