Documentație tehnică

Să presupunem că în textul pe care dezasamblarea a emis-o, există un astfel de fragment:

Probabil, aici mulți vor avea o îndoială - fie că este necesar să înlocuiți numărul cu OFFSET-ul corespunzător - la toate acestea, s-ar părea că în noul program asamblat datele vor avea același decalaj? Din păcate, acest lucru nu este cazul. În primul rând, de regulă, nu știm ce ansamblu a fost folosit la traducerea textului original, iar codurile obținute cu ajutorul asamblorilor diferiți vor avea lungimi diferite, ceea ce va duce la o schimbare a deplasărilor. De exemplu, comanda AND CX, 0007h este tradusă prin MASM 5.1 și TASM 1.01 ca 83E107 și ocupă 3 octeți. Dar aceeași comandă poate fi tradusă ca 81E10700 și ocupă 4 octeți. În al doilea rând, chiar dacă offsetul persistă, programul nu va fi supus modificării, deoarece atunci când inserați un fragment de cod, offseturile se vor schimba și totul "se va prăbuși". Astfel, OFFSET vă permite să lipiți programul, să îl potriviți pentru modificare. Exemplul dezasamblat este destul de primitiv. Să încercăm să luăm în considerare situații mai complexe și, în primul rând, vom investiga fragmentul de text emis de dezasamblare:







Luați în considerare un alt exemplu de apel indirect către o subrutină în care OFFSET intră în zona de date.

Pentru a afla ce înseamnă 8792h, trebuie să te uiți în regiune cu deplasări apropiate de acel număr. Aici este fragmentul corespunzător emis de disassembler:







Se poate vedea că cuvântul 0d5,93 corespunde offsetului 08792. Acum rămâne să rețineți că, din offsetul 093d5 din programul sursă, începe un fragment al codului

Prin urmare, întregul exemplu analizat este un apel indiscret indirect către o subrutină. Fragmentul corectat ar trebui să arate astfel:

Aici prevăd mari obiecții. Mi se va spune că toate acestea pot fi interpretate în mod diferit, dovezile mele sunt neconcludente etc. Cu asta sunt total de acord. Mai mult, aceste dovezi nu sunt convingătoare pentru mine. Mult mai puternic convinge că programul după montaj funcționează! Dezasamblarea, ca programele de depanare, este un proces intuitiv. O persoană cu experiență este deosebit de mulțumită de faptul că presupunerile sale nemotivate sunt ulterior confirmate. Cât de des, gândul care a venit în autobuz, într-un vis, într-o companie, în situația cea mai necorespunzătoare - se dovedește a fi adevărat! Încheiem acest punct cu un exemplu mai deștept. În textul pe care dezasamblarea a dat-o, a existat un astfel de fragment:

Se ridică aceeași întrebare - ce este 4f71h - numărul sau offsetul? Pentru a răspunde la această întrebare, trebuie să înțelegeți ce face această secțiune a programului. Să încercăm să înțelegem asta. Evident, un număr este împins din stack, în comparație cu 4f71h și dacă nu există egalitate, următorul număr este împins. Dacă numărul este 4f71h, acesta este împins înapoi pe teanc și programul revine din subrutină. Dar unde? În mod evident, la locul a cărui offset era în programul original este 4f71h. După cum puteți vedea din text, în acest moment a fost un apel la subroutina s229. Deci, într-un mod atât de ciudat, subrutina este chemată și 4f71h este compensată! Fragmentul corectat ar trebui să arate astfel:







Articole similare

Trimiteți-le prietenilor: