Selamat pagi para blogger tercinta pada kesempatan kali ini saya akan memosting suatu artikel Format File PE (Portable Executable) mulai dikenalkan pada Windows NT 3.1, dimana format file ini masih menyimpan header MZ dari MS-DOS. Berikut skema dasar format file PE :
|----------------------------|
| CodeView Debug Information |
|----------------------------|
| COFF Symbols |
|----------------------------|
| COFF Line Numbers |
|----------------------------|
| Section - n |
| . |
| . |
| Section - 2 |
|----------------------------|
| Section - 1 |
|----------------------------|
| Section - 0 |
|----------------------------|
| Array Section table |
| . |
| . |
| Array Section table |
|----------------------------|
| Data Directory |
|----------------------------|
| |
|----------------------------|
| Image File Header |
|----------------------------|
| "PE\0\0" |
|----------------------------|
| "MZ" |
|----------------------------|
Gambar 2.6 Skema PE
1. PE Header
PE Header merupakan salah satu struktur dari IMAGE_NT_HEADER (dideklarasikan dalam WINNT.H). Header ini mengandung berbagai macam jenis informasi seperti lokasi dan ukuran dari area kode dan data, sistem operasi yang dipakai, ukuran stack, dan lain-lain. Header ini juga mengandung MS-DOS stub, yaitu program kecil yang akan menampilkan teks "This program cannot be run in MS-DOS mode." Bila file PE dijalankan di lingkungan yang tidak mendukung Win32. PE Header Terdiri dari struktur :
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER OptionalHeader;
Dimana Signature adalah teks "PE\0\0". Sedangkan IMAGE_FILE_HEADER berisi struktur :
- WORD
Machine //Berisi nilai untuk jenis CPU yang dipakai, ex : 0x14d untuk Intel i860
2. WORD
NumberOfSections //Berisi jumlah section yang ada di file PE
2 DWORD
TimeDateStamp //Berisi tanggal kapan linker (atau compiler untuk File OBJ) memproduksi file PE
3 DWORD
PointerToSymbolTable //Offset untuk tabel symbol COFF
4 DWORD
NumberOfSymbols //Berisi jumlah symbol COFF di tabel
5 WORD :
SizeOfOptionalHeader //Berisi ukuran dari optional header
6 WORD
Characteristics //Berisi informasi tentang file PE
Untuk IMAGE_OPTIONAL_HEADER berisi :
1. WORD
Magic //Selalu bernilai 0x010B
2. BYTE
MajorLinkerVersion //Versi linker yang dipakai
3. BYTE
MinorLinkerVersion //Versi linker yang dipakai
4. DWORD
SizeOfCode //Ukuran dari section code
5. DWORD
SizeOfInitializedData //Ukuran dari semua data section yang terinisialisasi
6. DWORD
SizeOfUninitializedData //Ukuran dari semua data section yang tidak terinisialisasi
7. DWORD
AddressOfEntryPoint //Alamat dimana loader akan memulai eksekusi file PE, alamat ini adalah RVA (Relative Virtual Address)
8. DWORD
BaseOfCode //Alamat RVA dimana section code dimulai
9. DWORD
BaseOfData //Alamat RVA dimana section data dimulai
10. DWORD
ImageBase //Alamat dimana file PE akan dimapping di memory
10. DWORD
SectionAlignment //Nilai penggandaan untuk mapping tiap section di memory
11. DWORD
FileAlignment //Nilai penggandaan untuk mapping tiap section di disk
12. WORD
MajorOperatingSystemVersion //Versi OS yang dipakai
13. WORD
MinorOperatingSystemVersion //Versi OS yang dipakai
14. WORD
MajorSubsystemVersion //Versi minimum OS yang dipakai
15. WORD
MinorSubsystemVersion //Versi minimum OS yang dipakai
18. DWORD
Reserved1 //Selalu bernilai 0
19. DWORD
SizeOfImage //Ukuran dari image yang akan diload oleh loader
20. DWORD
SizeOfHeaders //Ukuran dari PE Header dan tabel section
21. DWORD
CheckSum //Nilai checksum CRC dari file PE
22. WORD
Subsystem //Tipe subsistem yang diperlukan untuk keperluan GUI
23. WORD
DllCharacteristics //Tanda atau flag untuk inisialisasi DLL (Dynamic Link Library)
24. DWORD
SizeOfStackReserve //Ukuran dari virtual memory yang akan digunakan untuk inisialisasi stack
25. DWORD
SizeOfStackCommit //Ukuran dari memory yang akan digunakan untuk inisialisasi stack
26. DWORD
SizeOfHeapReserve //Ukuran dari virtual memory yang akan digunakan untuk inisialisas heap proses
27. DWORD
SizeOfHeapCommit //Ukuran dari memory yang akan digunakan untuk inisialisasi heap proses
28. DWORD
LoaderFlags //Digunakan untuk keperluan debugging
29. DWORD
NumberOfRvaAndSizes //Jumlah dari array DataDirectory
2. Tabel Section
Secara umum Tabel Section dapat dianalogikan sebagai "daftar" untuk tiap section yang ada di file PE. Tabel ini mencakup informasi tentang section-section file PE. berikut contoh layout dari tabel section file PE yang sudah di dump :
- text VirtSize: 00005AFA VirtAddr: 00001000
raw data offs: 00000400 raw data size: 00005C00
relocation offs: 00000000 relocations: 00000000
line # offs: 00009220 line #'s: 0000020C
characteristics: 60000020
CODE MEM_EXECUTE MEM_READ
- bss VirtSize: 00001438 VirtAddr: 00007000
raw data offs: 00000000 raw data size: 00001600
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: C0000080
UNINITIALIZED_DATA MEM_READ MEM_WRITE
- rdata VirtSize: 0000015C VirtAddr : 00009000
raw data offs: 00006000 raw data size: 00000200
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: 40000040
INITIALIZED_DATA MEM_READ
- data VirtSize: 0000239C VirtAddr: 0000A000
raw data offs: 00006200 raw data size: 00002400
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: C0000040
INITIALIZED_DATA MEM_READ MEM_WRITE
5. data VirtSize: 0000033E VirtAddr: 0000D000
raw data offs: 00008600 raw data size: 00000400
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: C0000040
INITIALIZED_DATA MEM_READ MEM_WRITE
6. reloc VirtSize: 000006CE VirtAddr: 0000E000
raw data offs: 00008A00 raw data size: 00000800
relocation offs: 00000000 relocations: 00000000
line # offs: 00000000 line #'s: 00000000
characteristics: 42000040
INITIALIZED_DATA MEM_DISCARDABLE MEM_READ
Layout diatas adalah format dari IMAGE_SECTION_HEADER, Berikut keterangan tentang IMAGE_SECTION_HEADER :
- BYTE Name[IMAGE_SIZEOF_SHORT_NAME] //Nama section,biasanya
- diawali dengan tanda titik/dot union { //Nilai sesungguhnya dari ukuran kode atau data DWORD PhysicalAddress DWORD VirtualSize } Misc;\
- DWORD VirtualAddress //Alamat RVA untuk keperluan mapping oleh loader
- DWORD SizeOfRawData //Ukuran dari section setelah dibulatkan ke ukuran file alignment
- DWORD PointerToRawData //Offset dari section
- DWORD PointerToRelocations //Offset untuk informasi relokasi section
- DWORD PointerToLinenumbers //Offset untuk nomor baris (line number)
- WORD NumberOfRelocations //Jumlah dari relokasi yang ada di tabel relokasi
- WORD NumberOfLinenumbers //Jumlah dari nomor baris yang ada di tabel nomor baris
- DWORD Characteristics //Berisi angka tertentu yang menunjukkan atribut dari suatu section (data, kode, dll)
12. Sistem Operasi 16 dan 32 bit
Perbedaan penting dari 16 bit dan 32 bit sistem operasi ialah cara bagaimana mereka menangani struktur internal. Ada perbedaan besar antara sistem operasi 16-bit dengan 32-bit, yaitu mendukung mode 32-bit protected, model memori flat, yang mana menyediakan manajemen memori lebih bersih daripada 16-bit, dan mengizinkan program untuk membuat dan mengalamatkan struktur data yang sangat besar.
1. Tidak menggunakan DOS lagi
Windows NT tidak berisi kode DOS dalam kernelnya. Semuanya dikerjakan melalui emulasi pada pemanggilan standar DOS. Windows 95 masih mengandalkan kode DOS untuk menjalankan aplikasi DOS. Windows 95 sebenarnya terdiri atas dua sistem operasi dalam satu paket, yaitu Windows 4.0 dan DOS 7.0 Meskipun tidak ada DOS, Windows NT tetap dapat menjalankan banyak program DOS sepanjang mereka atidak mencoba mengakses secara langsung hardware atau membutuhkan device driver khusus. Hal ini dimungkinkan terjadi karena NT membuat lingkungan DOS virtual.
No comments:
Post a Comment
Tuliskan komentar anda tetang postingan diatas !