ReverseCraft assem bler by gynvael.coldwind//vx Opcode Strony projektu: http://re.coldwind.pl/ http://www.uw-team.org/
Zasoby! czyli co możemy użyć... Instrukcje procesora Pamięć Wirtualna Rejestry CPU Ext. OS Stack Heap... Biblioteki OS API
Instrukcje procesora mov eax, 45678h mnemonic??? opcode B8 78 56 4
Instrukcje procesora Dla wszystkich: - opcode'y, prefixy, imm - co można dać w [ ] - jak czytać opcodes.txt :) Dla dociekliwych: - jak dokładnie zbudowany jest opcode - co zawiera ModRM i SIB - jak wygląda mapa opcode'ów
Instrukcje procesora (opcodes.txt/pentium.txt)??????args??? 89 /r MOV r/m,r Move opcode mnemonic opis
Instrukcje procesora (opcodes.txt/pentium.txt) /r -- Indicates that the ModR/M byte of the instruction contains both a register operand and an r/m operand.???args??? 89 /r MOV r/m,r Move opcode mnemonic opis
Instrukcje procesora (Intel Manual, Vol a, rozdział.) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. od do 6 bajtów
Instrukcje procesora (Intel Manual, Vol a, rozdział.) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. unikatowy identyfikator polecenia procesora Przykłady poleceń: 6 - PUSHAD 9 - NOP 9 - XCHG EAX, EAX 6 - POPAD C - RET D9 FE - FSIN
Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) Uproszczona mapa opcode'ów -FF oprócz poniższych wyjątków, to pojedyncze instrukcje, prefiksy oraz grupy instrukcji z indexem w MODR/M Wyjątki D8-DF to ucieczka do instrukcji koprocesora (FPU) F to ucieczka do rozszerzonego zestawu instrukcji, podobnie jak sekwencje: 66 F F F F F 66 F
Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) C - RET 4+rd - INC rejestr rd = (EAX =, ECX, EDX, EBX, ESP, EBP, ESI, EDI) 4 - INC EAX 4 - INC EDX 47 - INC EDI C - grupa opcode'ów:??? C / ib - ROL r/m8, imm8 C / ib - ROR r/m8, imm8... C /7 ib - SAR r/m8, imm8
Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) D8 numer_instrukcji_koprocesora lub MODR/M D8 / - FADD mreal D8 D - FCOM D8 D9 - FCOMP Escape prefix F F BE /r - MOVSX r,r/m8 F BF /r - MOVSX r,r/m6 (B8+rd - MOV r,imm) 66 F A F - PALIGNR xmm, xmm/m8, imm8
Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) D8 numer_instrukcji_koprocesora lub MODR/M D8 / - FADD mreal D8 D - FCOM D8 D9 - FCOMP Escape prefix F F BE /r - MOVSX r,r/m8 F BF /r - MOVSX r,r/m6 (B8+rd - MOV r,imm) 66 F A F - PALIGNR xmm, xmm/m8, imm8
Jak wyglądają opcode'y (Intel Manual, Vol b, dodatek A i B) // 6 - PUSHAD, 9 - NOP, 6 - POPAD, C - RET #include <stdio.h> int main(void) { char *func_code = \x6\x9\x6\xc ; void (*func_ptr)(void) = (void(*)(void))func_code; func_ptr(); } return ;
Instrukcje procesora (Intel Manual, Vol a, rozdział.) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Przykłady poleceń: B8+rd - MOV r,imm np. B8 78 56 4 to MOV EAX, x45678!little ENDIAN! stała (liczba) / natychmiastowa / bezpośrednia (immediate)
Little big endian Little endian (X86) Big endian (SPARC) B8 78 56 4 78 56 4 EAX: 4 56 78 REG: 78 56 4
Program cd... // B8+rd imm - MOV rd, imm ; C - RET #include <stdio.h> int main(void) { char *func_code = "\xb8\x78\x56\x4\x\xc"; int (*func_ptr)(void) = (int(*)(void))func_code; printf("%x\n", func_ptr()); } return ;
Instrukcje procesora (Intel Manual, Vol a, rozdział.) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. 4 grupy prefixów: prefiksy zmieniające działanie instrukcji. Lock and repeat. Segment override / branch hint. Operand-size override 4. Address-size override
Instrukcje procesora 4 grupy prefixów:. Lock and repeat F - LOCK, F - REPNE/REPNZ, F - REP or REPE/REPZ. Segment override / branch hint E - CS, 6 - SS, E - DS, 6 - ES, 64 - FS, 65 - GS E - branch not taken, E - branch taken. Operand-size override (and espace) 66 - Operand-size override prefix 4. Address-size override 67 - Address-size override prefix
Instrukcje procesora 4 grupy prefixów: 66 - Operand-size override prefix operand bity <-> operand 6 bitów B8 78 56 4 - MOV EAX, x45678 66 B8 4 - MOV AX, x4 rejestr -bitowy (EAX) -> rejestr 6-bitowy (AX) stała -bitowa -> stała 6-bitowa
prefiksy zmieniające działanie instrukcji -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Mod Reg / Op R/M [REG] EAX EAX [REG+disp8] ECX ECX [REG+disp] EDX EDX REG EBX EBX ESP SIB/ESP 4 EBP disp/ebp 5 ESI ESI 6 EDI EDI 7
C7 / id MOV r/m,imm Opcode = C7 ModR/M = ( Mod=?? Op= R/M=??? ) C7 C 44 -> MOV ECX, x44 C = = ( Mod= Op= R/M= ) C7 44 -> MOV [ECX], x44 = = ( Mod= Op= R/M= ) Mod Reg / Op R/M [REG] EAX EAX [REG+disp8] ECX ECX [REG+disp] EDX EDX REG EBX EBX ESP SIB/ESP 4 EBP disp/ebp 5 ESI ESI 6 EDI EDI 7
8B /r MOV r,r/m 89 /r MOV r/m,r 8B -> MOV EAX, [EAX] 89 -> MOV [EAX], EAX = ( Mod=, Reg=, R/M= ) ( [REG] EAX EAX ) Mod Reg / Op R/M [REG] EAX EAX [REG+disp8] ECX ECX [REG+disp] EDX EDX REG EBX EBX ESP SIB/ESP 4 EBP disp/ebp 5 ESI ESI 6 EDI EDI 7
8B /r MOV r,r/m 8B C -> MOV EAX, EAX 89 /r MOV r/m,r 89 C -> MOV EAX, EAX Kodowanie MOV EAX, EAX Kodowanie MOV EAX, IMM B8+rd MOV r,imm B8 IMM -> MOV EAX, IMM C7 / id MOV r/m,imm C7 C IMM -> MOV EAX, IMM
offset, przesunięcie -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Mod Reg / Op R/M [REG] [REG+disp8] [REG+disp] REG EAX ECX EDX EBX ESP EBP ESI EAX ECX EDX EBX SIB/ESP disp/ebp ESI 4 5 6 MOV EAX, [EAX+x45678] 8B 8 78 56 4 Mod= Reg= R/M= MOV EAX, [x45678] 8B 5 78 56 4 MOV EAX, [x45678] A 78 56 4 EDI EDI 7
rozszerzona notacja adresu (tablice!) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Mod Reg / Op R/M [REG] EAX EAX [REG+disp8] ECX ECX [REG+disp] EDX EDX REG EBX EBX ESP SIB/ESP 4 EBP DISP/EBP 5 ESI ESI 6 EDI EDI 7
rozszerzona notacja adresu (tablice!) -4 - - - -4-4 Prefixes Opcode ModR/M SIB Disp. Imm. Mod Scale Index Base [Base + Index*Scale] = EAX EAX [Base + Index*Scale + disp8] = ECX ECX [Base + Index*Scale + disp] = 4 EDX EDX REG = 8 EBX EBX MOV EAX, [EBX+ECX*4 + x45678] MOV EAX, [ESP+] LEA EAX, [ECX+ECX*8 + x4] none EBP ESI EDI ESP Mod= -> disp Mod=/ -> EBP ESI EDI 4 5 6 7
Mod Scale Index Base [Base + Index*Scale] = EAX EAX [Base + Index*Scale + disp8] = ECX ECX [Base + Index*Scale + disp] = 4 EDX EDX REG = 8 EBX EBX none ESP 4 Zabawa w disassembler! EBP ESI Mod= -> disp Mod=/ -> EBP ESI 5 6 EDI EDI 7 8B 84 8B 78 56 4 Co to za instrukcja?
Mod [Base + Index*Scale] [Base + Index*Scale + disp8] [Base + Index*Scale + disp] REG Zabawa w disassembler! Scale Index Base = = = 4 = 8 8B 84 8B 78 56 4 EAX ECX EDX EBX none EBP ESI EDI EAX ECX EDX EBX ESP Mod= -> disp Mod=/ -> EBP ESI EDI 4 5 6 7 Opcode = 8B /r MOV r, r/m ModR/M = 84 = (Mod= Reg= R/M=) [+disp] EAX SIB SIB = 8B = (Scale= Index= Base=) =4 ECX EBX Końcowa postać: MOV EAX, [EBX + ECX*4 + x45678]
Podsumowanie - pełna instrukcja w kodzie maszynowym ma od do 6 bajtów - instrukcja dzieli się na 6 pól Prefixes Opcode ModR/M SIB Disp. Imm. - jakie warianty danego mnemonika mogą być zakodowane można zobaczyć w opcodes.txt/pentium.txt oraz w manualach - niektóre instrukcje można zakodować na więcej niż jeden sposób
Podsumowanie - adres w nawiasie [ ] może być złożony z: [rejestru] [rejestru + przesunięcia] [bazy + indeksu*skala] [bazy + indeksu*skala + przesunięcia] [indeksu*skala + przesunięcia] [przesunięcia] innych opcji nie ma - przesunięcie to stała (liczba) 8 lub bitowa
Podsumowanie - z uwagi na budowę instrukcji, nie jest możliwe zapisanie w instrukcji dwóch dereferencji adresu (tj. dwóch członów w [ ]) - prefiksy m.in. umożliwiają przejście między a 6 bitową wielkością operandu - opcodes.txt jest proste i przydatne :)
Eksperymenty domowe - co się stanie jeżeli przed opcode wstawimy dwa prefiksy zmieniające wielkość operandu?
Co dalej? - prefix zmieniający tryb adresowania z -bitowego na 6-bitowe zmienia działanie bajtu ModR/M, sprawdź jak - sprawdź jakie są rodzaje innych argumentów jakie przyjmują opcode'y (tj. innych niż r, r/m i imm) - jakiego rodzaju argumenty przyjmują skoki?
Dziękuje za uwagę :) Strony projektu: http://re.coldwind.pl/ http://www.uw-team.org/