Baca dalam bahasa Inggris

Bagikan melalui


PE Format

Spesifikasi ini menjelaskan struktur file yang dapat dieksekusi (gambar) dan file objek di bawah keluarga sistem operasi Windows. File-file ini disebut sebagai file Portable Executable (PE) dan Common Object File Format (COFF), masing-masing.

Catatan

Dokumen ini disediakan untuk membantu dalam pengembangan alat dan aplikasi untuk Windows tetapi tidak dijamin menjadi spesifikasi lengkap dalam segala hal. Microsoft berhak mengubah dokumen ini tanpa pemberitahuan.

Revisi Spesifikasi Microsoft Portable Executable dan Common Object File Format ini menggantikan semua revisi sebelumnya dari spesifikasi ini.

Konsep Umum

Dokumen ini menentukan struktur file yang dapat dieksekusi (gambar) dan file objek di bawah keluarga sistem operasi Microsoft Windows. File-file ini disebut sebagai file Portable Executable (PE) dan Common Object File Format (COFF), masing-masing. Nama "Portable Executable" mengacu pada fakta bahwa formatnya tidak spesifik untuk arsitektur.

Konsep tertentu yang muncul di seluruh spesifikasi ini dijelaskan dalam tabel berikut:

Nama Deskripsi
sertifikat atribut
Sertifikat yang digunakan untuk mengaitkan pernyataan yang dapat diverifikasi dengan gambar. Sejumlah pernyataan yang dapat diverifikasi yang berbeda dapat dikaitkan dengan file; salah satu yang paling berguna adalah pernyataan oleh produsen perangkat lunak yang menunjukkan apa hash pesan gambar yang diharapkan. Hash pesan mirip dengan checksum kecuali bahwa sangat sulit untuk dipalsukan. Oleh karena itu, sangat sulit untuk memodifikasi file agar memiliki hash pesan yang sama dengan file asli. Pernyataan ini dapat diverifikasi sebagai dibuat oleh produsen dengan menggunakan skema kriptografi kunci publik atau privat. Dokumen ini menjelaskan detail tentang sertifikat atribut selain untuk memungkinkan penyisipannya ke dalam file gambar.
stempel tanggal/waktu
Stempel yang digunakan untuk tujuan yang berbeda di beberapa tempat dalam file PE atau COFF. Dalam kebanyakan kasus, format setiap stempel sama dengan yang digunakan oleh fungsi waktu di pustaka run-time C. Untuk pengecualian, lihat deskripsi IMAGE_DEBUG_TYPE_REPRO dalam Jenis Debug. Jika nilai stempel adalah 0 atau 0xFFFFFFFF, nilai tersebut tidak mewakili stempel tanggal/waktu nyata atau bermakna.
penunjuk file
Lokasi item dalam file itu sendiri, sebelum diproses oleh linker (dalam kasus file objek) atau loader (dalam kasus file gambar). Dengan kata lain, ini adalah posisi dalam file seperti yang disimpan pada disk.
Linker
Referensi ke linker yang disediakan dengan Microsoft Visual Studio.
file objek
File yang diberikan sebagai input ke linker. Linker menghasilkan file gambar, yang pada gilirannya digunakan sebagai input oleh loader. Istilah "file objek" tidak selalu menyiratkan koneksi apa pun ke pemrograman berorientasi objek.
dicadangkan, harus 0
Deskripsi bidang yang menunjukkan bahwa nilai bidang harus nol untuk generator dan konsumen harus mengabaikan bidang .
Alamat virtual relatif (RVA)
Dalam file gambar, ini adalah alamat item setelah dimuat ke dalam memori, dengan alamat dasar file gambar dikurangi darinya. RVA item hampir selalu berbeda dari posisinya dalam file pada disk (penunjuk file).
Dalam file objek, RVA kurang bermakna karena lokasi memori tidak ditetapkan. Dalam hal ini, RVA akan menjadi alamat dalam bagian (dijelaskan nanti dalam tabel ini), tempat relokasi kemudian diterapkan selama penautan. Untuk kesederhanaan, pengkompilasi harus mengatur RVA pertama di setiap bagian ke nol.
bagian
Unit dasar kode atau data dalam file PE atau COFF. Misalnya, semua kode dalam file objek dapat digabungkan dalam satu bagian atau (tergantung pada perilaku pengompilasi) setiap fungsi dapat menempati bagiannya sendiri. Dengan lebih banyak bagian, ada lebih banyak overhead file, tetapi linker dapat menautkan kode secara lebih selektif. Bagian mirip dengan segmen dalam arsitektur Intel 8086. Semua data mentah di suatu bagian harus dimuat secara berdampingan. Selain itu, file gambar dapat berisi sejumlah bagian, seperti .tls atau .reloc , yang memiliki tujuan khusus.
Alamat Virtual (VA)
Sama seperti RVA, kecuali bahwa alamat dasar file gambar tidak dikurangi. Alamat ini disebut VA karena Windows membuat ruang VA yang berbeda untuk setiap proses, terlepas dari memori fisik. Untuk hampir semua tujuan, VA harus dianggap hanya alamat. VA tidak dapat diprediksi sebagai RVA karena loader mungkin tidak memuat gambar di lokasi pilihannya.

Gambaran Umum

Daftar berikut ini menjelaskan format Microsoft PE yang dapat dieksekusi, dengan dasar header gambar di bagian atas. Bagian dari Header EXE yang Kompatibel MS-DOS 2.0 hingga bagian yang tidak digunakan tepat sebelum header PE adalah Bagian MS-DOS 2.0, dan hanya digunakan untuk kompatibilitas MS-DOS.

  • Header EXE yang Kompatibel MS-DOS 2.0

  • tidak digunakan

  • Pengidentifikasi OEM

    Informasi OEM

    Offset ke Header PE

  • MS-DOS 2.0 Stub Program dan Tabel Relokasi

  • tidak digunakan

  • Header PE (diratakan pada batas 8-byte)

  • Header Bagian

  • Halaman Gambar:

    impor info

    info ekspor

    relokasi dasar

    info sumber daya

Daftar berikut ini menjelaskan format modul objek Microsoft COFF:

  • Microsoft COFF Header

  • Header Bagian

  • Data Mentah:

    kode

    data

    info debug

    relokasi

Header File

Header file PE terdiri dari stub Microsoft MS-DOS, tanda tangan PE, header file COFF, dan header opsional. Header file objek COFF terdiri dari header file COFF dan header opsional. Dalam kedua kasus, header file segera diikuti oleh header bagian.

Stub MS-DOS (Hanya gambar)

Stub MS-DOS adalah aplikasi valid yang berjalan di bawah MS-DOS. Ini ditempatkan di bagian depan gambar EXE. Linker menempatkan stub default di sini, yang mencetak pesan "Program ini tidak dapat dijalankan dalam mode DOS" ketika gambar dijalankan di MS-DOS. Pengguna dapat menentukan stub yang berbeda dengan menggunakan opsi linker /STUB.

Di lokasi 0x3c, stub memiliki offset file ke tanda tangan PE. Informasi ini memungkinkan Windows untuk menjalankan file gambar dengan benar, meskipun memiliki stub MS-DOS. Offset file ini ditempatkan di lokasi 0x3c selama penautan.

Tanda tangan (Hanya Gambar)

Setelah stub MS-DOS, pada offset file yang ditentukan pada offset 0x3c, adalah tanda tangan 4 byte yang mengidentifikasi file sebagai file gambar format PE. Tanda tangan ini adalah "PE\0\0" (huruf "P" dan "E" diikuti oleh dua byte null).

Header File COFF (Objek dan Gambar)

Di awal file objek, atau segera setelah tanda tangan file gambar, adalah header file COFF standar dalam format berikut. Perhatikan bahwa pemuat Windows membatasi jumlah bagian hingga 96.

Offset Ukuran Bidang Deskripsi
0
2
Mesin
Jumlah yang mengidentifikasi jenis komputer target. Untuk informasi selengkapnya, lihat Jenis Mesin.
2
2
NumberOfSections
Jumlah bagian. Ini menunjukkan ukuran tabel bagian, yang segera mengikuti header.
4
4
TimeDateStamp
32 bit rendah dari jumlah detik sejak 00:00 1 Januari 1970 (nilai time_t run-time C), yang menunjukkan kapan file dibuat.
8
4
PointerToSymbolTable
Offset file dari tabel simbol COFF, atau nol jika tidak ada tabel simbol COFF yang ada. Nilai ini harus nol untuk gambar karena informasi penelusuran kesalahan COFF tidak digunakan lagi.
12
4
NumberOfSymbols
Jumlah entri dalam tabel simbol. Data ini dapat digunakan untuk menemukan tabel string, yang segera mengikuti tabel simbol. Nilai ini harus nol untuk gambar karena informasi penelusuran kesalahan COFF tidak digunakan lagi.
16
2
SizeOfOptionalHeader
Ukuran header opsional, yang diperlukan untuk file yang dapat dieksekusi tetapi tidak untuk file objek. Nilai ini harus nol untuk file objek. Untuk deskripsi format header, lihat Header Opsional (Hanya Gambar).
18
2
Karakteristik
Bendera yang menunjukkan atribut file. Untuk nilai bendera tertentu, lihat Karakteristik.

Jenis Mesin

Bidang Mesin memiliki salah satu nilai berikut, yang menentukan jenis CPU. File gambar hanya dapat dijalankan pada komputer yang ditentukan atau pada sistem yang menimulasi komputer yang ditentukan.

Terus-menerus Nilai Deskripsi
IMAGE_FILE_MACHINE_UNKNOWN
0x0
Konten bidang ini diasumsikan berlaku untuk jenis komputer apa pun
IMAGE_FILE_MACHINE_ALPHA
0x184
Alpha AXP, ruang alamat 32-bit
IMAGE_FILE_MACHINE_ALPHA64
0x284
Ruang alamat Alpha 64, 64-bit
IMAGE_FILE_MACHINE_AM33
0x1d3
Matsushita AM33
IMAGE_FILE_MACHINE_AMD64
0x8664
x64
IMAGE_FILE_MACHINE_ARM
0x1c0
Arm little endian
IMAGE_FILE_MACHINE_ARM64
0xaa64
ARM64 little endian
IMAGE_FILE_MACHINE_ARMNT
0x1c4
ARM Thumb-2 little endian
IMAGE_FILE_MACHINE_AXP64
0x284
AXP 64 (Sama dengan Alpha 64)
IMAGE_FILE_MACHINE_EBC
0xebc
Kode byte EFI
IMAGE_FILE_MACHINE_I386
0x14c
Prosesor Intel 386 atau yang lebih baru dan prosesor yang kompatibel
IMAGE_FILE_MACHINE_IA64
0x200
Keluarga prosesor Intel Itanium
IMAGE_FILE_MACHINE_LOONGARCH32
0x6232
Keluarga prosesor LoongArch 32-bit
IMAGE_FILE_MACHINE_LOONGARCH64
0x6264
Keluarga prosesor LoongArch 64-bit
IMAGE_FILE_MACHINE_M32R
0x9041
Mitsubishi M32R little endian
IMAGE_FILE_MACHINE_MIPS16
0x266
MIPS16
IMAGE_FILE_MACHINE_MIPSFPU
0x366
MIPS dengan FPU
IMAGE_FILE_MACHINE_MIPSFPU16
0x466
MIPS16 dengan FPU
IMAGE_FILE_MACHINE_POWERPC
0x1f0
Power PC little endian
IMAGE_FILE_MACHINE_POWERPCFP
0x1f1
Power PC dengan dukungan titik mengambang
IMAGE_FILE_MACHINE_R4000
0x166
MIPS little endian
IMAGE_FILE_MACHINE_RISCV32
0x5032
Ruang alamat RISC-V 32-bit
IMAGE_FILE_MACHINE_RISCV64
0x5064
Ruang alamat RISC-V 64-bit
IMAGE_FILE_MACHINE_RISCV128
0x5128
Ruang alamat RISC-V 128-bit
IMAGE_FILE_MACHINE_SH3
0x1a2
Hitachi SH3
IMAGE_FILE_MACHINE_SH3DSP
0x1a3
Hitachi SH3 DSP
IMAGE_FILE_MACHINE_SH4
0x1a6
Hitachi SH4
IMAGE_FILE_MACHINE_SH5
0x1a8
Hitachi SH5
IMAGE_FILE_MACHINE_THUMB
0x1c2
Jempol
IMAGE_FILE_MACHINE_WCEMIPSV2
0x169
MIPS little-endian WCE v2

Karakteristik

Bidang Karakteristik berisi bendera yang menunjukkan atribut objek atau file gambar. Bendera berikut saat ini ditentukan:

Bendera Nilai Deskripsi
IMAGE_FILE_RELOCS_STRIPPED
0x0001
Hanya gambar, Windows CE, dan Microsoft Windows NT dan yang lebih baru. Ini menunjukkan bahwa file tidak berisi relokasi dasar dan oleh karena itu harus dimuat pada alamat dasar pilihannya. Jika alamat dasar tidak tersedia, loader melaporkan kesalahan. Perilaku default linker adalah untuk menghapus relokasi dasar dari file executable (EXE).
IMAGE_FILE_EXECUTABLE_IMAGE
0x0002
Hanya gambar. Ini menunjukkan bahwa file gambar valid dan dapat dijalankan. Jika bendera ini tidak diatur, bendera ini menunjukkan kesalahan linker.
IMAGE_FILE_LINE_NUMS_STRIPPED
0x0004
Nomor baris COFF telah dihapus. Bendera ini tidak digunakan lagi dan harus nol.
IMAGE_FILE_LOCAL_SYMS_STRIPPED
0x0008
Entri tabel simbol COFF untuk simbol lokal telah dihapus. Bendera ini tidak digunakan lagi dan harus nol.
IMAGE_FILE_AGGRESSIVE_WS_TRIM
0x0010
Kedaluwarsa. Secara agresif memangkas set kerja. Bendera ini tidak digunakan lagi untuk Windows 2000 dan yang lebih baru dan harus nol.
IMAGE_FILE_LARGE_ADDRESS_ AWARE
0x0020
Aplikasi dapat menangani > alamat 2 GB.
0x0040
Bendera ini dicadangkan untuk digunakan di masa mendatang.
IMAGE_FILE_BYTES_REVERSED_LO
0x0080
Little endian: bit paling tidak signifikan (LSB) mendahului bit paling signifikan (MSB) dalam memori. Bendera ini tidak digunakan lagi dan harus nol.
IMAGE_FILE_32BIT_MACHINE
0x0100
Mesin didasarkan pada arsitektur kata 32-bit.
IMAGE_FILE_DEBUG_STRIPPED
0x0200
Informasi penelusuran kesalahan dihapus dari file gambar.
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP
0x0400
Jika gambar berada di media yang dapat dilepas, muat sepenuhnya dan salin ke file swap.
IMAGE_FILE_NET_RUN_FROM_SWAP
0x0800
Jika gambar berada di media jaringan, muat sepenuhnya dan salin ke file swap.
IMAGE_FILE_SYSTEM
0x1000
File gambar adalah file sistem, bukan program pengguna.
IMAGE_FILE_DLL
0x2000
File gambar adalah pustaka tautan dinamis (DLL). File tersebut dianggap file yang dapat dieksekusi untuk hampir semua tujuan, meskipun file tersebut tidak dapat dijalankan secara langsung.
IMAGE_FILE_UP_SYSTEM_ONLY
0x4000
File harus dijalankan hanya pada mesin uniprocessor.
IMAGE_FILE_BYTES_REVERSED_HI
0x8000
Big endian: MSB mendahului LSB dalam memori. Bendera ini tidak digunakan lagi dan harus nol.

Header Opsional (Hanya Gambar)

Setiap file gambar memiliki header opsional yang menyediakan informasi ke loader. Header ini bersifat opsional dalam arti bahwa beberapa file (khususnya, file objek) tidak memilikinya. Untuk file gambar, header ini diperlukan. File objek dapat memiliki header opsional, tetapi umumnya header ini tidak memiliki fungsi dalam file objek kecuali untuk meningkatkan ukurannya.

Perhatikan bahwa ukuran header opsional tidak diperbaiki. Bidang SizeOfOptionalHeader di header COFF harus digunakan untuk memvalidasi bahwa pemeriksaan ke dalam file untuk direktori data tertentu tidak melampaui SizeOfOptionalHeader. Untuk informasi selengkapnya, lihat Header File COFF (Objek dan Gambar).

Bidang NumberOfRvaAndSizes dari header opsional juga harus digunakan untuk memastikan bahwa tidak ada pemeriksaan untuk entri direktori data tertentu melampaui header opsional. Selain itu, penting untuk memvalidasi nomor ajaib header opsional untuk kompatibilitas format.

Angka ajaib header opsional menentukan apakah gambar adalah PE32 atau PE32+ yang dapat dieksekusi.

Nomor ajaib Format PE
0x10b
PE32
0x20b
PE32+

Gambar PE32+ memungkinkan ruang alamat 64-bit sambil membatasi ukuran gambar hingga 2 gigabyte. Modifikasi PE32+ lainnya dibahas di bagian masing-masing.

Header opsional itu sendiri memiliki tiga bagian utama.

Offset (PE32/PE32+) Ukuran (PE32/PE32+) Bagian header Deskripsi
0
28/24
Bidang standar
Bidang yang didefinisikan untuk semua implementasi COFF, termasuk UNIX.
28/24
68/88
Bidang khusus Windows
Bidang tambahan untuk mendukung fitur Tertentu Windows (misalnya, subsistem).
96/112
Variabel
Direktori data
Pasangan alamat/ukuran untuk tabel khusus yang ditemukan dalam file gambar dan digunakan oleh sistem operasi (misalnya, tabel impor dan tabel ekspor).

Bidang Standar Header Opsional (Hanya Gambar)

Delapan bidang pertama dari header opsional adalah bidang standar yang ditentukan untuk setiap implementasi COFF. Bidang ini berisi informasi umum yang berguna untuk memuat dan menjalankan file yang dapat dieksekusi. Mereka tidak berubah untuk format PE32+.

Offset Ukuran Bidang Deskripsi
0
2
Sihir
Bilangan bulat yang tidak ditandatangani yang mengidentifikasi status file gambar. Angka yang paling umum adalah 0x10B, yang mengidentifikasinya sebagai file yang dapat dieksekusi normal. 0x107 mengidentifikasinya sebagai gambar ROM, dan 0x20B mengidentifikasinya sebagai PE32+ yang dapat dieksekusi.
2
1
MajorLinkerVersion
Nomor versi utama linker.
3
1
MinorLinkerVersion
Nomor versi minor linker.
4
4
SizeOfCode
Ukuran bagian kode (teks), atau jumlah semua bagian kode jika ada beberapa bagian.
8
4
SizeOfInitializedData
Ukuran bagian data yang diinisialisasi, atau jumlah semua bagian tersebut jika ada beberapa bagian data.
12
4
SizeOfUninitializedData
Ukuran bagian data yang tidak diinisialisasi (BSS), atau jumlah semua bagian tersebut jika ada beberapa bagian BSS.
16
4
AddressOfEntryPoint
Alamat titik masuk relatif terhadap basis gambar ketika file yang dapat dieksekusi dimuat ke dalam memori. Untuk gambar program, ini adalah alamat awal. Untuk driver perangkat, ini adalah alamat fungsi inisialisasi. Titik masuk bersifat opsional untuk DLL. Ketika tidak ada titik masuk, bidang ini harus nol.
20
4
BaseOfCode
Alamat yang relatif terhadap basis gambar bagian awal kode saat dimuat ke dalam memori.

PE32 berisi bidang tambahan ini, yang tidak ada di PE32+, mengikuti BaseOfCode.

Offset Ukuran Bidang Deskripsi
24
4
BaseOfData
Alamat yang relatif terhadap basis gambar bagian awal data saat dimuat ke dalam memori.

Header Opsional Bidang Khusus Windows (Hanya Gambar)

21 bidang berikutnya adalah ekstensi untuk format header opsional COFF. Mereka berisi informasi tambahan yang diperlukan oleh linker dan loader di Windows.

Offset (PE32/ PE32+) Ukuran (PE32/ PE32+) Bidang Deskripsi
28/24
4/8
ImageBase
Alamat yang disukai dari byte gambar pertama saat dimuat ke dalam memori; harus kelipatan 64 K. Default untuk DLL adalah 0x10000000. Default untuk WINDOWS CE EXEs adalah 0x00010000. Default untuk Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98, dan Windows Me 0x00400000.
32/32
4
SectionAlignment
Perataan (dalam byte) bagian saat dimuat ke dalam memori. Ini harus lebih besar dari atau sama dengan FileAlignment. Defaultnya adalah ukuran halaman untuk arsitektur.
36/36
4
FileAlignment
Faktor perataan (dalam byte) yang digunakan untuk menyelaraskan data mentah bagian dalam file gambar. Nilai harus berupa kekuatan 2 antara 512 dan 64 K, inklusif. Defaultnya adalah 512. Jika SectionAlignment kurang dari ukuran halaman arsitektur, maka FileAlignment harus cocok dengan SectionAlignment.
40/40
2
MajorOperatingSystemVersion
Nomor versi utama dari sistem operasi yang diperlukan.
42/42
2
MinorOperatingSystemVersion
Nomor versi minor dari sistem operasi yang diperlukan.
44/44
2
MajorImageVersion
Nomor versi utama gambar.
46/46
2
MinorImageVersion
Nomor versi minor gambar.
48/48
2
MajorSubsystemVersion
Nomor versi utama subsistem.
50/50
2
MinorSubsystemVersion
Nomor versi minor subsistem.
52/52
4
Win32VersionValue
Dicadangkan, harus nol.
56/56
4
SizeOfImage
Ukuran (dalam byte) gambar, termasuk semua header, karena gambar dimuat dalam memori. Ini harus kelipatan SectionAlignment.
60/60
4
SizeOfHeaders
Ukuran gabungan stub MS-DOS, header PE, dan header bagian dibulatkan ke kelipatan FileAlignment.
64/64
4
Checksum
Checksum file gambar. Algoritma untuk menghitung checksum dimasukkan ke dalam IMAGHELP.DLL. Berikut ini diperiksa untuk validasi pada waktu pemuatan: semua driver, DLL apa pun yang dimuat pada waktu boot, dan DLL apa pun yang dimuat ke dalam proses Windows penting.
68/68
2
Subsistem
Subsistem yang diperlukan untuk menjalankan gambar ini. Untuk informasi selengkapnya, lihat Subsistem Windows.
70/70
2
DllCharacteristics
Untuk informasi selengkapnya, lihat Karakteristik DLL nanti dalam spesifikasi ini.
72/72
4/8
SizeOfStackReserve
Ukuran tumpukan yang akan dipesan. Hanya SizeOfStackCommit yang diterapkan; sisanya tersedia satu halaman pada satu waktu sampai ukuran cadangan tercapai.
76/80
4/8
SizeOfStackCommit
Ukuran tumpukan yang akan dikomit.
80/88
4/8
SizeOfHeapReserve
Ukuran ruang timbunan lokal untuk dipesan. Hanya SizeOfHeapCommit yang diterapkan; sisanya tersedia satu halaman pada satu waktu sampai ukuran cadangan tercapai.
84/96
4/8
SizeOfHeapCommit
Ukuran ruang timbunan lokal yang akan dilakukan.
88/104
4
LoaderFlags
Dicadangkan, harus nol.
92/108
4
NumberOfRvaAndSizes
Jumlah entri direktori data di sisa header opsional. Masing-masing menjelaskan lokasi dan ukuran.
Subsistem Windows

Nilai berikut yang ditentukan untuk bidang Subsistem header opsional menentukan subsistem Windows mana (jika ada) yang diperlukan untuk menjalankan gambar.

