Wie schwer ist es (wirklich) zu dekompilieren Assembler-code?

Ich versuche zu finden, die harten Fakten, die helfen, meine management-verstehen, wie schwer/einfach es ist das reverse-Engineering kompilierte C-code.

Ähnliche Frage gestellt, bevor auf dieser Website (siehe z.B. Ist es möglich, zu "dekompilieren" ein Windows .exe-Datei? Oder zumindest die Ansicht der Versammlung? oder Möglich, zu dekompilieren DLL in C geschrieben?), aber das wesentliche in diesen Fragen ist, dass der Dekompilierung der kompilierte C-code ist "hart, aber nicht völlig unmöglich".

Zur Erleichterung der Antworten basieren, in der Tat, ich bin auch von kompiliertem code für ein Rätsel Funktion, und ich schlage vor, dass Antworten auf diese Frage ermitteln Sie den Erfolg oder Misserfolg der vorgeschlagenen Techniken durch, ob Sie bestimmen können, was diese Funktion tut. Dies mag ungewöhnlich sein, für SO aber ich denke, es ist der beste Weg, um "gute subjektive" oder sachliche Antworten zu dieser technischen Frage. Daher Was ist Ihre beste Vermutung an, was diese Funktion tut, und wie?

Dies ist der kompilierte code, kompiliert auf Mac OS x mit 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 ist der erste, der die richtige Antwort: es ist in der Tat eine naive Implementierung des Heron-Algorithmus zur Berechnung von Quadratwurzeln. Der original source code ist hier:

#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.));
}
Sie haben 7k+ Ruf und die Adresse "Moderatoren"?? Haben Sie noch nicht herausgefunden, wie diese Seite funktioniert?
Wie ist "ratet mal, was mein assembler nicht?" überhaupt eine zulässige Frage? (oder war das Sarkasmus?)
Ich gebe Ihnen ein anderes Beispiel hier, wo 10 Zeilen inline-Funktionen und C++ - templates werden kompiliert in 4-5 Maschine Anweisungen. Was sind die Chancen, dass jemand reproduzieren können, die original-source-code?
Im Allgemeinen ist es unmöglich, die ursprüngliche Quelle ist absolut unmöglich, in den seltenen Fällen, in denen keine Optimierer verwendet wurde und der code war so trivial, dass Sie nicht brauchen, um die Mühe gehen wieder zurück zu C, dann könnten Sie rekonstruieren etwas, das ist funktional das gleiche.
Stellen Sie sich dies als Umwandlung einer wav-Datei in eine mp3-Datei (ein Bild, um jpg -, einen Film zu mpeg, etc) eine verlustbehaftete Komprimierung. Sie nicht mehr das ursprüngliche signal. Das gleiche passiert in den compiler an, Informationen aus dem source code kompilieren verloren ist, ist nicht sichtbar in der Ausgabe, können Sie nicht zurück zum original. Funktional ähnlich wie C-code, wo möglich, nicht mehr lesbar oder wartbar ist als die Assembler-Sprache, Sie sind besser dran, wenn Sie änderungen, um es in asm oder schreiben Sie C-code von hand aus einer Analyse der asm.

InformationsquelleAutor lindelof | 2013-01-13

Schreibe einen Kommentar