Kasutaja:MartenKu/Disassembler

Allikas: Vikipeedia

Disassembler on vastupidine protsess assemblerile. Kui assembler tõlgib assemblerkeeles kirjutatud programmi kahekomponentseks masinkoodiks, siis disassembler pöörab protsessi ümber ja üritab kahekomponentsest masinkoodist uuesti luua koostamiskoodi. Kuna enamikul assemblerkeeltel on üks-ühele vastavus masinatega seotud juhistega, on disassembler protsess suhteliselt lihtne ning disassembler on sageli rakendatav lihtsalt baitides lugedes ja tabeli otsingu tegemisel. Masinkoodi tõlkimiseks inimloetavaks vorminguks kasutatakse disassemblerit. Koodi demonteerimisel esineb sageli ka probleeme. Katkestatud koodi lugemine on keerulisem kui algne lähtekood, sest lahti võetud koodil puuduvad programmeerija kommentaarid ja märkused. [1]


Disassembleri platvormid[muuda | muuda lähteteksti]

Disassemlberi kasutamiseks on vaja spetsiaalset platvormi. Allpool on loetletud osa internetis leiduvatest platvormidest, osa neist on tasulised ja mõned on ka tasuta. Kuna igal disassembleri platvormil on omad omadused, siis enda vajadustele sobivaima leiab neid proovides. [2]