Terus-menerus Nilai Deskripsi
IMAGE_SUBSYSTEM_UNKNOWN
0
Subsistem yang tidak diketahui
IMAGE_SUBSYSTEM_NATIVE
1
Driver perangkat dan proses Windows asli
IMAGE_SUBSYSTEM_WINDOWS_GUI
2
Subsistem antarmuka pengguna grafis (GUI) Windows
IMAGE_SUBSYSTEM_WINDOWS_CUI
3
Subsistem karakter Windows
IMAGE_SUBSYSTEM_OS2_CUI
5
Subsistem karakter OS/2
IMAGE_SUBSYSTEM_POSIX_CUI
7
Subsistem karakter Posix
IMAGE_SUBSYSTEM_NATIVE_WINDOWS
8
Driver Win9x asli
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
9
Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION
10
Aplikasi Extensible Firmware Interface (EFI)
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER
11
Driver EFI dengan layanan boot
IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER
12
Driver EFI dengan layanan run-time
IMAGE_SUBSYSTEM_EFI_ROM
13
Gambar ROM EFI
IMAGE_SUBSYSTEM_XBOX
14
XBOX
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
16
Aplikasi boot Windows.
Karakteristik DLL

Nilai berikut didefinisikan untuk bidang DllCharacteristics dari header opsional.

Terus-menerus Nilai Deskripsi
0x0001
Dicadangkan, harus nol.
0x0002
Dicadangkan, harus nol.
0x0004
Dicadangkan, harus nol.
0x0008
Dicadangkan, harus nol.
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
0x0020
Gambar dapat menangani ruang alamat virtual 64-bit entropi tinggi.
IMAGE_DLLCHARACTERISTICS_
DYNAMIC_BASE
0x0040
DLL dapat direlokasi pada waktu pemuatan.
IMAGE_DLLCHARACTERISTICS_
FORCE_INTEGRITY
0x0080
Pemeriksaan Integritas Kode diberlakukan.
IMAGE_DLLCHARACTERISTICS_
NX_COMPAT
0x0100
Gambar kompatibel dengan NX.
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION
0x0200
Isolasi sadar, tetapi jangan mengisolasi gambar.
IMAGE_DLLCHARACTERISTICS_ NO_SEH
0x0400
Tidak menggunakan penanganan pengecualian terstruktur (SE). Tidak ada handler SE yang dapat dipanggil dalam gambar ini.
IMAGE_DLLCHARACTERISTICS_ NO_BIND
0x0800
Jangan mengikat gambar.
IMAGE_DLLCHARACTERISTICS_APPCONTAINER
0x1000
Gambar harus dijalankan di AppContainer.
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER
0x2000
Driver WDM.
IMAGE_DLLCHARACTERISTICS_GUARD_CF
0x4000
Gambar mendukung Control Flow Guard.
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE
0x8000
Server Terminal sadar.

Direktori Data Header Opsional (Hanya Gambar)

Setiap direktori data memberikan alamat dan ukuran tabel atau string yang digunakan Windows. Entri direktori data ini semuanya dimuat ke dalam memori sehingga sistem dapat menggunakannya pada waktu proses. Direktori data adalah bidang 8-byte yang memiliki deklarasi berikut:

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

Bidang pertama, VirtualAddress, sebenarnya adalah RVA tabel. RVA adalah alamat tabel relatif terhadap alamat dasar gambar saat tabel dimuat. Bidang kedua memberikan ukuran dalam byte. Direktori data, yang membentuk bagian terakhir dari header opsional, tercantum dalam tabel berikut.

Perhatikan bahwa jumlah direktori tidak diperbaiki. Sebelum mencari direktori tertentu, periksa bidang NumberOfRvaAndSizes di header opsional.

Selain itu, jangan asumsikan bahwa RVA dalam tabel ini menunjuk ke awal bagian atau bahwa bagian yang berisi tabel tertentu memiliki nama tertentu.

Offset (PE/PE32+) Ukuran Bidang Deskripsi
96/112
8
Ekspor Tabel
Alamat dan ukuran tabel ekspor. Untuk informasi selengkapnya, lihat Bagian .edata (Hanya Gambar).
104/120
8
Impor Tabel
Alamat dan ukuran tabel impor. Untuk informasi selengkapnya, lihat Bagian .idata.
112/128
8
Tabel Sumber Daya
Alamat dan ukuran tabel sumber daya. Untuk informasi selengkapnya, lihat Bagian .rsrc.
120/136
8
Tabel Pengecualian
Alamat dan ukuran tabel pengecualian. Untuk informasi selengkapnya, lihat Bagian .pdata.
128/144
8
Tabel Sertifikat
Alamat dan ukuran tabel sertifikat atribut. Untuk informasi selengkapnya, lihat Tabel Sertifikat Atribut (Hanya Gambar).
136/152
8
Tabel Relokasi Dasar
Alamat dan ukuran tabel relokasi dasar. Untuk informasi selengkapnya, lihat Bagian .reloc (Hanya Gambar).
144/160
8
Awakutu
Alamat dan ukuran awal data debug. Untuk informasi selengkapnya, lihat Bagian .debug.
152/168
8
Arsitektur
Dicadangkan, harus 0
160/176
8
Global Ptr
RVA dari nilai yang akan disimpan dalam daftar pointer global. Anggota ukuran struktur ini harus diatur ke nol.
168/184
8
Tabel TLS
Alamat dan ukuran tabel penyimpanan lokal utas (TLS). Untuk informasi selengkapnya, lihat Bagian .tls.
176/192
8
Muat Tabel Konfigurasi
Alamat dan ukuran tabel konfigurasi beban. Untuk informasi selengkapnya, lihat Struktur Konfigurasi Beban (Hanya Gambar).
184/200
8
Impor Terikat
Alamat dan ukuran tabel impor terikat.
192/208
8
IAT
Alamat dan ukuran tabel alamat impor. Untuk informasi selengkapnya, lihat Mengimpor Tabel Alamat.
200/216
8
Tunda Impor Deskriptor
Alamat dan ukuran deskriptor impor penundaan. Untuk informasi selengkapnya, lihat Tabel Impor Tunda Muat (Hanya Gambar).
208/224
8
CLR Runtime Header
Alamat dan ukuran header runtime CLR. Untuk informasi selengkapnya, lihat Bagian .cormeta (Khusus Objek).
216/232
8
Dicadangkan, harus nol

Entri Tabel Sertifikat menunjuk ke tabel sertifikat atribut. Sertifikat ini tidak dimuat ke dalam memori sebagai bagian dari gambar. Dengan demikian, bidang pertama dari entri ini, yang biasanya merupakan RVA, adalah penunjuk file sebagai gantinya.

Tabel Bagian (Header Bagian)

Setiap baris tabel bagian, berlaku, header bagian. Tabel ini segera mengikuti header opsional, jika ada. Penempatan ini diperlukan karena header file tidak berisi penunjuk langsung ke tabel bagian. Sebagai gantinya, lokasi tabel bagian ditentukan dengan menghitung lokasi byte pertama setelah header. Pastikan untuk menggunakan ukuran header opsional seperti yang ditentukan di header file.

Jumlah entri dalam tabel bagian diberikan oleh bidang NumberOfSections di header file. Entri dalam tabel bagian diberi nomor mulai dari satu (1). Entri bagian kode dan memori data berada dalam urutan yang dipilih oleh linker.

Dalam file gambar, VAs untuk bagian harus ditetapkan oleh linker sehingga berada dalam urutan naik dan berdekatan, dan harus berupa kelipatan nilai SectionAlignment di header opsional.

Setiap header bagian (entri tabel bagian) memiliki format berikut, dengan total 40 byte per entri.

Offset Ukuran Bidang Deskripsi
0
8
Nama
String yang dikodekan UTF-8 dengan 8 byte dan null-padded. Jika panjang string persis 8 karakter, tidak ada penghentian null. Untuk nama yang lebih panjang, bidang ini berisi garis miring (/) yang diikuti oleh representasi ASCII dari angka desimal yang merupakan offset ke dalam tabel string. Gambar yang dapat dieksekusi tidak menggunakan tabel string dan tidak mendukung nama bagian yang lebih panjang dari 8 karakter. Nama panjang dalam file objek dipotong jika dipancarkan ke file yang dapat dieksekusi.
8
4
VirtualSize
Ukuran total bagian saat dimuat ke dalam memori. Jika nilai ini lebih besar dari SizeOfRawData, bagiannya adalah zero-padded. Bidang ini hanya valid untuk gambar yang dapat dieksekusi dan harus diatur ke nol untuk file objek.
12
4
VirtualAddress
Untuk gambar yang dapat dieksekusi, alamat byte pertama bagian relatif terhadap basis gambar saat bagian dimuat ke dalam memori. Untuk file objek, bidang ini adalah alamat byte pertama sebelum relokasi diterapkan; untuk kesederhanaan, pengkompilasi harus mengatur ini ke nol. Jika tidak, itu adalah nilai arbitrer yang dikurangi dari offset selama relokasi.
16
4
SizeOfRawData
Ukuran bagian (untuk file objek) atau ukuran data yang diinisialisasi pada disk (untuk file gambar). Untuk gambar yang dapat dieksekusi, ini harus berupa kelipatan FileAlignment dari header opsional. Jika ini kurang dari VirtualSize, sisa bagian tidak terisi. Karena bidang SizeOfRawData dibulatkan tetapi bidang VirtualSize tidak, dimungkinkan bagi SizeOfRawData untuk menjadi lebih besar dari VirtualSize juga. Ketika bagian hanya berisi data yang tidak diinisialisasi, bidang ini harus nol.
20
4
PointerToRawData
Penunjuk file ke halaman pertama bagian dalam file COFF. Untuk gambar yang dapat dieksekusi, ini harus berupa kelipatan FileAlignment dari header opsional. Untuk file objek, nilai harus diselaraskan pada batas 4 byte untuk performa terbaik. Ketika bagian hanya berisi data yang tidak diinisialisasi, bidang ini harus nol.
24
4
PointerToRelocations
Penunjuk file ke awal entri relokasi untuk bagian tersebut. Ini diatur ke nol untuk gambar yang dapat dieksekusi atau jika tidak ada relokasi.
28
4
PointerToLinenumbers
Penunjuk file ke awal entri nomor baris untuk bagian tersebut. Ini diatur ke nol jika tidak ada nomor baris COFF. Nilai ini harus nol untuk gambar karena informasi penelusuran kesalahan COFF tidak digunakan lagi.
32
2
NumberOfRelocations
Jumlah entri relokasi untuk bagian tersebut. Ini diatur ke nol untuk gambar yang dapat dieksekusi.
34
2
NumberOfLinenumbers
Jumlah entri nomor baris untuk bagian tersebut. Nilai ini harus nol untuk gambar karena informasi penelusuran kesalahan COFF tidak digunakan lagi.
36
4
Karakteristik
Bendera yang menjelaskan karakteristik bagian . Untuk informasi selengkapnya, lihat Bendera Bagian.

 

Bendera Bagian

Bendera bagian di bidang Karakteristik header bagian menunjukkan karakteristik bagian.

Bendera Nilai Deskripsi
0x00000000
Disiapkan untuk penggunaan masa mendatang.
0x00000001
Disiapkan untuk penggunaan masa mendatang.
0x00000002
Disiapkan untuk penggunaan masa mendatang.
0x00000004
Disiapkan untuk penggunaan masa mendatang.
IMAGE_SCN_TYPE_NO_PAD
0x00000008
Bagian tidak boleh diisi ke batas berikutnya. Bendera ini usang dan digantikan oleh IMAGE_SCN_ALIGN_1BYTES. Ini hanya valid untuk file objek.
0x00000010
Disiapkan untuk penggunaan masa mendatang.
IMAGE_SCN_CNT_CODE
0x00000020
Bagian berisi kode yang dapat dieksekusi.
IMAGE_SCN_CNT_INITIALIZED_DATA
0x00000040
Bagian berisi data yang diinisialisasi.
IMAGE_SCN_CNT_UNINITIALIZED_ DATA
0x00000080
Bagian berisi data yang tidak diinisialisasi.
IMAGE_SCN_LNK_OTHER
0x00000100
Disiapkan untuk penggunaan masa mendatang.
IMAGE_SCN_LNK_INFO
0x00000200
Bagian berisi komentar atau informasi lainnya. Bagian .drectve memiliki jenis ini. Ini hanya berlaku untuk file objek.
0x00000400
Disiapkan untuk penggunaan masa mendatang.
IMAGE_SCN_LNK_REMOVE
0x00000800
Bagian tidak akan menjadi bagian dari gambar. Ini hanya valid untuk file objek.
IMAGE_SCN_LNK_COMDAT
0x00001000
Bagian ini berisi data COMDAT. Untuk informasi selengkapnya, lihat Bagian COMDAT (Khusus Objek). Ini hanya valid untuk file objek.
IMAGE_SCN_GPREL
0x00008000
Bagian ini berisi data yang dirujuk melalui pointer global (GP).
IMAGE_SCN_MEM_PURGEABLE
0x00020000
Disiapkan untuk penggunaan masa mendatang.
IMAGE_SCN_MEM_16BIT
0x00020000
Disiapkan untuk penggunaan masa mendatang.
IMAGE_SCN_MEM_LOCKED
0x00040000
Disiapkan untuk penggunaan masa mendatang.
IMAGE_SCN_MEM_PRELOAD
0x00080000
Disiapkan untuk penggunaan masa mendatang.
IMAGE_SCN_ALIGN_1BYTES
0x00100000
Meratakan data pada batas 1 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_2BYTES
0x00200000
Meratakan data pada batas 2 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_4BYTES
0x00300000
Meratakan data pada batas 4 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_8BYTES
0x00400000
Meratakan data pada batas 8-byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_16BYTES
0x00500000
Meratakan data pada batas 16 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_32BYTES
0x00600000
Meratakan data pada batas 32 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_64BYTES
0x00700000
Meratakan data pada batas 64 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_128BYTES
0x00800000
Meratakan data pada batas 128 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_256BYTES
0x00900000
Meratakan data pada batas 256 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_512BYTES
0x00A00000
Meratakan data pada batas 512 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_1024BYTES
0x00B00000
Meratakan data pada batas 1024-byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_2048BYTES
0x00C00000
Meratakan data pada batas 2048-byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_4096BYTES
0x00D00000
Meratakan data pada batas 4096 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_ALIGN_8192BYTES
0x00E00000
Meratakan data pada batas 8192 byte. Hanya berlaku untuk file objek.
IMAGE_SCN_LNK_NRELOC_OVFL
0x01000000
Bagian berisi relokasi yang diperluas.
IMAGE_SCN_MEM_DISCARDABLE
0x02000000
Bagian dapat dibuang sesuai kebutuhan.
IMAGE_SCN_MEM_NOT_CACHED
0x04000000
Bagian tidak dapat di-cache.
IMAGE_SCN_MEM_NOT_PAGED
0x08000000
Bagian ini tidak dapat di-pageable.
IMAGE_SCN_MEM_SHARED
0x10000000
Bagian dapat dibagikan dalam memori.
IMAGE_SCN_MEM_EXECUTE
0x20000000
Bagian dapat dijalankan sebagai kode.
IMAGE_SCN_MEM_READ
0x40000000
Bagian dapat dibaca.
IMAGE_SCN_MEM_WRITE
0x80000000
Bagian dapat ditulis.

 

IMAGE_SCN_LNK_NRELOC_OVFL menunjukkan bahwa jumlah relokasi untuk bagian melebihi 16 bit yang dicadangkan untuk itu di header bagian. Jika bit diatur dan bidang NumberOfRelocations di header bagian 0xffff, jumlah relokasi aktual disimpan di bidang VirtualAddress 32-bit dari relokasi pertama. Ini adalah kesalahan jika IMAGE_SCN_LNK_NRELOC_OVFL diatur dan ada kurang dari 0xffff relokasi di bagian .

Bagian yang Dikelompokkan (Objek Saja)

Karakter "$" (tanda dolar) memiliki interpretasi khusus dalam nama bagian dalam file objek.

Saat menentukan bagian gambar yang akan berisi konten bagian objek, linker membuang "$" dan semua karakter yang mengikutinya. Dengan demikian, bagian objek bernama .text$X sebenarnya berkontribusi pada bagian .text dalam gambar.

Namun, karakter yang mengikuti "$" menentukan urutan kontribusi ke bagian gambar. Semua kontribusi dengan nama bagian objek yang sama dialokasikan secara berdekatan dalam gambar, dan blok kontribusi diurutkan dalam urutan leksikal menurut nama bagian objek. Oleh karena itu, semua yang ada dalam file objek dengan nama bagian .text$X berakhir bersama-sama, setelah kontribusi .text$W dan sebelum kontribusi .text$Y .

Nama bagian dalam file gambar tidak pernah berisi karakter "$".

Isi File Lainnya

Struktur data yang dijelaskan sejauh ini, hingga dan termasuk header opsional, semuanya terletak di offset tetap dari awal file (atau dari header PE jika file adalah gambar yang berisi stub MS-DOS).

Sisa objek COFF atau file gambar berisi blok data yang belum tentu pada offset file tertentu. Sebagai gantinya, lokasi ditentukan oleh penunjuk di header opsional atau header bagian.

Pengecualian adalah untuk gambar dengan nilai SectionAlignment kurang dari ukuran halaman arsitektur (4 K untuk Intel x86 dan untuk MIPS, dan 8 K untuk Itanium). Untuk deskripsi SectionAlignment, lihat Header Opsional (Hanya Gambar). Dalam hal ini, ada batasan pada offset file dari data bagian, seperti yang dijelaskan dalam bagian 5.1, "Data Bagian." Pengecualian lain adalah bahwa sertifikat atribut dan informasi debug harus ditempatkan di akhir file gambar, dengan tabel sertifikat atribut segera mendahului bagian debug, karena loader tidak memetakannya ke dalam memori. Namun, aturan tentang sertifikat atribut dan informasi debug tidak berlaku untuk file objek.

Data Bagian

Data yang diinisialisasi untuk bagian terdiri dari blok byte sederhana. Namun, untuk bagian yang berisi semua nol, data bagian tidak perlu disertakan.

Data untuk setiap bagian terletak di offset file yang diberikan oleh bidang PointerToRawData di header bagian. Ukuran data ini dalam file ditunjukkan oleh bidang SizeOfRawData. Jika SizeOfRawData kurang dari VirtualSize, sisanya diisi dengan nol.

Dalam file gambar, data bagian harus diratakan pada batas seperti yang ditentukan oleh bidang FileAlignment di header opsional. Data bagian harus muncul dalam urutan nilai RVA untuk bagian yang sesuai (seperti halnya header bagian individual dalam tabel bagian).

Ada batasan tambahan pada file gambar jika nilai SectionAlignment di header opsional kurang dari ukuran halaman arsitektur. Untuk file tersebut, lokasi data bagian dalam file harus cocok dengan lokasinya dalam memori ketika gambar dimuat, sehingga offset fisik untuk data bagian sama dengan RVA.

Relokasi COFF (Objek Saja)

File objek berisi relokasi COFF, yang menentukan bagaimana data bagian harus dimodifikasi ketika ditempatkan dalam file gambar dan kemudian dimuat ke dalam memori.

File gambar tidak berisi relokasi COFF, karena semua simbol yang direferensikan telah ditetapkan alamat di ruang alamat datar. Gambar berisi informasi relokasi dalam bentuk relokasi dasar di bagian .relokasi (kecuali gambar memiliki atribut IMAGE_FILE_RELOCS_STRIPPED). Untuk informasi selengkapnya, lihat Bagian .reloc (Hanya Gambar).

Untuk setiap bagian dalam file objek, array rekaman panjang tetap menyimpan relokasi COFF bagian. Posisi dan panjang array ditentukan di header bagian. Setiap elemen array memiliki format berikut.

Offset Ukuran Bidang Deskripsi
0
4
VirtualAddress
Alamat item tempat relokasi diterapkan. Ini adalah offset dari awal bagian, ditambah nilai bidang RVA/Offset bagian. Lihat Tabel Bagian (Header Bagian). Misalnya, jika byte pertama bagian memiliki alamat 0x10, byte ketiga memiliki alamat 0x12.
4
4
SymbolTableIndex
Indeks berbasis nol ke dalam tabel simbol. Simbol ini memberikan alamat yang akan digunakan untuk relokasi. Jika simbol yang ditentukan memiliki kelas penyimpanan bagian, maka alamat simbol adalah alamat dengan bagian pertama dengan nama yang sama.
8
2
Ketikkan
Nilai yang menunjukkan jenis relokasi yang harus dilakukan. Jenis relokasi yang valid bergantung pada jenis komputer. Lihat Indikator Tipe.

 

Jika simbol yang dirujuk oleh bidang SymbolTableIndex memiliki kelas penyimpanan IMAGE_SYM_CLASS_SECTION, alamat simbol adalah awal dari bagian tersebut. Bagian biasanya dalam file yang sama, kecuali ketika file objek adalah bagian dari arsip (pustaka). Dalam hal ini, bagian dapat ditemukan di file objek lain dalam arsip yang memiliki nama anggota arsip yang sama dengan file objek saat ini. (Hubungan dengan nama arsip-anggota digunakan dalam penautan tabel impor, yaitu, bagian .idata.)

Indikator Tipe

Bidang Jenis rekaman relokasi menunjukkan jenis relokasi apa yang harus dilakukan. Jenis relokasi yang berbeda didefinisikan untuk setiap jenis komputer.

Prosesor x64

Indikator jenis relokasi berikut didefinisikan untuk x64 dan prosesor yang kompatibel.

Terus-menerus Nilai Deskripsi
IMAGE_REL_AMD64_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_AMD64_ADDR64
0x0001
VA 64-bit dari target relokasi.
IMAGE_REL_AMD64_ADDR32
0x0002
VA 32-bit dari target relokasi.
IMAGE_REL_AMD64_ADDR32NB
0x0003
Alamat 32-bit tanpa basis gambar (RVA).
IMAGE_REL_AMD64_REL32
0x0004
Alamat relatif 32-bit dari byte setelah relokasi.
IMAGE_REL_AMD64_REL32_1
0x0005
Alamat 32-bit relatif terhadap jarak byte 1 dari relokasi.
IMAGE_REL_AMD64_REL32_2
0x0006
Alamat 32-bit relatif terhadap jarak byte 2 dari relokasi.
IMAGE_REL_AMD64_REL32_3
0x0007
Alamat 32-bit relatif terhadap jarak byte 3 dari relokasi.
IMAGE_REL_AMD64_REL32_4
0x0008
Alamat 32-bit relatif terhadap jarak byte 4 dari relokasi.
IMAGE_REL_AMD64_REL32_5
0x0009
Alamat 32-bit relatif terhadap jarak byte 5 dari relokasi.
IMAGE_REL_AMD64_SECTION
0x000A
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_AMD64_SECREL
0x000B
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_AMD64_SECREL7
0x000C
Offset 7-bit yang tidak ditandatangani dari dasar bagian yang berisi target.
IMAGE_REL_AMD64_TOKEN
0x000D
Token CLR.
IMAGE_REL_AMD64_SREL32
0x000E
Nilai dependen rentang bertanda tangan 32-bit yang dipancarkan ke dalam objek.
IMAGE_REL_AMD64_PAIR
0x000F
Pasangan yang harus segera mengikuti setiap nilai tergantung rentang.
IMAGE_REL_AMD64_SSPAN32
0x0010
Nilai dependen rentang bertanda tangan 32-bit yang diterapkan pada waktu tautan.

 

Prosesor ARM

Indikator jenis relokasi berikut didefinisikan untuk prosesor ARM.

