b'\n_START_ARTICLE_\nDekompilering\n_START_PARAGRAPH_\nMed dekompilering avses den process d\xc3\xa4r ett program som tidigare kompilerats till maskinkod eller bytekod \xc3\xb6vers\xc3\xa4tts till ett h\xc3\xb6gniv\xc3\xa5spr\xc3\xa5k med hj\xc3\xa4lp av en dekompilator.\n_START_SECTION_\nBegr\xc3\xa4nsningar\n_START_PARAGRAPH_\nDen anv\xc3\xa4ndare som f\xc3\xb6rv\xc3\xa4ntar sig kunna \xc3\xa5terst\xc3\xa4lla k\xc3\xa4llkod fr\xc3\xa5n maskinkod helt automatiskt blir snabbt besviken. F\xc3\xb6rutom att dekompilatortekniken fortfarande \xc3\xa4r v\xc3\xa4ldigt omogen, \xc3\xa4r det bevisligen matematiskt om\xc3\xb6jligt att dekompilera ett maskinkodsprogram till sin ursprungliga k\xc3\xa4llkodsform. Detta f\xc3\xb6ljer fr\xc3\xa5n Alan Turings ber\xc3\xb6mda stopproblem._NEWLINE_Dessutom f\xc3\xb6rsvinner mycket information n\xc3\xa4r k\xc3\xa4llkod kompileras av exempelvis en C-kompilator. Bland annat f\xc3\xb6rsvinner funktionsnamn, och i m\xc3\xa5nga fall \xc3\xa4r det sv\xc3\xa5rt att avg\xc3\xb6ra om ett givet v\xc3\xa4rde \xc3\xa4r en programadress eller ett vanligt heltal. Att felaktigt betrakta ett heltal som en programadress leder dekompilatorn att f\xc3\xb6rs\xc3\xb6ka dekompilera datav\xc3\xa4rden, vilket ger fel resultat._NEWLINE_De vanliga bytekodformaten, som till exempel Javaklasser och .NET Framework-assemblies, \xc3\xa4r n\xc3\xa5got enklare att dekompilera eftersom anv\xc3\xa4ndbar metadata (som funktions- och variabelnamn) medf\xc3\xb6ljer i programfilerna. F\xc3\xb6r att f\xc3\xb6rsv\xc3\xa5ra dekompilering finns det s\xc3\xa4rskilda s\xc3\xa5 kallad obfuscator-program, som genom f\xc3\xb6r\xc3\xa4ndringar i metadatan f\xc3\xb6rs\xc3\xb6ker att g\xc3\xb6ra den dekompilerade koden obegriplig._NEWLINE_I praktiken betyder informationsf\xc3\xb6rlusten vid kompilering att en dekompilatoranv\xc3\xa4ndare m\xc3\xa5ste bist\xc3\xa5 dekompilatorn med kompletterande information f\xc3\xb6r att underl\xc3\xa4tta dess arbete. Exempel p\xc3\xa5 s\xc3\xa5dan information \xc3\xa4r anv\xc3\xa4ndarv\xc3\xa4nliga namn f\xc3\xb6r funktioner, adresser f\xc3\xb6r k\xc3\xa4nda funktioner, och adressomr\xc3\xa5den som dekompilatorn b\xc3\xb6r undvika eftersom det \xc3\xa4r k\xc3\xa4nt att de enbart inneh\xc3\xa5ller data och ingen programkod. Dekompilering blir p\xc3\xa5 detta s\xc3\xa4tt en dialog mellan anv\xc3\xa4ndare ist\xc3\xa4llet f\xc3\xb6r en automatiserad process som kompilering.\n_START_SECTION_\nF\xc3\xb6rlopp\n_START_PARAGRAPH_\nDen f\xc3\xb6rsta dekompileringsfasen best\xc3\xa5r av inl\xc3\xa4sning av maskinkodsprogrammet. Ofta \xc3\xa4r det lagrat i ett bin\xc3\xa4rformat som \xc3\xa4r OS-specifikt, och som ger v\xc3\xa4rdefull information om vilka adresser startfunktionerna har. Exempelvis m\xc3\xa5ste headern i en programfil som kompilerats fr\xc3\xa5n ett C-program inneh\xc3\xa5lla adressen till funktionen main(), som \xc3\xa4r startfunktionen i de flesta C-program.\n_START_SECTION_\nDisassemblering\n_START_PARAGRAPH_\nNu f\xc3\xb6ljer en disassembleringsfas, d\xc3\xa4r startfunktionernas maskinkod unders\xc3\xb6ks, disassembleras, och \xc3\xb6vers\xc3\xa4tts till ett internt intermedi\xc3\xa4rt (och maskinneutralt) format. Maskinspecifika sekvenser \xc3\xb6vers\xc3\xa4tts till maskinneutrala s\xc3\xa5dana. Exempelvis kan den stereotypa 80386-sekvensen:_NEWLINE_    cdq    eax_NEWLINE_    xor    eax,edx_NEWLINE_    sub    eax,edx_NEWLINE_\xc3\xb6vers\xc3\xa4ttas till det mindre maskinspecifika:_NEWLINE_    eax = abs(eax)_NEWLINE_N\xc3\xa4r hoppinstruktioner p\xc3\xa5tr\xc3\xa4ffas, byggs det unders\xc3\xb6kta programmets kontrollgraf upp. N\xc3\xa4r funktionsanrop till en viss adress p\xc3\xa5tr\xc3\xa4ffas, "vet" dekompilatorn att en ny funktion kan disassembleras vid den adressen.\n_START_SECTION_\nProgramanalys\n_START_PARAGRAPH_\nEfter disassemblering b\xc3\xb6rjar programanalysen. Den liknar kompilatorers motsvarande analysfas i stor del, fast den utf\xc3\xb6rs "bakl\xc3\xa4nges". Programuttryck byggs ihop ur de enklare maskininstruktionerna. Exempelvis blir instruktionerna:_NEWLINE_    mov   eax,[ebx+0x04]_NEWLINE_    add   eax,[ebx+0x08]_NEWLINE_    sub   [ebx+0x0C],eax_NEWLINE_hopfogade till uttrycket:_NEWLINE_    mem[ebx+0x0C] -= mem[ebx+0x4] + mem[ebx+0x08]\n_START_SECTION_\nTyph\xc3\xa4rledning\n_START_PARAGRAPH_\nTyph\xc3\xa4rledning \xc3\xa4r n\xc3\xa4sta fas: dekompilatorn f\xc3\xb6rs\xc3\xb6ker att h\xc3\xa4rleda vilka datatyper programvariablerna hade i k\xc3\xa4llkoden genom att studera hur de anv\xc3\xa4nds i programmet. Fr\xc3\xa5n programsnutten ovan kan dekompilatorn h\xc3\xa4rleda att ebx m\xc3\xa5ste vara en pekare till en post med \xc3\xa5tminstone tre f\xc3\xa4lt. Dessv\xc3\xa4rre vet inte dekompilatorn mycket om datatypen f\xc3\xb6r dessa tre f\xc3\xa4lt; ytterligare  information kr\xc3\xa4vs f\xc3\xb6r att best\xc3\xa4mma detta. Uttryckt i C blir typerna:_NEWLINE_    struct T1 * ebx;_NEWLINE_    struct T1 {_NEWLINE_        int v0004; _NEWLINE_        int v0008;_NEWLINE_        int v000C;_NEWLINE_    };_NEWLINE_Med hj\xc3\xa4lp av de h\xc3\xa4rledda typerna kan programkoden omformuleras ytterligare. S\xc3\xa5lunda blir uttrycket ovan omgjort till:_NEWLINE_    ebx->v000C -= ebx->v0004 + ebx->v0008\n_START_SECTION_\nStrukturering\n_START_PARAGRAPH_\nStruktureringsfasen f\xc3\xb6rs\xc3\xb6ker att bygga kontrollstrukturer (som while-slingor och if-sater) ur de primitiva hoppinstruktionerna. Exempelvis blir f\xc3\xb6ljande maskinkod:_NEWLINE_    xor eax,eax_NEWLINE_ l0002:_NEWLINE_    or  ebx,ebx_NEWLINE_    jge l0003_NEWLINE_    add eax,[ebx]_NEWLINE_    mov ebx,[ebx+0x4]_NEWLINE_    jmp l0002    _NEWLINE_ l0003:_NEWLINE_    mov [0x10040000],eax_NEWLINE_\xc3\xb6versatt till det mer begripliga:_NEWLINE_    eax = 0;_NEWLINE_    while (ebx < 0) {_NEWLINE_        eax += ebx->v0000;_NEWLINE_        ebx = ebx->v0004;_NEWLINE_    }_NEWLINE_    globals.v10040000 = eax;\n_START_SECTION_\nUtmatning\n_START_PARAGRAPH_\nI slutskedet matas den dekompilerade programtexten ut, m\xc3\xb6jligtvis baserad p\xc3\xa5 anv\xc3\xa4ndarangivna funktion- och variabelnamn. Anv\xc3\xa4ndaren kan d\xc3\xa5 unders\xc3\xb6ka programtexten, hitta eventuella fel, och genom mer utf\xc3\xb6rliga processinstruktioner hj\xc3\xa4lpa dekompilatorn att g\xc3\xb6ra f\xc3\xa4rre fel i n\xc3\xa4sta iteration.'