コンパイルされたCコードをリバースエンジニアリングすることがどれほど難しいか/簡単かを経営陣が理解するのに役立つ難しい事実を見つけようとしています。
このサイトでは以前にも同様の質問がありました(たとえば、Windows .exeを「逆コンパイル」することは可能ですか?または少なくともアセンブリを表示することはできますか?またはCで記述されたDLLを逆コンパイルすることは可能ですか?を参照)が、これらの質問の要点は次のとおりです。コンパイルされたCコードの逆コンパイルは「難しいですが、完全に不可能というわけではありません」。
実際に基づいた回答を容易にするために、ミステリー関数のコンパイル済みコードを含めます。この質問への回答は、この関数が何をするかを判断できるかどうかによって、提案された手法の成功または失敗を測定することを提案します。これはSOにとっては珍しいことかもしれませんが、このエンジニアリングの質問に対する「良い主観的」または事実に基づく回答を得るのに最適な方法だと思います。したがって、この関数が何をしているのか、そしてどのように行うのかについてのあなたの最良の推測は何ですか?
これは、MacOSXで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:
アップデート
@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.));
}