Terus-menerus Nilai Deskripsi
IMAGE_REL_ARM_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_ARM_ADDR32
0x0001
VA 32-bit dari target.
IMAGE_REL_ARM_ADDR32NB
0x0002
RVA 32-bit dari target.
IMAGE_REL_ARM_BRANCH24
0x0003
Perpindahan relatif 24-bit ke target.
IMAGE_REL_ARM_BRANCH11
0x0004
Referensi ke panggilan subroutine. Referensi terdiri dari dua instruksi 16-bit dengan offset 11-bit.
IMAGE_REL_ARM_REL32
0x000A
Alamat relatif 32-bit dari byte setelah relokasi.
IMAGE_REL_ARM_SECTION
0x000E
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_ARM_SECREL
0x000F
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_ARM_MOV32
0x0010
VA 32-bit dari target. Relokasi ini diterapkan menggunakan instruksi MOVW untuk 16 bit rendah diikuti oleh MOVT untuk 16 bit tinggi.
IMAGE_REL_THUMB_MOV32
0x0011
VA 32-bit dari target. Relokasi ini diterapkan menggunakan instruksi MOVW untuk 16 bit rendah diikuti oleh MOVT untuk 16 bit tinggi.
IMAGE_REL_THUMB_BRANCH20
0x0012
Instruksi diperbaiki dengan perpindahan relatif 21-bit ke target selaras 2-byte. Bit yang paling tidak signifikan dari perpindahan selalu nol dan tidak disimpan. Relokasi ini sesuai dengan instruksi Thumb-2 32-bit conditional B.
Tidak terpakai
0x0013
IMAGE_REL_THUMB_BRANCH24
0x0014
Instruksi diperbaiki dengan perpindahan relatif 25-bit ke target selaras 2 byte. Bit yang paling tidak signifikan dari perpindahan adalah nol dan tidak disimpan. Relokasi ini sesuai dengan instruksi Thumb-2 B.
IMAGE_REL_THUMB_BLX23
0x0015
Instruksi diperbaiki dengan perpindahan relatif 25-bit ke target selaras 4-byte. 2 bit rendah dari perpindahan adalah nol dan tidak disimpan.
Relokasi ini sesuai dengan instruksi Thumb-2 BLX.
IMAGE_REL_ARM_PAIR
0x0016
Relokasi hanya berlaku ketika segera mengikuti ARM_REFHI atau THUMB_REFHI. SymbolTableIndex berisi perpindahan dan bukan indeks ke dalam tabel simbol.

 

Prosesor ARM64

Indikator jenis relokasi berikut didefinisikan untuk prosesor ARM64.

Terus-menerus Nilai Deskripsi
IMAGE_REL_ARM64_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_ARM64_ADDR32
0x0001
VA 32-bit dari target.
IMAGE_REL_ARM64_ADDR32NB
0x0002
RVA 32-bit dari target.
IMAGE_REL_ARM64_BRANCH26
0x0003
Perpindahan relatif 26-bit ke target, untuk instruksi B dan BL.
IMAGE_REL_ARM64_PAGEBASE_REL21
0x0004
Basis halaman target, untuk instruksi ADRP.
IMAGE_REL_ARM64_REL21
0x0005
Perpindahan relatif 12-bit ke target, untuk instruksi ADR
IMAGE_REL_ARM64_PAGEOFFSET_12A
0x0006
Offset halaman 12-bit dari target, untuk instruksi ADD/ADDS (langsung) dengan nol shift.
IMAGE_REL_ARM64_PAGEOFFSET_12L
0x0007
Offset halaman 12-bit dari target, untuk instruksi LDR (segera diindeks, tidak ditandatangani).
IMAGE_REL_ARM64_SECREL
0x0008
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_ARM64_SECREL_LOW12A
0x0009
Bit 0:11 dari offset bagian target, untuk instruksi ADD/ADDS (langsung) dengan nol shift.
IMAGE_REL_ARM64_SECREL_HIGH12A
0x000A
Bit 12:23 dari offset bagian target, untuk instruksi ADD/ADDS (langsung) dengan nol shift.
IMAGE_REL_ARM64_SECREL_LOW12L
0x000B
Bit 0:11 dari offset bagian target, untuk instruksi LDR (segera diindeks, tidak ditandatangani).
IMAGE_REL_ARM64_TOKEN
0x000C
Token CLR.
IMAGE_REL_ARM64_SECTION
0x000D
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_ARM64_ADDR64
0x000E
VA 64-bit dari target relokasi.
IMAGE_REL_ARM64_BRANCH19
0x000F
Offset 19-bit ke target relokasi, untuk instruksi B bersyarkat.
IMAGE_REL_ARM64_BRANCH14
0x0010
Offset 14-bit ke target relokasi, untuk instruksi TBZ dan TBNZ.
IMAGE_REL_ARM64_REL32
0x0011
Alamat relatif 32-bit dari byte setelah relokasi.
Prosesor Hitachi SuperH

Indikator jenis relokasi berikut didefinisikan untuk prosesor SH3 dan SH4. Relokasi khusus SH5 dicatat sebagai SHM (SH Media).

Terus-menerus Nilai Deskripsi
IMAGE_REL_SH3_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_SH3_DIRECT16
0x0001
Referensi ke lokasi 16-bit yang berisi VA simbol target.
IMAGE_REL_SH3_DIRECT32
0x0002
VA 32-bit dari simbol target.
IMAGE_REL_SH3_DIRECT8
0x0003
Referensi ke lokasi 8-bit yang berisi VA simbol target.
IMAGE_REL_SH3_DIRECT8_WORD
0x0004
Referensi ke instruksi 8-bit yang berisi VA 16-bit yang efektif dari simbol target.
IMAGE_REL_SH3_DIRECT8_LONG
0x0005
Referensi ke instruksi 8-bit yang berisi VA 32-bit efektif dari simbol target.
IMAGE_REL_SH3_DIRECT4
0x0006
Referensi ke lokasi 8-bit yang 4 bit rendahnya berisi VA simbol target.
IMAGE_REL_SH3_DIRECT4_WORD
0x0007
Referensi ke instruksi 8-bit yang 4 bit rendahnya berisi VA 16-bit yang efektif dari simbol target.
IMAGE_REL_SH3_DIRECT4_LONG
0x0008
Referensi ke instruksi 8-bit yang 4 bit rendahnya berisi VA 32-bit efektif dari simbol target.
IMAGE_REL_SH3_PCREL8_WORD
0x0009
Referensi ke instruksi 8-bit yang berisi offset relatif 16-bit efektif dari simbol target.
IMAGE_REL_SH3_PCREL8_LONG
0x000A
Referensi ke instruksi 8-bit yang berisi offset relatif 32-bit efektif dari simbol target.
IMAGE_REL_SH3_PCREL12_WORD
0x000B
Referensi ke instruksi 16-bit yang 12 bit rendahnya berisi offset relatif 16-bit yang efektif dari simbol target.
IMAGE_REL_SH3_STARTOF_SECTION
0x000C
Referensi ke lokasi 32-bit yang merupakan VA dari bagian yang berisi simbol target.
IMAGE_REL_SH3_SIZEOF_SECTION
0x000D
Referensi ke lokasi 32-bit yang merupakan ukuran bagian yang berisi simbol target.
IMAGE_REL_SH3_SECTION
0x000E
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_SH3_SECREL
0x000F
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_SH3_DIRECT32_NB
0x0010
RVA 32-bit dari simbol target.
IMAGE_REL_SH3_GPREL4_LONG
0x0011
GP relatif.
IMAGE_REL_SH3_TOKEN
0x0012
Token CLR.
IMAGE_REL_SHM_PCRELPT
0x0013
Offset dari instruksi saat ini dalam kata panjang. Jika bit NOMODE tidak diatur, masukkan inversi bit rendah pada bit 32 untuk memilih PTA atau PTB.
IMAGE_REL_SHM_REFLO
0x0014
16 bit rendah dari alamat 32-bit.
IMAGE_REL_SHM_REFHALF
0x0015
16 bit tinggi dari alamat 32-bit.
IMAGE_REL_SHM_RELLO
0x0016
16 bit rendah dari alamat relatif.
IMAGE_REL_SHM_RELHALF
0x0017
16 bit tinggi dari alamat relatif.
IMAGE_REL_SHM_PAIR
0x0018
Relokasi hanya berlaku ketika segera mengikuti relokasi REFHALF, RELHALF, atau RELLO. Bidang SymbolTableIndex dari relokasi berisi perpindahan dan bukan indeks ke dalam tabel simbol.
IMAGE_REL_SHM_NOMODE
0x8000
Relokasi mengabaikan mode bagian.

 

Prosesor IBM PowerPC

Indikator jenis relokasi berikut didefinisikan untuk prosesor PowerPC.

Terus-menerus Nilai Deskripsi
IMAGE_REL_PPC_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_PPC_ADDR64
0x0001
VA 64-bit dari target.
IMAGE_REL_PPC_ADDR32
0x0002
VA 32-bit dari target.
IMAGE_REL_PPC_ADDR24
0x0003
24 bit rendah dari VA target. Ini hanya berlaku ketika simbol target absolut dan dapat diperpanjang tanda ke nilai aslinya.
IMAGE_REL_PPC_ADDR16
0x0004
16 bit rendah dari VA target.
IMAGE_REL_PPC_ADDR14
0x0005
14 bit rendah dari VA target. Ini hanya berlaku ketika simbol target absolut dan dapat diperpanjang tanda ke nilai aslinya.
IMAGE_REL_PPC_REL24
0x0006
Offset PC-relative 24-bit ke lokasi simbol.
IMAGE_REL_PPC_REL14
0x0007
Offset PC-relative 14-bit ke lokasi simbol.
IMAGE_REL_PPC_ADDR32NB
0x000A
RVA 32-bit dari target.
IMAGE_REL_PPC_SECREL
0x000B
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_PPC_SECTION
0x000C
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_PPC_SECREL16
0x000F
Offset 16-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_PPC_REFHI
0x0010
16 bit tinggi dari VA 32-bit target. Ini digunakan untuk instruksi pertama dalam urutan dua instruksi yang memuat alamat lengkap. Relokasi ini harus segera diikuti oleh relokasi PAIR yang SymbolTableIndex-nya berisi perpindahan 16-bit yang ditandatangani yang ditambahkan ke 16 bit atas yang diambil dari lokasi yang sedang direlokasi.
IMAGE_REL_PPC_REFLO
0x0011
16 bit rendah dari VA target.
IMAGE_REL_PPC_PAIR
0x0012
Relokasi yang hanya valid ketika segera mengikuti relokasi REFHI atau SECRELHI. SymbolTableIndex berisi perpindahan dan bukan indeks ke dalam tabel simbol.
IMAGE_REL_PPC_SECRELLO
0x0013
16 bit rendah dari offset 32-bit target dari awal bagiannya.
IMAGE_REL_PPC_GPREL
0x0015
Perpindahan target yang ditandatangani 16-bit relatif terhadap register GP.
IMAGE_REL_PPC_TOKEN
0x0016
Token CLR.

 

Prosesor Intel 386

Indikator jenis relokasi berikut didefinisikan untuk Intel 386 dan prosesor yang kompatibel.

Terus-menerus Nilai Deskripsi
IMAGE_REL_I386_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_I386_DIR16
0x0001
Tidak didukung.
IMAGE_REL_I386_REL16
0x0002
Tidak didukung.
IMAGE_REL_I386_DIR32
0x0006
Target va 32-bit.
IMAGE_REL_I386_DIR32NB
0x0007
Targetnya adalah RVA 32-bit.
IMAGE_REL_I386_SEG12
0x0009
Tidak didukung.
IMAGE_REL_I386_SECTION
0x000A
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_I386_SECREL
0x000B
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_I386_TOKEN
0x000C
Token CLR.
IMAGE_REL_I386_SECREL7
0x000D
Offset 7-bit dari dasar bagian yang berisi target.
IMAGE_REL_I386_REL32
0x0014
Perpindahan relatif 32-bit ke target. Ini mendukung cabang relatif x86 dan instruksi panggilan.

 

Intel Itanium Processor Family (IPF)

Indikator jenis relokasi berikut didefinisikan untuk keluarga prosesor Intel Itanium dan prosesor yang kompatibel. Perhatikan bahwa relokasi pada instruksi menggunakan offset bundel dan nomor slot untuk offset relokasi.

Terus-menerus Nilai Deskripsi
IMAGE_REL_IA64_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_IA64_IMM14
0x0001
Relokasi instruksi dapat diikuti dengan relokasi ADDEND yang nilainya ditambahkan ke alamat target sebelum dimasukkan ke slot yang ditentukan dalam bundel IMM14. Target relokasi harus absolut atau gambar harus diperbaiki.
IMAGE_REL_IA64_IMM22
0x0002
Relokasi instruksi dapat diikuti dengan relokasi ADDEND yang nilainya ditambahkan ke alamat target sebelum dimasukkan ke dalam slot yang ditentukan dalam bundel IMM22. Target relokasi harus absolut atau gambar harus diperbaiki.
IMAGE_REL_IA64_IMM64
0x0003
Nomor slot dari relokasi ini harus satu (1). Relokasi dapat diikuti dengan relokasi ADDEND yang nilainya ditambahkan ke alamat target sebelum disimpan di ketiga slot bundel IMM64.
IMAGE_REL_IA64_DIR32
0x0004
Target va 32-bit. Ini hanya didukung untuk /LARGEADDRESSAWARE:NO images.
IMAGE_REL_IA64_DIR64
0x0005
Target adalah VA 64-bit.
IMAGE_REL_IA64_PCREL21B
0x0006
Instruksi diperbaiki dengan perpindahan relatif 25-bit ke target selaras 16-bit. 4 bit rendah dari perpindahan adalah nol dan tidak disimpan.
IMAGE_REL_IA64_PCREL21M
0x0007
Instruksi diperbaiki dengan perpindahan relatif 25-bit ke target selaras 16-bit. 4 bit rendah dari perpindahan, yang nol, tidak disimpan.
IMAGE_REL_IA64_PCREL21F
0x0008
LSB offset relokasi ini harus berisi nomor slot sedangkan sisanya adalah alamat bundel. Bundel diperbaiki dengan perpindahan relatif 25-bit ke target selaras 16-bit. 4 bit rendah dari perpindahan adalah nol dan tidak disimpan.
IMAGE_REL_IA64_GPREL22
0x0009
Relokasi instruksi dapat diikuti dengan relokasi ADDEND yang nilainya ditambahkan ke alamat target dan kemudian offset relatif GP 22-bit yang dihitung dan diterapkan ke bundel GPREL22.
IMAGE_REL_IA64_LTOFF22
0x000A
Instruksi diperbaiki dengan offset relatif GP 22-bit ke entri tabel literal simbol target. Linker membuat entri tabel harfiah ini berdasarkan relokasi ini dan relokasi ADDEND yang mungkin mengikuti.
IMAGE_REL_IA64_SECTION
0x000B
Indeks bagian 16-bit dari bagian berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_IA64_SECREL22
0x000C
Instruksi diperbaiki dengan offset 22-bit dari target dari awal bagiannya. Relokasi ini dapat segera diikuti oleh relokasi ADDEND, yang bidang Nilainya berisi offset target yang tidak ditandatangani 32-bit dari awal bagian.
IMAGE_REL_IA64_SECREL64I
0x000D
Nomor slot untuk relokasi ini harus satu (1). Instruksi diperbaiki dengan offset 64-bit dari target dari awal bagiannya. Relokasi ini dapat segera diikuti oleh relokasi ADDEND yang bidang Nilainya berisi offset target yang tidak ditandatangani 32-bit dari awal bagian.
IMAGE_REL_IA64_SECREL32
0x000E
Alamat data yang akan diperbaiki dengan offset 32-bit dari target dari awal bagiannya.
IMAGE_REL_IA64_DIR32NB
0x0010
Targetnya adalah RVA 32-bit.
IMAGE_REL_IA64_SREL14
0x0011
Ini diterapkan ke segera 14-bit yang ditandatangani yang berisi perbedaan antara dua target yang dapat direlokasi. Ini adalah bidang deklaratif untuk linker yang menunjukkan bahwa pengkompilasi telah memancarkan nilai ini.
IMAGE_REL_IA64_SREL22
0x0012
Ini diterapkan ke segera 22-bit yang ditandatangani yang berisi perbedaan antara dua target yang dapat direlokasi. Ini adalah bidang deklaratif untuk linker yang menunjukkan bahwa pengkompilasi telah memancarkan nilai ini.
IMAGE_REL_IA64_SREL32
0x0013
Ini diterapkan ke segera 32-bit yang ditandatangani yang berisi perbedaan antara dua nilai yang dapat direlokasi. Ini adalah bidang deklaratif untuk linker yang menunjukkan bahwa pengkompilasi telah memancarkan nilai ini.
IMAGE_REL_IA64_UREL32
0x0014
Ini diterapkan ke langsung 32-bit yang tidak ditandatangani yang berisi perbedaan antara dua nilai yang dapat direlokasi. Ini adalah bidang deklaratif untuk linker yang menunjukkan bahwa pengkompilasi telah memancarkan nilai ini.
IMAGE_REL_IA64_PCREL60X
0x0015
Perbaikan pc-relative 60-bit yang selalu tetap sebagai instruksi BRL dari bundel MLX.
IMAGE_REL_IA64_PCREL60B
0x0016
Perbaikan pc-relatif 60-bit. Jika perpindahan target pas di bidang 25-bit yang ditandatangani, konversikan seluruh bundel ke bundel MBB dengan NOP. B di slot 1 dan instruksi BR 25-bit (dengan 4 bit terendah semuanya nol dan dijatuhkan) di slot 2.
IMAGE_REL_IA64_PCREL60F
0x0017
Perbaikan pc-relatif 60-bit. Jika perpindahan target pas di bidang 25-bit yang ditandatangani, konversikan seluruh bundel ke bundel MFB dengan NOP. F di slot 1 dan instruksi BR 25-bit (4 bit terendah semua nol dan dijatuhkan) di slot 2.
IMAGE_REL_IA64_PCREL60I
0x0018
Perbaikan pc-relatif 60-bit. Jika perpindahan target pas di bidang 25-bit yang ditandatangani, konversikan seluruh bundel ke bundel MIB dengan NOP. Saya di slot 1 dan instruksi BR 25-bit (4 bit terendah semua nol dan dijatuhkan) di slot 2.
IMAGE_REL_IA64_PCREL60M
0x0019
Perbaikan pc-relatif 60-bit. Jika perpindahan target pas di bidang 25-bit yang ditandatangani, konversikan seluruh bundel ke bundel MMB dengan NOP. M di slot 1 dan instruksi BR 25-bit (4 bit terendah semua nol dan dijatuhkan) di slot 2.
IMAGE_REL_IA64_IMMGPREL64
0x001a
Perbaikan relatif GP 64-bit.
IMAGE_REL_IA64_TOKEN
0x001b
Token CLR.
IMAGE_REL_IA64_GPREL32
0x001c
Perbaikan relatif GP 32-bit.
IMAGE_REL_IA64_ADDEND
0x001F
Relokasi hanya berlaku ketika segera mengikuti salah satu relokasi berikut: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I, atau SECREL32. Nilainya berisi addend untuk diterapkan ke instruksi dalam bundel, bukan untuk data.

 

Prosesor MIPS

Indikator jenis relokasi berikut didefinisikan untuk prosesor MIPS.

Terus-menerus Nilai Deskripsi
IMAGE_REL_MIPS_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_MIPS_REFHALF
0x0001
16 bit tinggi dari VA 32-bit target.
IMAGE_REL_MIPS_REFWORD
0x0002
Target va 32-bit.
IMAGE_REL_MIPS_JMPADDR
0x0003
26 bit rendah dari VA target. Ini mendukung instruksi MIPS J dan JAL.
IMAGE_REL_MIPS_REFHI
0x0004
16 bit tinggi dari VA 32-bit target. Ini digunakan untuk instruksi pertama dalam urutan dua instruksi yang memuat alamat lengkap. Relokasi ini harus segera diikuti oleh relokasi PAIR yang SymbolTableIndex-nya berisi perpindahan 16-bit yang ditandatangani yang ditambahkan ke 16 bit atas yang diambil dari lokasi yang sedang direlokasi.
IMAGE_REL_MIPS_REFLO
0x0005
16 bit rendah dari VA target.
IMAGE_REL_MIPS_GPREL
0x0006
Perpindahan target yang ditandatangani 16-bit relatif terhadap register GP.
IMAGE_REL_MIPS_LITERAL
0x0007
Sama seperti IMAGE_REL_MIPS_GPREL.
IMAGE_REL_MIPS_SECTION
0x000A
Indeks bagian 16-bit dari bagian berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_MIPS_SECREL
0x000B
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_MIPS_SECRELLO
0x000C
16 bit rendah dari offset 32-bit target dari awal bagiannya.
IMAGE_REL_MIPS_SECRELHI
0x000D
16 bit tinggi dari offset 32-bit target dari awal bagiannya. Relokasi IMAGE_REL_MIPS_PAIR harus segera mengikuti relokasi ini. SymbolTableIndex dari relokasi PAIR berisi displacement 16-bit yang ditandatangani yang ditambahkan ke 16 bit atas yang diambil dari lokasi yang sedang direlokasi.
IMAGE_REL_MIPS_JMPADDR16
0x0010
26 bit rendah dari VA target. Ini mendukung instruksi MIPS16 JAL.
IMAGE_REL_MIPS_REFWORDNB
0x0022
Targetnya adalah RVA 32-bit.
IMAGE_REL_MIPS_PAIR
0x0025
Relokasi hanya berlaku ketika segera mengikuti relokasi REFHI atau SECRELHI. SymbolTableIndex berisi perpindahan dan bukan indeks ke dalam tabel simbol.

 

Mitsubishi M32R

Indikator jenis relokasi berikut didefinisikan untuk prosesor Mitsubishi M32R.

Terus-menerus Nilai Deskripsi
IMAGE_REL_M32R_ABSOLUTE
0x0000
Relokasi diabaikan.
IMAGE_REL_M32R_ADDR32
0x0001
Target va 32-bit.
IMAGE_REL_M32R_ADDR32NB
0x0002
Targetnya adalah RVA 32-bit.
IMAGE_REL_M32R_ADDR24
0x0003
Target adalah VA 24-bit.
IMAGE_REL_M32R_GPREL16
0x0004
Offset 16-bit target dari register GP.
IMAGE_REL_M32R_PCREL24
0x0005
Offset 24-bit target dari penghitung program (PC), digeser ke kiri 2 bit dan sign-extended
IMAGE_REL_M32R_PCREL16
0x0006
Offset 16-bit target dari PC, digeser ke kiri 2 bit dan diperpanjang tanda
IMAGE_REL_M32R_PCREL8
0x0007
Offset 8-bit target dari PC, digeser ke kiri 2 bit dan diperpanjang tanda
IMAGE_REL_M32R_REFHALF
0x0008
16 MSB dari VA target.
IMAGE_REL_M32R_REFHI
0x0009
16 MSB dari VA target, disesuaikan untuk ekstensi tanda LSB. Ini digunakan untuk instruksi pertama dalam urutan dua instruksi yang memuat alamat 32-bit lengkap. Relokasi ini harus segera diikuti oleh relokasi PAIR yang SymbolTableIndex-nya berisi perpindahan 16-bit yang ditandatangani yang ditambahkan ke 16 bit atas yang diambil dari lokasi yang sedang direlokasi.
IMAGE_REL_M32R_REFLO
0x000A
16 LSB dari VA target.
IMAGE_REL_M32R_PAIR
0x000B
Relokasi harus mengikuti relokasi REFHI. SymbolTableIndex berisi perpindahan dan bukan indeks ke dalam tabel simbol.
IMAGE_REL_M32R_SECTION
0x000C
Indeks bagian 16-bit dari bagian yang berisi target. Ini digunakan untuk mendukung informasi penelusuran kesalahan.
IMAGE_REL_M32R_SECREL
0x000D
Offset 32-bit dari target dari awal bagiannya. Ini digunakan untuk mendukung informasi penelusuran kesalahan dan penyimpanan lokal utas statis.
IMAGE_REL_M32R_TOKEN
0x000E
Token CLR.

 

Nomor Baris COFF (Tidak digunakan lagi)

Nomor baris COFF tidak lagi diproduksi dan, di masa depan, tidak akan dikonsumsi.

Nomor baris COFF menunjukkan hubungan antara kode dan nomor baris dalam file sumber. Format Microsoft untuk nomor baris COFF mirip dengan COFF standar, tetapi telah diperluas untuk memungkinkan satu bagian berhubungan dengan nomor baris dalam beberapa file sumber.

Nomor baris COFF terdiri dari array rekaman panjang tetap. Lokasi (offset file) dan ukuran array ditentukan di header bagian. Setiap rekaman nomor baris adalah format berikut.

