. tehnici de inginerie inversă // dev0id
Pe site-ul nostru (rootteam.void.ru) postat dezasamblor Release, voi să vă descriu principiile de bază ale muncii sale pentru a înțelege cum funcționează, și modul în care programul devine codul sursă.
Codul pe care le scrie, este codificat într-un mod special și pentru a obține codul mașinii. Lungimea maximă a acestui cod pentru o echipă de 15 octeți. Codul în sine este împărțit în mai multe domenii, fiecare dintre acestea având propria sa lungime. Un total de 6 domenii:
- prefixe de câmp
- câmp opcode
- octet modrm
- bytes sib
- in echipa de offset
- operand imediat
Unele câmpuri pot să lipsească, dar codul de funcționare va fi întotdeauna. Considerăm acum ordinea fiecărui câmp:
prefixe de câmp
Prefixele Sami sunt împărțite în 5 grupe:
În bună, doar câmpul prefix poate fi doar un singur prefix din grupul lor, și anume, dacă ne preopredelyaem segment, atunci nu putem avea mai multe înlocuiri în aceeași echipă, dar acest lucru este valabil numai pentru compilare „curat“. Unele programe folosesc pentru a spune, protecția împotriva inginerie inversă - un manechin de substituție „extra“ grupuri prefix. EXEMPLU (hex):
Există un NOP prefixele de comandă schimbare de segment SS, CS, ES și SS.
În general, comanda prefixe și să fie acolo, dar aceasta este doar o dovadă că puteți înlocui fictive orice prefix pentru orice echipă. Procesorul, la rândul său, aranjate în așa fel încât el înțelege doar ultimul prefix al unui grup, care este, în acest caz, înlocuirea segmentului SS prefix. De asemenea, trebuie remarcat faptul că prefixele sunt folosite doar pentru această echipă pentru următorul, ei nu vor mai fi valabile în cazul în care codul mașinii următoarea comandă nu va fi dat aceste prefixe.
Aici este un exemplu de comandă SUB ECX, EDX:
Poate că zadatite întrebare logică că există registre de 8 biți și date în memorie și vă întrebați modul în care acestea sunt codificate. Pentru a determina dacă utilizarea datelor de 8 biți, fără prefixe. În acest caz, trebuie să apeleze la polițistul (opcode).
CPC
Codul de operare are o lungime de fie unul sau doi octeți. Site-ul are developer.intel.com trei volume de documentare completa pentru programatori pe asm. A se vedea în anexa celui de al doilea volum al tabelului sunt codificări pe un octet, și polițiști dublu-byte. komadny de bază sunt în primul rând - tabel cu un singur octet. Tabelul se arată astfel: tabele 16x16 în rânduri
0-3 operații logice matimaticheskie +
4 inc dec
5 împinge pop
6 aritmetice și de control al comenzilor grele
7 salt condiționat
8 aritmetică ușor / logică într-un format special, trimiterea de comenzi spets.formate
9 registru XCHG, înregistrați + unele mai multe echipe
O comandă șir + comenzi de control
B mov într-un format special cu valori imediate
C Echipa Management
D coprocessor echipa
E-F mult orice altceva
Este vorba de un dig-un octet. Dublu-byte, nu am de gând să picteze, cu excepția să spun că este întotdeauna primul octet începe cu 0Fh, astfel încât să puteți identifica rapid. Acum câteva cuvinte despre ceea ce putem spune CPC.
Polițistul a găsit, de asemenea, unele dintre câmpuri, dar aceasta este o specificație de comandă, deoarece nu toți polițiștii, de exemplu, este registru codificat. Aici sunt câmpuri de biți sunt în Cope:
Câteva cuvinte despre modul în care registrele codificate: modrm
Vreau doar să dea câteva mese, fără de care ar fi imposibil să demonteze bytes modrm. Acest tabel poate fi găsit în același document „Intel“ sau V.Yurova „de referință specială“. După cum puteți vedea, schimb de opt biți pot fi utilizate atât în grila de 16- și 32-biți. Sam modrm octet codificate după cum urmează:
Din tabelele de mai sus se observă că, în mod alocat 2 biți, în reg - 3 și pentru rm și 3. EXEMPLU. Luați în considerare comanda de sub cx, dx. De captură de ecran plin -CB CA algoritm este după cum urmează:
1. Verificați prefixele (în termeni de „protecție“ împotriva dezasamblare).
2. Găsiți CPC.
3. În funcție de Copa decide dacă următorul octet sau nu am citit, și decidem că este, vom modrm? compensate? imm (operand imediat)?
C B
1 1 0 0 1 0 1 1
w
Astfel, înseamnă că w este 1, folosind astfel adesatsiya deplin, adică una care este definită prefixe, și din moment ce ele nu există, atunci 16 biți. Acest SUB, prin urmare, mai precis este modrm - CA. Împărțiți-l:
cu o
1 1 0 0 1 0 1 0
2EH segment de prefix de înlocuire CS
3eh segment de prefix de înlocuire DS
Deci, procesorul va înțelege doar ultimul din grup, iar acest lucru - 3eh. Excelent, vom continua. Prin intel'a tabel, 2B - operațiunea CPC sub, o memorie de registru. Verificați dacă w biți:
2 B
0 0 1 0 1 0 1 1
w
sub cx, cuvânt ds: ptr [bp + si] + 1234h
ss bază index (câmpuri de mărime, cum ar fi în modrm-byte)
de bază joacă rolul de modrm reg'a, dar el este întotdeauna pe 32 de biți. Ss multiplicator arată cât de mult trebuie să multiplice scara, index'om calculat. Apoi, înmulțit cu scala se adaugă la base'om. Trebuie remarcat faptul că, atunci când ss este zero, nu multiplicare are loc, și cu o bază egală 5, se consideră că nu există nici o bază, și adiția are loc. exemplu:
66 67 2B 45 00 00 04 00 00
Soooo. acest lucru va fi ultimul și cel mai complex exemplu. Verificați prefixe: 66h, 67H. registru de biți și memorie - 32. CPC-2B (a se vedea exemplul anterior fișier.). Apoi, verificați modrm:
ss = 1 - 2 multiplicator.
de bază = 5 - cred că nu există nici o bază.
index = 0 - pentru masa sib'a [eax * 2]
sub EAX, dword ptr [eax * 2]
Numărul apare aproape întotdeauna, dacă baza este de 5 (adică EBP), precum și numărul este 0, ea poate fi ignorată, deși îl puteți scrie în jos
sub EAX, dword ptr [eax * 2] + 00000000h
<<ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