Masinkood
  • ODA on tasuta veebipõhine demonteerija mitmesuguste arhitektuuride jaoks. "Live View" abil saate näha, kuidas kood on reaalajas lahti võetud, üks bait korraga või faili üles laadida. 2019. jaanuari seisuga on veebileht beetaversioonis.[3]
  • IDA Pro on professionaalne disassembler, mis on kallis, äärmiselt võimas ja millel on terve rida omadusi. IDA Pro negatiivne külg on see, et see maksab standardse ühe kasutaja eest 515 USA dollarit. Sellisena ei ole Wikibook IDA Pro-d just väga populaarsed, kuna hinnalipik on paljude jaoks välistav tegur ja internetis on saadaval ka tasuta versioone; vt allpool.[4]
  • Binary Ninja on pöördtehnoloogiaga platvorm. Binary on fokuseeritud puhtale ja kergesti hallatavale [[liides|liidesele], millel on võimas mitmekordne analüüsi võime. Binary on kiiresti kohanduv erinevate arhitektuuride, platvormide ja kompilaatoritega. Töötab antud operatsioonisüsteemide peal: MacOS, Windows ja Linux.[5]
  • Capstone on avatud lähtekoodiga demonteerimise raamistik mitme arhitektuuri (sh x86, x86_64) ja mitme platvormi täiustatud funktsioonidega. Capstone on kerge platvorm, multi-arhitektuuri demonteerimise raamistikuga.[6]
  • IDA 3.7 DOS GUI tööriist, mis käitub väga sarnaselt IDA Pro'le, kuid on oluliselt piiratum. See võib demonteerida koodi Z80, 6502, Intel 8051, Intel i860 ja PDP-11 protsessoritele, samuti x86 juhiseid kuni 486-ni. [7]
  • Miasm on tasuta ja avatud lähtekoodiga (GPLv2) pöördtehnoloogiaga raamistik, Miasmi platvorm on kirjutatud Pythoni programmeerimise keeles. Miasmi põhiline eesmärk on analüüsida, muuta ja genereerida binaarprogramme.[8]
  • Decompiler on lihtne kasutada ja lihtsalt rakendatav, Decompiler on mõeldud programmi binaaride lugemiseks ja käivitatavate või DLL-failide dekompileerimiseks. Põhiliselt rakendatakse Decompiler ainult x86-suhtes.


Disassembleri probleemid[muuda | muuda lähteteksti]

Koodi demonteerimise protsessiga on seotud ka mitmed probleemid ja raskused. Kaks kõige olulisemat raskust on koodide ja andmete jagamine ning programmeerija poolt kirjutatud tekstinformatsiooni kadumine.[9]


Koodi eraldamine andmetest

Kuna kõik andmed ja juhised on salvestatud binaarandmetena, tekib ilmne küsimus: kuidas saab demontaažija anda binaarandmetest koodi? Kas mõni bait on muutuja või osa juhendist? Üldine probleem koodide eraldamiseks andmetest suvaliste käivitatavate programmidega on samaväärne peatamise probleemiga. Selle tulemusena ei ole võimalik kirjutada disassemblerit, mis õigesti eraldab koodi ja andmed kõigi võimalike sisendprogrammide jaoks. Pöördtehnoloogia on täis selliseid teoreetilisi piiranguid, kuigi Rice'i teoreemiga on kõik huvitavad küsimused programmi omaduste kohta lahendamatud (nii et ka kompilaatorid ja paljud muud tööriistad, mis tegelevad igasuguste programmidega, satuvad ka sellistesse piiridesse). Praktikas võib interaktiivse ja automaatse analüüsi ja sihikindluse kombinatsioon käsitleda kõiki programme, mis on spetsiaalselt ette nähtud vastupidise konstruktsiooni takistamiseks, näiteks krüpteerimis- ja dekrüpteerimiskoodi kasutamine vahetult enne kasutamist ja koodi ümberpaigutamist mälus. [10]


Informatsiooni kaotamine

Kasutaja poolt määratud tekstilised identifikaatorid, nagu muutujate nimed, sildi nimed ja kommentaarid, eemaldatakse montaažiprotsessiga. Nad võivad endiselt esineda genereeritud objektifailides, kasutamiseks selliste tööriistade nagu debuggers ja linkerside ümberpaigutamiseks, kuid otsene ühendus on kadunud ja selle ühenduse taastamine nõuab rohkem kui lihtsalt disassemblerit. Eriti väikestel konstantidel võib olla rohkem kui üks võimalik nimi. Operatsioonisüsteemikõnesid (näiteks DLL-i MS-Windowsis) võib rekonstrueerida, kuna nende nimed ilmuvad eraldi segmendis või on eelnevalt teada. Paljud disassemblerid võimaldavad kasutajal lisada märgisele märgise või konstante, lähtudes oma koodist. Need identifikaatorid aitavad lisaks lähtefaili kommentaaridele muuta koodi inimesele kergemini loetavaks ja võivad ka anda mõningaid vihjeid koodi eesmärgi kohta. Ilma nende kommentaaride ja identifikaatoriteta on lähtekoodi eesmärki raskem mõista ja selles koodis kasutatavat algoritmi võib olla raske kindlaks määrata. Kui ühendate selle probleemi võimalusega, et kood, mida proovite lugeda, võib tegelikult olla andmed (nagu eespool kirjeldatud), siis võib olla veelgi raskem määrata, mis toimub. [11]

Teiseks väljakutseks on kaasaegsed optimeerivad kompilaatorid. Tänapäevased kompilaatorid kaotavad väärtusliku teabe programmi ülesehituse kohta.

Dekompilaatorid[muuda | muuda lähteteksti]

Dekompilaatorid võtavad protsessi demonteerimiseks sammu edasi ja üritavad koodi korraga kõrgel tasemel reprodutseerida. Sageli on see kõrgetasemeline keel C, sest C on piisavalt lihtne ja primitiivne, et hõlbustada dekompileerimisprotsessi. Kuid ka Dekompileerimisel on omad puudused, üheks probleemiks on ,et algse kompileerimisprotsessi käigus kaotatakse palju andmeid ja loetavuse konstruktsioone ning neid ei saa enam taasesitada.[12]


Populaarsemad dekompilaatorid[muuda | muuda lähteteksti]

  • Hex-Rays Decompiler on kommertskasutatav. See on tehtud laienduseks populaarsele IDA-Pro disassemblerile. 2019. aasta jaanuari seisuga ainus teadaolev elujõuline kaubanduslikult kättesaadav dekompilaator, mis annab kasutamisel tulemusi. See toetab nii x86 kui ka ARM arhitektuuri.[13]
  • DCC on tõenäoliselt üks vanimaid olemasolevaid dekompilaatoreid. Alates 2015. aastast on DCC taas aktiivne projekt. Mõned viimased tehtud muudatused hõlmavad parandusi pikaajaliste mälulekete ja moodsama Qt5-põhise front-endi jaoks.[14]
  • C4Decompiler on interaktiivne, staatiline dekompilaator (Alpha aastal 2013). See teostab binaarset analüüsi ja esitab tulemuseks oleva C allika Windows GUI-s.
  • Reko on modulaarne avatud lähtekoodiga dekompilaator, mis toetab nii interaktiivset GUI kui ka käsurealiidest. Selle ühendatav disain toetab mitmesuguste käivitatavate formaatide ja protsessori arhitektuuride dekompileerimist (8-, 16-, 32- ja 64-bitised arhitektuure, alates 2015.aastast).

Vaata ka[muuda | muuda lähteteksti]


Viited[muuda | muuda lähteteksti]

  1. Sang Cho. "Disassembler".
  2. "x86 / x64 Assembler and Disassembler".
  3. "ODA".
  4. "IDA Pro".
  5. "Binary Ninja".
  6. "Capstone".
  7. "IDA".
  8. "Miasm". {{netiviide}}: tundmatu tühi parameeter: |1= (juhend)
  9. Mike Van Emmerik (29. aprill 2005). "Why Decompilation". Program-transformation.org. {{cite web}}: tundmatu tühi parameeter: |1= (juhend)
  10. Rob van Glabbeek. "Rice's theorem".
  11. "Problems". {{netiviide}}: tundmatu tühi parameeter: |1= (juhend)
  12. "Decompile". {{netiviide}}: tundmatu tühi parameeter: |1= (juhend)
  13. "Hex-Rays Decompiler". {{netiviide}}: tundmatu tühi parameeter: |1= (juhend)
  14. "DCC". {{netiviide}}: tundmatu tühi parameeter: |1= (juhend)

[[Kategooria:Disassemlber]] [[Kategooria:Pöördtehnika]] [[Kategooria:Silumine]]