VyÜlo v t²denφku: COMPUTERWORLD
╚φslo:50/94
RoΦnφk:1994
Rubrika/kategorie: Co (ne)najdete ve slovnφku

zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ Φlßnek | nßsledujφcφ Φlßnek

Ji°φ Peterka

Disassembly

Napsat dob°e fungujφcφ program nemusφ b²t ₧ßdn² velk² problΘm. Ten vÜak m∙₧e nastat v okam₧iku, kdy se od takovΘhoto programu ztratφ jeho zdrojov² tvar, autor je neznßmo kde a zmφn∞n² program je zapot°ebφ n∞jak²m velmi jednoduch²m zp∙sobem pozm∞nit, upravit, rozÜφ°it, doplnit Φi jinak modifikovat. Nebo jeÜt∞ jinak: nejmenovan² hacker zφskß z nejmenovanΘho zdroje nejmenovan² program - samoz°ejm∞ bez oprßvn∞nφ a bez zdrojovΘho tvaru - a chce se mu "podφvat na zoubek".

Podobn²ch situacφ bychom z°ejm∞ mohli nalΘzt jeÜt∞ vφce, ale zastavme se rad∞ji u toho, co je pro n∞ podstatnΘ a co majφ spoleΦnΘho - je pot°eba "vid∞t" do takovΘho programu, kter² je k dispozici jen ve spustitelnΘm (tj. binßrnφm) tvaru. Motivace p°itom m∙₧e b²t r∙znß, v prvnφm p°φpad∞ legitimnφ, ve druhΘm ji₧ mΘn∞, ale v obou p°φpadech by p°iÜel velmi vhod takov² prost°edek, kter² by dokßzal p°evΘst jednou p°elo₧en² program z jeho binßrnφho tvaru zp∞t do tvaru zdrojovΘho.

Pokud byl p°φsluÜn² program napsßn v n∞kterΘm vyÜÜφm programovacφm jazyku, pak takovßto mo₧nost nikdy nebude k dispozici - ji₧ jen z toho prostΘho d∙vodu, ₧e vztah mezi zdrojov²mi a p°elo₧en²mi programy nenφ jednoznaΦn², v tom smyslu, ₧e p°ekladem mnoha r∙zn²ch zdrojov²ch program∙ m∙₧e vzniknout jeden a tent²₧ p°elo₧en² program. Proces p°ekladu tedy bohu₧el nenφ obecn∞ vratn² - krom∞ p°φpad∙, kdy pro pot°eby nejr∙zn∞jÜφch ladicφch program∙ p°ekladaΦ ·mysln∞ zachovß vedle zdrojovΘho textu programu i ta kovΘ informace o p°ekladu, kterΘ zp∞tnou rekonstrukci umo₧≥ujφ.

V principu vÜak mo₧nΘ je - a to pro ka₧d² program v binßrnφm (spustitelnΘm) tvaru - p°evΘst jej do jazyka symbolick²ch instrukcφ neboli do asembleru (viz minule). Tedy nahradit ΦφselnΘ tvary jednotliv²ch strojov²ch instrukcφ jejich symbolick²m vyjßd°enφm, kterΘ je pro Φlov∞ka samoz°ejm∞ mnohem srozumiteln∞jÜφ a ji₧ samo o sob∞ v²razn∞ p°ispφvß k mo₧nosti "vid∞t do" p°φsluÜnΘho programu. Tφm ale mo₧nosti p°evodu z binßrnφho tvaru do asembleru jeÜt∞ nemusφ konΦit: dalÜφ mo₧nostφ je i nahrazenφ Φφseln²ch adres (pou₧it²ch v roli operand∙ skokov²ch instrukcφ a instrukcφ volßnφ podprogram∙) vhodn²mi symbolick²mi nßv∞Ütφmi.

Prßv∞ naznaΦen² p°evod se v angliΦtin∞ oznaΦuje jako disassembly (jako protiklad k procesu sestavenφ neboli "assembly") a program, kter² jej provßdφ, je tzv. disassembler. V ΦeÜtin∞ se Φasto hovo°φ nep°φliÜ sprßvn∞ o zp∞tnΘm p°ekladu (p°iΦem₧ v∞cn∞ sprßvn∞jÜφ by asi bylo oznaΦenφ ve smyslu "p°eklad opaΦn²m sm∞rem", proto₧e nap°φklad program napsan² p∙vodn∞ v Pascalu se tφmto zp∙sobem nep°eklßdß zp∞t).

Se zp∞tn²m p°ekladem jsou ovÜem i n∞kterΘ principißlnφ problΘmy. Ten nejv∞tÜφ vypl²vß ji₧ ze samotnΘ koncepce dneÜnφch poΦφtaΦ∙, stanovenΘ ke konci druhΘ sv∞tovΘ vßlky americk²m matematikem von Neumannem: ten toti₧ zavedl zßsadu, ₧e program a data jsou ve svΘ podstat∞ jedno a totΘ₧ a ₧e se majφ uchovßvat stejn²m zp∙sobem na stejnΘm mφst∞ (tj. v operaΦnφ pam∞ti); o tom, zda jde skuteΦn∞ o program Φi data, rozhoduje pouze zp∙sob jejich interpretace procesorem. Nynφ, p°i zp∞tnΘm p°ekladu, je ovÜem sprßvn ß interpretace ponechßna na disasembleru. Ten se ale opravdu nemß "Φeho chytit", resp. nemß podle Φeho poznat, zda to, co v rßmci binßrnφho tvaru programu najde, jsou instrukce, nebo data. U₧ivatel mu m∙₧e pomoci tφm, ₧e mu sßm °ekne, kde jsou data a kde instrukce - samoz°ejm∞ pokud to sßm vφ. V opaΦnΘm p°φpad∞ se pak m∙₧e snadno stßt, ₧e disasembler necht∞n∞ "zabrousφ" do dat a bude je interpretovat jako instrukce.


zp∞t do archivu Φlßnk∙ | rejst°φk | p°edchozφ Φlßnek | nßsledujφcφ Φlßnek
Tento Φlßnek m∙₧e b²t voln∞ Üφ°en, pokud se tak d∞je pro studijnφ ·Φely, na nev²d∞leΦnΘm zßklad∞ a se zachovßnφm tohoto dov∞tku. Podrobnosti hledejte zde, resp. na adrese http://archiv.czech.net/copyleft.htm