Offset Ukuran Bidang Deskripsi
0
4
Jenis (*)
Ini adalah gabungan dua bidang: SymbolTableIndex dan VirtualAddress. Apakah SymbolTableIndex atau RVA digunakan tergantung pada nilai Linenumber.
4
2
Linenumber
Saat bukan nol, bidang ini menentukan nomor baris berbasis satu. Saat nol, bidang Jenis ditafsirkan sebagai indeks tabel simbol untuk fungsi.

 

Bidang Jenis adalah gabungan dari dua bidang 4-byte: SymbolTableIndex dan VirtualAddress.

Offset Ukuran Bidang Deskripsi
0
4
SymbolTableIndex
Digunakan saat Linenumber adalah nol: indeks ke entri tabel simbol untuk fungsi. Format ini digunakan untuk menunjukkan fungsi yang dirujuk oleh sekelompok rekaman nomor baris.
0
4
VirtualAddress
Digunakan saat Linenumber bukan nol: RVA dari kode yang dapat dieksekusi yang sesuai dengan baris sumber yang ditunjukkan. Dalam file objek, ini berisi VA di dalam bagian .

 

Rekaman nomor baris dapat mengatur bidang Linenumber ke nol dan menunjuk ke definisi fungsi dalam tabel simbol atau dapat berfungsi sebagai entri nomor baris standar dengan memberikan bilangan bulat positif (nomor baris) dan alamat yang sesuai dalam kode objek.

Sekelompok entri nomor baris selalu dimulai dengan format pertama: indeks simbol fungsi. Jika ini adalah rekaman nomor baris pertama di bagian , maka ini juga merupakan nama simbol COMDAT untuk fungsi jika bendera COMDAT bagian diatur. Lihat Bagian COMDAT (Objek Saja). Rekaman tambahan fungsi dalam tabel simbol memiliki penunjuk ke bidang Linenumber yang menunjuk ke rekaman nomor baris yang sama ini.

Catatan yang mengidentifikasi fungsi diikuti oleh sejumlah entri nomor baris yang memberikan informasi nomor baris aktual (yaitu, entri dengan Linenumber lebih besar dari nol). Entri ini berbasis satu, relatif terhadap awal fungsi, dan mewakili setiap baris sumber dalam fungsi kecuali untuk baris pertama.

Misalnya, rekaman nomor baris pertama untuk contoh berikut akan menentukan fungsi ReverseSign (SymbolTableIndex dari ReverseSign dan Linenumber diatur ke nol). Kemudian rekaman dengan nilai Linenumber 1, 2, dan 3 akan mengikuti, sesuai dengan baris sumber seperti yang ditunjukkan:

// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2:  return -1 * i;
3: }

Tabel Simbol COFF

Tabel simbol di bagian ini diwarisi dari format COFF tradisional. Ini berbeda dari informasi debug Microsoft Visual C++. File dapat berisi tabel simbol COFF dan informasi debug Visual C++, dan keduanya dipisahkan. Beberapa alat Microsoft menggunakan tabel simbol untuk tujuan terbatas tetapi penting, seperti mengkomunikasikan informasi COMDAT ke linker. Nama bagian dan nama file, serta simbol kode dan data, tercantum dalam tabel simbol.

Lokasi tabel simbol ditunjukkan di header COFF.

Tabel simbol adalah array rekaman, masing-masing panjang 18 byte. Setiap rekaman adalah rekaman tabel simbol standar atau tambahan. Rekaman standar mendefinisikan simbol atau nama dan memiliki format berikut.

Offset Ukuran Bidang Deskripsi
0
8
Nama (*)
Nama simbol, diwakili oleh persatuan tiga struktur. Array 8 byte digunakan jika nama tidak lebih dari 8 byte. Untuk informasi selengkapnya, lihat Representasi Nama Simbol.
8
4
Nilai
Nilai yang terkait dengan simbol . Interpretasi bidang ini tergantung pada SectionNumber dan StorageClass. Arti umum adalah alamat yang dapat direlokasi.
12
2
Nomor Bagian
Bilangan bulat bertanda tangan yang mengidentifikasi bagian, menggunakan indeks berbasis satu ke dalam tabel bagian. Beberapa nilai memiliki arti khusus, seperti yang didefinisikan dalam bagian 5.4.2, "Nilai Nomor Bagian."
14
2
Ketikkan
Angka yang menunjukkan jenis. Alat Microsoft mengatur bidang ini ke 0x20 (fungsi) atau 0x0 (bukan fungsi). Untuk informasi selengkapnya, lihat Representasi Jenis.
16
1
StorageClass
Nilai enumerasi yang mewakili kelas penyimpanan. Untuk informasi selengkapnya, lihat Kelas Penyimpanan.
17
1
NumberOfAuxSymbols
Jumlah entri tabel simbol tambahan yang mengikuti rekaman ini.

 

Nol atau lebih rekaman tabel simbol tambahan segera mengikuti setiap rekaman tabel simbol standar. Namun, biasanya tidak lebih dari satu rekaman tabel simbol tambahan mengikuti rekaman tabel simbol standar (kecuali untuk rekaman .file dengan nama file panjang). Setiap rekaman tambahan berukuran sama dengan rekaman tabel simbol standar (18 byte), tetapi daripada menentukan simbol baru, rekaman tambahan memberikan informasi tambahan pada simbol terakhir yang ditentukan. Pilihan dari beberapa format mana yang akan digunakan tergantung pada bidang StorageClass. Format yang saat ini ditentukan untuk rekaman tabel simbol tambahan diperlihatkan di bagian 5.5, "Rekaman Simbol Tambahan."

Alat yang membaca tabel simbol COFF harus mengabaikan rekaman simbol tambahan yang interpretasinya tidak diketahui. Ini memungkinkan format tabel simbol diperluas untuk menambahkan rekaman tambahan baru, tanpa merusak alat yang ada.

Representasi Nama Simbol

Bidang ShortName dalam tabel simbol terdiri dari 8 byte yang berisi nama itu sendiri, jika panjangnya tidak lebih dari 8 byte, atau bidang ShortName memberikan offset ke dalam tabel string. Untuk menentukan apakah nama itu sendiri atau offset diberikan, uji 4 byte pertama untuk kesetaraan hingga nol.

Menurut konvensi, nama diperlakukan sebagai string yang dikodekan UTF-8 yang dihentikan nol.

Offset Ukuran Bidang Deskripsi
0
8
ShortName
Array 8 byte. Array ini diisi dengan null di sebelah kanan jika panjang nama kurang dari 8 byte.
0
4
Nol
Bidang yang diatur ke semua nol jika namanya lebih panjang dari 8 byte.
4
4
Offset
Offset ke dalam tabel string.

 

Nilai Nomor Bagian

Biasanya, bidang Nilai Bagian dalam entri tabel simbol adalah indeks berbasis satu ke dalam tabel bagian. Namun, bidang ini adalah bilangan bulat bertanda tangan dan dapat mengambil nilai negatif. Nilai berikut, kurang dari satu, memiliki arti khusus.

Terus-menerus Nilai Deskripsi
IMAGE_SYM_UNDEFINED
0
Catatan simbol belum ditetapkan bagian. Nilai nol menunjukkan bahwa referensi ke simbol eksternal ditentukan di tempat lain. Nilai non-nol adalah simbol umum dengan ukuran yang ditentukan oleh nilai .
IMAGE_SYM_ABSOLUTE
1-
Simbol memiliki nilai absolut (tidak dapat direlokasi) dan bukan alamat.
IMAGE_SYM_DEBUG
2-
Simbol menyediakan informasi jenis umum atau penelusuran kesalahan tetapi tidak sesuai dengan bagian. Alat Microsoft menggunakan pengaturan ini bersama dengan rekaman .file (FILE kelas penyimpanan).

 

Representasi Jenis

Bidang Jenis entri tabel simbol berisi 2 byte, di mana setiap byte mewakili informasi jenis. LSB mewakili jenis data sederhana (dasar), dan MSB mewakili jenis kompleks, jika ada:

MSB LSB
Jenis kompleks: none, pointer, function, array.
Jenis dasar: bilangan bulat, titik mengambang, dan sebagainya.

 

Nilai berikut didefinisikan untuk jenis dasar, meskipun alat Microsoft umumnya tidak menggunakan bidang ini dan mengatur LSB ke 0. Sebagai gantinya, informasi debug Visual C++ digunakan untuk menunjukkan jenis. Namun, kemungkinan nilai COFF tercantum di sini untuk kelengkapan.

Terus-menerus Nilai Deskripsi
IMAGE_SYM_TYPE_NULL
0
Tidak ada informasi jenis atau jenis dasar yang tidak diketahui. Alat Microsoft menggunakan pengaturan ini
IMAGE_SYM_TYPE_VOID
1
Tidak ada jenis yang valid; digunakan dengan penunjuk dan fungsi yang batal
IMAGE_SYM_TYPE_CHAR
2
Karakter (byte yang ditandatangani)
IMAGE_SYM_TYPE_SHORT
3
Bilangan bulat bertanda tangan 2-byte
IMAGE_SYM_TYPE_INT
4
Jenis bilangan bulat alami (biasanya 4 byte di Windows)
IMAGE_SYM_TYPE_LONG
5
Bilangan bulat bertanda tangan 4-byte
IMAGE_SYM_TYPE_FLOAT
6
Angka floating-point 4-byte
IMAGE_SYM_TYPE_DOUBLE
7
Angka floating-point 8-byte
IMAGE_SYM_TYPE_STRUCT
8
Struktur
IMAGE_SYM_TYPE_UNION
9
Serikat
IMAGE_SYM_TYPE_ENUM
10
Jenis enumerasi
IMAGE_SYM_TYPE_MOE
11
Anggota enumerasi (nilai tertentu)
IMAGE_SYM_TYPE_BYTE
12
Byte; bilangan bulat 1-byte yang tidak ditandatangani
IMAGE_SYM_TYPE_WORD
13
Sebuah kata; bilangan bulat 2-byte yang tidak ditandatangani
IMAGE_SYM_TYPE_UINT
14
Bilangan bulat berukuran alami yang tidak ditandatangani (biasanya, 4 byte)
IMAGE_SYM_TYPE_DWORD
15
Bilangan bulat 4-byte yang tidak ditandatangani

 

Byte yang paling signifikan menentukan apakah simbol adalah penunjuk ke, fungsi yang mengembalikan, atau array dari jenis dasar yang ditentukan dalam LSB. Alat Microsoft hanya menggunakan bidang ini untuk menunjukkan apakah simbol adalah fungsi, sehingga satu-satunya dua nilai yang dihasilkan 0x0 dan 0x20 untuk bidang Jenis. Namun, alat lain dapat menggunakan bidang ini untuk mengomunikasikan lebih banyak informasi.

Sangat penting untuk menentukan atribut fungsi dengan benar. Informasi ini diperlukan agar penautan inkremental berfungsi dengan benar. Untuk beberapa arsitektur, informasi mungkin diperlukan untuk tujuan lain.

Terus-menerus Nilai Deskripsi
IMAGE_SYM_DTYPE_NULL
0
Tidak ada jenis turunan; simbol adalah variabel skalar sederhana.
IMAGE_SYM_DTYPE_POINTER
1
Simbol adalah penunjuk ke jenis dasar.
IMAGE_SYM_DTYPE_FUNCTION
2
Simbol adalah fungsi yang mengembalikan jenis dasar.
IMAGE_SYM_DTYPE_ARRAY
3
Simbol adalah array jenis dasar.

 

Kelas Penyimpanan

Bidang StorageClass dari tabel simbol menunjukkan jenis definisi yang diwakili simbol. Tabel berikut ini memperlihatkan kemungkinan nilai. Perhatikan bahwa bidang StorageClass adalah bilangan bulat 1 byte yang tidak ditandatangani. Oleh karena itu, nilai khusus -1 harus dianggap setara dengan yang tidak ditandatangani, 0xFF.

Meskipun format COFF tradisional menggunakan banyak nilai kelas penyimpanan, alat Microsoft mengandalkan format debug Visual C++ untuk sebagian besar informasi simbolis dan umumnya hanya menggunakan empat nilai kelas penyimpanan: EXTERNAL (2), STATIC (3), FUNCTION (101), dan FILE (103). Kecuali pada judul kolom kedua di bawah ini, "Nilai" harus diambil untuk berarti bidang Nilai dari rekaman simbol (yang interpretasinya tergantung pada angka yang ditemukan sebagai kelas penyimpanan).

Terus-menerus Nilai Deskripsi/interpretasi bidang Nilai
IMAGE_SYM_CLASS_END_OF_FUNCTION
-1 (0xFF)
Simbol khusus yang mewakili akhir fungsi, untuk tujuan penelusuran kesalahan.
IMAGE_SYM_CLASS_NULL
0
Tidak ada kelas penyimpanan yang ditetapkan.
IMAGE_SYM_CLASS_AUTOMATIC
1
Variabel otomatis (tumpukan). Bidang Nilai menentukan offset bingkai tumpukan.
IMAGE_SYM_CLASS_EXTERNAL
2
Nilai yang digunakan alat Microsoft untuk simbol eksternal. Bidang Nilai menunjukkan ukuran jika nomor bagian IMAGE_SYM_UNDEFINED (0). Jika nomor bagian bukan nol, maka bidang Nilai menentukan offset dalam bagian .
IMAGE_SYM_CLASS_STATIC
3
Offset simbol di dalam bagian . Jika bidang Nilai adalah nol, maka simbol mewakili nama bagian.
IMAGE_SYM_CLASS_REGISTER
4
Variabel register. Bidang Nilai menentukan nomor register.
IMAGE_SYM_CLASS_EXTERNAL_DEF
5
Simbol yang didefinisikan secara eksternal.
IMAGE_SYM_CLASS_LABEL
6
Label kode yang ditentukan dalam modul. Bidang Nilai menentukan offset simbol di dalam bagian .
IMAGE_SYM_CLASS_UNDEFINED_LABEL
7
Referensi ke label kode yang tidak ditentukan.
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
8
Anggota struktur. Bidang Nilai menentukan anggota ke-n.
IMAGE_SYM_CLASS_ARGUMENT
9
Argumen formal (parameter) fungsi. Bidang Nilai menentukan argumen n th.
IMAGE_SYM_CLASS_STRUCT_TAG
10
Entri nama tag struktur.
IMAGE_SYM_CLASS_MEMBER_OF_UNION
11
Anggota serikat. Bidang Nilai menentukan anggota ke-n.
IMAGE_SYM_CLASS_UNION_TAG
12
Entri nama tag Union.
IMAGE_SYM_CLASS_TYPE_DEFINITION
13
Entri Typedef.
IMAGE_SYM_CLASS_UNDEFINED_STATIC
14
Deklarasi data statis.
IMAGE_SYM_CLASS_ENUM_TAG
15
Entri nama tag jenis enumerasi.
IMAGE_SYM_CLASS_MEMBER_OF_ENUM
16
Anggota enumerasi. Bidang Nilai menentukan anggota ke-n.
IMAGE_SYM_CLASS_REGISTER_PARAM
17
Parameter register.
IMAGE_SYM_CLASS_BIT_FIELD
18
Referensi bit-field. Bidang Nilai menentukan n th bit di bidang bit.
IMAGE_SYM_CLASS_BLOCK
100
Rekaman .bb (awal blok) atau .eb (akhir blok). Bidang Nilai adalah alamat lokasi kode yang dapat direlokasi.
IMAGE_SYM_CLASS_FUNCTION
101
Nilai yang digunakan alat Microsoft untuk rekaman simbol yang menentukan tingkat fungsi: fungsi mulai (.bf ), fungsi akhir ( .ef ), dan baris dalam fungsi ( .lf ). Untuk rekaman .lf, bidang Nilai memberikan jumlah baris sumber dalam fungsi. Untuk rekaman .ef, bidang Nilai memberikan ukuran kode fungsi.
IMAGE_SYM_CLASS_END_OF_STRUCT
102
Entri akhir struktur.
IMAGE_SYM_CLASS_FILE
103
Nilai yang digunakan alat Microsoft, serta format COFF tradisional, untuk rekaman simbol file sumber. Simbol diikuti oleh rekaman tambahan yang memberi nama file.
IMAGE_SYM_CLASS_SECTION
104
Definisi bagian (alat Microsoft menggunakan kelas penyimpanan STATIC sebagai gantinya).
IMAGE_SYM_CLASS_WEAK_EXTERNAL
105
Eksternal lemah. Untuk informasi selengkapnya, lihat Format Tambahan 3: Eksternal Lemah.
IMAGE_SYM_CLASS_CLR_TOKEN
107
Simbol token CLR. Nama adalah string ASCII yang terdiri dari nilai heksadesimal token. Untuk informasi selengkapnya, lihat Definisi Token CLR (Khusus Objek).

 

Rekaman Simbol Tambahan

Rekaman tabel simbol tambahan selalu mengikuti, dan berlaku untuk, beberapa rekaman tabel simbol standar. Rekaman tambahan dapat memiliki format apa pun yang dapat dikenali alat, tetapi 18 byte harus dialokasikan untuk mereka sehingga tabel simbol dipertahankan sebagai array ukuran reguler. Saat ini, alat Microsoft mengenali format tambahan untuk jenis rekaman berikut: definisi fungsi, simbol awal dan akhir fungsi (.bf dan .ef), eksternal yang lemah, nama file, dan definisi bagian.

Desain COFF tradisional juga mencakup format catatan tambahan untuk array dan struktur. Alat Microsoft tidak menggunakan ini, tetapi menempatkan informasi simbolis tersebut dalam format debug Visual C++ di bagian debug.

Format Tambahan 1: Definisi Fungsi

Rekaman tabel simbol menandai awal definisi fungsi jika memiliki semua hal berikut: kelas penyimpanan EXTERNAL (2), nilai Jenis yang menunjukkan bahwa itu adalah fungsi (0x20), dan nomor bagian yang lebih besar dari nol. Perhatikan bahwa rekaman tabel simbol yang memiliki nomor bagian UNDEFINED (0) tidak menentukan fungsi dan tidak memiliki rekaman tambahan. Rekaman simbol definisi fungsi diikuti oleh rekaman tambahan dalam format yang dijelaskan di bawah ini:

Offset Ukuran Bidang Deskripsi
0
4
TagIndex
Indeks simbol-tabel dari rekaman simbol .bf (begin function) yang sesuai.
4
4
TotalSize
Ukuran kode yang dapat dieksekusi untuk fungsi itu sendiri. Jika fungsi berada di bagiannya sendiri, SizeOfRawData di header bagian lebih besar atau sama dengan bidang ini, tergantung pada pertimbangan perataan.
8
4
PointerToLinenumber
Offset file entri nomor baris COFF pertama untuk fungsi, atau nol jika tidak ada. Untuk informasi selengkapnya, lihat Nomor Baris COFF (Tidak digunakan lagi).
12
4
PointerToNextFunction
Indeks tabel simbol dari rekaman untuk fungsi berikutnya. Jika fungsi adalah yang terakhir dalam tabel simbol, bidang ini diatur ke nol.
16
2
Tidak terpakai

 

Format Tambahan 2: Simbol .bf dan .ef

Untuk setiap definisi fungsi dalam tabel simbol, tiga item menjelaskan awal, akhir, dan jumlah baris. Masing-masing simbol ini memiliki kelas penyimpanan FUNCTION (101):

Rekaman simbol bernama .bf (fungsi mulai). Bidang Nilai tidak digunakan.

Rekaman simbol bernama .lf (baris dalam fungsi). Bidang Nilai memberikan jumlah baris dalam fungsi.

Rekaman simbol bernama .ef (akhir fungsi). Bidang Nilai memiliki angka yang sama dengan bidang Ukuran Total dalam rekaman simbol definisi fungsi.

Catatan simbol .bf dan .ef (tetapi bukan rekaman .lf) diikuti oleh rekaman tambahan dengan format berikut:

Offset Ukuran Bidang Deskripsi
0
4
Tidak terpakai
4
2
Linenumber
Nomor baris ordinal aktual (1, 2, 3, dan sebagainya) dalam file sumber, sesuai dengan catatan .bf atau .ef.
6
6
Tidak terpakai
12
4
PointerToNextFunction ( hanya .bf)
Indeks simbol-tabel dari rekaman simbol .bf berikutnya. Jika fungsi adalah yang terakhir dalam tabel simbol, bidang ini diatur ke nol. Ini tidak digunakan untuk rekaman .ef.
16
2
Tidak terpakai

 

Format Tambahan 3: Eksternal Lemah

"Eksternal lemah" adalah mekanisme untuk file objek yang memungkinkan fleksibilitas pada waktu tautan. Modul dapat berisi simbol eksternal yang tidak terselesaikan (sym1), tetapi juga dapat menyertakan rekaman tambahan yang menunjukkan bahwa jika sym1 tidak ada pada waktu tautan, simbol eksternal lain (sym2) digunakan untuk mengatasi referensi sebagai gantinya.

Jika definisi sym1 ditautkan, maka referensi eksternal ke simbol diselesaikan secara normal. Jika definisi sym1 tidak ditautkan, maka semua referensi ke eksternal lemah untuk sym1 mengacu pada sym2 sebagai gantinya. Simbol eksternal, sym2, harus selalu ditautkan; biasanya, ini didefinisikan dalam modul yang berisi referensi lemah ke sym1.

Eksternal yang lemah diwakili oleh rekaman tabel simbol dengan kelas penyimpanan EKSTERNAL, nomor bagian UNDEF, dan nilai nol. Rekaman simbol eksternal lemah diikuti oleh rekaman tambahan dengan format berikut:

Offset Ukuran Bidang Deskripsi
0
4
TagIndex
Indeks tabel simbol sym2, simbol yang akan ditautkan jika sym1 tidak ditemukan.
4
4
Karakteristik
Nilai IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY menunjukkan bahwa tidak ada pencarian pustaka untuk sym1 yang harus dilakukan.
Nilai IMAGE_WEAK_EXTERN_SEARCH_LIBRARY menunjukkan bahwa pencarian pustaka untuk sym1 harus dilakukan.
Nilai IMAGE_WEAK_EXTERN_SEARCH_ALIAS menunjukkan bahwa sym1 adalah alias untuk sym2.
8
10
Tidak terpakai

 

Perhatikan bahwa bidang Karakteristik tidak ditentukan dalam WINNT. H; sebagai gantinya, bidang Ukuran Total digunakan.

Format Tambahan 4: File

Format ini mengikuti rekaman tabel simbol dengan FILE kelas penyimpanan (103). Nama simbol itu sendiri harus .file, dan rekaman tambahan yang mengikutinya memberikan nama file kode sumber.

Offset Ukuran Bidang Deskripsi
0
18
Nama File
String ANSI yang memberikan nama file sumber. Ini diisi dengan null jika kurang dari panjang maksimum.

 

Format Tambahan 5: Definisi Bagian

Format ini mengikuti rekaman tabel simbol yang menentukan bagian. Rekaman semacam itu memiliki nama simbol yang merupakan nama bagian (seperti .text atau .drectve) dan memiliki kelas penyimpanan STATIC (3). Catatan tambahan menyediakan informasi tentang bagian yang dirujuknya. Dengan demikian, ini menduplikasi beberapa informasi di header bagian.

Offset Ukuran Bidang Deskripsi
0
4
Panjangnya
Ukuran data bagian; sama dengan SizeOfRawData di header bagian.
4
2
NumberOfRelocations
Jumlah entri relokasi untuk bagian tersebut.
6
2
NumberOfLinenumbers
Jumlah entri nomor baris untuk bagian tersebut.
8
4
Checksum
Checksum untuk data komunal. Ini berlaku jika bendera IMAGE_SCN_LNK_COMDAT diatur di header bagian. Untuk informasi selengkapnya, lihat Bagian COMDAT (Khusus Objek).
12
2
Angka
Indeks berbasis satu ke dalam tabel bagian untuk bagian terkait. Ini digunakan ketika pengaturan pemilihan COMDAT adalah 5.
14
1
Pilihan
Nomor pilihan COMDAT. Ini berlaku jika bagian tersebut adalah bagian COMDAT.
15
3
Tidak terpakai

 

Bagian COMDAT (Objek Saja)

