Я пытаюсь найти твердые факты, которые помогут моему руководству понять, насколько сложно/легко перепрограммировать скомпилированный код C.
Аналогичные вопросы задавались на этом сайте (см., например, Возможно ли "декомпилировать" Windows.exe? Или, по крайней мере, просмотреть сборку? или Возможно декомпилировать DLL, написанную на 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
@Егор Скочинский первым найдет правильный ответ: это действительно наивная реализация алгоритма Херона для вычисления квадратных корней. Исходный код находится здесь:
#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.));
}