En disassembler eller disassembler ( [ ˌdɪsəˈsɛmblə (r)] ) er et dataprogram som oversetter maskinspråk til monteringsspråk , den omvendte operasjonen av det som gjøres av assembler . En disassembler skiller seg fra en dekompilator ved at den retter seg mot et høynivåspråk i stedet for et assemblerspråk. utgangen til en demonter, demonteringsmaskinen, er ofte formatert for lesbarhet for mennesker i stedet for å være egnet for inndata til en montør, noe som gjør montøren primært til et omvendt ingeniørverktøy .
Assembly - språkkildekoden tillater generelt bruk av konstanter og programmeringskommentarer . Disse fjernes vanligvis, av montøren, fra den sammensatte koden til maskinkoden . På denne måten ville en demonter som opererer på maskinkoden produsere demonteringen som mangler disse konstantene og kommentarene; den demonterte utgangen blir vanskeligere for et menneske å tolke enn den opprinnelige kommenterte kildekoden. Noen demontører bruker symbolsk feilsøkingsinformasjon som finnes i objektfiler som ELF . I en interaktiv sesjon lar Interactive Disassembler den menneskelige brukeren plassere mnemoniske symboler for verdier eller koderegioner: menneskelig intuisjon brukt på demonteringsprosessen er ofte parallell med menneskelig kreativitet i prosessen med å skrive koden.
Demontering er ikke en eksakt vitenskap: På CISC -plattformer med instruksjoner med variabel bredde, eller i nærvær av selvmodifiserende kode , er det mulig for et enkelt program å ha to eller flere rimelige demonteringer. Å bestemme hvilke instruksjoner som faktisk vil bli møtt under en programkjøring reduseres til det beviste uløselige stoppproblemet .
Demonteringsprogrammet som skal brukes, fordi det fungerer med maskin og monteringsspråk, avhenger utelukkende av mikroprosessoren vi bruker (slik at den kan gjenkjenne binærkodeinstruksjonene), av maskinens arkitektur og operativsystemet som er i bruk ( det er ikke det samme Microsoft Windows som GNU/Linux ).
Demontereren transformerer binærkoden til grunnleggende instruksjoner for PC - en den kjøres i, programmet er ikke i stand til å skille om disse instruksjonene kommer fra et "hvis", et "for" eller et "mens". Den kjenner heller ikke navnene på variablene (de er ikke inkludert i binæren siden maskinen ikke bruker navn), så den utgjør ofte navn som VAR_0001, VAR_0002 osv.
Når det gjelder funksjonene, skjer det noe lignende med de interne funksjonene i programmet, de kalles vanligvis CALL_0001 eller JMP_0001, eller lignende, avhengig av om det er anropsadresser med henholdsvis uten retur.
De eksterne funksjonene avhenger av systemet som programmet som skal demonteres utføres på:
Under systemer som DOS kan du mesteparten av tiden se hvilke funksjoner som kalles (kalling av en funksjon krever vanligvis å kalle et avbrudd med spesifikke verdier i registre, som må slås opp hvis de ikke leveres av demontøren). For eksempel, for å skrive ut litt tekst på skjermen:
mov ax , 0009 mov dx , offset TEXT int 21 hI stedet under moderne operativsystemer som Windows, kalles funksjoner ved navn , og dette er vanligvis ganske selvforklarende. Dette gjelder for de fleste funksjoner som leveres av operativsystemet og eksterne anrop i dynamiske koblingsbiblioteker . For eksempel funksjonene CreateFile eller ReadFile.
En demonter kan ikke:
Det er ett forbehold til alt dette, og det er når programkompilatoren har aktivert et alternativ, som er å inkludere feilsøkingsinformasjon i programmet (vanligvis programmer under utvikling og ikke endelige programmer).
Demonteringsmaskiner er mye brukt for cracking programmer og for reverse engineering . De brukes også av programvareutviklere, forskere eller studenter.
Enhver interaktiv debugger vil inkludere en måte å se demonteringen av programmet som feilsøkes. Ofte vil det samme demonteringsverktøyet bli pakket som en frittstående demonteringsmaskin distribuert sammen med debuggeren. For eksempel er objdump , en del av GNU Binutils , relatert til gdb interaktiv debugger .