Bidang Pilihan dari format tambahan definisi bagian berlaku jika bagian tersebut adalah bagian COMDAT. Bagian COMDAT adalah bagian yang dapat ditentukan oleh lebih dari satu file objek. (Bendera IMAGE_SCN_LNK_COMDAT diatur di bidang Bendera Bagian header bagian.) Bidang Pilihan menentukan cara linker menyelesaikan beberapa definisi bagian COMDAT.

Simbol pertama yang memiliki nilai bagian dari bagian COMDAT harus menjadi simbol bagian. Simbol ini memiliki nama bagian, bidang Nilai sama dengan nol, nomor bagian dari bagian COMDAT yang dimaksud, bidang Tipe sama dengan IMAGE_SYM_TYPE_NULL, bidang Kelas sama dengan IMAGE_SYM_CLASS_STATIC, dan satu rekaman tambahan. Simbol kedua disebut "simbol COMDAT" dan digunakan oleh linker bersama dengan bidang Pilihan.

Nilai untuk bidang Pilihan diperlihatkan di bawah ini.

Terus-menerus Nilai Deskripsi
IMAGE_COMDAT_SELECT_NODUPLICATES
1
Jika simbol ini sudah ditentukan, linker mengeluarkan kesalahan "multiply defined symbol".
IMAGE_COMDAT_SELECT_ANY
2
Bagian apa pun yang mendefinisikan simbol COMDAT yang sama dapat ditautkan; sisanya dihapus.
IMAGE_COMDAT_SELECT_SAME_SIZE
3
Linker memilih bagian arbitrer di antara definisi untuk simbol ini. Jika semua definisi tidak berukuran sama, kesalahan "simbol yang ditentukan perkalian" dikeluarkan.
IMAGE_COMDAT_SELECT_EXACT_MATCH
4
Linker memilih bagian arbitrer di antara definisi untuk simbol ini. Jika semua definisi tidak cocok persis, kesalahan "simbol yang ditentukan perkalian" dikeluarkan.
IMAGE_COMDAT_SELECT_ASSOCIATIVE
5
Bagian ini ditautkan jika bagian COMDAT tertentu lainnya ditautkan. Bagian lain ini ditunjukkan oleh bidang Angka dari rekaman simbol tambahan untuk definisi bagian. Pengaturan ini berguna untuk definisi yang memiliki komponen di beberapa bagian (misalnya, kode dalam satu dan data di bagian lain), tetapi di mana semua harus ditautkan atau dibuang sebagai satu set. Bagian lain yang dikaitkan dengan bagian INI harus berupa bagian COMDAT, yang dapat menjadi bagian COMDAT asosiatif lainnya. Rantai asosiasi bagian COMDAT asosiatif tidak dapat membentuk perulangan. Rantai asosiasi bagian akhirnya harus datang ke bagian COMDAT yang tidak memiliki set IMAGE_COMDAT_SELECT_ASSOCIATIVE.
IMAGE_COMDAT_SELECT_LARGEST
6
Linker memilih definisi terbesar dari antara semua definisi untuk simbol ini. Jika beberapa definisi memiliki ukuran ini, pilihan di antaranya segan-segan.

 

Definisi Token CLR (Khusus Objek)

Simbol tambahan ini umumnya mengikuti IMAGE_SYM_CLASS_CLR_TOKEN. Ini digunakan untuk mengaitkan token dengan namespace tabel simbol COFF.

Offset Ukuran Bidang Deskripsi
0
1
bAuxType
Harus IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1).
1
1
bReserved
Dicadangkan, harus nol.
2
4
SymbolTableIndex
Indeks simbol simbol COFF yang dirujuk oleh definisi token CLR ini.
6
12
Dicadangkan, harus nol.

 

Tabel String COFF

Segera setelah tabel simbol COFF adalah tabel string COFF. Posisi tabel ini ditemukan dengan mengambil alamat tabel simbol di header COFF dan menambahkan jumlah simbol dikalikan dengan ukuran simbol.

Di awal tabel string COFF adalah 4 byte yang berisi ukuran total (dalam byte) dari sisa tabel string. Ukuran ini mencakup bidang ukuran itu sendiri, sehingga nilai di lokasi ini akan menjadi 4 jika tidak ada string yang ada.

Mengikuti ukurannya adalah string yang dihentikan null yang ditunjukkan oleh simbol dalam tabel simbol COFF.

Tabel Sertifikat Atribut (Hanya Gambar)

Sertifikat atribut dapat dikaitkan dengan gambar dengan menambahkan tabel sertifikat atribut. Tabel sertifikat atribut terdiri dari sekumpulan entri sertifikat atribut selaras quadword yang bersebelahan. Zero padding disisipkan antara akhir asli file dan awal tabel sertifikat atribut untuk mencapai perataan ini. Setiap entri sertifikat atribut berisi bidang berikut.

Offset Ukuran Bidang Deskripsi
0
4
dwLength
Menentukan panjang entri sertifikat atribut.
4
2
wRevision
Berisi nomor versi sertifikat. Untuk detailnya, lihat teks berikut.
6
2
wCertificateType
Menentukan jenis konten dalam bCertificate. Untuk detailnya, lihat teks berikut.
8
Lihat yang berikut ini
bCertificate
Berisi sertifikat, seperti tanda tangan Authenticode. Untuk detailnya, lihat teks berikut.

 

Nilai alamat virtual dari entri Tabel Sertifikat di Direktori Data Header Opsional adalah offset file ke entri sertifikat atribut pertama. Entri berikutnya diakses dengan memajukan byte dwLength entri tersebut, dibulatkan ke kelipatan 8 byte, dari awal entri sertifikat atribut saat ini. Ini berlanjut hingga jumlah nilai dwLength yang dibulatkan sama dengan nilai Ukuran dari entri Tabel Sertifikat di Direktori Data Header Opsional. Jika jumlah nilai dwLength yang dibulatkan tidak sama dengan nilai Ukuran, maka tabel sertifikat atribut atau bidang Ukuran rusak.

Misalnya, jika Entri Tabel Sertifikat Direktori Data Header Opsional berisi:

virtual address = 0x5000
size = 0x1000

Sertifikat pertama dimulai pada 0x5000 offset dari awal file pada disk. Untuk memajukan semua entri sertifikat atribut:

  1. Tambahkan nilai dwLength sertifikat atribut pertama ke offset awal.
  2. Bulatkan nilai dari langkah 1 ke atas ke kelipatan 8 byte terdekat untuk menemukan offset entri sertifikat atribut kedua.
  3. Tambahkan nilai offset dari langkah 2 ke nilai dwLength entri sertifikat atribut kedua dan bulatkan ke atas ke kelipatan 8 byte terdekat untuk menentukan offset entri sertifikat atribut ketiga.
  4. Ulangi langkah 3 untuk setiap sertifikat berturut-turut hingga offset terhitung sama dengan 0x6000 (0x5000 mulai + 0x1000 ukuran total), yang menunjukkan bahwa Anda telah memandu seluruh tabel.

Atau, Anda dapat menghitung entri sertifikat dengan memanggil fungsi Win32 ImageEnumerateCertificates dalam perulangan. Untuk tautan ke halaman referensi fungsi, lihat Referensi.

Entri tabel sertifikat atribut dapat berisi jenis sertifikat apa pun, selama entri memiliki nilai dwLength yang benar, nilai wRevision yang unik, dan nilai wCertificateType yang unik. Jenis entri tabel sertifikat yang paling umum adalah struktur WIN_CERTIFICATE, yang didokumentasikan dalam Wintrust.h dan dibahas di sisa bagian ini.

Opsi untuk anggota WIN_CERTIFICATE wRevision mencakup (tetapi tidak terbatas pada) berikut ini.

Nilai Nama Catatan
0x0100
WIN_CERT_REVISION_1_0
Versi 1, versi warisan dari struktur Win_Certificate. Ini hanya didukung untuk tujuan memverifikasi tanda tangan Authenticode warisan
0x0200
WIN_CERT_REVISION_2_0
Versi 2 adalah versi struktur Win_Certificate saat ini.

 

Opsi untuk anggota WIN_CERTIFICATE wCertificateType menyertakan (tetapi tidak terbatas pada) item dalam tabel berikut. Perhatikan bahwa beberapa nilai saat ini tidak didukung.

Nilai Nama Catatan
0x0001
WIN_CERT_TYPE_X509
bCertificate berisi Sertifikat X.509
Tidak Didukung
0x0002
WIN_CERT_TYPE_PKCS_SIGNED_DATA
bCertificate berisi struktur PKCS#7 SignedData
0x0003
WIN_CERT_TYPE_RESERVED_1
Dipesan
0x0004
WIN_CERT_TYPE_TS_STACK_SIGNED
Penandatanganan Sertifikat Tumpukan Protokol Server Terminal
Tidak Didukung

 

Anggota bCertificate struktur WIN_CERTIFICATE berisi array byte panjang variabel dengan jenis konten yang ditentukan oleh wCertificateType. Jenis yang didukung oleh Authenticode WIN_CERT_TYPE_PKCS_SIGNED_DATA, struktur PKCS#7 SignedData . Untuk detail tentang format tanda tangan digital Authenticode, lihat Format Tanda Tangan Eksekusi Portabel Windows Authenticode.

Jika konten bCertificate tidak berakhir pada batas quadword, entri sertifikat atribut diisi dengan nol, dari akhir bCertificate ke batas quadword berikutnya.

Nilai dwLength adalah panjang struktur WIN_CERTIFICATE yang diselesaikan dan dihitung sebagai:

dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)

Panjang ini harus mencakup ukuran padding apa pun yang digunakan untuk memenuhi persyaratan bahwa setiap struktur WIN_CERTIFICATE selaras dengan quadword:

dwLength += (8 - (dwLength & 7)) & 7;

Ukuran Tabel Sertifikat yang ditentukan dalam entri Tabel Sertifikat di Direktori Data Header Opsional (Khusus Gambar)- menyertakan padding.

Untuk informasi selengkapnya tentang menggunakan ImageHlp API untuk menghitung, menambahkan, dan menghapus sertifikat dari File PE, lihat Fungsi ImageHlp.

Data Sertifikat

Seperti yang dinyatakan di bagian sebelumnya, sertifikat dalam tabel sertifikat atribut dapat berisi jenis sertifikat apa pun. Sertifikat yang memastikan integritas file PE dapat menyertakan hash gambar PE.

Hash gambar PE (atau hash file) mirip dengan checksum file karena algoritma hash menghasilkan hash pesan yang terkait dengan integritas file. Namun, checksum diproduksi oleh algoritma sederhana dan digunakan terutama untuk mendeteksi apakah blok memori pada disk telah buruk dan nilai yang disimpan di sana telah rusak. Hash file mirip dengan checksum karena juga mendeteksi kerusakan file. Namun, tidak seperti kebanyakan algoritma checksum, sangat sulit untuk memodifikasi file tanpa mengubah hash file dari nilai aslinya yang tidak dimodifikasi. Hash file dengan demikian dapat digunakan untuk mendeteksi modifikasi yang disengaja dan bahkan halus pada file, seperti yang diperkenalkan oleh virus, peretas, atau program kuda Trojan.

Ketika disertakan dalam sertifikat, hash gambar harus mengecualikan bidang tertentu dalam Gambar PE, seperti entri Checksum dan Tabel Sertifikat di Direktori Data Header Opsional. Ini karena tindakan menambahkan Sertifikat mengubah bidang ini dan akan menyebabkan nilai hash yang berbeda dihitung.

Fungsi Win32 ImageGetDigestStream menyediakan aliran data dari file PE target untuk fungsi hash. Aliran data ini tetap konsisten ketika sertifikat ditambahkan atau dihapus dari file PE. Berdasarkan parameter yang diteruskan ke ImageGetDigestStream, data lain dari gambar PE dapat dihilangkan dari komputasi hash. Untuk tautan ke halaman referensi fungsi, lihat Referensi.

Tabel Impor Tunda-Muat (Hanya Gambar)

Tabel ini ditambahkan ke gambar untuk mendukung mekanisme seragam bagi aplikasi untuk menunda pemuatan DLL hingga panggilan pertama ke DLL tersebut. Tata letak tabel cocok dengan tabel impor tradisional yang dijelaskan di bagian 6.4, Bagian .idata." Hanya beberapa detail yang dibahas di sini.

Tabel Direktori Tunda-Muat

Tabel direktori tunda-muat adalah mitra tabel direktori impor. Ini dapat diambil melalui entri Tunda Impor Deskriptor dalam daftar direktori data header opsional (offset 200). Tabel disusun sebagai berikut:

Offset Ukuran Bidang Deskripsi
0
4
Atribut
Harus nol.
4
4
Nama
RVA nama DLL yang akan dimuat. Nama berada di bagian data baca-saja dari gambar.
8
4
Handel Modul
RVA handel modul (di bagian data gambar) DLL yang akan dimuat keterlambatan. Ini digunakan untuk penyimpanan oleh rutinitas yang disediakan untuk mengelola penundaan pemuatan.
12
4
Tunda Impor Tabel Alamat
RVA dari tabel alamat impor tunda-muat. Untuk informasi selengkapnya, lihat Menunda Tabel Alamat Impor (IAT).
16
4
Tunda Impor Tabel Nama
RVA tabel nama tunda-muat, yang berisi nama impor yang mungkin perlu dimuat. Ini cocok dengan tata letak tabel nama impor. Untuk informasi selengkapnya, lihat Tabel Petunjuk/Nama.
20
4
Tabel Impor Penundaan Terikat
RVA dari tabel alamat tunda-muat terikat, jika ada.
24
4
Membongkar Tabel Impor Penundaan
RVA tabel alamat delay-load unload, jika ada. Ini adalah salinan pasti dari tabel alamat impor penundaan. Jika pemanggil membongkar DLL, tabel ini harus disalin kembali melalui tabel alamat impor penundaan sehingga panggilan berikutnya ke DLL terus menggunakan mekanisme penghentian dengan benar.
28
4
Stempel Waktu
Tanda waktu DLL tempat gambar ini terikat.

 

Tabel yang direferensikan dalam struktur data ini diatur dan diurutkan sama seperti rekan-rekan mereka untuk impor tradisional. Untuk detailnya, lihat Bagian .idata.

Atribut

Namun, tidak ada bendera atribut yang didefinisikan. Linker mengatur bidang ini ke nol dalam gambar. Bidang ini dapat digunakan untuk memperluas rekaman dengan menunjukkan adanya bidang baru, atau dapat digunakan untuk menunjukkan perilaku terhadap fungsi pembantu penundaan atau pembongkaran.

Nama

Nama DLL yang akan dimuat keterlambatan berada di bagian data baca-saja dari gambar. Ini dirujuk melalui bidang szName.

Handel Modul

Handel DLL yang akan dimuat keterlambatan ada di bagian data gambar. Bidang phmod menunjuk ke handel. Pembantu delay-load yang disediakan menggunakan lokasi ini untuk menyimpan handel ke DLL yang dimuat.

Tunda Impor Tabel Alamat

Tabel alamat impor penundaan (IAT) dirujuk oleh deskriptor impor penundaan melalui bidang pIAT. Penundaan-load helper memperbarui pointer ini dengan titik masuk nyata sehingga thunks tidak lagi dalam perulangan panggilan. Penunjuk fungsi diakses dengan menggunakan ekspresi pINT->u1.Function.

Tunda Impor Tabel Nama

Tabel nama impor penundaan (INT) berisi nama impor yang mungkin memerlukan pemuatan. Mereka dipesan dengan cara yang sama dengan penunjuk fungsi di IAT. Mereka terdiri dari struktur yang sama dengan INT standar dan diakses dengan menggunakan ekspresi pINT->u1.AddressOfData->Name[0].

Tunda Tabel Alamat Impor Terikat dan Stempel Waktu

Tabel alamat impor terikat penundaan (BIAT) adalah tabel opsional dari item IMAGE_THUNK_DATA yang digunakan bersama dengan bidang tanda waktu tabel direktori tunda-muat oleh fase pengikatan pasca-proses.

Tunda Bongkar Tabel Alamat Impor

Tabel alamat impor bongkar tunda (UIAT) adalah tabel opsional dari item IMAGE_THUNK_DATA yang digunakan kode bongkar untuk menangani permintaan bongkar eksplisit. Ini terdiri dari data yang diinisialisasi di bagian baca-saja yang merupakan salinan yang tepat dari IAT asli yang merujuk kode ke thunks delay-load. Pada permintaan bongkar, pustaka dapat dibebaskan, *phmod dihapus, dan UIAT yang ditulis melalui IAT untuk memulihkan semuanya ke status pramuatnya.

Bagian Khusus

Bagian COFF umum berisi kode atau data yang diproses linker dan pemuat Microsoft Win32 tanpa pengetahuan khusus tentang konten bagian. Konten hanya relevan dengan aplikasi yang sedang ditautkan atau dijalankan.

Namun, beberapa bagian COFF memiliki arti khusus ketika ditemukan dalam file objek atau file gambar. Alat dan pemuat mengenali bagian ini karena memiliki bendera khusus yang diatur di header bagian, karena lokasi khusus dalam header opsional gambar menunjuk ke bagian tersebut, atau karena nama bagian itu sendiri menunjukkan fungsi khusus dari bagian tersebut. (Bahkan jika nama bagian itu sendiri tidak menunjukkan fungsi khusus bagian, nama bagian ditentukan oleh konvensi, sehingga penulis spesifikasi ini dapat merujuk ke nama bagian dalam semua kasus.)

Bagian yang dipesan dan atributnya dijelaskan dalam tabel di bawah ini, diikuti oleh deskripsi terperinci untuk jenis bagian yang dipertahankan ke dalam executable dan jenis bagian yang berisi metadata untuk ekstensi.

Nama bagian Konten Karakteristik
.Bss
Data yang tidak diinisialisasi (format gratis)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.cormeta
Metadata CLR yang menunjukkan bahwa file objek berisi kode terkelola
IMAGE_SCN_LNK_INFO
.data
Data yang diinisialisasi (format gratis)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.debug$F
Informasi debug FPO yang dihasilkan (hanya objek, arsitektur x86 saja, dan sekarang usang)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$P
Jenis debug yang telah dikompresi (hanya objek)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$S
Simbol debug (hanya objek)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$T
Jenis debug (objek saja)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.drective
Opsi linker
IMAGE_SCN_LNK_INFO
.edata
Mengekspor tabel
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.idata
Mengimpor tabel
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.idlsym
Termasuk SEH terdaftar (hanya gambar) untuk mendukung atribut IDL. Untuk informasi, lihat "Atribut IDL" di Referensi di akhir topik ini.
IMAGE_SCN_LNK_INFO
.pdata
Informasi pengecualian
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.rdata
Data yang diinisialisasi baca-saja
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.reloc
Relokasi gambar
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.rsrc
Direktori sumber daya
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.sbss
Data yang tidak diinisialisasi relatif GP (format gratis)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Bendera IMAGE_SCN_GPREL harus diatur hanya untuk arsitektur IA64; bendera ini tidak valid untuk arsitektur lain. Bendera IMAGE_SCN_GPREL hanya untuk file objek; ketika jenis bagian ini muncul dalam file gambar, bendera IMAGE_SCN_GPREL tidak boleh diatur.
.sdata
Data yang diinisialisasi relatif GP (format gratis)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Bendera IMAGE_SCN_GPREL harus diatur hanya untuk arsitektur IA64; bendera ini tidak valid untuk arsitektur lain. Bendera IMAGE_SCN_GPREL hanya untuk file objek; ketika jenis bagian ini muncul dalam file gambar, bendera IMAGE_SCN_GPREL tidak boleh diatur.
.srdata
Data baca-saja relatif GP (format gratis)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL Bendera IMAGE_SCN_GPREL harus diatur hanya untuk arsitektur IA64; bendera ini tidak valid untuk arsitektur lain. Bendera IMAGE_SCN_GPREL hanya untuk file objek; ketika jenis bagian ini muncul dalam file gambar, bendera IMAGE_SCN_GPREL tidak boleh diatur.
.sxdata
Data handler pengecualian terdaftar (format gratis dan x86/objek saja)
IMAGE_SCN_LNK_INFO Berisi indeks simbol dari setiap handler pengecualian yang dirujuk oleh kode dalam file objek tersebut. Simbol dapat untuk simbol UNDEF atau simbol yang ditentukan dalam modul tersebut.
.Teks
Kode yang dapat dieksekusi (format gratis)
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IIMAGE_SCN_MEM_READ
.tls
Penyimpanan lokal utas (khusus objek)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.tls$
Penyimpanan lokal utas (khusus objek)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.vsdata
Data yang diinisialisasi relatif GP (format gratis dan hanya untuk arsitektur ARM, SH4, dan Thumb)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.xdata
Informasi pengecualian (format gratis)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

 

Beberapa bagian yang tercantum di sini ditandai "objek saja" atau "hanya gambar" untuk menunjukkan bahwa semantik khusus mereka hanya relevan untuk file objek atau file gambar, masing-masing. Bagian yang ditandai "hanya gambar" mungkin masih muncul dalam file objek sebagai cara masuk ke file gambar, tetapi bagian tersebut tidak memiliki arti khusus untuk linker, hanya untuk pemuat file gambar.

Bagian .debug

Bagian .debug digunakan dalam file objek untuk berisi informasi debug yang dihasilkan kompilator dan dalam file gambar untuk berisi semua informasi debug yang dihasilkan. Bagian ini menjelaskan pengemasan informasi debug dalam file objek dan gambar.

Bagian berikutnya menjelaskan format direktori debug, yang dapat berada di mana saja dalam gambar. Bagian berikutnya menjelaskan "grup" dalam file objek yang berisi informasi debug.

Default untuk linker adalah bahwa informasi debug tidak dipetakan ke ruang alamat gambar. Bagian .debug hanya ada ketika informasi debug dipetakan di ruang alamat.

Direktori Debug (Hanya Gambar)

File gambar berisi direktori debug opsional yang menunjukkan bentuk informasi debug apa yang ada dan di mana itu berada. Direktori ini terdiri dari array entri direktori debug yang lokasi dan ukurannya ditunjukkan dalam header opsional gambar.

Direktori debug dapat berada di bagian .debug yang dapat dibuang (jika ada), atau dapat disertakan di bagian lain dalam file gambar, atau tidak berada di bagian sama sekali.

Setiap entri direktori debug mengidentifikasi lokasi dan ukuran blok informasi debug. RVA yang ditentukan dapat menjadi nol jika informasi debug tidak dicakup oleh header bagian (yaitu, berada di file gambar dan tidak dipetakan ke dalam ruang alamat run-time). Jika dipetakan, RVA adalah alamatnya.

Entri direktori debug memiliki format berikut:

Offset Ukuran Bidang Deskripsi
0
4
Karakteristik
Dicadangkan, harus nol.
4
4
TimeDateStamp
Waktu dan tanggal data debug dibuat.
8
2
MajorVersion
Nomor versi utama format data debug.
10
2
MinorVersion
Nomor versi minor dari format data debug.
12
4
Ketikkan
Format informasi penelusuran kesalahan. Bidang ini memungkinkan dukungan beberapa debugger. Untuk informasi selengkapnya, lihat Jenis Debug.
16
4
SizeOfData
Ukuran data debug (tidak termasuk direktori debug itu sendiri).
20
4
AddressOfRawData
Alamat data debug saat dimuat, relatif terhadap basis gambar.
24
4
PointerToRawData
Penunjuk file ke data debug.

 

Jenis Debug

Nilai berikut didefinisikan untuk bidang Jenis entri direktori debug:

