我正在努力尋找能夠幫助我的管理層理解對已編譯的C代碼進行反向工程是多麼困難/容易的事實。反編譯彙編代碼有多難?
本網站提出過類似問題(例如,請參閱Is it possible to 「decompile」 a Windows .exe? Or at least view the Assembly?或Possible to decompile DLL written in C?),但這些問題的要點是反編譯的C代碼是「很難但並非完全不可能」。
爲了方便實際的答案,我包含了一個神祕函數的編譯代碼,我建議這個問題的答案衡量所提出的技術的成敗,看他們是否可以確定這個函數是什麼確實。這對於SO來說可能並不常見,但我認爲這是獲得這個工程問題的「良好主觀」或事實答案的最佳方式。因此,什麼是你最好的猜測這個功能在做什麼,以及如何?
這是編譯後的代碼,編譯Mac OSX上用gcc:
_mystery:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movsd LCPI1_0(%rip), %xmm1
subsd %xmm0, %xmm1
pxor %xmm2, %xmm2
ucomisd %xmm1, %xmm2
jbe LBB1_2
xorpd LCPI1_1(%rip), %xmm1
LBB1_2:
ucomisd LCPI1_2(%rip), %xmm1
jb LBB1_8
movsd LCPI1_0(%rip), %xmm1
movsd LCPI1_3(%rip), %xmm2
pxor %xmm3, %xmm3
movsd LCPI1_1(%rip), %xmm4
jmp LBB1_4
.align 4, 0x90
LBB1_5:
ucomisd LCPI1_2(%rip), %xmm1
jb LBB1_9
movapd %xmm5, %xmm1
LBB1_4:
movapd %xmm0, %xmm5
divsd %xmm1, %xmm5
addsd %xmm1, %xmm5
mulsd %xmm2, %xmm5
movapd %xmm5, %xmm1
mulsd %xmm1, %xmm1
subsd %xmm0, %xmm1
ucomisd %xmm1, %xmm3
jbe LBB1_5
xorpd %xmm4, %xmm1
jmp LBB1_5
LBB1_8:
movsd LCPI1_0(%rip), %xmm5
LBB1_9:
movapd %xmm5, %xmm0
popq %rbp
ret
Leh_func_end1:
UPDATE
@Igor Skochinsky是第一個找到正確的答案:這的確是一個天真的實現Heron算法計算平方根。原來的源代碼是在這裏:
#include <stdio.h>
#define EPS 1e-7
double mystery(double x){
double y=1.;
double diff;
diff=y*y-x;
diff=diff<0?-diff:diff;
while(diff>=EPS){
y=(y+x/y)/2.;
diff=y*y-x;
diff=diff<0?-diff:diff;
}
return y;
}
int main() {
printf("The square root of 2 is %g\n", mystery(2.));
}
你有7k +的聲望和地址「網站版主」?你沒有研究過這個網站的工作原理嗎? –
我想知道如果我現在應該啓動meta.so線程來處理此問題的合法性... – djechlin
可惜我沒有hexrays反編譯器許可證。我懷疑這代碼很簡單。 – CodesInChaos