Experiența dezasambla mare
Apoi, un an în urmă, am încercat să dezasambleze un program simplu și a fost teribil de surprins de faptul că disassembler face greșit, iar programul nu funcționează așa cum ar trebui, atunci când re asseblirovanii. În același timp, am fost în stare să vorbesc cu o persoană cunoștință de cauză, și, deși am simțit un prost naiv, am fost în stare să găsească importante: FULL, dezasamblare automat IMPOSIBIL peste textul, care dă un disassembler, ai nevoie de un timp destul de mult timp pentru a lucra înainte de asamblare a textului da un program viabil.
În viitor, voi încerca să vă spun despre tehnicile care fac „rău“, textul din „bun“. și anume în text, care nu numai că oferă programul de funcționare corectă la adunarea, dar, de asemenea, vă permite să vă modificați pentru a îmbunătăți programul inițial.
DE CE DisDoc?
SOURSER - un nume cunoscut tuturor celor care au auzit cel puțin vag de dizasseblirovanii. Se crede că acest dizasseblera minunat, puternic, nu are concurenți. Cred că zvonurile despre beneficiile imense SOURSERa un puternic exagerat. Am impresia că SRI mici programe dizassemblirova (până la 7 kb.) SOURSER preferabilă. Atunci când programul este mare (în cazul meu - 58 kb), SOURSER este foarte lent și, în opinia mea, nu există nici un avantaj.
Alegerea dezasamblor DisDoc 2.3 a fost pentru mine în mai multe rânduri. De la locul de muncă, am primit un text cu privire la modul de utilizare a SOURSERa de asamblare (versiunea 3.07), și folosind un DisDoc disassembler 2.3. Apoi, atât textul, după eliminarea erorilor evidente au fost de a asambla. Deci, ceea ce a fost eliberat SOURSERom, agățate în același timp, și care a dat DisDoc 2.3, înainte de a închide, a adus la ecranul de câteva linii. Aceasta a determinat alegerea. În acest proces, am avut de multe ori ocazia de a evalua principalele DisDoc avantaj dezasamblor - intuitiv, neizoschrenny, listarea convenabil și compact.
Pentru a înțelege pe viitor, trebuie să se familiarizeze cu trecerea de listare, care dă DisDoc 2.3
În orice caz, asigurați-vă că pentru a satisface
probleme fundamentale
1. OFFSETa problemă
Să presupunem că în text, care a emis dizaccembler au un fragment:
Poate că vor apărea multe îndoieli - fie pentru a înlocui un număr în necesitatea OFFSET corespunzătoare - la urma urmei, s-ar părea, în, datele programului asamblat în fabrică re va avea aceeași compensate? Din păcate, acest lucru nu este cazul. În primul rând, de obicei, nu știu ce asamblor a fost utilizat pentru difuzarea textului original, precum și codurile obținute prin diferite asamblorii vor avea lungimi diferite, ceea ce va conduce la o schimbare în deplasare. De exemplu, echipa și CX, difuzat 0007h MASMom TASMom 5.1 și 1.01 ca 83E107 și ia 3 bayta. Dar, aceeași comandă poate fi tradus ca 81E10700 și ocupă 4 octeți. În al doilea rând, chiar dacă diferența este de a continua, programul nu va ceda la modificarea, deoarece introducerea de orice bucată de cod se va schimba prejudecată și toate „se încadrează în afară.“ Deci, OFFSETy permite programului adeziv, făcându-l potrivit pentru modificarea. Un exemplu detaliat este destul de primitiv. Să considerăm o situație mai complexă și în primul rând, să examineze o bucată de text, eliberat de disassembler:
Să considerăm un alt exemplu de apel subrutina indirect, în care OFFSET este semnalizat în zona de date.
Pentru a afla ce este 8792h, trebuie să se uite la zona cu decalaje care sunt aproape de acest număr. Aici este fragmentul emis disassembler relevante:
Se poate observa că deplasarea 08 792 corespunde cuvântului 0d5,93. Acum rămâne să se constate că deplasarea de la 093d5 fragment de cod bălăbăneală începe în programul inițial
Prin urmare, întregul exemplu analizat - este un telefon inteligent subrutină indirectă. fragment de rectificat ar trebui să arate:
Aici Prevăd obiecții mari. Voi spune că toate acestea pot fi interpretate în mod diferit, că dovezile sunt neconcludente, etc. Cu aceasta sunt total de acord. Mai mult decât atât, dovezile nu este convingătoare pentru mine. Mult mai convingătoare este că, după asamblarea programul de lucrări! Dezasamblarea, precum și programe de depanare - un proces intuitiv. O persoană cu experiență mare plăcere experiențele din faptul că speculațiile sale nemotivată a confirmat ulterior. Cât de des a crezut că a venit în autobuz, într-un vis, în cadrul companiei, în condițiile cele mai nepotrivite - este corect! Incheiem acest punct cu totul alt exemplu complicat. În text, care a emis un disassembler, m-am întâlnit acest fragment:
Există aceeași întrebare - ce 4f71h - număr sau compensate? Pentru a răspunde la această întrebare trebuie să înțelegem ceea ce face ca această secțiune de program. Să încercăm să-l dau seama. Evident, stiva este împins numărul este comparat cu 4f71h și dacă nu există nici o egalitate, împins afară numărul următor. Dacă numărul este 4f71h, acesta este din nou împins pe stiva și întoarcerea din subrutina. Dar unde? Este clar că în acel loc, care a fost compensat în programul inițial încă 4f71h. După cum se poate observa din text, în acest loc a fost o provocare rutine s229. Deci, într-un mod ciudat subrutină și 4f71h - această schimbare! fragment de rectificat ar trebui să arate:
2. Cum se distinge datele de comenzi?
Orice dezasamblor confuz de date și comenzi. Acest lucru este valabil în special pentru programele .COM, în cazul în care este amestecat totul. Luați în considerare un exemplu simplu:
În acest fragment ne-am întâlnit două instrucțiuni fanteziste, suspendate:
De mai sus acestea sunt limitate de instrucțiuni de retur ret din subrutina, iar în partea de jos - m03e5c Tagged. În mod evident, aceste instrucțiuni pot fi date numai. După modificarea fragmentului dat ar trebui să arate:
Acest lucru ridică o altă întrebare: de ce într-un caz în valoare de dw, iar celălalt - db? Răspunsul este conținut în text, care a emis un disassembler. Puteți găsi aceste instrucțiuni:
Ceea ce înseamnă că d03e58 privit ca un cuvânt, și d03e5a - ca un octet. Luați în considerare un pic mai complicat, dar, cu toate acestea, un exemplu foarte tipic.
În fragmentul de mai sus a etichetei de text b03f6b este absent. Între timp, eticheta trebuie să fie „tăiat“ în două instrucțiuni în add BYTE PTR [si], bh. care începe în programul original, care urmează să fie supus demontării, cu părtinire 03f6a. Randament poate exista doar un singur - deplasarea 03f6a corespunde octet de date și instrucțiuni începe cu 03f6b offset. fragment de rectificat ar trebui să arate:
Confuzia între datele și instrucțiunile de acolo destul de des. SOURSER capabil să producă metri întregi instrucțiuni lipsite de sens. DisDoc 2.3 în acest sens, se comportă mai bine.
3. Dependența de traducător
programatori Assembler tind să neglijeze regulile de eticheta, pentru a rupe orice fel de tabu imaginabil, iar acest lucru creează dificultăți suplimentare în dezasamblarea. Ca un exemplu dezasamblor fragment de cod emis
Acest fragment pare destul de nevinovat, și într-adevăr, el a demontat corect. Problema este că programator este planificat pentru a schimba această piesă, care este tăiat la rapid. Se pare că în program există o bucată de
În plus, trebuie să se înțeleagă că face instrucțiuni în figura 1 cu S25 de rutină. Să această asslemblirovana rutină folosind TASM 1.01. Codul de asamblare Eliberat va fi așa cum se arată în figura 2.
Dar problema este că programul inițial a fost de a asambla un alt limbaj de asamblare și are forma prezentată în figura 3. După cum se poate vedea dintr-o comparație între figurile 2 și 3, TASM 1.01 și instrucțiunile de asamblare necunoscute ADD difuzate în diferite moduri, iar acest lucru duce la consecințe dezastruoase. Într-adevăr, o privire la modul în care codul afectează porțiunea prezentată în figura 1 (înainte de a înlocui 086bh pe d0086b OFFSET) pe S25 de rutină, difuzat TASMom (Figura 4) și asamblare necunoscută (Figura 5).
O comparație între figurile 4 și 5 arată că logica programului variază în funcție de tipul de asamblare a fost folosit. Cum să iasă din această situație, dacă se dorește de asamblare nu este la îndemână? Cel mai simplu, dar nu este un mod foarte frumos - pentru a pune un „patch“. Pentru a utiliza tasm, podprogroamma S25 ar trebui să arate astfel:
Caracteristici și eroare DisDoc 2.3 dezasamblor
Din păcate, DisDoc 2.3 face greșeli, uneori regulate și, uneori, rare, insidioasă și chiar lașitate. Bug-ul cel mai urât - aleatoare sărind peste dannyhvstrechaetsya destul de rare. Pentru început, este foarte frecvente.
1. EQU - cine a inventat?
Codul, a emis un disassembler, este de multe ori vin peste astfel de piese enigmatice:
Care este sensul de atribuire d0046c teh 00046ch. Pentru a afla, aveți nevoie pentru a găsi d0046c în text. În datele noastre d0046c caz element este găsit foarte departe de prima sa apariție - în subrutina s321
Deci, pentru a rezolva această problemă, trebuie:
- Eliminați de la începutul subrutinei S12 atribuire d0046c teh 00046ch
- Rescriem prezentat în figura 6 a fragmentului s321 urmează:
Luați în considerare un al doilea exemplu. Codul, emis pe disassembler, sa întâlnit o astfel de piesă:
Date Elementul de căutare d0076a a eșuat. Un d00771 întâlnit în acest fragment:
Există în mod clar un cod de modificare S22 subrutină. Prin urmare, este necesar să se înlocuiască d00771 pe b00771, marcați această instrucțiune corespunzătoare etichetă în S22 și se îndepărtează de atribuire
fragment S22 corectat va arăta astfel:
Luați în considerare un alt exemplu. La începutul S32 întâlnit psevdooperatory familiar:
Dacă te uiți la zona cu decalaje apropiate de C1C, atunci ar fi o bucată de marionetă cod care poate fi dat numai:
Acum trebuie să caute identificatori și d00c1c d00c1e textul emis disassembler. Foarte repede puteți găsi fragmente de tip: mov WORD PTR DS: d00c1c, topor, MOV DS WORD PTR: d00c1e, topor. Deci greșeală dezasamblor este că el a amestecat date și comenzi, și pe această bază a făcut două incadrari eronate, teh, a ajuns la partea de sus a rutine S32.
Corecțiile vor fi după cum urmează:
- Eliminați de la începutul subrutina S32 teh două psevdooperatora.
- Rescrie codul din figura 7, după cum urmează:
În concluzie, considerăm piesa foarte simplu de cod:
Pentru a încheia această secțiune Summarize. icoane numit vsevdooperatorami echipare de împ. Dacă vorbim despre dezasamblor DisDoc 2.3, este surprinzător numele exacte. Dacă textul teh se va întâlni - o greșeală acolo. Între timp, uneori DisDoc 2.3 Utilizările teh destul de corect. Deci, fii atent si nu va lasati pacaliti.
2. Greșelile rele.
Uneori, comportamentul unui disassembler este dificil de explicat. De exemplu, dă
pierderea sau denaturând biții de date. Din fericire, acest lucru se întâmplă foarte rar.