Terus-menerus Nilai Deskripsi
IMAGE_DEBUG_TYPE_UNKNOWN
0
Nilai yang tidak diketahui yang diabaikan oleh semua alat.
IMAGE_DEBUG_TYPE_COFF
1
Informasi debug COFF (nomor baris, tabel simbol, dan tabel string). Jenis informasi debug ini juga ditujukan ke bidang di header file.
IMAGE_DEBUG_TYPE_CODEVIEW
2
Informasi debug Visual C++.
IMAGE_DEBUG_TYPE_FPO
3
Informasi kelalaian pointer bingkai (FPO). Informasi ini memberi tahu debugger cara menginterpretasikan bingkai tumpukan nonstandar, yang menggunakan register EBP untuk tujuan selain sebagai penunjuk bingkai.
IMAGE_DEBUG_TYPE_MISC
4
Lokasi file DBG.
IMAGE_DEBUG_TYPE_EXCEPTION
5
Salinan bagian .pdata.
IMAGE_DEBUG_TYPE_FIXUP
6
Dicadangkan.
IMAGE_DEBUG_TYPE_OMAP_TO_SRC
7
Pemetaan dari RVA dalam gambar ke RVA dalam gambar sumber.
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
8
Pemetaan dari RVA dalam gambar sumber ke RVA dalam gambar.
IMAGE_DEBUG_TYPE_BORLAND
9
Dicadangkan untuk Borland.
IMAGE_DEBUG_TYPE_RESERVED10
10
Dicadangkan.
IMAGE_DEBUG_TYPE_CLSID
11
Dicadangkan.
IMAGE_DEBUG_TYPE_REPRO
16
Determinisme pe atau reprodusibilitas.
Tidak terdefinisi
17
Informasi penelusuran kesalahan disematkan dalam file PE di lokasi yang ditentukan oleh PointerToRawData.
Tidak terdefinisi
19
Menyimpan hash kripto untuk konten file simbol yang digunakan untuk membangun file PE/COFF.
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20 Bit karakteristik DLL yang diperluas.

 

Jika bidang Jenis diatur ke IMAGE_DEBUG_TYPE_FPO, data mentah debug adalah array di mana setiap anggota menjelaskan bingkai tumpukan fungsi. Tidak setiap fungsi dalam file gambar harus memiliki informasi FPO yang ditentukan untuk itu, meskipun jenis debug adalah FPO. Fungsi-fungsi yang tidak memiliki informasi FPO diasumsikan memiliki bingkai tumpukan normal. Format untuk informasi FPO adalah sebagai berikut:

#define FRAME_FPO   0
#define FRAME_TRAP  1
#define FRAME_TSS   2

typedef struct _FPO_DATA {
    DWORD       ulOffStart;            // offset 1st byte of function code
    DWORD       cbProcSize;            // # bytes in function
    DWORD       cdwLocals;             // # bytes in locals/4
    WORD        cdwParams;             // # bytes in params/4
    WORD        cbProlog : 8;          // # bytes in prolog
    WORD        cbRegs   : 3;          // # regs saved
    WORD        fHasSEH  : 1;          // TRUE if SEH in func
    WORD        fUseBP   : 1;          // TRUE if EBP has been allocated
    WORD        reserved : 1;          // reserved for future use
    WORD        cbFrame  : 2;          // frame type
} FPO_DATA;

Kehadiran entri jenis IMAGE_DEBUG_TYPE_REPRO menunjukkan file PE dibangun dengan cara untuk mencapai determinisme atau reproduksi. Jika input tidak berubah, file PE output dijamin menjadi bit-for-bit yang identik tidak peduli kapan atau di mana PE diproduksi. Berbagai bidang stempel tanggal/waktu dalam file PE diisi dengan bagian atau semua bit dari nilai hash terhitung yang menggunakan konten file PE sebagai input, dan oleh karena itu tidak lagi mewakili tanggal dan waktu aktual ketika file PE atau data spesifik terkait dalam PE diproduksi. Data mentah entri debug ini mungkin kosong, atau mungkin berisi nilai hash terhitung yang didahului oleh nilai empat byte yang mewakili panjang nilai hash.

Jika bidang Jenis diatur ke IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, data mentah debug berisi bit karakteristik DLL yang diperluas, selain yang dapat diatur dalam header opsional gambar. Lihat Karakteristik DLL di bagian Header Opsional Bidang Khusus Windows (Hanya Gambar).

Karakteristik DLL yang Diperluas

Nilai berikut didefinisikan untuk bit karakteristik DLL yang diperluas.

Terus-menerus Nilai Deskripsi
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 Gambar kompatibel dengan Control-flow Enforcement Technology (CET) Shadow Stack.
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040 Semua target cabang di semua bagian kode gambar diannotasi dengan instruksi pelindung integritas alur kontrol tepi depan seperti instruksi x86 CET-Indirect Branch Tracking (IBT) atau ARM Branch Target Identification (BTI). Bit ini tidak digunakan oleh Windows.

.debug$F (Objek Saja)

Data di bagian ini telah digantikan dalam Visual C++ versi 7.0 dan yang lebih baru oleh sekumpulan data yang lebih luas yang dipancarkan ke dalam subbagian .debug$S .

File objek dapat berisi bagian .debug$F yang isinya adalah satu atau beberapa rekaman FPO_DATA (informasi kelalaian pointer bingkai). Lihat "IMAGE_DEBUG_TYPE_FPO" di Jenis Debug.

Linker mengenali rekaman .debug$F ini. Jika informasi debug sedang dibuat, linker mengurutkan rekaman FPO_DATA berdasarkan prosedur RVA dan menghasilkan entri direktori debug untuk mereka.

Pengkompilasi tidak boleh menghasilkan rekaman FPO untuk prosedur yang memiliki format bingkai standar.

.debug$S (Objek Saja)

Bagian ini berisi informasi debug Visual C++ (informasi simbolis).

.debug$P (Objek Saja)

Bagian ini berisi informasi debug Visual C++ (informasi yang telah dikommpilasikan sebelumnya). Ini adalah jenis bersama di antara semua objek yang dikompilasi dengan menggunakan header yang telah dikompilasi yang dihasilkan dengan objek ini.

.debug$T (Objek Saja)

Bagian ini berisi informasi debug Visual C++ (informasi jenis).

Dukungan Linker untuk Informasi Debug Microsoft

Untuk mendukung informasi debug, linker:

  • Mengumpulkan semua data debug yang relevan dari bagian .debug$F, debug$S, .debug$P, dan .debug$T .

  • Memproses data tersebut bersama dengan informasi debugging yang dihasilkan linker ke dalam file PDB, dan membuat entri direktori debug untuk merujuknya.

Bagian .drectve (Objek Saja)

Bagian adalah bagian direktif jika memiliki bendera IMAGE_SCN_LNK_INFO yang diatur di header bagian dan memiliki nama bagian .drectve . Linker menghapus bagian .drectve setelah memproses informasi, sehingga bagian tidak muncul dalam file gambar yang sedang ditautkan.

Bagian .drectve terdiri dari string teks yang dapat dikodekan sebagai ANSI atau UTF-8. Jika penanda urutan byte UTF-8 (BOM, awalan tiga byte yang terdiri dari 0xEF, 0xBB, dan 0xBF) tidak ada, string direktif ditafsirkan sebagai ANSI. String direktif adalah serangkaian opsi linker yang dipisahkan oleh spasi. Setiap opsi berisi tanda hubung, nama opsi, dan atribut yang sesuai. Jika opsi berisi spasi, opsi harus diapit dalam tanda kutip. Bagian .drectve tidak boleh memiliki relokasi atau nomor baris.

Bagian .edata (Hanya Gambar)

Bagian ekspor data, bernama .edata, berisi informasi tentang simbol yang dapat diakses gambar lain melalui penautan dinamis. Simbol yang diekspor umumnya ditemukan di DLL, tetapi DLL juga dapat mengimpor simbol.

Gambaran umum struktur umum bagian ekspor dijelaskan di bawah ini. Tabel yang dijelaskan biasanya berdekatan dalam file dalam urutan yang ditampilkan (meskipun ini tidak diperlukan). Hanya tabel direktori ekspor dan tabel alamat ekspor yang diperlukan untuk mengekspor simbol sebagai ordinal. (Ordinal adalah ekspor yang diakses langsung oleh indeks tabel alamat ekspornya.) Tabel penunjuk nama, tabel ordinal, dan tabel nama ekspor semuanya ada untuk mendukung penggunaan nama ekspor.

Nama Tabel Deskripsi
Ekspor tabel direktori
Tabel hanya dengan satu baris (tidak seperti direktori debug). Tabel ini menunjukkan lokasi dan ukuran tabel ekspor lainnya.
Ekspor tabel alamat
Array RVA dari simbol yang diekspor. Ini adalah alamat aktual dari fungsi dan data yang diekspor dalam kode dan bagian data yang dapat dieksekusi. File gambar lain dapat mengimpor simbol dengan menggunakan indeks ke tabel ini (ordinal) atau, secara opsional, dengan menggunakan nama publik yang sesuai dengan ordinal jika nama publik ditentukan.
Tabel penunjuk nama
Array pointer ke nama ekspor publik, diurutkan dalam urutan naik.
Tabel ordinal
Array ordinal yang sesuai dengan anggota tabel penunjuk nama. Korespondensi berdasarkan posisi; oleh karena itu, tabel penunjuk nama dan tabel ordinal harus memiliki jumlah anggota yang sama. Setiap ordinal adalah indeks ke dalam tabel alamat ekspor.
Ekspor tabel nama
Serangkaian string ASCII null-terminated. Anggota tabel penunjuk nama menunjuk ke area ini. Nama-nama ini adalah nama publik tempat simbol diimpor dan diekspor; nama tersebut belum tentu sama dengan nama privat yang digunakan dalam file gambar.

 

Ketika file gambar lain mengimpor simbol menurut nama, pemuat Win32 mencari tabel penunjuk nama untuk string yang cocok. Jika string yang cocok ditemukan, ordinal terkait diidentifikasi dengan mencari anggota yang sesuai dalam tabel ordinal (yaitu, anggota tabel ordinal dengan indeks yang sama dengan penunjuk string yang ditemukan dalam tabel penunjuk nama). Ordinal yang dihasilkan adalah indeks ke dalam tabel alamat ekspor, yang memberikan lokasi sebenarnya dari simbol yang diinginkan. Setiap simbol ekspor dapat diakses oleh ordinal.

Ketika file gambar lain mengimpor simbol menurut ordinal, tidak perlu mencari tabel penunjuk nama untuk string yang cocok. Oleh karena itu, penggunaan langsung ordinal lebih efisien. Namun, nama ekspor lebih mudah diingat dan tidak mengharuskan pengguna untuk mengetahui indeks tabel untuk simbol tersebut.

Ekspor Tabel Direktori

Informasi simbol ekspor dimulai dengan tabel direktori ekspor, yang menjelaskan sisa informasi simbol ekspor. Tabel direktori ekspor berisi informasi alamat yang digunakan untuk mengatasi impor ke titik masuk dalam gambar ini.

Offset Ukuran Bidang Deskripsi
0
4
Ekspor Bendera
Dicadangkan, harus 0.
4
4
Stempel Waktu/Tanggal
Waktu dan tanggal pembuatan data ekspor.
8
2
Versi Utama
Nomor versi utama. Nomor versi utama dan minor dapat diatur oleh pengguna.
10
2
Versi Minor
Nomor versi minor.
12
4
Nama RVA
Alamat string ASCII yang berisi nama DLL. Alamat ini relatif terhadap basis gambar.
16
4
Dasar Ordinal
Nomor ordinal awal untuk ekspor dalam gambar ini. Bidang ini menentukan nomor ordinal awal untuk tabel alamat ekspor. Biasanya diatur ke 1.
20
4
Entri Tabel Alamat
Jumlah entri dalam tabel alamat ekspor.
24
4
Jumlah Penunjuk Nama
Jumlah entri dalam tabel penunjuk nama. Ini juga jumlah entri dalam tabel ordinal.
28
4
Ekspor Tabel Alamat RVA
Alamat tabel alamat ekspor, relatif terhadap basis gambar.
32
4
Nama Pointer RVA
Alamat tabel penunjuk nama ekspor, relatif terhadap basis gambar. Ukuran tabel diberikan oleh bidang Jumlah Penunjuk Nama.
36
4
Tabel Ordinal RVA
Alamat tabel ordinal, relatif terhadap basis gambar.

 

Ekspor Tabel Alamat

Tabel alamat ekspor berisi alamat titik masuk yang diekspor dan data dan absolut yang diekspor. Nomor ordinal digunakan sebagai indeks ke dalam tabel alamat ekspor.

Setiap entri dalam tabel alamat ekspor adalah bidang yang menggunakan salah satu dari dua format dalam tabel berikut. Jika alamat yang ditentukan tidak berada dalam bagian ekspor (seperti yang didefinisikan oleh alamat dan panjang yang ditunjukkan di header opsional), bidang adalah RVA ekspor, yang merupakan alamat aktual dalam kode atau data. Jika tidak, bidang adalah RVA penerus, yang menamai simbol di DLL lain.

Offset Ukuran Bidang Deskripsi
0
4
Ekspor RVA
Alamat simbol yang diekspor saat dimuat ke dalam memori, relatif terhadap basis gambar. Misalnya, alamat fungsi yang diekspor.
0
4
Penerus RVA
Penunjuk ke string ASCII yang dihentikan null di bagian ekspor. String ini harus berada dalam rentang yang diberikan oleh entri direktori data tabel ekspor. Lihat Direktori Data Header Opsional (Hanya Gambar). String ini memberikan nama DLL dan nama ekspor (misalnya, "MYDLL.expfunc") atau nama DLL dan nomor ordinal ekspor (misalnya, "MYDLL.#27").

 

Penerus RVA mengekspor definisi dari beberapa gambar lain, membuatnya tampak seolah-olah sedang diekspor oleh gambar saat ini. Dengan demikian, simbol diimpor dan diekspor secara bersamaan.

Misalnya, dalam Kernel32.dll di Windows XP, ekspor bernama "HeapAlloc" diteruskan ke string "NTDLL. RtlAllocateHeap." Ini memungkinkan aplikasi untuk menggunakan modul khusus Windows XP Ntdll.dll tanpa benar-benar berisi referensi impor ke dalamnya. Tabel impor aplikasi hanya mengacu pada Kernel32.dll. Oleh karena itu, aplikasi ini tidak spesifik untuk Windows XP dan dapat berjalan pada sistem Win32 apa pun.

Ekspor Tabel Penunjuk Nama

Tabel penunjuk nama ekspor adalah array alamat (RVA) ke dalam tabel nama ekspor. Pointer masing-masing 32 bit dan relatif terhadap basis gambar. Pointer diurutkan secara leksikal untuk memungkinkan pencarian biner.

Nama ekspor ditentukan hanya jika tabel penunjuk nama ekspor berisi penunjuk ke dalamnya.

Ekspor Tabel Ordinal

Tabel ordinal ekspor adalah array indeks 16-bit yang tidak bias ke dalam tabel alamat ekspor. Ordinal dibiaskan oleh bidang Ordinal Base dari tabel direktori ekspor. Dengan kata lain, basis ordinal harus dikurangi dari ordinal untuk mendapatkan indeks benar ke dalam tabel alamat ekspor.

Tabel penunjuk nama ekspor dan tabel ordinal ekspor membentuk dua array paralel yang dipisahkan untuk memungkinkan perataan bidang alami. Kedua tabel ini, berlaku, beroperasi sebagai satu tabel, di mana kolom Ekspor Penunjuk Nama menunjuk ke nama publik (diekspor) dan kolom Ekspor Ordinal memberikan ordinal yang sesuai untuk nama publik tersebut. Anggota tabel penunjuk nama ekspor dan anggota tabel ordinal ekspor dikaitkan dengan memiliki posisi (indeks) yang sama dalam array masing-masing.

Dengan demikian, ketika tabel penunjuk nama ekspor dicari dan string yang cocok ditemukan pada posisi i, algoritma untuk menemukan RVA simbol dan ordinal bias adalah:

i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];

rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;

Saat mencari simbol berdasarkan ordinal (bias), algoritma untuk menemukan RVA simbol dan nama adalah:

ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);

rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];

Ekspor Tabel Nama

Tabel nama ekspor berisi data string aktual yang diacu oleh tabel penunjuk nama ekspor. String dalam tabel ini adalah nama publik yang dapat digunakan gambar lain untuk mengimpor simbol. Nama ekspor publik ini belum tentu sama dengan nama simbol privat yang dimiliki simbol dalam file gambar dan kode sumber mereka sendiri, meskipun bisa.

Setiap simbol yang diekspor memiliki nilai ordinal, yang hanya merupakan indeks ke dalam tabel alamat ekspor. Namun, penggunaan nama ekspor bersifat opsional. Beberapa, semua, atau tidak ada simbol yang diekspor dapat memiliki nama ekspor. Untuk simbol yang diekspor yang memang memiliki nama ekspor, entri yang sesuai dalam tabel penunjuk nama ekspor dan ekspor tabel ordinal bekerja sama untuk mengaitkan setiap nama dengan ordinal.

Struktur tabel nama ekspor adalah serangkaian string ASCII panjang variabel yang dihentikan null.

Bagian .idata

Semua file gambar yang mengimpor simbol, termasuk hampir semua file executable (EXE), memiliki bagian .idata. Tata letak file umum untuk informasi impor mengikuti:

  • Tabel Direktori

    Entri Direktori Null

  • Dll1 Impor Tabel Pencarian

    Null

  • Dll2 Impor Tabel Pencarian

    Null

  • Dll3 Impor Tabel Pencarian

    Null

  • Tabel Nama Petunjuk

Impor Tabel Direktori

Informasi impor dimulai dengan tabel direktori impor, yang menjelaskan sisa informasi impor. Tabel direktori impor berisi informasi alamat yang digunakan untuk mengatasi referensi perbaikan ke titik masuk dalam gambar DLL. Tabel direktori impor terdiri dari array entri direktori impor, satu entri untuk setiap DLL yang dirujuk gambar. Entri direktori terakhir kosong (diisi dengan nilai null), yang menunjukkan akhir tabel direktori.

Setiap entri direktori impor memiliki format berikut:

Offset Ukuran Bidang Deskripsi
0
4
Impor RVA Tabel Pencarian (Karakteristik)
RVA tabel pencarian impor. Tabel ini berisi nama atau ordinal untuk setiap impor. (Nama "Karakteristik" digunakan di Winnt.h, tetapi tidak lagi menggambarkan bidang ini.)
4
4
Stempel Waktu/Tanggal
Stempel yang diatur ke nol hingga gambar terikat. Setelah gambar terikat, bidang ini diatur ke stempel waktu/data DLL.
8
4
Rantai Penerus
Indeks referensi penerus pertama.
12
4
Nama RVA
Alamat string ASCII yang berisi nama DLL. Alamat ini relatif terhadap basis gambar.
16
4
Impor Tabel Alamat RVA (Tabel Thunk)
RVA tabel alamat impor. Konten tabel ini identik dengan konten tabel pencarian impor hingga gambar terikat.

 

Impor Tabel Pencarian

Tabel pencarian impor adalah array angka 32-bit untuk PE32 atau array angka 64-bit untuk PE32+. Setiap entri menggunakan format bit-field yang dijelaskan dalam tabel berikut. Dalam format ini, bit 31 adalah bit paling signifikan untuk PE32 dan bit 63 adalah bit paling signifikan untuk PE32+. Kumpulan entri ini menjelaskan semua impor dari DLL tertentu. Entri terakhir diatur ke nol (NULL) untuk menunjukkan akhir tabel.

Bit Ukuran Bidang bit Deskripsi
31/63
1
Bendera Ordinal/Nama
Jika bit ini diatur, impor menurut ordinal. Jika tidak, impor berdasarkan nama. Bit ditutupi sebagai 0x80000000 untuk PE32, 0x8000000000000000 untuk PE32+.
15-0
16
Nomor Ordinal
Angka ordinal 16-bit. Bidang ini hanya digunakan jika bidang Bit Bendera Ordinal/Nama adalah 1 (impor menurut ordinal). Bit 30-15 atau 62-15 harus 0.
30-0
31
Tabel Petunjuk/Nama RVA
RVA 31-bit dari entri tabel petunjuk/nama. Bidang ini hanya digunakan jika bidang Bit Bendera Ordinal/Nama adalah 0 (impor menurut nama). Untuk PE32+ bit 62-31 harus nol.

 

Tabel Petunjuk/Nama

Satu cukup tabel petunjuk/nama untuk seluruh bagian impor. Setiap entri dalam tabel petunjuk/nama memiliki format berikut:

Offset Ukuran Bidang Deskripsi
0
2
Petunjuk
Indeks ke dalam tabel penunjuk nama ekspor. Kecocokan dicoba terlebih dahulu dengan nilai ini. Jika gagal, pencarian biner dilakukan pada tabel penunjuk nama ekspor DLL.
2
variabel
Nama
String ASCII yang berisi nama yang akan diimpor. Ini adalah string yang harus dicocokkan dengan nama publik di DLL. String ini peka huruf besar/kecil dan dihentikan oleh byte null.
*
0 atau 1
Pad
Byte nol-pad berikutnya yang muncul setelah byte null berikutnya, jika perlu, untuk menyelaraskan entri berikutnya pada batas genap.

 

Impor Tabel Alamat

Struktur dan konten tabel alamat impor identik dengan tabel pencarian impor, hingga file terikat. Selama pengikatan, entri dalam tabel alamat impor ditimpa dengan alamat 32-bit (untuk PE32) atau 64-bit (untuk PE32+) dari simbol yang sedang diimpor. Alamat ini adalah alamat memori aktual dari simbol, meskipun secara teknis alamat tersebut masih disebut "alamat virtual." Loader biasanya memproses pengikatan.

Bagian .pdata

Bagian .pdata berisi array entri tabel fungsi yang digunakan untuk penanganan pengecualian. Ini diarahkan ke oleh entri tabel pengecualian di direktori data gambar. Entri harus diurutkan sesuai dengan alamat fungsi (bidang pertama di setiap struktur) sebelum dipancarkan ke dalam gambar akhir. Platform target menentukan mana dari tiga variasi format entri tabel fungsi yang dijelaskan di bawah ini yang digunakan.

Untuk gambar MIPS 32-bit, entri tabel fungsi memiliki format berikut:

Offset Ukuran Bidang Deskripsi
0
4
Mulai Alamat
VA dari fungsi yang sesuai.
4
4
Alamat Akhir
VA akhir fungsi.
8
4
Handler Pengecualian
Penunjuk ke handler pengecualian yang akan dijalankan.
12
4
Handler Data
Penunjuk ke informasi tambahan yang akan diteruskan ke handler.
16
4
Alamat Akhir Prolog
VA dari akhir prolog fungsi.

 

Untuk platform ARM, PowerPC, SH3, dan SH4 Windows CE, entri tabel fungsi memiliki format berikut:

Offset Ukuran Bidang Deskripsi
0
4
Mulai Alamat
VA dari fungsi yang sesuai.
4
8 bit
Panjang Prolog
Jumlah instruksi dalam prolog fungsi.
4
22 bit
Panjang Fungsi
Jumlah instruksi dalam fungsi.
4
1 bit
Bendera 32-bit
Jika diatur, fungsi terdiri dari instruksi 32-bit. Jika jelas, fungsi terdiri dari instruksi 16-bit.
4
1 bit
Bendera Pengecualian
Jika diatur, handler pengecualian ada untuk fungsi tersebut. Jika tidak, tidak ada handler pengecualian.

 

Untuk platform x64 dan Itanium, entri tabel fungsi memiliki format berikut:

Offset Ukuran Bidang Deskripsi
0
4
Mulai Alamat
RVA dari fungsi yang sesuai.
4
4
Alamat Akhir
RVA dari akhir fungsi.
8
4
Batalkan Informasi
RVA dari informasi unwind.

 

Bagian .reloc (Hanya Gambar)

Tabel relokasi dasar berisi entri untuk semua relokasi dasar dalam gambar. Bidang Tabel Relokasi Dasar di direktori data header opsional memberikan jumlah byte dalam tabel relokasi dasar. Untuk informasi selengkapnya, lihat Direktori Data Header Opsional (Hanya Gambar). Tabel relokasi dasar dibagi menjadi blok. Setiap blok mewakili relokasi dasar untuk halaman 4K. Setiap blok harus dimulai pada batas 32-bit.

Loader tidak diperlukan untuk memproses relokasi dasar yang diselesaikan oleh linker, kecuali gambar beban tidak dapat dimuat di basis gambar yang ditentukan di header PE.

Blok Relokasi Dasar

Setiap blok relokasi dasar dimulai dengan struktur berikut:

