Get our toolbar!

Halaman

Kamis, 14 Maret 2013

80x86 32-bit dan Disassembler Assembler

Salam sejah terah un tuk semua agan-agan yang lagi butuh info... Ini ada sedikit info untuk agan-agan semua, semoga bermanfaat untuk agan semuanya...
Maaf gan sekarang baru sempat ngepos lagi ini karena ane sibuk ngurusin kerjaan di dunia datar jadi nggak sempat  ngurusin yang d.dunia aer ini


Hukum Bagian
Pengantar
Penjelasan singkat tentang fungsi
Berkumpul
Checkcondition
Decodeaddress
Disasm
Disassembleback
Disassembleforward
Isfilling
Printfloat * fungsi Ambil sumber


Hukum Bagian Paket ini termasuk kode sumber dari 32-bit Disassembler dan 32-bit Assembler baris tunggal untuk 80x86-kompatibel prosesor. Sumber adalah versi sedikit dilucuti dari kode yang digunakan dalam OllyDbg v1.04 dan terbukti baik oleh pengguna yang banyak. (Jika Anda belum pernah mendengar sebelumnya, OllyDbg adalah 32-bit Assembler tingkat debugger dengan kemampuan analisis yang kuat yang membuat biner kode mesin dimengerti).
Program ini adalah perangkat lunak bebas, Anda dapat menyebarluaskannya dan / atau memodifikasinya di bawah ketentuan GNU General Public License seperti yang diterbitkan oleh Free Software Foundation; baik versi 2 dari Lisensi, atau (dengan pilihan Anda) versi lain. Program ini didistribusikan dengan harapan bahwa itu akan berguna, tetapi TANPA JAMINAN APAPUN; bahkan tanpa jaminan yang termasuk dari DAGANGAN atau KECOCOKAN UNTUK TUJUAN TERTENTU. Lihat GNU General Public License ( http://www.fsf.org/copyleft/gpl.html) untuk lebih jelasnya.
Anda seharusnya menerima salinan dari GNU General Public License (gpl.txt) bersama dengan program ini, jika tidak, tulis ke Free Software Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
Semua nama merek dan nama produk yang digunakan dalam Assembler 80x86 dan disassembler, menyertai file atau dalam file help adalah merek dagang, merek dagang terdaftar, atau nama dagang dari pemiliknya masing-masing.


Pengantar Disassembler memahami semua perintah standar 80x86, FPU, MMX, AMD MMX ekstensi, Athlon / PIII MMX ekstensi dan 3DNow! petunjuk. Ini tidak decode SSI atau SSI2 perintah. Disassembler mengasumsikan 32 bit kode dan segmen data tetapi benar decode diawali 16-bit perintah. Beberapa decoding mode memungkinkan Anda untuk memilih jumlah informasi dikembalikan (yang berbanding terbalik dengan kecepatan eksekusi): Perintah panjang saja, informasi dasar yang berguna untuk analisis kode, atau decoding penuh dengan sampah dan bentuk assembler. Beberapa pilihan pilih format yang diinginkan. Disassembler dan Assembler mendukung MASM dan mode IDEAL Borland.
Assembler mengubah perintah tunggal dari bentuk ASCII ke kode biner. Hal ini memungkinkan untuk menemukan pengkodean beberapa kemungkinan, atau bahkan untuk membuat pola pencarian dengan operan tidak terdefinisi.
Paket ini termasuk file-file berikut:
  • disasm.h - umum definisi
  • disasm.c - Disassembler
  • assembl.c - Assembler
  • asmserv.c - tabel perintah dan fungsi layanan
  • main.c - Program demo
Ukuran Jumlah sumber melebihi 3800 baris teks padat (lebih dari 190 K!). Saya telah menggunakan Borland C dan tidak menjamin bahwa ia akan bekerja dengan compiler lain Silakan mengatur jenis karakter default untuk unsigned! Silakan juga menempatkan pernyataan berikut ke dalam file utama dari program Anda,. Dan tidak # define MAINPROG di lain file: # Define MAINPROG / / Tempatkan semua variabel unik di sini
# Include "disasm.h"
(Saya menggunakan trik ini untuk mendefinisikan variabel global bersama). Di bawah ini adalah sebagian kecil kode dibongkar dengan OllyDbg 1.04 menggunakan pengaturan teks yang berbeda:
004505B3 A1 DC464B00 MOV EAX, DS: [4B46DC]
004505B8 8B0498 MOV EAX, DS: [EAX + EBX * 4]
004505BB 50 PUSH EAX
004505BC 8D85 E0FBFFFF LEA EAX, SS: [EBP-420]
004505C2 50 PUSH EAX
004505C3 E8 141BFCFF PANGGILAN 004120DC
004505C8 83C4 08 ADD ESP, 8
004505CB 43 INC EBX
004505CC 3B1D D8464B00 CMP EBX, DS: [4B46D8]
004505D2 0F8C AFFEFFFF JL 00.450.487
004505D8 80BD E0FDFFFF 00 CMP BYTE PTR SS: [EBP-220], 0
004505DF 75 14 JNZ 004505F5 PENDEK
004505E1 68 B39E4600 PUSH 469EB3
004505E6 8D85 E0FDFFFF LEA EAX, SS: [EBP-220]
004505EC 50 PUSH EAX
004505ED E8 521BFCFF PANGGILAN 00.412.144

004505B3 A1 DC464B00 mov eax, [dword ds: 4B46DC]
004505B8 8B0498 mov eax, [dword ds: eax + ebx * 4]
004505BB 50 push eax
004505BC 8D85 E0FBFFFF lea eax, [dword ss: EBP-420]
004505C2 50 push eax
004505C3 E8 141BFCFF panggilan 004120DC
004505C8 83C4 08 add esp, 8
004505CB 43 inc ebx
004505CC 3B1D D8464B00 cmp ebx, [dword ds: 4B46D8]
004505D2 0F8C AFFEFFFF jl 00.450.487
004505D8 80BD E0FDFFFF 00 cmp [byte ss: EBP-220], 0
004505DF 75 14 jnz 004505F5 singkat
004505E1 68 B39E4600 mendorong 469EB3
004505E6 8D85 E0FDFFFF lea eax, [dword ss: EBP-220]
004505EC 50 push eax
004505ED E8 521BFCFF panggilan 00.412.144


Penjelasan singkat tentang fungsi
  • int Merakit (char * cmd, ip ulong, t_asmmodel * model, upaya int, int constsize, char * errtext) - merakit perintah teks ke kode biner;
  • int Checkcondition (int kode, bendera ulong) - memeriksa apakah bendera bertemu kondisi perintah;
  • int Decodeaddress (addr ulong, dasar ulong, int addrmode, char * symb, int nsymb, char * komentar) - pengguna-fungsi yang disediakan alamat menerjemahkan ke nama simbolik;
  • ulong Disasm (char * src, srcsize ulong, srcip ulong, t_disasm * disasm, int disasmmode) - menentukan panjang dari perintah biner atau disassembles ke teks;
  • ulong Disassembleback (char * blok, dasar ulong, ukuran ulong, ip ulong, int n) - berjalan kode biner mundur;
  • ulong Disassembleforward (* blok char, dasar ulong, ukuran ulong, ip ulong, int n) - berjalan kode biner ke depan;
  • int Isfilling (addr ulong, char * data, ukuran ulong, ulong menyelaraskan) - menentukan apakah perintah setara dengan PDN;
  • int Print3dnow (char * s, char * f) - mengkonversi 3DNow! konstan untuk teks tanpa memicu pengecualian FPU untuk operan tidak valid;
  • int Printfloat10 (char * s, ext ganda yang panjang) - mengkonversi 10-byte konstan mengambang ke teks tanpa menyebabkan pengecualian;
  • int Printfloat4 (char * s, float f) - mengkonversi 4-byte konstan mengambang ke teks tanpa menyebabkan pengecualian;
  • int Printfloat8 (char * s, ganda d) - mengkonversi 8-byte konstan mengambang teks tanpa menyebabkan pengecualian.


Berkumpul Fungsi Assemble (), seperti yang diharapkan, mengubah perintah dari bentuk ASCII ke kode biner 32 bit. Ini saham table perintah dengan Disasm (), jadi jika beberapa perintah dapat dibongkar, dapat dirakit kembali juga, dengan satu pengecualian: Merakit tidak mendukung 16 bit alamat. Dengan beberapa pengecualian penting, 16 alamat bit tidak dapat digunakan dalam program Win32.
Beberapa perintah memiliki lebih dari satu encoding. Merakit () memungkinkan Anda untuk menemukan mereka semua. Hal ini penting, misalnya, jika Anda ingin menemukan kode sesingkat mungkin atau untuk menemukan semua kejadian yang mungkin dari perintah ini dalam kode. Ada dua parameter, constsize dan berusaha. Parameter pertama memilih ukuran langsung konstan dan alamat konstan (8 atau 32 bit), kedua adalah terjadinya perintah dalam tabel perintah. Untuk menemukan semua varian, panggilan Merakit () dengan upaya = 0,1,2 ... dan untuk setiap upaya dengan constsize = 0,1,2,3 asalkan keberhasilan fungsi laporan untuk setidaknya satu constsize. Kode yang dihasilkan dapat mengulang. Perlu diketahui bahwa jika perintah menggunakan alamat memori, hanya satu bentuk akan dihasilkan dalam setiap kasus: [EAX * 2] tetapi tidak [EAX + EAX], [EBX + EAX] tetapi tidak [EAX + EBX], [EAX] tidak akan menggunakan SIB byte, tidak ada DS: awalan dan sebagainya.
Merakit mengkompilasi juga perintah tidak tepat yang mencakup operan umum berikut:
  • R8 - register 8-bit (untuk tetap AL, BL, CL, DL, AH, BH, CH, DH)
  • R16 - register 16 bit (AX, BX, CX, DX, SP, BP, SI, DI)
  • R32 - register 32 bit (EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI)
  • FPU - register FPU (ST0. ST7.)
  • MMX - register MMX (MM0. MM7.)
  • CRX - register kontrol (CR0. CR7.)
  • DRX - register debug (DR0. DR7.)
  • CONST - setiap konstanta
Hal ini memungkinkan untuk menghasilkan pola pencarian tidak tepat, di mana topeng berisi nol bit pada posisi yang diduduki oleh operan tepat dalam kode biner. Misalnya, pola yang dihasilkan untuk perintah MOV R32, CONST akan cocok baik MOV EAX, 1 dan MOV ECX, 12345678h. Fungsi kembali jumlah byte dalam kode dirakit atau non-positif (nol atau negatif) nomor dalam kasus kesalahan atau ketika varian dipilih oleh kombinasi upaya dan constsize tidak ada. Jumlah ini adalah posisi negatif dari kesalahan dalam perintah masukan. Jika Anda menghasilkan kode dieksekusi, perintah tidak tepat biasanya tidak diperbolehkan. Untuk memastikan bahwa perintah yang tepat, periksa bahwa semua byte yang signifikan dalam topeng mengandung 0xFF.
int Merakit (char * cmd, ip ulong, t_asmmodel * model, upaya int, int constsize, char * errtext);
Parameter:
  • cmd - pointer ke nol perintah ASCII dihentikan;
  • pi - alamat byte pertama dari perintah biner yang dihasilkan dalam memori;
  • Model - pointer ke struktur yang menerima kode mesin dan masker, lihat penjelasan rinci di bawah ini;
  • upaya - indeks encoding alternatif perintah. Panggil Merakit dengan upaya = 0,1,2 ... untuk mendapatkan semua versi kemungkinan perintah. Hentikan urutan ini ketika Merakit kesalahan laporan;
  • constsize - ukuran diminta data alamat konstan dan segera. Panggil Merakit dengan constsize = 0,1,2,3 untuk mendapatkan semua encoding yang mungkin dari versi yang dipilih oleh upaya;
  • errtext - pointer ke buffer teks panjang pada byte TextLen setidaknya yang menerima deskripsi kesalahan terdeteksi.
t_asmmodel: struktur yang menerima kode dirakit. typedef struct {t_asmmodel / / Model untuk mencari perintah assembler
kode char [MAXCMDSIZE], kode / / Binary
Char mask [MAXCMDSIZE]; / / Masker untuk kode biner (0: bit diabaikan)
int panjang; / / Panjang kode, byte (0: kosong)
int jmpsize; / / Offset ukuran jika lompat relatif
int jmpoffset; / / Offset relatif terhadap IP
jmppos int; / / Posisi melompat offset di command
} T_asmmodel;
Anggota:
  • kode - kode biner dari perintah. Hanya yang memiliki bit 1 dalam bit mask sesuai yang signifikan;
  • topeng - topeng perbandingan. Cari rutin mengabaikan bit semua kode di mana topeng diatur ke 0;
  • panjang - panjang kode dan masker, byte. Jika panjang adalah 0, model pencarian kosong atau tidak valid;
  • jmpsize - jika nol, perintah adalah melompat relatif dan jmpsize adalah ukuran offset dalam byte;
  • jmpoffset - jika jmpsize adalah nol, melompat diimbangi relatif terhadap alamat dari perintah berikut, jika tidak terdefinisi;
  • jmppos - jika jmpsize adalah nol, posisi byte pertama dari offset dalam kode, jika tidak terdefinisi.


Checkcondition Memeriksa apakah bendera 80x86 memenuhi kode kondisi dalam perintah. Pengembalian 1 jika kondisi terpenuhi dan 0 jika tidak.
int Checkcondition (int kode, bendera ulong);
Parameter:
  • Kode - byte perintah yang berisi kode kondisi;
  • bendera - isi register EFL.


Decodeaddress Kustom yang disediakan pengguna fungsi yang mengubah konstan (alamat) ke nama simbolik. Awalnya, kode sumber termasuk fungsi boneka yang mengembalikan 0.
Decodeaddress () alamat memori decode atau konstan untuk string ASCII dan opsional komentar alamat ini. Pengembalian panjang string didekode (tidak termasuk terminal 0), atau 0 pada kesalahan atau jika nama simbolis tidak tersedia.
int Decodeaddress (addr ulong, char * symb, int nsymb, char * komentar);
Parameter:
  • addr - alamat untuk memecahkan kode dalam ruang alamat program debugged;
  • symb - pointer ke buffer panjang setidaknya nsymb byte mana Decodeaddress () menempatkan string yang diterjemahkan;
  • nsymb - panjang, dalam karakter, buffer symb;
  • komentar - pointer ke string dengan panjang setidaknya TextLen byte atau NULL, menerima komentar terkait dengan addr.


Disasm Fungsi (dan kompleks) yang paling penting dalam paket ini. Tergantung pada disasmmode tertentu, Disasm () melakukan salah satu dari empat fungsi:
  • DISASM_SIZE - cepat menentukan ukuran perintah. Gunakan mode ini jika Anda ingin berjalan melalui kode. Dalam mode ini, memperlakukan semua anggota disasm sebagai tidak terdefinisi;
  • DISASM_DATA - menentukan ukuran dan operan analisis. Gunakan mode ini untuk analisis cepat, misalnya, jika Anda perlu untuk menghitung tujuan melompat. Anggota disasm ditandai dengan tanda bintang (*) tidak terdefinisi;
  • DISASM_FILE - menentukan ukuran, analisis operan dan disassembles perintah, namun tidak berusaha untuk mengubah alamat ke simbol. Gunakan mode ini jika tidak ada korespondensi antara alamat dan simbol, misalnya, jika Anda membuang isi dari file biner;
  • DISASM_CODE - pembongkaran penuh.
Fungsi mengembalikan ukuran dari perintah dibongkar. Ada konstanta global beberapa yang mempengaruhi perilaku fungsi ini. Mereka dijelaskan kemudian dalam bagian ini. Semua konstanta simbolis dijelaskan dalam disasm.h file. ulong Disasm (char * src, srcsize ulong, srcip ulong, t_disasm * disasm, int disasmmode);
Parameter:
  • src - pointer ke kode biner yang harus dibongkar;
  • srcsize - ukuran src. Panjang perintah 80x86 terbatas MAXCMDSIZE byte;
  • srcip - alamat perintah;
  • disasm - pointer ke struktur yang menerima hasil pembongkaran, lihat penjelasan rinci di bawah ini;
  • disasmmode - pembongkaran modus, salah DISASM_xxx (lihat di atas).
t_disasm: struct typedef t_disasm {/ / Hasil pembongkaran
ulong pi, pointer / / Instruksi
Char sampah [TextLen]; / / (*) sampah Heksadesimal dari perintah
Char hasil [TextLen]; / / (*) Perintah Dibongkar
Char komentar [TextLen]; / / (*) komentar Singkat
int cmdtype; / / Salah satu C_xxx
int memtype; / / Jenis variabel dibahas dalam memori
int nprefix; / / Jumlah prefiks
int diindeks; / / Alamat berisi register (s)
ulong jmpconst, alamat melompat / / Konstan
ulong jmptable; / / Kemungkinan alamat tabel saklar
ulong adrconst, bagian / / Konstan alamat
ulong immconst; / / Segera konstan
zeroconst int; / / Entah berisi nol konstan
fixupoffset int; / / Kemungkinan offset 32 bit fixups
int fixupsize, ukuran total / / Kemungkinan fixups atau 0
int kesalahan, / / Error saat pembongkaran perintah
int peringatan; / / Kombinasi DAW_xxx
} T_disasm;
Anggota:
  • pi - alamat perintah dibongkar;
  • dump - string ASCII, dump heksadesimal diformat dari perintah;
  • Hasilnya - ASCII string, perintah dibongkar sendiri;
  • komentar - string ASCII, komentar singkat yang berlaku untuk seluruh perintah;
  • cmdtype - jenis perintah dibongkar, salah satu dari C_xxx mungkin ORed dengan C_RARE untuk menunjukkan bahwa perintah jarang dalam aplikasi Win32 biasa. Perintah dari C_MMX jenis tambahan mengandung ukuran data MMX dalam 3 bit paling signifikan (0 berarti 8-byte operan). Non-MMX perintah mungkin memiliki bit set C_EXPL yang berarti bahwa beberapa operan memori memiliki ukuran yang tidak sesuai dengan aturan 80x86 standar;
  • memtype - jenis memori operan, salah satu dari DEC_xxx, atau DEC_UNKNOWN jika operan adalah non-standar atau perintah tidak mengakses memori;
  • nprefix - jumlah prefiks bahwa perintah ini mengandung;
  • diindeks - jika alamat memori berisi indeks mendaftar, diatur untuk skala, dinyatakan 0;
  • jmpconst - alamat tujuan melompat jika alamat ini adalah konstan, dan 0 sebaliknya;
  • jmptable - jika melompat tidak langsung dapat diartikan sebagai saklar, alamat dasar tabel switch dan 0 sebaliknya;
  • adrconst - bagian konstan alamat memori;
  • immconst - langsung konstan atau 0 jika perintah tidak mengandung konstanta langsung. Perintah-satunya yang mengandung dua konstanta yang langsung ENTER. Disasm () mengabaikan konstan kedua yang tetap 0 dalam banyak kasus;
  • zeroconst - nol jika perintah mengandung konstan nol langsung;
  • fixupoffset - permulaan yang memungkinkan dari 32 fixup bit dalam perintah, atau 0 jika perintah tidak dapat berisi fixups;
  • fixupsize - ukuran total kemungkinan fixups (0, 4 atau 8). Jika perintah mengandung baik alamat konstan dan segera langsung, mereka selalu berdekatan pada prosesor 80x86;
  • error - Disasm () tidak mampu membongkar perintah (misalnya, perintah tidak ada atau melintasi ujung blok memori), salah satu dari DAE_xxx;
  • peringatan - perintah yang mencurigakan atau tidak bermakna (misalnya, jauh melompat atau MOV EAX, EAX didahului dengan awalan segmen), kombinasi bit DAW_xxx;
Global bendera yang mempengaruhi teks perintah dibongkar:
  • yang ideal - kekuatan IDEAL decoding modus
  • huruf kecil - gaya huruf kecil
  • tabarguments - menyisipkan tab antara mnemonik dan argumen
  • extraspace - ruang ekstra insert antara argumen
  • putdefseg - menunjukkan segmen standar
  • showmemsize - selalu menampilkan ukuran memori
  • shownear - menunjukkan pengubah DEKAT
  • shortstringcmds - menggunakan bentuk pendek dari perintah string yang
  • sizesens - mode decoding ukuran-sensitif mnemonik (16/32 bit) seperti:
0 - PUSHA / PUSHAD
1 - PUSHAW / PUSHAD
2 - PUSHAW / PUSHA
  • simbolik - menampilkan alamat simbolis, membutuhkan Decodeaddress ()
Global bendera yang memperingatkan perintah yang berpotensi tidak valid:
  • farcalls - menerima panggilan jauh, kembali & alamat
  • decodevxd - decode panggilan VxD (Win95/98)
  • istimewa - menerima perintah istimewa
  • iocommand - menerima I / O perintah
  • badshift - menerima pergeseran keluar dari kisaran 1 .. 31
  • extraprefix - menerima prefiks berlebihan
  • lockedbus - menerima LOCK prefiks
  • stackalign - menerima operasi tumpukan teralign
  • iswindowsnt - ketika memeriksa perintah berbahaya, asumsikan NT berbasis OS
Jika Disasm () bertemu perintah berpotensi valid dan bendera yang sesuai adalah 0, itu set bit dalam disasm-> peringatan dan pesan tempat peringatan di disasm-> komentar.


Disassembleback Menghitung alamat instruksi assembler yang adalah n petunjuk (maksimal 127) kembali dari instruksi di pi ditentukan. Pengembalian alamat instruksi ditemukan. Dalam kasus kesalahan, mungkin kurang dari n petunjuk terpisah.
Perintah 80x86 memiliki panjang variabel. Disassembleback menggunakan metode heuristical perintah terpisah dan dalam beberapa (mencengangkan langka!) Kasus dapat kembali jawaban valid.
Disassembleback ulong (char * blok, dasar ulong, ukuran ulong, ip ulong, int n);
Parameter:
  • blok - pointer ke copy kode;
  • dasar - alamat byte pertama dalam blok kode;
  • Ukuran - ukuran blok kode;
  • pi - alamat instruksi saat ini;
  • n - jumlah instruksi untuk berjalan kembali.


Disassembleforward Menghitung alamat instruksi assembler yang n petunjuk maju dari instruksi di alamat yang ditentukan. Pengembalian alamat instruksi ditemukan. Dalam kasus kesalahan, mungkin kurang dari n petunjuk terpisah.
ulong Disassembleforward (* blok char, dasar ulong, ukuran ulong, ip ulong, n int, int usedec);
Parameter:
  • blok - pointer ke copy kode;
  • dasar - alamat byte pertama dalam blok kode;
  • Ukuran - ukuran blok kode;
  • pi - alamat instruksi saat ini;
  • n - jumlah instruksi untuk berjalan ke depan.


Isfilling Fungsi menentukan apakah instruksi runcing adalah perintah no-tindakan (setara dengan PDN) yang digunakan oleh kompiler yang berbeda untuk mengisi kesenjangan antara prosedur atau blok data ke perbatasan selaras tertentu. Pengembalian panjang mengisi perintah dalam byte atau 0 jika perintah tidak mengisi diakui.
int Isfilling (addr ulong, data char *, ukuran ulong, ulong menyelaraskan);
Parameter:
  • addr - alamat byte pertama dari perintah dianalisis;
  • Data - pointer ke perintah biner;
  • Ukuran - ukuran data;
  • menyelaraskan - keselarasan diasumsikan dari perintah non-mengisi berikutnya (kekuatan 2), atau 0 jika keselarasan tidak diperlukan.


Printfloat * fungsi Fungsi-fungsi decode 4 -, 8 -, 10-byte floating point number atau 8-byte 3DNow! operan ke dalam bentuk teks ke string s. Mereka benar decode semua kasus Nans atau INFs tanpa memicu pengecualian floating point. Jika operan bukan nomor titik yang valid floating, fungsi cetak pembuangan heksadesimal nomor. Kembali panjang string didekode dalam bytes, tidak termasuk terminal 0.
int Print3dnow (char * s, char * f);
int Printfloat10 (char * s, ext ganda yang panjang);
int Printfloat4 (char * s, float f);
int Printfloat8 (char * s, ganda d);

Copyleft (C) 2001 Oleh Yuschuk