Programozás és c

. Fejtheti // dev0id

Honlapunkon (rootteam.void.ru) küldte Release bontó, fogom leírni, hogy az alapelveket a munkát annak érdekében, hogy megértsük, hogyan működik, és hogy a program megkapja a forráskódot.

A kód, hogy írunk, van kódolva különleges módon, hogy a gép kódját. A maximális hossza ezt a kódot a csapat 15 bájt. A kód maga van osztva több területen, amelyek mindegyike saját hosszát. Összesen 6 mezőket:

- mező előtagok
- műveleti kód mezőt
- byte modrm
- sib bájt
- A csapat ofszet
- azonnali operandus

Egyes területeken is hiányzik, de a műveleti kódot mindig lesz. Mi most úgy a rendelést minden területen:

mező előtagok
Sami előtagok 5 csoportra osztjuk:

Az jó, csak előtag mezőbe csak egy lehet előtag a saját csoport, azaz a ha preopredelyaem szegmensben, akkor nem lehet több felülbírálja ugyanabban a csapatban, de ez csak akkor igaz, a „tiszta” válogatás. Egyes programok használatához mondani, védelem reverse engineering - hatóanyag nélküli helyettesítő „extra” előtag csoportok. Példa (hex):

Van egy NOP parancs előtagokat elmozdulás szegmens SS, CS, ES és SS.
Általában a parancs elő- és legyen ott, de ez csak bizonyítja, hogy akkor helyettesítheti egy fiktív bármilyen előtagot bármely csapat. A processzor, viszont elrendezve oly módon, hogy megérti csak az utolsó előtag egy csoport, azaz, Ebben az esetben helyettesítve az előtag szegmens SS. Azt is meg kell jegyezni, hogy az előtagok felhasználása csak ez a csapat a következő, akkor már nem lesz érvényes, ha a gépi kód a következő parancs nem adható ilyen előtag.

Itt egy példa parancs SUB ECX, EDX:

Lehet, hogy zadatite logikus kérdés, hogy vannak 8 bites regiszterek és az adatok a memóriában, és akkor csoda, hogy hogyan vannak kódolva. Annak eldöntésére, hogy a használata 8 bites adat, nincs előtagokat. Ebben az esetben be kell kapcsolnia a rendőr (műveleti kód).

CPC
A műveleti kód hossza egy vagy két bájt. Az oldalon van developer.intel.com három kötetben teljes dokumentáció programozóknak asm. Lásd a függelékben a második kötet a táblázatban egybájtos kódolás, és a kétbájtos zsaruk. Alapvető komadny először - egy byte-os asztalon. A tábla maga a következőképpen néz ki: 16x16 asztalok sorokba

0-3 matimaticheskie logikai műveletek +
4 inc december
5 tolja pop
6 nehéz számtani és ellenőrző parancsok
7 feltételes ugrás
8 egyszerű számtani / logika egy speciális formátumban, parancsok küldését spets.formate
9 xchg nyilvántartásban, regisztrálja + még néhány csapat
A string parancs + parancsok
B mov egy speciális formátumban azonnali értékek
C Management Team
F-csoport koprocesszor
E-F sok minden mást

Ez körülbelül egy byte dig. Duplabájtos, nem fogok festeni, kivéve azt, hogy mindig az első bájt kezdődik 0Fh, így gyorsan azonosítani. Most néhány szót arról, hogy mit tudunk mondani a CPC.
A rendőr azt is megállapította, néhány területen, de ez egy parancs specifikáció, mivel nem minden rendőr, például, kódolt számláló. Íme bit mezők Cope:

Néhány szó arról, hogy a kódolt regiszterek: modrm
Csak azt, hogy néhány asztal, amely nélkül lehetetlen lenne szétszedni bájt modrm. Ez a táblázat megtalálható ugyanabban a dokumentumban az „Intel” vagy „különleges hivatkozás” V.Yurova. Mint látható, nyolc Biteltolás lehet használni mind a 16 és 32 bites rács. Sam modrm bájtos kódolt az alábbiak szerint:

A fenti táblázat alapján látható, hogy a mod kiosztott 2 bit alatt reg - 3 és rm és 3. példa. Tekintsük a parancs al cx, dx. Tól teljes screenshot -CB CA algoritmus a következő:

1. Ellenőrizze az előtag (szempontjából „védelem” ellen szétszerelés).
2. Keresse meg a CPC.
3. Attól függően, hogy a Copa eldönteni, hogy a következő bájt vagy sem olvasunk, és úgy döntünk, hogy mi lesz modrm? offset? imm (azonnali operandus)?

C B
1 1 0 0 1 0 1 1
w

Így, azt jelenti, w értéke 1, így a teljes körű adesatsiya, azaz az egyik, hogy meghatározott előtagok és mivel nem létezik, akkor a 16-bit. Ez SUB, így annál pontosabb modrm - CA Osszuk meg:

With a
1 1 0 0 1 0 1 0

2EH csere előtag szegmens CS
3eh csere előtag szegmens DS

Tehát a processzor fogja érteni csak az utolsó csoport, és ez - 3eh. Kiváló, mi továbbra is. By intel'a asztal, 2B - CPC művelet sub nyilvántartását memóriát. Ellenőrizze bit w:

2 B
0 0 1 0 1 0 1 1
w

sub cx, szó ptr DS: [bp + si] + 1234h

ss index bázis (mérete olyan területeken, mint a modrm-bájtos)

bázis szerepét játssza reg'a modrm, de ő mindig 32-bit. Ss szorzó mutatja, hogy mennyit kell szorozni a skála számított index'om. Ezután szorozva a skála adunk base'om. Meg kell jegyezni, hogy ha p értéke nulla, nincs szorzás zajlik, és egyenlő 5 alap, úgy vélik, hogy nincs alapja, és felül jelentkezik. például:

66 67 2B 04 45 00 00 00 00

Soooo. ez lesz az utolsó és legbonyolultabb példája. Ellenőrizze előtagokat: 66h, 67h. Bites regiszter és memória - 32. CPC 2B (lásd az előző fájl példa.). Ezután ellenőrizze a modrm:

SS = 1 - 2 szorzó.
base = 5 - úgy vélik, hogy nincs alapja.
index = 0 - a sib'a táblázat [EAX * 2]

sub EAX, dword ptr [EAX * 2]

A szám megjelenik szinte mindig, ha bázis 5 (azaz EBP), valamint a szám 0, akkor figyelmen kívül lehet hagyni, de akkor írd le

sub EAX, dword ptr [EAX * 2] + 00000000h

<<ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ

Kapcsolódó cikkek