Offset Ukuran Bidang Deskripsi
0
4
Halaman RVA
Basis gambar ditambah halaman RVA ditambahkan ke setiap offset untuk membuat VA tempat relokasi dasar harus diterapkan.
4
4
Ukuran Blok
Jumlah total byte di blok relokasi dasar, termasuk bidang RVA Halaman dan Ukuran Blok dan bidang Jenis/Offset yang mengikutinya.

 

Bidang Ukuran Blok kemudian diikuti oleh sejumlah entri bidang Tipe atau Offset. Setiap entri adalah WORD (2 byte) dan memiliki struktur berikut:

Offset Ukuran Bidang Deskripsi
0
4 bit
Ketikkan
Disimpan dalam 4 bit tinggi WORD, nilai yang menunjukkan jenis relokasi dasar yang akan diterapkan. Untuk informasi selengkapnya, lihat Jenis Relokasi Dasar.
0
12 bit
Offset
Disimpan dalam 12 bit WORD yang tersisa, offset dari alamat awal yang ditentukan di bidang RVA Halaman untuk blok tersebut. Offset ini menentukan di mana relokasi dasar akan diterapkan.

 

Untuk menerapkan relokasi dasar, perbedaan dihitung antara alamat dasar pilihan dan basis tempat gambar benar-benar dimuat. Jika gambar dimuat pada basis pilihannya, perbedaannya adalah nol dan dengan demikian relokasi dasar tidak harus diterapkan.

Jenis Relokasi Dasar

Terus-menerus Nilai Deskripsi
IMAGE_REL_BASED_ABSOLUTE
0
Relokasi dasar dilewati. Jenis ini dapat digunakan untuk melakukan pad blok.
IMAGE_REL_BASED_HIGH
1
Relokasi dasar menambahkan 16 bit tinggi dari perbedaan ke bidang 16-bit pada offset. Bidang 16-bit mewakili nilai tinggi kata 32-bit.
IMAGE_REL_BASED_LOW
2
Relokasi dasar menambahkan 16 bit rendah dari perbedaan ke bidang 16-bit pada offset. Bidang 16-bit mewakili setengah rendah dari kata 32-bit.
IMAGE_REL_BASED_HIGHLOW
3
Relokasi dasar menerapkan semua 32 bit perbedaan ke bidang 32-bit pada offset.
IMAGE_REL_BASED_HIGHADJ
4
Relokasi dasar menambahkan 16 bit tinggi dari perbedaan ke bidang 16-bit pada offset. Bidang 16-bit mewakili nilai tinggi kata 32-bit. 16 bit rendah dari nilai 32-bit disimpan dalam kata 16-bit yang mengikuti relokasi dasar ini. Ini berarti bahwa relokasi dasar ini menempati dua slot.
IMAGE_REL_BASED_MIPS_JMPADDR
5
Interpretasi relokasi tergantung pada jenis komputer.
Ketika jenis komputer adalah MIPS, relokasi dasar berlaku untuk instruksi lompat MIPS.
IMAGE_REL_BASED_ARM_MOV32
5
Relokasi ini bermakna hanya ketika jenis komputer adalah ARM atau Thumb. Relokasi dasar menerapkan alamat 32-bit simbol di seluruh pasangan instruksi MOVW/MOVT berturut-turut.
IMAGE_REL_BASED_RISCV_HIGH20
5
Relokasi ini hanya bermakna ketika jenis komputer adalah RISC-V. Relokasi dasar berlaku untuk 20 bit tinggi dari alamat absolut 32-bit.
6
Dicadangkan, harus nol.
IMAGE_REL_BASED_THUMB_MOV32
7
Relokasi ini bermakna hanya ketika jenis komputer adalah Thumb. Relokasi dasar menerapkan alamat simbol 32-bit ke pasangan instruksi MOVW/MOVT berturut-turut.
IMAGE_REL_BASED_RISCV_LOW12I
7
Relokasi ini hanya bermakna ketika jenis komputer adalah RISC-V. Relokasi dasar berlaku untuk 12 bit rendah dari alamat absolut 32-bit yang terbentuk dalam format instruksi RISC-V tipe I.
IMAGE_REL_BASED_RISCV_LOW12S
8
Relokasi ini hanya bermakna ketika jenis komputer adalah RISC-V. Relokasi dasar berlaku untuk 12 bit rendah dari alamat absolut 32-bit yang dibentuk dalam format instruksi jenis RISC-V S.
IMAGE_REL_BASED_LOONGARCH32_MARK_LA
8
Relokasi ini hanya bermakna ketika jenis mesin adalah LoongArch 32-bit. Relokasi dasar berlaku untuk alamat absolut 32-bit yang dibentuk dalam dua instruksi berturut-turut.
IMAGE_REL_BASED_LOONGARCH64_MARK_LA
8
Relokasi ini hanya bermakna ketika jenis mesin adalah LoongArch 64-bit. Relokasi dasar berlaku untuk alamat absolut 64-bit yang dibentuk dalam empat instruksi berturut-turut.
IMAGE_REL_BASED_MIPS_JMPADDR16
9
Relokasi hanya bermakna ketika jenis komputer adalah MIPS. Relokasi dasar berlaku untuk instruksi lompat MIPS16.
IMAGE_REL_BASED_DIR64
10
Relokasi dasar menerapkan perbedaan ke bidang 64-bit saat offset.

 

Bagian .tls

Bagian .tls menyediakan dukungan PE dan COFF langsung untuk penyimpanan lokal utas statis (TLS). TLS adalah kelas penyimpanan khusus yang didukung Windows di mana objek data bukan variabel otomatis (tumpukan), namun bersifat lokal untuk setiap utas individu yang menjalankan kode. Dengan demikian, setiap utas dapat mempertahankan nilai yang berbeda untuk variabel yang dideklarasikan dengan menggunakan TLS.

Perhatikan bahwa sejumlah data TLS dapat didukung dengan menggunakan panggilan API TlsAlloc, TlsFree, TlsSetValue, dan TlsGetValue. Implementasi PE atau COFF adalah pendekatan alternatif untuk menggunakan API dan memiliki keuntungan lebih sederhana dari sudut pandang pemrogram tingkat tinggi. Implementasi ini memungkinkan data TLS didefinisikan dan diinisialisasi mirip dengan variabel statis biasa dalam suatu program. Misalnya, di Visual C++, variabel TLS statis dapat didefinisikan sebagai berikut, tanpa menggunakan WINDOWS API:

__declspec (thread) int tlsFlag = 1;

Untuk mendukung konstruksi pemrograman ini, bagian PE dan COFF .tls menentukan informasi berikut: data inisialisasi, rutinitas panggilan balik untuk inisialisasi dan penghentian per utas, dan indeks TLS, yang dijelaskan dalam diskusi berikut.

Catatan

Sebelum Windows Vista, objek data TLS yang dideklarasikan secara statis hanya dapat digunakan dalam file gambar yang dimuat secara statis. Fakta ini membuatnya tidak dapat menggunakan data TLS statis dalam DLL kecuali Anda tahu bahwa DLL, atau apa pun yang terkait secara statis dengannya, tidak akan pernah dimuat secara dinamis dengan fungsi API LoadLibrary. Namun, dimulai dengan Windows Vista, peningkatan dilakukan pada pemuat Windows untuk mendukung pemuatan DLL dinamis dengan TLS statis dengan lebih baik. Perubahan ini berarti bahwa DLL dengan objek data TLS yang dideklarasikan secara statis sekarang dapat digunakan dengan lebih andal, bahkan jika dimuat secara dinamis menggunakan LoadLibrary. Loader mampu mengalokasikan slot TLS untuk DLL tersebut pada waktu pemuatan, mengurangi batasan yang ada di versi Windows sebelumnya.

 

Catatan

Referensi ke offset 32-bit dan pengali indeks 4 berlaku untuk sistem dengan arsitektur 32-bit. Dalam sistem berdasarkan arsitektur 64-bit, sesuaikan seperlunya.

Kode yang dapat dieksekusi mengakses objek data TLS statis melalui langkah-langkah berikut:

  1. Pada waktu tautan, linker mengatur bidang Alamat Indeks direktori TLS. Bidang ini menunjuk ke lokasi di mana program mengharapkan untuk menerima indeks TLS.

    Pustaka run-time Microsoft memfasilitasi proses ini dengan menentukan gambar memori direktori TLS dan memberinya nama khusus "__tls_used" (platform Intel x86) atau "_tls_used" (platform lain). Linker mencari gambar memori ini dan menggunakan data di sana untuk membuat direktori TLS. Pengkompilasi lain yang mendukung TLS dan bekerja dengan linker Microsoft harus menggunakan teknik yang sama ini.

  2. Saat utas dibuat, loader mengomunikasikan alamat array TLS utas dengan menempatkan alamat blok lingkungan utas (TEB) di register FS. Penunjuk ke array TLS berada di offset 0x2C dari awal TEB. Perilaku ini khusus intel x86.

  3. Loader menetapkan nilai indeks TLS ke tempat yang ditunjukkan oleh bidang Alamat Indeks.

  4. Kode yang dapat dieksekusi mengambil indeks TLS dan juga lokasi array TLS.

  5. Kode ini menggunakan indeks TLS dan lokasi array TLS (mengalikan indeks dengan 4 dan menggunakannya sebagai offset ke array) untuk mendapatkan alamat area data TLS untuk program dan modul tertentu. Setiap utas memiliki area data TLS sendiri, tetapi ini transparan untuk program, yang tidak perlu mengetahui bagaimana data dialokasikan untuk utas individual.

  6. Objek data TLS individual diakses sebagai beberapa offset tetap ke area data TLS.

Array TLS adalah array alamat yang dipertahankan sistem untuk setiap utas. Setiap alamat dalam array ini memberikan lokasi data TLS untuk modul tertentu (EXE atau DLL) dalam program. Indeks TLS menunjukkan anggota array mana yang akan digunakan. Indeks adalah angka (bermakna hanya untuk sistem) yang mengidentifikasi modul.

Direktori TLS

Direktori TLS memiliki format berikut:

Offset (PE32/ PE32+) Ukuran (PE32/ PE32+) Bidang Deskripsi
0
4/8
Va Mulai Data Mentah
Alamat awal templat TLS. Templat adalah blok data yang digunakan untuk menginisialisasi data TLS. Sistem menyalin semua data ini setiap kali utas dibuat, sehingga tidak boleh rusak. Perhatikan bahwa alamat ini bukan RVA; ini adalah alamat yang harus ada relokasi dasar di bagian .reloc.
4/8
4/8
VA Akhir Data Mentah
Alamat byte terakhir TLS, kecuali untuk pengisian nol. Seperti bidang Raw Data Start VA, ini adalah VA, bukan RVA.
8/16
4/8
Alamat Indeks
Lokasi untuk menerima indeks TLS, yang ditetapkan loader. Lokasi ini berada di bagian data biasa, sehingga dapat diberi nama simbolis yang dapat diakses oleh program.
12/24
4/8
Alamat Panggilan Balik
Penunjuk ke array fungsi panggilan balik TLS. Array dihentikan null, jadi jika tidak ada fungsi panggilan balik yang didukung, bidang ini menunjuk ke 4 byte yang diatur ke nol. Untuk informasi tentang prototipe untuk fungsi-fungsi ini, lihat Fungsi Panggilan Balik TLS.
16/32
4
Ukuran Isian Nol
Ukuran dalam byte templat, di luar data yang diinisialisasi yang dibatasi oleh bidang Raw Data Start VA dan Raw Data End VA. Ukuran templat total harus sama dengan ukuran total data TLS dalam file gambar. Pengisian nol adalah jumlah data yang muncul setelah data nonzero yang diinisialisasi.
20/36
4
Karakteristik
Empat bit [23:20] menjelaskan info perataan. Nilai yang mungkin adalah nilai yang didefinisikan sebagai IMAGE_SCN_ALIGN_*, yang juga digunakan untuk menjelaskan perataan bagian dalam file objek. 28 bit lainnya dicadangkan untuk digunakan di masa mendatang.

 

Fungsi Panggilan Balik TLS

Program ini dapat menyediakan satu atau beberapa fungsi panggilan balik TLS untuk mendukung inisialisasi dan penghentian tambahan untuk objek data TLS. Penggunaan umum untuk fungsi panggilan balik seperti itu adalah memanggil konstruktor dan destruktor untuk objek.

Meskipun biasanya tidak ada lebih dari satu fungsi panggilan balik, panggilan balik diimplementasikan sebagai array untuk memungkinkan untuk menambahkan fungsi panggilan balik tambahan jika diinginkan. Jika ada lebih dari satu fungsi panggilan balik, setiap fungsi dipanggil dalam urutan alamatnya muncul dalam array. Penunjuk null mengakhiri array. Sangat valid untuk memiliki daftar kosong (tidak ada panggilan balik yang didukung), dalam hal ini array panggilan balik memiliki tepat satu anggota-penunjuk null.

Prototipe untuk fungsi panggilan balik (ditujukkan oleh penunjuk jenis PIMAGE_TLS_CALLBACK) memiliki parameter yang sama dengan fungsi titik masuk DLL:

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );

Parameter Yang Dipesan harus diatur ke nol. Parameter Alasan dapat mengambil nilai berikut:

Pengaturan Nilai Deskripsi
DLL_PROCESS_ATTACH
1
Proses baru telah dimulai, termasuk utas pertama.
DLL_THREAD_ATTACH
2
Utas baru telah dibuat. Pemberitahuan ini dikirim untuk semua kecuali utas pertama.
DLL_THREAD_DETACH
3
Utas akan dihentikan. Pemberitahuan ini dikirim untuk semua kecuali utas pertama.
DLL_PROCESS_DETACH
0
Proses akan dihentikan, termasuk utas asli.

 

Struktur Konfigurasi Beban (Hanya Gambar)

Struktur konfigurasi beban (IMAGE_LOAD_CONFIG_DIRECTORY) sebelumnya digunakan dalam kasus yang sangat terbatas dalam sistem operasi Windows NT itu sendiri untuk menggambarkan berbagai fitur yang terlalu sulit atau terlalu besar untuk dijelaskan di header file atau header opsional gambar. Versi linker Microsoft saat ini dan Windows XP dan versi Windows yang lebih baru menggunakan versi baru struktur ini untuk sistem berbasis x86 32-bit yang mencakup teknologi SEH yang dicadangkan. Ini menyediakan daftar penangan pengecualian terstruktur yang aman yang digunakan sistem operasi selama pengiriman pengecualian. Jika alamat handler berada dalam rentang VA gambar dan ditandai sebagai sadar SEH khusus (yaitu, IMAGE_DLLCHARACTERISTICS_NO_SEH jelas di bidang DllCharacteristics dari header opsional, seperti yang dijelaskan sebelumnya), maka handler harus berada dalam daftar handler aman yang diketahui untuk gambar tersebut. Jika tidak, sistem operasi mengakhiri aplikasi. Ini membantu mencegah eksploitasi "pembajakan handler pengecualian x86" yang telah digunakan di masa lalu untuk mengendalikan sistem operasi.

Linker Microsoft secara otomatis menyediakan struktur konfigurasi beban default untuk menyertakan data SEH yang dipesan. Jika kode pengguna sudah menyediakan struktur konfigurasi beban, kode tersebut harus menyertakan bidang SEH baru yang dipesan. Jika tidak, linker tidak dapat menyertakan data SEH yang dipesan dan gambar tidak ditandai sebagai berisi SEH yang dipesan.

Muat Direktori Konfigurasi

Entri direktori data untuk struktur konfigurasi beban SEH yang telah dipesan sebelumnya harus menentukan ukuran tertentu dari struktur konfigurasi beban karena pemuat sistem operasi selalu mengharapkannya menjadi nilai tertentu. Dalam hal ini, ukurannya benar-benar hanya pemeriksaan versi. Untuk kompatibilitas dengan Windows XP dan versi Windows yang lebih lama, ukurannya harus 64 untuk gambar x86.

Muat Tata Letak Konfigurasi

Struktur konfigurasi beban memiliki tata letak berikut untuk file PE 32-bit dan 64-bit:

Offset Ukuran Bidang Deskripsi
0
4
Karakteristik
Bendera yang menunjukkan atribut file, saat ini tidak digunakan.
4
4
TimeDateStamp
Nilai stempel tanggal dan waktu. Nilai diwakili dalam jumlah detik yang telah berlalu sejak tengah malam (00:00:00), 1 Januari 1970, Universal Coordinated Time, sesuai dengan jam sistem. Stempel waktu dapat dicetak dengan menggunakan fungsi waktu runtime C (CRT).
8
2
MajorVersion
Nomor versi utama.
10
2
MinorVersion
Nomor versi minor.
12
4
GlobalFlagsClear
Loader global ditandai untuk menghapus proses ini saat loader memulai proses.
16
4
GlobalFlagsSet
Loader global ditandai untuk diatur untuk proses ini saat loader memulai proses.
20
4
CriticalSectionDefaultTimeout
Nilai batas waktu default yang digunakan untuk bagian penting proses ini yang ditinggalkan.
24
4/8
DeCommitFreeBlockThreshold
Memori yang harus dibebaskan sebelum dikembalikan ke sistem, dalam byte.
28/32
4/8
DeCommitTotalFreeThreshold
Jumlah total memori gratis, dalam byte.
32/40
4/8
LockPrefixTable
[x86 saja] VA dari daftar alamat tempat awalan LOCK digunakan sehingga dapat diganti dengan NOP pada mesin prosesor tunggal.
36/48
4/8
MaximumAllocationSize
Ukuran alokasi maksimum, dalam byte.
40/56
4/8
VirtualMemoryThreshold
Ukuran memori virtual maksimum, dalam byte.
44/64
4/8
ProcessAffinityMask
Mengatur bidang ini ke nilai bukan nol setara dengan memanggil SetProcessAffinityMask dengan nilai ini selama startup proses (hanya .exe)
48/72
4
ProcessHeapFlags
Proses bendera timbunan yang sesuai dengan argumen pertama fungsi HeapCreate. Bendera ini berlaku untuk tumpukan proses yang dibuat selama startup proses.
52/76
2
CSDVersion
Pengidentifikasi versi paket layanan.
54/78
2
DependentLoadFlags
Bendera beban default yang digunakan saat sistem operasi menyelesaikan impor modul yang ditautkan secara statis.
56/80
4/8
EditList
Dicadangkan untuk digunakan oleh sistem.
60/88
4/8
SecurityCookie
Penunjuk ke cookie yang digunakan oleh implementasi Visual C++ atau GS.
64/96
4/8
SEHandlerTable
[x86 saja] VA tabel RVA yang diurutkan dari setiap handler SE yang valid dan unik dalam gambar.
68/104
4/8
SEHandlerCount
[x86 saja] Jumlah handler unik dalam tabel.
72/112
4/8
GuardCFCheckFunctionPointer
VA tempat penunjuk fungsi pemeriksaan Control Flow Guard disimpan.
76/120
4/8
GuardCFDispatchFunctionPointer
VA tempat penunjuk fungsi pengiriman Control Flow Guard disimpan.
80/128
4/8
GuardCFfunctionTable
VA tabel RVA yang diurutkan dari setiap fungsi Control Flow Guard dalam gambar.
84/136
4/8
GuardCFunctionCount
Jumlah RVA unik dalam tabel di atas.
88/144
4
GuardFlags
Kontrol bendera terkait Flow Guard.
92/148
12
CodeIntegrity
Informasi integritas kode.
104/160
4/8
GuardAddressTakenIatEntryTable
VA tempat alamat Control Flow Guard mengambil tabel IAT disimpan.
108/168
4/8
GuardAddressTakenIatEntryCount
Jumlah RVA unik dalam tabel di atas.
112/176
4/8
GuardLongJumpTargetTable
VA tempat tabel target lompatan panjang Control Flow Guard disimpan.
116/184
4/8
GuardLongJumpTargetCount
Jumlah RVA unik dalam tabel di atas.

 

Bidang GuardFlags berisi kombinasi satu atau beberapa bendera dan subbidang berikut:

  • Modul melakukan pemeriksaan integritas alur kontrol menggunakan dukungan yang disediakan sistem.

    #define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100

  • Modul melakukan alur kontrol dan pemeriksaan integritas tulis.

    #define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200

  • Modul berisi metadata target alur kontrol yang valid.

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400

  • Modul tidak menggunakan cookie keamanan /GS.

    #define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800

  • Modul mendukung IAT penundaan baca saja.

    #define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000

  • Tunda muat tabel impor di bagian .didat sendiri (tanpa hal lain di dalamnya) yang dapat dilindungi kembali secara bebas.

    #define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000

  • Modul berisi informasi ekspor yang ditekan. Ini juga menyimpulkan bahwa alamat yang diambil tabel IAT juga ada dalam konfigurasi beban.

    #define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000

  • Modul memungkinkan penindasan ekspor.

    #define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000

  • Modul berisi informasi target longjmp.

    #define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000

  • Masker untuk subbidang yang berisi langkah entri tabel fungsi Control Flow Guard (yaitu, jumlah tambahan byte per entri tabel).

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000

Selain itu, header Windows SDK winnt.h menentukan makro ini untuk jumlah bit untuk menggeser kanan nilai GuardFlags untuk membenarkan kanan tabel fungsi Control Flow Guard:

#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28

Bagian .rsrc

Sumber daya diindeks oleh struktur pohon yang diurutkan biner beberapa tingkat. Desain umum dapat menggabungkan 2**31 tingkat. Namun, berdasarkan konvensi, Windows menggunakan tiga tingkat:

Bahasa Nama Jenis

Serangkaian tabel direktori sumber daya berkaitan dengan semua tingkat dengan cara berikut: Setiap tabel direktori diikuti oleh serangkaian entri direktori yang memberikan nama atau pengidentifikasi (ID) untuk tingkat tersebut (Jenis, Nama, atau Tingkat bahasa) dan alamat deskripsi data atau tabel direktori lain. Jika alamat menunjuk ke deskripsi data, maka data adalah daun di pohon. Jika alamat menunjuk ke tabel direktori lain, maka tabel tersebut mencantumkan entri direktori di tingkat berikutnya ke bawah.

Jenis, Nama, dan ID Bahasa daun ditentukan oleh jalur yang diambil melalui tabel direktori untuk mencapai daun. Tabel pertama menentukan ID Tipe, tabel kedua (diarahkan oleh entri direktori dalam tabel pertama) menentukan ID Nama, dan tabel ketiga menentukan ID Bahasa.

Struktur umum bagian .rsrc adalah:

Data Deskripsi
Tabel Direktori Sumber Daya (dan Entri Direktori Sumber Daya)
Serangkaian tabel, satu untuk setiap grup simpul di pohon. Semua simpul tingkat atas (Jenis) tercantum dalam tabel pertama. Entri dalam tabel ini menunjuk ke tabel tingkat kedua. Setiap pohon tingkat kedua memiliki ID Jenis yang sama tetapi ID Nama yang berbeda. Pohon tingkat ketiga memiliki ID Jenis dan Nama yang sama tetapi ID Bahasa yang berbeda.
Setiap tabel individu segera diikuti oleh entri direktori, di mana setiap entri memiliki nama atau pengidentifikasi numerik dan penunjuk ke deskripsi data atau tabel di tingkat bawah berikutnya.
String Direktori Sumber Daya
Untai (karakter) Unicode selaras dua byte, yang berfungsi sebagai data string yang diarahkan oleh entri direktori.
Deskripsi Data Sumber Daya
Array rekaman, yang ditujukkan menurut tabel, yang menjelaskan ukuran aktual dan lokasi data sumber daya. Catatan ini adalah daun di pohon deskripsi sumber daya.
Data Sumber Daya
Data mentah dari bagian sumber daya. Informasi ukuran dan lokasi di bidang Deskripsi Data Sumber Daya memisahkan masing-masing wilayah data sumber daya.

 

Tabel Direktori Sumber Daya

Setiap tabel direktori sumber daya memiliki format berikut. Struktur data ini harus dianggap sebagai judul tabel karena tabel sebenarnya terdiri dari entri direktori (dijelaskan dalam bagian 6.9.2, "Entri Direktori Sumber Daya") dan struktur ini:

