我正在努力寻找能够帮助我的管理层理解对已编译的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