Offset Ukuran Bidang Deskripsi
0
4
Karakteristik
Bendera sumber daya. Bidang ini dicadangkan untuk digunakan di masa mendatang. Saat ini diatur ke nol.
4
4
Stempel Waktu/Tanggal
Waktu data sumber daya dibuat oleh pengkompilasi sumber daya.
8
2
Versi Utama
Nomor versi utama, diatur oleh pengguna.
10
2
Versi Minor
Nomor versi minor, diatur oleh pengguna.
12
2
Jumlah Entri Nama
Jumlah entri direktori segera mengikuti tabel yang menggunakan string untuk mengidentifikasi entri Tipe, Nama, atau Bahasa (tergantung pada tingkat tabel).
14
2
Jumlah Entri ID
Jumlah entri direktori segera mengikuti entri Nama yang menggunakan ID numerik untuk entri Tipe, Nama, atau Bahasa.

 

Entri Direktori Sumber Daya

Entri direktori membentuk baris tabel. Setiap entri direktori sumber daya memiliki format berikut. Apakah entri adalah entri Nama atau ID ditunjukkan oleh tabel direktori sumber daya, yang menunjukkan berapa banyak entri Nama dan ID yang mengikutinya (ingat bahwa semua entri Nama mendahului semua entri ID untuk tabel). Semua entri untuk tabel diurutkan dalam urutan naik: entri Nama menurut string peka huruf besar/kecil dan entri ID menurut nilai numerik. Offset relatif terhadap alamat di IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Lihat Peering Di Dalam PE: Tur Format File Eksekusi Portabel Win32 untuk informasi selengkapnya.

Offset Ukuran Bidang Deskripsi
0
4
Offset Nama
Offset string yang memberikan entri Jenis, Nama, atau ID Bahasa, tergantung pada tingkat tabel.
0
4
ID bilangan bulat
Bilangan bulat 32-bit yang mengidentifikasi entri Tipe, Nama, atau ID Bahasa.
4
4
Offset Entri Data
Bit tinggi 0. Alamat entri Data Sumber Daya (daun).
4
4
Offset Subdirektori
Bit tinggi 1. 31 bit yang lebih rendah adalah alamat tabel direktori sumber daya lain (tingkat berikutnya ke bawah).

 

String Direktori Sumber Daya

Area string direktori sumber daya terdiri dari string Unicode, yang selaras dengan kata. String ini disimpan bersama-sama setelah entri Resource Directory terakhir dan sebelum entri Data Sumber Daya pertama. Ini meminimalkan dampak string panjang variabel ini pada penyelarasan entri direktori ukuran tetap. Setiap string direktori sumber daya memiliki format berikut:

Offset Ukuran Bidang Deskripsi
0
2
Panjangnya
Ukuran string, tidak termasuk bidang panjang itu sendiri.
2
variabel
Untai (karakter) Unicode
Data string Unicode dengan panjang variabel, diratakan kata.

 

Entri Data Sumber Daya

Setiap entri Data Sumber Daya menjelaskan unit aktual data mentah di area Data Sumber Daya. Entri Data Sumber Daya memiliki format berikut:

Offset Ukuran Bidang Deskripsi
0
4
Data RVA
Alamat unit data sumber daya di area Data Sumber Daya.
4
4
Tingginya
Ukuran, dalam byte, dari data sumber daya yang ditujukkan oleh bidang RVA Data.
8
4
Halaman kode
Halaman kode yang digunakan untuk mendekode nilai titik kode dalam data sumber daya. Biasanya, halaman kode akan menjadi halaman kode Unicode.
12
4
Dicadangkan, harus 0.

 

Bagian .cormeta (Objek Saja)

Metadata CLR disimpan di bagian ini. Ini digunakan untuk menunjukkan bahwa file objek berisi kode terkelola. Format metadata tidak didokumentasikan, tetapi dapat diserahkan ke antarmuka CLR untuk menangani metadata.

Bagian .sxdata

Handler pengecualian objek yang valid tercantum di bagian .sxdata objek tersebut. Bagian ditandai IMAGE_SCN_LNK_INFO. Ini berisi indeks simbol COFF dari setiap handler yang valid, menggunakan 4 byte per indeks.

Selain itu, pengkompilasi menandai objek COFF sebagai SEH terdaftar dengan memancarkan simbol absolut "@feat.00" dengan LSB bidang nilai yang diatur ke 1. Objek COFF tanpa handler SEH terdaftar akan memiliki simbol "@feat.00", tetapi tidak ada bagian .sxdata .

Format File Arsip (Pustaka)

Format arsip COFF menyediakan mekanisme standar untuk menyimpan koleksi file objek. Koleksi ini biasanya disebut pustaka dalam dokumentasi pemrograman.

8 byte pertama arsip terdiri dari tanda tangan file. Sisa arsip terdiri dari serangkaian anggota arsip, sebagai berikut:

  • Anggota pertama dan kedua adalah "anggota linker." Masing-masing anggota ini memiliki formatnya sendiri seperti yang dijelaskan di bagian Impor Jenis Nama. Biasanya, linker menempatkan informasi ke dalam anggota arsip ini. Anggota linker berisi direktori arsip.

  • Anggota ketiga adalah anggota "nama panjang". Anggota opsional ini terdiri dari serangkaian string ASCII null-terminated di mana setiap string adalah nama anggota arsip lain.

  • Sisa arsip terdiri dari anggota standar (file objek). Masing-masing anggota ini berisi konten satu file objek secara keseluruhan.

Header anggota arsip mendahului setiap anggota. Daftar berikut menunjukkan struktur umum arsip:

Tanda tangan :"!<arch>\n"
Header
Anggota Linker ke-1
Header
Anggota Linker Ke-2
Header
Anggota Nama Panjang
Header
Isi File OBJ 1
(Format COFF)
Header
Isi File OBJ 2
(Format COFF)

...

Header
Isi FILE OBJ N
(Format COFF)

Tanda Tangan File Arsip

Tanda tangan file arsip mengidentifikasi jenis file. Utilitas apa pun (misalnya, linker) yang mengambil file arsip sebagai input dapat memeriksa jenis file dengan membaca tanda tangan ini. Tanda tangan terdiri dari karakter ASCII berikut, di mana setiap karakter di bawah ini diwakili secara harfiah, kecuali untuk karakter baris baru (\n):

!<arch>\n

Header Windows SDK winnt.h menentukan makro berikut:

#define IMAGE_ARCHIVE_START_SIZE             8
#define IMAGE_ARCHIVE_START                  "!<arch>\n"
#define IMAGE_ARCHIVE_END                    "`\n"
#define IMAGE_ARCHIVE_PAD                    "\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "
#define IMAGE_ARCHIVE_HYBRIDMAP_MEMBER       "/<HYBRIDMAP>/   "

Header Anggota Arsip

Setiap anggota (linker, nama panjang, atau anggota file objek) didahului oleh header. Header anggota arsip memiliki format berikut, di mana setiap bidang adalah string teks ASCII yang dibiarkan dibenarkan dan diisi dengan spasi ke akhir bidang. Tidak ada penghentian karakter null di salah satu bidang ini.

Setiap header anggota dimulai pada alamat genap pertama setelah akhir anggota arsip sebelumnya, satu byte '\n' (IMAGE_ARCHIVE_PAD) dapat dimasukkan setelah anggota arsip untuk membuat anggota berikut dimulai pada alamat genap.

Offset Ukuran Bidang Deskripsi
0
16
Nama
Nama anggota arsip, dengan garis miring (/) ditambahkan untuk mengakhiri nama. Jika karakter pertama adalah garis miring, namanya memiliki interpretasi khusus, seperti yang dijelaskan dalam tabel berikut.
16
12
Tanggal
Tanggal dan waktu anggota arsip dibuat: Ini adalah representasi desimal ASCII dari jumlah detik sejak 1/1/1970 UCT.
28
6
ID Pengguna
Representasi desimal ASCII dari ID pengguna. Bidang ini tidak berisi nilai yang bermakna pada platform Windows karena alat Microsoft memancarkan semua kosong.
34
6
ID Grup
Representasi desimal ASCII dari ID grup. Bidang ini tidak berisi nilai yang bermakna pada platform Windows karena alat Microsoft memancarkan semua kosong.
40
8
Modus
Representasi oktal ASCII dari mode file anggota. Ini adalah nilai ST_MODE dari fungsi run-time C _wstat.
48
10
Tingginya
Representasi desimal ASCII dari ukuran total anggota arsip, tidak termasuk ukuran header.
58
2
Akhir Header
Dua byte (0x60 0x0A) dalam string C "'\n" (IMAGE_ARCHIVE_END).

Bidang Nama memiliki salah satu format yang diperlihatkan dalam tabel berikut ini. Seperti disebutkan sebelumnya, masing-masing string ini dibiarkan dibenarkan dan diisi dengan spasi berikutnya dalam bidang 16 byte:

Isi bidang Nama Deskripsi
Nama/
Nama anggota arsip.
/
Anggota arsip adalah salah satu dari dua anggota linker. Kedua anggota linker memiliki nama ini.
//
Anggota arsip adalah anggota nama panjang, yang terdiri dari serangkaian string ASCII yang dihentikan null. Anggota nama panjang adalah anggota arsip ketiga dan bersifat opsional.
/n
Nama anggota arsip terletak di offset n dalam anggota nama panjang. Angka n adalah representasi desimal dari offset. Misalnya: "/26" menunjukkan bahwa nama anggota arsip terletak 26 byte di luar awal konten anggota nama panjang.

 

Anggota Penghubung Pertama

Nama anggota linker pertama adalah "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Anggota linker pertama disertakan untuk kompatibilitas mundur. Ini tidak digunakan oleh linker saat ini, tetapi formatnya harus benar. Anggota linker ini menyediakan direktori nama simbol, seperti halnya anggota linker kedua. Untuk setiap simbol, informasi menunjukkan tempat menemukan anggota arsip yang berisi simbol .

Anggota linker pertama memiliki format berikut. Informasi ini muncul setelah header:

Offset Ukuran Bidang Deskripsi
0
4
Jumlah Simbol
Panjang tidak ditandatangani yang berisi jumlah simbol terindeks. Angka ini disimpan dalam format big-endian. Setiap anggota file objek biasanya mendefinisikan satu atau beberapa simbol eksternal.
4
4 * n
Offset
Array file mengimbangi untuk mengarsipkan header anggota, di mana n sama dengan bidang Jumlah Simbol. Setiap angka dalam array adalah panjang yang tidak ditandatangani yang disimpan dalam format big-endian. Untuk setiap simbol yang dinamai dalam tabel string, elemen yang sesuai dalam array offset memberikan lokasi anggota arsip yang berisi simbol .
*
*
Tabel String
Serangkaian string null-terminated yang menamai semua simbol dalam direktori. Setiap string dimulai segera setelah karakter null di string sebelumnya. Jumlah string harus sama dengan nilai bidang Jumlah Simbol.

 

Elemen dalam array offset harus diatur dalam urutan naik. Fakta ini menyiratkan bahwa simbol dalam tabel string harus diatur sesuai dengan urutan anggota arsip. Misalnya, semua simbol dalam anggota file objek pertama harus dicantumkan sebelum simbol dalam file objek kedua.

Anggota Penghubung Kedua

Seperti anggota linker pertama, anggota linker kedua memiliki nama "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Meskipun kedua anggota linker menyediakan direktori simbol dan anggota arsip yang berisi mereka, anggota linker kedua digunakan sebagai preferensi untuk yang pertama oleh semua linker saat ini. Anggota linker kedua menyertakan nama simbol dalam urutan leksikal, yang memungkinkan pencarian lebih cepat berdasarkan nama.

Anggota kedua memiliki format berikut. Informasi ini muncul setelah header:

Offset Ukuran Bidang Deskripsi
0
4
Jumlah Anggota
Panjang yang tidak ditandatangani yang berisi jumlah anggota arsip.
4
4 * m
Offset
Array offset file untuk mengarsipkan header anggota, disusun dalam urutan naik. Setiap offset adalah panjang yang tidak ditandatangani . Angka m sama dengan nilai bidang Jumlah Anggota.
*
4
Jumlah Simbol
Panjang yang tidak ditandatangani yang berisi jumlah simbol yang diindeks. Setiap anggota file objek biasanya mendefinisikan satu atau beberapa simbol eksternal.
*
2 * n
Indeks
Array indeks berbasis 1 (pendek tidak ditandatangani ) yang memetakan nama simbol untuk mengarsipkan offset anggota. Angka n sama dengan bidang Jumlah Simbol. Untuk setiap simbol yang dinamai dalam tabel string, elemen yang sesuai dalam array Indeks memberikan indeks ke dalam array offset. Array offset, pada gilirannya, memberikan lokasi anggota arsip yang berisi simbol .
*
*
Tabel String
Serangkaian string null-terminated yang menamai semua simbol dalam direktori. Setiap string dimulai segera setelah byte null di string sebelumnya. Jumlah string harus sama dengan nilai bidang Jumlah Simbol. Tabel ini mencantumkan semua nama simbol dalam urutan leksikal naik.

 

Anggota Nama Panjang

Nama anggota nama panjang adalah "//" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Anggota nama panjang adalah serangkaian string nama anggota arsip. Nama muncul di sini hanya ketika ada ruang yang tidak mencukupi di bidang Nama (16 byte). Anggota nama panjang bersifat opsional. Ini bisa kosong hanya dengan header, atau bisa benar-benar tidak ada tanpa header.

String dihentikan null. Setiap string dimulai segera setelah byte null di string sebelumnya.

Impor Format Pustaka

Pustaka impor tradisional, yaitu pustaka yang menjelaskan ekspor dari satu gambar untuk digunakan oleh gambar lain, biasanya mengikuti tata letak yang dijelaskan di bagian 7, Format File Arsip (Pustaka). Perbedaan utamanya adalah bahwa anggota pustaka impor berisi file objek pseudo alih-alih file asli, di mana setiap anggota menyertakan kontribusi bagian yang diperlukan untuk membangun tabel impor yang dijelaskan di bagian 6.4, Bagian .idata Linker menghasilkan arsip ini saat membangun aplikasi ekspor.

Kontribusi bagian untuk impor dapat disimpulkan dari sekumpulan informasi kecil. Linker dapat menghasilkan informasi verbose lengkap ke pustaka impor untuk setiap anggota pada saat pembuatan pustaka atau hanya menulis informasi kanonis ke pustaka dan membiarkan aplikasi yang nantinya menggunakannya menghasilkan data yang diperlukan dengan cepat.

Di pustaka impor dengan format panjang, satu anggota berisi informasi berikut:

  • Header anggota arsip
  • Header file
  • Header bagian
  • Data yang sesuai dengan setiap header bagian
  • Tabel simbol COFF
  • String

Sebaliknya, pustaka impor singkat ditulis sebagai berikut:

  • Header anggota arsip
  • Impor header
  • String nama impor null-terminated
  • String nama DLL null-terminated

Ini adalah informasi yang cukup untuk secara akurat membangun kembali seluruh konten anggota pada saat penggunaannya.

Impor Header

Header impor berisi bidang dan offset berikut:

Offset Ukuran Bidang Deskripsi
0
2
Sig1
Harus IMAGE_FILE_MACHINE_UNKNOWN. Untuk informasi selengkapnya, lihat Jenis Mesin.
2
2
Sig2
Pasti 0xFFFF.
4
2
Versi
Versi struktur.
6
2
Mesin
Jumlah yang mengidentifikasi jenis komputer target. Untuk informasi selengkapnya, lihat Jenis Mesin.
8
4
Stempel Tanggal Waktu
Waktu dan tanggal file dibuat.
12
4
Ukuran data
Ukuran string yang mengikuti header.
16
2
Ordinal/Petunjuk
Baik ordinal atau petunjuk untuk impor, ditentukan oleh nilai di bidang Jenis Nama.
18
2 bit
Ketikkan
Jenis impor. Untuk nilai dan deskripsi tertentu, lihat Jenis Impor.
3 bit
Jenis Nama
Jenis nama impor. Untuk informasi selengkapnya, lihat Mengimpor Jenis Nama.
11 bit
Dipesan
Dicadangkan, harus 0.

 

Struktur ini diikuti oleh dua string yang dihentikan null yang menjelaskan nama simbol yang diimpor dan DLL asalnya.

Jenis Impor

Nilai berikut didefinisikan untuk bidang Jenis di header impor:

Terus-menerus Nilai Deskripsi
IMPORT_OBJECT_CODE
0
Kode yang dapat dieksekusi.
IMPORT_OBJECT_DATA
1
Data.
IMPORT_OBJECT_CONST
2
Ditentukan sebagai CONST dalam file .def.

Nilai-nilai ini digunakan untuk menentukan kontribusi bagian mana yang harus dihasilkan oleh alat yang menggunakan pustaka jika harus mengakses data tersebut.

Jenis Nama Impor

Nama simbol impor yang dihentikan null segera mengikuti header impor terkait. Nilai berikut didefinisikan untuk bidang Tipe Nama di header impor. Mereka menunjukkan bagaimana nama akan digunakan untuk menghasilkan simbol yang benar yang mewakili impor:

Terus-menerus Nilai Deskripsi
IMPORT_OBJECT_ORDINAL 0 Impornya bersifat ordinal. Ini menunjukkan bahwa nilai di bidang Ordinal/Petunjuk header impor adalah ordinal impor. Jika konstanta ini tidak ditentukan, maka bidang Ordinal/Petunjuk harus selalu ditafsirkan sebagai petunjuk impor.
IMPORT_OBJECT_NAME 1 Nama impor identik dengan nama simbol publik.
IMPORT_OBJECT_NAME_NOPREFIX 2 Nama impor adalah nama simbol publik, tetapi melewatkan yang di depan ?, @, atau secara opsional _.
IMPORT_OBJECT_NAME_UNDECORATE 3 Nama impor adalah nama simbol publik, tetapi melewati di depan ?, @, atau opsional _, dan memotong pada @pertama.

Lampiran A: Menghitung Hash Gambar PE Authenticode

Beberapa sertifikat atribut diharapkan digunakan untuk memverifikasi integritas gambar. Namun, yang paling umum adalah tanda tangan Authenticode. Tanda tangan Authenticode dapat digunakan untuk memverifikasi bahwa bagian yang relevan dari file gambar PE belum diubah dengan cara apa pun dari formulir asli file. Untuk menyelesaikan tugas ini, tanda tangan Authenticode berisi sesuatu yang disebut hash gambar PE

Apa itu Authenticode PE Image Hash?

Singkatnya hash gambar Authenticode PE, atau hash file, mirip dengan checksum file karena menghasilkan nilai kecil yang berkaitan dengan integritas file. Checksum diproduksi oleh algoritma sederhana dan digunakan terutama untuk mendeteksi kegagalan memori. Artinya, ini digunakan untuk mendeteksi apakah blok memori pada disk telah buruk dan nilai yang disimpan di sana telah rusak. Hash file mirip dengan checksum karena juga mendeteksi kerusakan file. Namun, tidak seperti kebanyakan algoritma checksum, sangat sulit untuk memodifikasi file sehingga memiliki hash file yang sama dengan bentuk aslinya (tidak dimodifikasi). Artinya, checksum dimaksudkan untuk mendeteksi kegagalan memori sederhana yang menyebabkan kerusakan, tetapi hash file dapat digunakan untuk mendeteksi modifikasi yang disengaja dan bahkan halus pada file, seperti yang diperkenalkan oleh virus, peretas, atau program kuda Troya.

Dalam tanda tangan Authenticode, hash file ditandatangani secara digital dengan menggunakan kunci privat yang hanya diketahui oleh penanda tangan file. Konsumen perangkat lunak dapat memverifikasi integritas file dengan menghitung nilai hash file dan membandingkannya dengan nilai hash yang ditandatangani yang terkandung dalam tanda tangan digital Authenticode. Jika hash file tidak cocok, bagian dari file yang dicakup oleh hash gambar PE telah dimodifikasi.

Apa yang Tercakup dalam Hash Gambar Authenticode PE?

Tidak dimungkinkan atau diinginkan untuk menyertakan semua data file gambar dalam perhitungan hash gambar PE. Terkadang hanya menyajikan karakteristik yang tidak diinginkan (misalnya, informasi penelusuran kesalahan tidak dapat dihapus dari file yang dirilis secara publik); kadang-kadang itu tidak mungkin. Misalnya, tidak dimungkinkan untuk menyertakan semua informasi dalam file gambar dalam tanda tangan Authenticode, lalu menyisipkan tanda tangan Authenticode yang berisi hash gambar PE tersebut ke dalam gambar PE, dan nantinya dapat menghasilkan hash gambar PE yang identik dengan menyertakan semua data file gambar dalam perhitungan lagi, karena file sekarang berisi tanda tangan Authenticode yang awalnya tidak ada.

Proses untuk Menghasilkan Hash Gambar Authenticode PE

Bagian ini menjelaskan bagaimana hash gambar PE dihitung dan bagian mana dari gambar PE yang dapat dimodifikasi tanpa membatalkan tanda tangan Authenticode.

Catatan

Hash gambar PE untuk file tertentu dapat disertakan dalam file katalog terpisah tanpa menyertakan sertifikat atribut dalam file yang di-hash. Ini relevan, karena menjadi mungkin untuk membatalkan hash gambar PE dalam file katalog yang ditandatangani Authenticode dengan memodifikasi gambar PE yang sebenarnya tidak berisi tanda tangan Authenticode.

Semua data di bagian gambar PE yang ditentukan dalam tabel bagian di-hash secara keseluruhan kecuali untuk rentang pengecualian berikut:

  • Bidang CheckSum file dari bidang khusus Windows dari header opsional. Checksum ini mencakup seluruh file (termasuk sertifikat atribut apa pun dalam file). Dalam semua kemungkinan, checksum akan berbeda dari nilai asli setelah menyisipkan tanda tangan Authenticode.

  • Informasi yang terkait dengan sertifikat atribut. Area gambar PE yang terkait dengan tanda tangan Authenticode tidak disertakan dalam perhitungan hash gambar PE karena tanda tangan Authenticode dapat ditambahkan atau dihapus dari gambar tanpa memengaruhi integritas gambar secara keseluruhan. Ini bukan masalah, karena ada skenario pengguna yang bergantung pada penandatanganan ulang gambar PE atau menambahkan stempel waktu. Authenticode mengecualikan informasi berikut dari perhitungan hash:

    • Bidang Tabel Sertifikat dari direktori data header opsional.

    • Tabel Sertifikat dan sertifikat terkait yang ditujukkan oleh bidang Tabel Sertifikat yang tercantum tepat di atas.

    Untuk menghitung hash gambar PE, Authenticode mengurutkan bagian yang ditentukan dalam tabel bagian menurut rentang alamat, lalu hash urutan byte yang dihasilkan, melewati rentang pengecualian.

  • Informasi sebelumnya dari akhir bagian terakhir. Area yang melewati bagian terakhir (didefinisikan oleh offset tertinggi) tidak di-hash. Area ini biasanya berisi informasi debug. Informasi debug umumnya dapat dianggap sebagai nasihat kepada debugger; ini tidak mempengaruhi integritas aktual dari program yang dapat dieksekusi. Sangat mungkin untuk menghapus informasi debug dari gambar setelah produk dikirimkan dan tidak memengaruhi fungsionalitas program. Bahkan, ini kadang-kadang dilakukan sebagai ukuran penghematan disk. Perlu dicatat bahwa informasi debug yang terkandung dalam bagian yang ditentukan dari Gambar PE tidak dapat dihapus tanpa membatalkan tanda tangan Authenticode.

Anda dapat menggunakan alat makecert dan signtool yang disediakan di SDK Platform Windows untuk bereksperimen dengan membuat dan memverifikasi tanda tangan Authenticode. Untuk informasi selengkapnya, lihat Referensi, di bawah ini.

Referensi

Unduhan dan alat untuk Windows (termasuk Windows SDK)

Membuat, Menampilkan, dan Mengelola Sertifikat

Panduan Penandatanganan Kode Mode Kernel (.doc)

SignTool

Format Tanda Tangan Eksekusi Portabel Windows Authenticode (.docx)

Fungsi ImageHlp