Aracılığıyla paylaş


PE Biçimi

Bu belirtim, Windows işletim sistemi ailesi altında yürütülebilir (görüntü) dosyalarının ve nesne dosyalarının yapısını açıklar. Bu dosyalar sırasıyla Taşınabilir Yürütülebilir Dosya (PE) ve Ortak Nesne Dosyası Biçimi (COFF) dosyaları olarak adlandırılır.

Not

Bu belge, Windows için araçların ve uygulamaların geliştirilmesine yardımcı olmak için sağlanır, ancak her bakımdan eksiksiz bir belirtim olacağı garanti değildir. Microsoft, bildirimde bulunmadan bu belgeyi değiştirme hakkını saklıdır.

Microsoft Taşınabilir Yürütülebilir Dosya ve Ortak Nesne Dosyası Biçimi Belirtimi'nin bu düzeltmesi, bu belirtimin önceki tüm düzeltmelerinin yerini alır.

Genel Kavramlar

Bu belge, Microsoft Windows işletim sistemleri ailesi altında yürütülebilir (görüntü) dosyalarının ve nesne dosyalarının yapısını belirtir. Bu dosyalar sırasıyla Taşınabilir Yürütülebilir Dosya (PE) ve Ortak Nesne Dosyası Biçimi (COFF) dosyaları olarak adlandırılır. "Taşınabilir Yürütülebilir Dosya" adı, biçimin mimariye özgü olmamasını ifade eder.

Bu belirtim boyunca görünen bazı kavramlar aşağıdaki tabloda açıklanmıştır:

Ad Açıklama
öznitelik sertifikası
Doğrulanabilir deyimleri bir görüntüyle ilişkilendirmek için kullanılan sertifika. Bir dosyayla bir dizi farklı doğrulanabilir deyim ilişkilendirilebilir; En yararlı olanlardan biri, bir yazılım üreticisi tarafından görüntünün ileti özetinin ne olması beklendiğini gösteren bir deyimdir. İleti özeti sağlama toplamına benzer, ancak bunun için çok zor olabilir. Bu nedenle, bir dosyayı özgün dosyayla aynı ileti özetine sahip olacak şekilde değiştirmek çok zordur. Deyimin, ortak veya özel anahtar şifreleme şemaları kullanılarak üretici tarafından yapıldığı doğrulanabilir. Bu belgede, görüntü dosyalarına eklemelerine izin vermek dışında öznitelik sertifikaları hakkındaki ayrıntılar açıklanmaktadır.
tarih/saat damgası
PE veya COFF dosyasında çeşitli yerlerde farklı amaçlar için kullanılan damga pulu. Çoğu durumda, her damganın biçimi C çalışma zamanı kitaplığındaki zaman işlevleri tarafından kullanılanla aynıdır. Özel durumlar için Hata Ayıklama Türüiçindeki IMAGE_DEBUG_TYPE_REPRO tanımlayıcısını inceleyin. Damga pulu değeri 0 veya 0xFFFFFFFF ise, gerçek veya anlamlı bir tarih/saat damgasını temsil etmez.
dosya işaretçisi
Bağlayıcı (nesne dosyaları söz konusu olduğunda) veya yükleyici (görüntü dosyaları söz konusu olduğunda) tarafından işlenmeden önce dosyanın içindeki bir öğenin konumu. Başka bir deyişle, bu dosya içinde diskte depolandığı gibi bir konumdur.
Bağlayıcı
Microsoft Visual Studio ile sağlanan bağlayıcıya başvuru.
nesne dosyası
Bağlayıcıya giriş olarak verilen bir dosya. Bağlayıcı bir görüntü dosyası oluşturur ve bu dosya da yükleyici tarafından giriş olarak kullanılır. "Nesne dosyası" terimi, nesne odaklı programlamaya herhangi bir bağlantı anlamına gelmez.
ayrılmış, 0 olmalıdır
Oluşturucular için alanın değerinin sıfır olması gerektiğini ve tüketicilerin alanı yoksayması gerektiğini gösteren bir alan açıklaması.
Göreli sanal adres (RVA)
Görüntü dosyasında, bir öğenin belleğe yüklendikten sonraki adresidir ve görüntü dosyasının temel adresi ondan çıkarılır. Bir öğenin RVA'sı neredeyse her zaman disk üzerindeki dosya (dosya işaretçisi) içindeki konumundan farklıdır.
Bir nesne dosyasında, bellek konumları atanmadığından RVA daha az anlamlıdır. Bu durumda RVA, daha sonra bağlama sırasında yeniden konumlandırmanın uygulandığı bir bölümdeki (bu tablonun ilerleyen bölümlerinde açıklanmıştır) bir adres olacaktır. Kolaylık olması için, derleyicinin her bölümdeki ilk RVA'yı sıfır olarak ayarlaması gerekir.
bölüm
PE veya COFF dosyası içindeki temel kod veya veri birimi. Örneğin, bir nesne dosyasındaki tüm kodlar tek bir bölümde birleştirilebilir veya (derleyici davranışına bağlı olarak) her işlev kendi bölümünü kaplayabilir. Daha fazla bölümde daha fazla dosya yükü vardır, ancak bağlayıcı koda daha seçmeli olarak bağlanabilir. Bölüm, Intel 8086 mimarisindeki bir segmente benzer. Bir bölümdeki tüm ham veriler bitişik olarak yüklenmelidir. Ayrıca, bir görüntü dosyası özel amaçları olan .tls veya .reloc gibi bir dizi bölüm içerebilir.
Sanal Adres (VA)
RVA ile aynıdır, ancak görüntü dosyasının temel adresi çıkarılmaz. Windows, fiziksel bellekten bağımsız olarak her işlem için ayrı bir VA alanı oluşturduğundan, adres VA olarak adlandırılır. Va, neredeyse tüm amaçlar için yalnızca bir adres olarak kabul edilmelidir. Yükleyici görüntüyü tercih ettiği konuma yükleyemeyebileceği için VA, RVA kadar tahmin edilebilir değildir.

Genel bakış

Aşağıdaki listede, görüntü üst bilgisinin tabanı en üstte olacak şekilde Microsoft PE yürütülebilir biçimi açıklanmaktadır. MS-DOS 2.0 Uyumlu EXE Üst Bilgisi'nden PE üst bilgisinin hemen önceki kullanılmayan bölümüne kadar olan bölüm MS-DOS 2.0 Bölümüdür ve yalnızca MS-DOS uyumluluk için kullanılır.

  • MS-DOS 2.0 Uyumlu EXE Üst Bilgisi

  • Kullanılma -yan

  • OEM Tanımlayıcısı

    OEM Bilgileri

    PE Üst Bilgisine Uzaklık

  • MS-DOS 2.0 Saplama Programı ve Yeniden Konumlandırma Tablosu

  • Kullanılma -yan

  • PE Üst Bilgisi (8 baytlık sınıra hizalanmış)

  • Bölüm Üst Bilgileri

  • Resim Sayfaları:

    bilgileri içeri aktarma

    bilgileri dışarı aktarma

    temel yeniden konumlandırmalar

    kaynak bilgileri

Aşağıdaki listede Microsoft COFF nesne modülü biçimi açıklanmaktadır:

  • Microsoft COFF Üst Bilgisi

  • Bölüm Üst Bilgileri

  • Ham Veriler:

    kod

    veri

    hata ayıklama bilgileri

    yeniden konumlandırmalar

Dosya Üst Bilgileri

PE dosya üst bilgisi bir Microsoft MS-DOS saplama, PE imzası, COFF dosya üst bilgisi ve isteğe bağlı üst bilgiden oluşur. COFF nesne dosyası üst bilgisi, COFF dosya üst bilgilerinden ve isteğe bağlı üst bilgiden oluşur. Her iki durumda da, dosya üst bilgileri hemen bölüm üst bilgileriyle takip edilir.

MS-DOS Saptaması (Yalnızca Görüntü)

MS-DOS saplama, MS-DOS altında çalışan geçerli bir uygulamadır. EXE görüntüsünün önüne yerleştirilir. Bağlayıcı buraya, görüntü MS-DOS'da çalıştırıldığında "Bu program DOS modunda çalıştırılamaz" iletisini yazdıran bir varsayılan saplama yerleştirir. Kullanıcı ,/STUB bağlayıcısı seçeneğini kullanarak farklı bir saplama belirtebilir.

Saplama, 0x3c konumda PE imzasına dosya uzaklığını gösterir. Bu bilgiler, MS-DOS saplaması olsa bile Windows'un görüntü dosyasını düzgün bir şekilde yürütmesini sağlar. Bu dosya uzaklığı, bağlama sırasında 0x3c konuma yerleştirilir.

İmza (Yalnızca Resim)

MS-DOS saplamadan sonra, 0x3c uzaklıkta belirtilen dosya uzaklığında, dosyayı PE biçimli görüntü dosyası olarak tanımlayan 4 baytlık bir imzadır. Bu imza "PE\0\0" ("P" ve "E" harfleri ve ardından iki null bayt) şeklindedir.

COFF Dosya Üst Bilgisi (Nesne ve Görüntü)

Nesne dosyasının başında veya görüntü dosyasının imzasının hemen ardından, aşağıdaki biçimde standart bir COFF dosya üst bilgisidir. Windows yükleyicisinin bölüm sayısını 96 ile sınırladığını unutmayın.

Ofset Boyut Alan Açıklama
0
2
Makine
Hedef makinenin türünü tanımlayan sayı. Daha fazla bilgi için bkz. Makine Türleri.
2
2
NumberOfSections
Bölüm sayısı. Bu, üst bilgileri hemen izleyen bölüm tablosunun boyutunu gösterir.
4
4
TimeDateStamp
1 Ocak 1970(C çalışma zamanı time_t değeri) ile 00:00'dan bu yana saniye sayısının en düşük 32 biti, dosyanın ne zaman oluşturulduğunu gösterir.
8
4
PointerToSymbolTable
COFF sembol tablosunun dosya uzaklığı veya COFF simgesi tablosu yoksa sıfır. COFF hata ayıklama bilgileri kullanım dışı bırakıldığından bu değer bir görüntü için sıfır olmalıdır.
12
4
NumberOfSymbols
Sembol tablosundaki girdilerin sayısı. Bu veriler, sembol tablosunun hemen ardından gelen dize tablosunu bulmak için kullanılabilir. COFF hata ayıklama bilgileri kullanım dışı bırakıldığından bu değer bir görüntü için sıfır olmalıdır.
16
2
SizeOfOptionalHeader
Yürütülebilir dosyalar için gerekli olan ancak nesne dosyaları için gerekli olmayan isteğe bağlı üst bilginin boyutu. Bu değer bir nesne dosyası için sıfır olmalıdır. Üst bilgi biçiminin açıklaması için bkz. İsteğe Bağlı Üst Bilgi (Yalnızca Resim).
18
2
Özellik -lerini
Dosyanın özniteliklerini gösteren bayraklar. Belirli bayrak değerleri için bkz. Özellikler.

Makine Türleri

Makine alanı, CPU türünü belirten aşağıdaki değerlerden birine sahiptir. Görüntü dosyası yalnızca belirtilen makinede veya belirtilen makineye öykünen bir sistemde çalıştırılabilir.

Sabit Değer Açıklama
IMAGE_FILE_MACHINE_UNKNOWN
0x0
Bu alanın içeriğinin herhangi bir makine türü için geçerli olduğu varsayılır
IMAGE_FILE_MACHINE_ALPHA
0x184
Alfa AXP, 32 bit adres alanı
IMAGE_FILE_MACHINE_ALPHA64
0x284
Alfa 64, 64 bit adres alanı
IMAGE_FILE_MACHINE_AM33
0x1d3
Matsushita AM33
IMAGE_FILE_MACHINE_AMD64
0x8664
x64
IMAGE_FILE_MACHINE_ARM
0x1c0
ARM küçük endian
IMAGE_FILE_MACHINE_ARM64
0xaa64
ARM64 küçük endian
IMAGE_FILE_MACHINE_ARMNT
0x1c4
ARM Thumb-2 küçük endian
IMAGE_FILE_MACHINE_AXP64
0x284
AXP 64 (Alfa 64 ile aynıdır)
IMAGE_FILE_MACHINE_EBC
0xebc
EFI bayt kodu
IMAGE_FILE_MACHINE_I386
0x14c
Intel 386 veya üzeri işlemciler ve uyumlu işlemciler
IMAGE_FILE_MACHINE_IA64
0x200
Intel Itanium işlemci ailesi
IMAGE_FILE_MACHINE_LOONGARCH32
0x6232
LoongArch 32 bit işlemci ailesi
IMAGE_FILE_MACHINE_LOONGARCH64
0x6264
LoongArch 64 bit işlemci ailesi
IMAGE_FILE_MACHINE_M32R
0x9041
Mitsubishi M32R küçük endian
IMAGE_FILE_MACHINE_MIPS16
0x266
MIPS16
IMAGE_FILE_MACHINE_MIPSFPU
0x366
FPU ile MIPS
IMAGE_FILE_MACHINE_MIPSFPU16
0x466
FPU ile MIPS16
IMAGE_FILE_MACHINE_POWERPC
0x1f0
Power PC küçük endian
IMAGE_FILE_MACHINE_POWERPCFP
0x1f1
Kayan nokta desteğine sahip Power PC
IMAGE_FILE_MACHINE_R4000
0x166
MIPS küçük endian
IMAGE_FILE_MACHINE_RISCV32
0x5032
32 bit adres alanını RISC-V
IMAGE_FILE_MACHINE_RISCV64
0x5064
RISC-V 64 bit adres alanı
IMAGE_FILE_MACHINE_RISCV128
0x5128
RISC-V 128 bit adres alanı
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
Başparmak
IMAGE_FILE_MACHINE_WCEMIPSV2
0x169
MIPS küçük endian WCE v2

Özellik -lerini

Özellikler alanı, nesnenin veya görüntü dosyasının özniteliklerini gösteren bayraklar içerir. Şu anda aşağıdaki bayraklar tanımlanmıştır:

Bayrak Değer Açıklama
IMAGE_FILE_RELOCS_STRIPPED
0x0001
Yalnızca görüntü, Windows CE ve Microsoft Windows NT ve üzeri. Bu, dosyanın temel konumlar içermediğini ve bu nedenle tercih edilen temel adrese yüklenmesi gerektiğini gösterir. Temel adres kullanılamıyorsa, yükleyici bir hata bildirir. Bağlayıcının varsayılan davranışı, temel konumları yürütülebilir (EXE) dosyalardan kaldırmaktır.
IMAGE_FILE_EXECUTABLE_IMAGE
0x0002
Yalnızca resim. Bu, görüntü dosyasının geçerli olduğunu ve çalıştırılabilir olduğunu gösterir. Bu bayrak ayarlanmadıysa bağlayıcı hatası gösterir.
IMAGE_FILE_LINE_NUMS_STRIPPED
0x0004
COFF satır numaraları kaldırıldı. Bu bayrak kullanım dışıdır ve sıfır olmalıdır.
IMAGE_FILE_LOCAL_SYMS_STRIPPED
0x0008
Yerel simgeler için COFF simgesi tablo girdileri kaldırıldı. Bu bayrak kullanım dışıdır ve sıfır olmalıdır.
IMAGE_FILE_AGGRESSIVE_WS_TRIM
0x0010
Eskimiş. Çalışma kümesini agresif bir şekilde kırp. Bu bayrak Windows 2000 ve üzeri için kullanım dışıdır ve sıfır olmalıdır.
IMAGE_FILE_LARGE_ADDRESS_ AWARE
0x0020
Uygulama > 2 GB adresleri işleyebilir.
0x0040
Bu bayrak gelecekte kullanılmak üzere ayrılmıştır.
IMAGE_FILE_BYTES_REVERSED_LO
0x0080
Küçük endian: bellekteki en önemli bitin (MSB) başında en az önemli bit (LSB) bulunur. Bu bayrak kullanım dışıdır ve sıfır olmalıdır.
IMAGE_FILE_32BIT_MACHINE
0x0100
Makine, 32 bit sözcük mimarisini temel alır.
IMAGE_FILE_DEBUG_STRIPPED
0x0200
Hata ayıklama bilgileri görüntü dosyasından kaldırılır.
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP
0x0400
Görüntü çıkarılabilir medyadaysa, tam olarak yükleyin ve değiştirme dosyasına kopyalayın.
IMAGE_FILE_NET_RUN_FROM_SWAP
0x0800
Görüntü ağ medyası üzerindeyse, görüntüyü tam olarak yükleyin ve takas dosyasına kopyalayın.
IMAGE_FILE_SYSTEM
0x1000
Görüntü dosyası bir sistem dosyasıdır, kullanıcı programı değildir.
IMAGE_FILE_DLL
0x2000
Görüntü dosyası bir dinamik bağlantı kitaplığıdır (DLL). Bu tür dosyalar hemen hemen tüm amaçlarla yürütülebilir dosyalar olarak kabul edilir, ancak bunlar doğrudan çalıştırılamaz.
IMAGE_FILE_UP_SYSTEM_ONLY
0x4000
Dosya yalnızca tek işlemcili bir makinede çalıştırılmalıdır.
IMAGE_FILE_BYTES_REVERSED_HI
0x8000
Büyük endian: MSB bellekteki LSB'den öncedir. Bu bayrak kullanım dışıdır ve sıfır olmalıdır.

İsteğe Bağlı Üst Bilgi (Yalnızca Resim)

Her görüntü dosyasının yükleyiciye bilgi sağlayan isteğe bağlı bir üst bilgisi vardır. Bu üst bilgi, bazı dosyalara (özellikle nesne dosyalarına) sahip olmadığı için isteğe bağlıdır. Görüntü dosyaları için bu üst bilgi gereklidir. Nesne dosyasının isteğe bağlı üst bilgisi olabilir, ancak genellikle bu üst bilginin boyutunu artırmak dışında bir nesne dosyasında işlevi yoktur.

İsteğe bağlı üst bilginin boyutunun sabit olmadığını unutmayın. COFF üst bilgisindeki SizeOfOptionalHeader alanı, belirli bir veri dizinine yönelik dosyada yapılan araştırmanın SizeOfOptionalHeaderötesine geçmediğini doğrulamak için kullanılmalıdır. Daha fazla bilgi için bkz. COFF Dosya Üst Bilgisi (Nesne ve Görüntü).

İsteğe bağlı üst bilginin NumberOfRvaAndSizes alanı da, belirli bir veri dizini girdisi için yoklamanın isteğe bağlı üst bilgiden öteye geçmediğinden emin olmak için kullanılmalıdır. Ayrıca, biçim uyumluluğu için isteğe bağlı üst bilgi sihirli numarasının doğrulanması önemlidir.

İsteğe bağlı üst bilgi sihirli numarası, görüntünün PE32 veya PE32+ yürütülebilir dosyası olup olmadığını belirler.

Sihirli sayı PE biçimi
0x10b
PE32
0x20b
PE32+

PE32+ görüntüler, görüntü boyutunu 2 gigabaytla sınırlandırırken 64 bit adres alanı sağlar. Diğer PE32+ değişiklikleri ilgili bölümlerinde ele alınıyor.

İsteğe bağlı üst bilginin kendisi üç ana bölüme sahiptir.

Uzaklık (PE32/PE32+) Boyut (PE32/PE32+) Üst bilgi bölümü Açıklama
0
28/24
Standart alanlar
UNIX de dahil olmak üzere tüm COFF uygulamaları için tanımlanan alanlar.
28/24
68/88
Windows'a özgü alanlar
Windows'un belirli özelliklerini (örneğin, alt sistemler) desteklemek için ek alanlar.
96/112
Değişken
Veri dizinleri
Görüntü dosyasında bulunan ve işletim sistemi (örneğin, içeri aktarma tablosu ve dışarı aktarma tablosu) tarafından kullanılan özel tablolar için adres/boyut çiftleri.

İsteğe Bağlı Üst Bilgi Standart Alanları (Yalnızca Resim)

İsteğe bağlı üst bilginin ilk sekiz alanı, her COFF uygulaması için tanımlanan standart alanlardır. Bu alanlar, yürütülebilir dosyayı yüklemek ve çalıştırmak için yararlı olan genel bilgiler içerir. PE32+ biçimi için bunlar değişmez.

Ofset Boyut Alan Açıklama
0
2
Sihir
Görüntü dosyasının durumunu tanımlayan işaretsiz tamsayı. En yaygın sayı, normal yürütülebilir dosya olarak tanımlayan 0x10B' dir. 0x107 bunu bir ROM görüntüsü olarak tanımlar ve 0x20B pe32+ yürütülebilir dosyası olarak tanımlar.
2
1
MajorLinkerVersion
Bağlayıcı ana sürüm numarası.
3
1
MinorLinkerVersion
Bağlayıcı ikincil sürüm numarası.
4
4
SizeOfCode
Kod (metin) bölümünün boyutu veya birden çok bölüm varsa tüm kod bölümlerinin toplamı.
8
4
SizeOfInitializedData
Başlatılan veri bölümünün boyutu veya birden çok veri bölümü varsa bu tür tüm bölümlerin toplamı.
12
4
SizeOfUninitializedData
Başlatılmamış veri bölümünün (BSS) boyutu veya birden çok BSS bölümü varsa tüm bu bölümlerin toplamı.
16
4
AddressOfEntryPoint
Yürütülebilir dosya belleğe yüklendiğinde görüntü tabanına göre giriş noktasının adresi. Program görüntüleri için bu başlangıç adresidir. Cihaz sürücüleri için bu, başlatma işlevinin adresidir. Dll'ler için giriş noktası isteğe bağlıdır. Hiçbir giriş noktası olmadığında, bu alan sıfır olmalıdır.
20
4
BaseOfCode
Belleğe yüklendiğinde kod başlangıcı bölümünün görüntü tabanına göre olan adres.

PE32, BaseOfCode'un ardından PE32+ içinde bulunmayan bu ek alanı içerir.

Ofset Boyut Alan Açıklama
24
4
BaseOfData
Belleğe yüklendiğinde veri başlangıcı bölümünün görüntü tabanına göre olan adres.

İsteğe Bağlı Üst Bilgi Windows-Specific Alanları (Yalnızca Resim)

Sonraki 21 alan, COFF isteğe bağlı üst bilgi biçiminin bir uzantısıdır. Bunlar, Windows'da bağlayıcı ve yükleyici tarafından gerekli olan ek bilgileri içerir.

Uzaklık (PE32/ PE32+) Boyut (PE32/ PE32+) Alan Açıklama
28/24
4/8
ImageBase
Belleğe yüklendiğinde görüntünün ilk baytının tercih edilen adresi; 64 K'nin katı olmalıdır. DLL'ler için varsayılan değer 0x10000000. Windows CE EXEs için varsayılan değer 0x00010000. Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 ve Windows Me için varsayılan değer 0x00400000.
32/32
4
SectionAlignment
Belleğe yüklendiklerinde bölümlerin hizalaması (bayt cinsinden). FileAlignment değerinden büyük veya buna eşit olmalıdır. Varsayılan değer, mimarinin sayfa boyutudur.
36/36
4
FileAlignment
Görüntü dosyasındaki bölümlerin ham verilerini hizalamak için kullanılan hizalama faktörü (bayt cinsinden). Değer, 512 ile 64 K arasında (dahil) 2'lik bir güç olmalıdır. Varsayılan değer 512'dir. SectionAlignment, mimarinin sayfa boyutundan küçükse FileAlignment, SectionAlignment ile eşleşmelidir.
40/40
2
MajorOperatingSystemVersion
Gerekli işletim sisteminin ana sürüm numarası.
42/42
2
MinorOperatingSystemVersion
Gerekli işletim sisteminin ikincil sürüm numarası.
44/44
2
MajorImageVersion
Görüntünün ana sürüm numarası.
46/46
2
MinorImageVersion
Görüntünün ikincil sürüm numarası.
48/48
2
MajorSubsystemVersion
Alt sistemin ana sürüm numarası.
50/50
2
MinorSubsystemVersion
Alt sistemin ikincil sürüm numarası.
52/52
4
Win32VersionValue
Ayrılmış, sıfır olmalıdır.
56/56
4
SizeOfImage
Görüntü belleğe yüklendiğinden, tüm üst bilgiler de dahil olmak üzere görüntünün boyutu (bayt cinsinden). SectionAlignment'ın bir katı olmalıdır.
60/60
4
SizeOfHeaders
MS-DOS saplama, PE üst bilgisi ve bölüm üst bilgilerinin birleştirilmiş boyutu FileAlignment'ın bir katına yuvarlandı.
64/64
4
Sağlama toplamı
Görüntü dosyası sağlama toplamı. Sağlama toplamını hesaplama algoritması IMAGHELP.DLL içine eklenir. Yükleme zamanında doğrulama için aşağıdakiler denetlendi: tüm sürücüler, önyükleme zamanında yüklenen tüm DLL'ler ve kritik bir Windows işlemine yüklenen tüm DLL'ler.
68/68
2
Alt
Bu görüntüyü çalıştırmak için gereken alt sistem. Daha fazla bilgi için bkz. Windows Alt Sistemi.
70/70
2
DllCharacteristics
Daha fazla bilgi için bu belirtimin devamında DLL Özellikleri bölümüne bakın.
72/72
4/8
SizeOfStackReserve
Ayıracak yığının boyutu. Yalnızca SizeOfStackCommit işlenir; gerisi, yedek boyutuna ulaşılana kadar her seferinde bir sayfa kullanılabilir hale getirilir.
76/80
4/8
SizeOfStackCommit
İşlenmek üzere yığının boyutu.
80/88
4/8
SizeOfHeapReserve
Rezerve etmek için yerel yığın alanının boyutu. Yalnızca SizeOfHeapCommit işlenir; gerisi, yedek boyutuna ulaşılana kadar her seferinde bir sayfa kullanılabilir hale getirilir.
84/96
4/8
SizeOfHeapCommit
İşlemek için yerel yığın alanının boyutu.
88/104
4
LoaderFlags
Ayrılmış, sıfır olmalıdır.
92/108
4
NumberOfRvaAndSizes
İsteğe bağlı üst bilginin geri kalanındaki veri dizini girdilerinin sayısı. Her birinde bir konum ve boyut açıklanmaktadır.
Windows Alt Sistemi

İsteğe bağlı üst bilginin Alt Sistem alanı için tanımlanan aşağıdaki değerler, görüntüyü çalıştırmak için hangi Windows alt sisteminin (varsa) gerekli olduğunu belirler.

Sabit Değer Açıklama
IMAGE_SUBSYSTEM_UNKNOWN
0
Bilinmeyen bir alt sistem
IMAGE_SUBSYSTEM_NATIVE
1
Cihaz sürücüleri ve yerel Windows işlemleri
IMAGE_SUBSYSTEM_WINDOWS_GUI
2
Windows grafik kullanıcı arabirimi (GUI) alt sistemi
IMAGE_SUBSYSTEM_WINDOWS_CUI
3
Windows karakter alt sistemi
IMAGE_SUBSYSTEM_OS2_CUI
5
İşletim sistemi/2 karakter alt sistemi
IMAGE_SUBSYSTEM_POSIX_CUI
7
Posix karakter alt sistemi
IMAGE_SUBSYSTEM_NATIVE_WINDOWS
8
Yerel Win9x sürücüsü
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
9
Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION
10
Genişletilebilir Üretici Yazılımı Arabirimi (EFI) uygulaması
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER
11
Önyükleme hizmetleri olan bir EFI sürücüsü
sürücü IMAGE_SUBSYSTEM_EFI_RUNTIME_
12
Çalışma zamanı hizmetleri olan bir EFI sürücüsü
IMAGE_SUBSYSTEM_EFI_ROM
13
EFI ROM görüntüsü
IMAGE_SUBSYSTEM_XBOX
14
XBOX
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
16
Windows önyükleme uygulaması.
DLL Özellikleri

İsteğe bağlı üst bilginin DllCharacteristics alanı için aşağıdaki değerler tanımlanır.

Sabit Değer Açıklama
0x0001
Ayrılmış, sıfır olmalıdır.
0x0002
Ayrılmış, sıfır olmalıdır.
0x0004
Ayrılmış, sıfır olmalıdır.
0x0008
Ayrılmış, sıfır olmalıdır.
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
0x0020
Görüntü, yüksek entropi 64 bit sanal adres alanını işleyebilir.
IMAGE_DLLCHARACTERISTICS_
DYNAMIC_BASE
0x0040
DLL, yükleme zamanında yeniden konumlandırılabilir.
IMAGE_DLLCHARACTERISTICS_
FORCE_INTEGRITY
0x0080
Kod Bütünlüğü denetimleri zorlanır.
IMAGE_DLLCHARACTERISTICS_
NX_COMPAT
0x0100
Görüntü NX uyumlu.
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION
0x0200
Yalıtım farkındadır, ancak görüntüyü yalıtmayın.
IMAGE_DLLCHARACTERISTICS_ NO_SEH
0x0400
Yapılandırılmış özel durum (SE) işleme kullanmaz. Bu görüntüde hiçbir SE işleyicisi çağrılmayabilir.
IMAGE_DLLCHARACTERISTICS_ NO_BIND
0x0800
Görüntüyü bağlamayın.
IMAGE_DLLCHARACTERISTICS_APPCONTAINER
0x1000
Görüntünün AppContainer'da yürütülmesi gerekir.
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER
0x2000
WDM sürücüsü.
IMAGE_DLLCHARACTERISTICS_GUARD_CF
0x4000
Görüntü Control Flow Guard'ı destekler.
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE
0x8000
Terminal Sunucusu'nu algılar.

İsteğe Bağlı Üst Bilgi Veri Dizinleri (Yalnızca Görüntü)

Her veri dizini, Windows'un kullandığı bir tablonun veya dizenin adresini ve boyutunu verir. Bu veri dizini girdilerinin tümü, sistemin çalışma zamanında kullanabilmesi için belleğe yüklenir. Veri dizini, aşağıdaki bildirimi içeren 8 baytlık bir alandır:

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

İlk alan olan VirtualAddress, tablonun RVA'sıdır. RVA, tablo yüklendiğinde görüntünün temel adresine göre tablonun adresidir. İkinci alan, boyutu bayt cinsinden verir. İsteğe bağlı üst bilginin son bölümünü oluşturan veri dizinleri aşağıdaki tabloda listelenmiştir.

Dizin sayısının sabit olmadığını unutmayın. Belirli bir dizini aramadan önce, isteğe bağlı üst bilgideki NumberOfRvaAndSizes alanını denetleyin.

Ayrıca, bu tablodaki RVA'ların bir bölümün başına işaret ettiğini veya belirli tablolar içeren bölümlerin belirli adlara sahip olduğunu varsaymayın.

Uzaklık (PE/PE32+) Boyut Alan Açıklama
96/112
8
Tabloyu Dışarı Aktar
Dışarı aktarma tablosu adresi ve boyutu. Daha fazla bilgi için bkz. .edata Bölümü (Yalnızca Resim).
104/120
8
Tabloyu İçeri Aktar
İçeri aktarma tablosu adresi ve boyutu. Daha fazla bilgi için bkz. .idata Bölümü .
112/128
8
Kaynak Tablosu
Kaynak tablosu adresi ve boyutu. Daha fazla bilgi için bkz. .rsrc Bölümü .
120/136
8
Özel Durum Tablosu
Özel durum tablosu adresi ve boyutu. Daha fazla bilgi için bkz. .pdata Bölümü .
128/144
8
Sertifika Tablosu
Öznitelik sertifika tablosu adresi ve boyutu. Daha fazla bilgi için bkz. Öznitelik Sertifikası Tablosu (Yalnızca Görüntü).
136/152
8
Temel Yeniden Konumlandırma Tablosu
Temel yeniden konumlandırma tablosu adresi ve boyutu. Daha fazla bilgi için bkz. .reloc Bölümü (Yalnızca Görüntü) .
144/160
8
Hata ayıklama
Hata ayıklama verileri başlangıç adresi ve boyutu. Daha fazla bilgi için bkz. .debug Bölümü .
152/168
8
Mimarlık
Ayrılmış, 0 olmalıdır
160/176
8
Genel Ptr
Genel işaretçi kaydında depolanacak değerin RVA'sı. Bu yapının boyut üyesi sıfır olarak ayarlanmalıdır.
168/184
8
TLS Tablosu
İş parçacığı yerel depolama (TLS) tablo adresi ve boyutu. Daha fazla bilgi için bkz. .tls Bölümü.
176/192
8
Yapılandırma Tablosunu Yükle
Yük yapılandırma tablosu adresi ve boyutu. Daha fazla bilgi için bkz. Yükleme Yapılandırma Yapısı (Yalnızca Görüntü).
184/200
8
İlişkili İçeri Aktarma
İlişkili içeri aktarma tablosu adresi ve boyutu.
192/208
8
IAT
İçeri aktarma adresi tablosu adresi ve boyutu. Daha fazla bilgi için bkz. adres tablosunu içeri aktarma .
200/216
8
İçeri Aktarma Tanımlayıcısı'nın Gecikmesi
Gecikmeli içeri aktarma tanımlayıcı adresi ve boyutu. Daha fazla bilgi için bkz. Delay-Load Tabloları İçeri Aktar (Yalnızca Görüntü).
208/224
8
CLR Çalışma Zamanı Üst Bilgisi
CLR çalışma zamanı üst bilgi adresi ve boyutu. Daha fazla bilgi için bkz. .cormeta Bölümü (Yalnızca Nesne) .
216/232
8
Ayrılmış, sıfır olmalıdır

Sertifika Tablosu girdisi bir öznitelik sertifikaları tablosuna işaret eder. Bu sertifikalar görüntünün bir parçası olarak belleğe yüklenmez. Bu nedenle, bu girdinin normalde RVA olan ilk alanı bunun yerine bir dosya işaretçisidir.

Bölüm Tablosu (Bölüm Üst Bilgileri)

Bölüm tablosunun her satırı, aslında bir bölüm üst bilgisidir. Bu tablo, varsa isteğe bağlı üst bilgiden hemen sonra gelir. Dosya üst bilgisi bölüm tablosunun doğrudan işaretçisini içermediğinden bu konumlandırma gereklidir. Bunun yerine, bölüm tablosunun konumu, üst bilgilerden sonraki ilk bayt konumu hesaplanarak belirlenir. Dosya üst bilgisinde belirtilen isteğe bağlı üst bilginin boyutunu kullandığınızdan emin olun.

Bölüm tablosundaki girdilerin sayısı, dosya üst bilgisindeki NumberOfSections alanı tarafından verilir. Bölüm tablosundaki girdiler, bir (1) tarihinden başlayarak numaralandırılır. Kod ve veri belleği bölümü girişleri bağlayıcı tarafından seçilen sıradadır.

Görüntü dosyasında, bölümlerin VA'ları bağlayıcı tarafından artan düzende ve bitişik olacak şekilde atanmalıdır ve isteğe bağlı üst bilgideki SectionAlignment değerinin katı olmalıdır.

Her bölüm üst bilgisi (bölüm tablosu girdisi), giriş başına toplam 40 bayt için aşağıdaki biçime sahiptir.

Ofset Boyut Alan Açıklama
0
8
Ad
8 baytlık, null doldurmalı UTF-8 kodlanmış dize. Dize tam olarak 8 karakter uzunluğundaysa, sonlandırıcı null değeri yoktur. Daha uzun adlar için, bu alan dize tablosuna uzaklık olan ondalık bir sayının ASCII gösteriminin ardından gelen eğik çizgi (/) içerir. Yürütülebilir görüntüler dize tablosu kullanmaz ve 8 karakterden uzun bölüm adlarını desteklemez. Nesne dosyalarındaki uzun adlar yürütülebilir bir dosyaya yayılıyorsa kesilir.
8
4
VirtualSize
Belleğe yüklendiğinde bölümün toplam boyutu. Bu değer SizeOfRawData değerinden büyükse, bölüm sıfıra doldurulur. Bu alan yalnızca yürütülebilir görüntüler için geçerlidir ve nesne dosyaları için sıfır olarak ayarlanmalıdır.
12
4
VirtualAddress
Yürütülebilir görüntüler için, bölüm belleğe yüklendiğinde bölümün ilk baytının görüntü tabanına göre adresi. Nesne dosyaları için bu alan, yeniden konumlandırma uygulanmadan önce ilk baytın adresidir; kolaylık olması için derleyicilerin bunu sıfır olarak ayarlaması gerekir. Aksi takdirde, yeniden konumlandırma sırasında uzaklıklardan çıkarılmış rastgele bir değerdir.
16
4
SizeOfRawData
Bölümün boyutu (nesne dosyaları için) veya diskte başlatılan verilerin boyutu (görüntü dosyaları için). Yürütülebilir görüntüler için bu, isteğe bağlı üst bilgiden FileAlignment'ın bir katı olmalıdır. Bu, VirtualSize'dan küçükse, bölümün geri kalanı sıfır doldurulur. SizeOfRawData alanı yuvarlandığından ancak VirtualSize alanı yuvarlamadığından, SizeOfRawData'nın VirtualSize'dan büyük olması da mümkündür. Bir bölüm yalnızca başlatılmamış veriler içerdiğinde, bu alan sıfır olmalıdır.
20
4
PointerToRawData
COFF dosyasının içindeki bölümün ilk sayfasına ilişkin dosya işaretçisi. Yürütülebilir görüntüler için bu, isteğe bağlı üst bilgiden FileAlignment'ın bir katı olmalıdır. Nesne dosyaları için, en iyi performans için değer 4 baytlık bir sınıra hizalanmalıdır. Bir bölüm yalnızca başlatılmamış veriler içerdiğinde, bu alan sıfır olmalıdır.
24
4
PointerToRelocations
Bölümün yeniden konumlandırma girdilerinin başlangıcına yönelik dosya işaretçisi. Bu, yürütülebilir görüntüler için veya yeniden konumlandırma yoksa sıfır olarak ayarlanır.
28
4
PointerToLinenumbers
Bölümün satır numarası girdilerinin başlangıcına yönelik dosya işaretçisi. COFF satır numarası yoksa bu sıfır olarak ayarlanır. COFF hata ayıklama bilgileri kullanım dışı bırakıldığından bu değer bir görüntü için sıfır olmalıdır.
32
2
NumberOfRelocations
Bölümün yeniden konumlandırma girdilerinin sayısı. Bu, yürütülebilir görüntüler için sıfır olarak ayarlanır.
34
2
NumberOfLinenumbers
Bölümün satır numarası girdilerinin sayısı. COFF hata ayıklama bilgileri kullanım dışı bırakıldığından bu değer bir görüntü için sıfır olmalıdır.
36
4
Özellik -lerini
Bölümün özelliklerini açıklayan bayraklar. Daha fazla bilgi için bkz. Bölüm Bayrakları.

 

Bölüm Bayrakları

Bölüm üst bilgisinin Özellikler alanındaki bölüm bayrakları bölümün özelliklerini gösterir.

Bayrak Değer Açıklama
0x00000000
Gelecekte kullanmak üzere ayrılmıştır.
0x00000001
Gelecekte kullanmak üzere ayrılmıştır.
0x00000002
Gelecekte kullanmak üzere ayrılmıştır.
0x00000004
Gelecekte kullanmak üzere ayrılmıştır.
IMAGE_SCN_TYPE_NO_PAD
0x00000008
Bölüm bir sonraki sınıra doldurulmamalıdır. Bu bayrak eskidir ve IMAGE_SCN_ALIGN_1BYTES ile değiştirilir. Bu yalnızca nesne dosyaları için geçerlidir.
0x00000010
Gelecekte kullanmak üzere ayrılmıştır.
IMAGE_SCN_CNT_CODE
0x00000020
bölümü yürütülebilir kod içerir.
IMAGE_SCN_CNT_INITIALIZED_DATA
0x00000040
bölümü, başlatılan verileri içerir.
IMAGE_SCN_CNT_UNINITIALIZED_ DATA
0x00000080
bölümü başlatılmamış veriler içerir.
IMAGE_SCN_LNK_OTHER
0x00000100
Gelecekte kullanmak üzere ayrılmıştır.
IMAGE_SCN_LNK_INFO
0x00000200
Bölümünde açıklamalar veya diğer bilgiler yer alır. .drectve bölümü bu türe sahiptir. Bu yalnızca nesne dosyaları için geçerlidir.
0x00000400
Gelecekte kullanmak üzere ayrılmıştır.
IMAGE_SCN_LNK_REMOVE
0x00000800
Bölüm görüntünün bir parçası olmayacaktır. Bu yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_LNK_COMDAT
0x00001000
bölümü COMDAT verilerini içerir. Daha fazla bilgi için bkz. COMDAT Bölümleri (Yalnızca Nesne). Bu yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_GPREL
0x00008000
bölümü, genel işaretçi (GP) aracılığıyla başvuruda bulunan verileri içerir.
IMAGE_SCN_MEM_PURGEABLE
0x00020000
Gelecekte kullanmak üzere ayrılmıştır.
IMAGE_SCN_MEM_16BIT
0x00020000
Gelecekte kullanmak üzere ayrılmıştır.
IMAGE_SCN_MEM_LOCKED
0x00040000
Gelecekte kullanmak üzere ayrılmıştır.
IMAGE_SCN_MEM_PRELOAD
0x00080000
Gelecekte kullanmak üzere ayrılmıştır.
IMAGE_SCN_ALIGN_1BYTES
0x00100000
Verileri 1 baytlık sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_2BYTES
0x00200000
Verileri 2 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_4BYTES
0x00300000
Verileri 4 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_8BYTES
0x00400000
Verileri 8 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_16BYTES
0x00500000
Verileri 16 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_32BYTES
0x00600000
Verileri 32 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_64BYTES
0x00700000
Verileri 64 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_128BYTES
0x00800000
Verileri 128 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_256BYTES
0x00900000
Verileri 256 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_512BYTES
0x00A00000
Verileri 512 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_1024BYTES
0x00B00000
Verileri 1024 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_2048BYTES
0x00C00000
Verileri 2048 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_4096BYTES
0x00D00000
Verileri 4096 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_ALIGN_8192BYTES
0x00E00000
Verileri 8192 baytlık bir sınıra hizalayın. Yalnızca nesne dosyaları için geçerlidir.
IMAGE_SCN_LNK_NRELOC_OVFL
0x01000000
bölümü genişletilmiş yeniden konumlar içerir.
IMAGE_SCN_MEM_DISCARDABLE
0x02000000
Bölüm gerektiğinde atılabilir.
IMAGE_SCN_MEM_NOT_CACHED
0x04000000
Bölüm önbelleğe alınamaz.
IMAGE_SCN_MEM_NOT_PAGED
0x08000000
Bölüm sayfalanabilir değil.
IMAGE_SCN_MEM_SHARED
0x10000000
Bölüm bellekte paylaşılabilir.
IMAGE_SCN_MEM_EXECUTE
0x20000000
Bölüm kod olarak yürütülebilir.
IMAGE_SCN_MEM_READ
0x40000000
Bölüm okunabilir.
IMAGE_SCN_MEM_WRITE
0x80000000
Bölüm için yazılabilir.

 

IMAGE_SCN_LNK_NRELOC_OVFL, bölüm için yeniden konumlandırma sayısının bölüm üst bilgisinde bu bölüm için ayrılmış olan 16 bit'i aştığını gösterir. Bit ayarlanırsa ve bölüm üst bilgisindeki NumberOfRelocations alanı 0xffff, gerçek yeniden konumlandırma sayısı ilk yeniden konumlandırmanın 32 bit VirtualAddress alanında depolanır. IMAGE_SCN_LNK_NRELOC_OVFL ayarlanırsa ve bölümde 0xffff yeniden konumlandırmalardan daha az olması bir hatadır.

Gruplandırılmış Bölümler (Yalnızca Nesne)

"$" karakteri (dolar işareti), nesne dosyalarındaki bölüm adlarında özel bir yoruma sahiptir.

Bir nesne bölümünün içeriğini içerecek görüntü bölümünü belirlerken, bağlayıcı "$" ve ardından gelen tüm karakterleri atar. Bu nedenle, adlı bir nesne bölümü.text$X, görüntüdeki .text bölümüne katkıda bulunur.

Bununla birlikte, "$" öğesini izleyen karakterler, görüntü bölümüne yapılan katkıların sırasını belirler. Aynı nesne bölümü adına sahip tüm katkılar görüntüde bitişik olarak ayrılır ve katkı blokları nesne bölümü adına göre sözcük düzeninde sıralanır. Bu nedenle, bölüm adı .text$X olan nesne dosyalarındaki her şey, .text$W katkılarından sonra ve .text$Y katkılarından önce birlikte biter.

Görüntü dosyasındaki bölüm adı hiçbir zaman "$" karakteri içermez.

Dosyanın Diğer İçeriği

Şimdiye kadar açıklanan ve isteğe bağlı üst bilgi dahil olmak üzere veri yapılarının tümü dosyanın başından sabit bir uzaklıkta (veya dosya MS-DOS saplama içeren bir görüntüyse PE üst bilgisinden) bulunur.

COFF nesnesinin veya görüntü dosyasının geri kalanı, belirli bir dosya uzaklığında olması gerekmeyen veri blokları içerir. Bunun yerine, konumlar isteğe bağlı üst bilgi veya bölüm üst bilgisindeki işaretçiler tarafından tanımlanır.

Mimarinin sayfa boyutundan küçük SectionAlignment değerine sahip görüntüler için bir özel durum vardır (Intel x86 ve MIPS için 4 K ve Itanium için 8 K). SectionAlignment açıklaması için bkz. İsteğe Bağlı Üst Bilgi (Yalnızca Resim). Bu durumda, bölüm verilerinin dosya uzaklığında, bölüm 5.1,"Bölüm Verileri" bölümünde açıklandığı gibi kısıtlamalar vardır. Bir diğer özel durum da, öznitelik sertifikası ve hata ayıklama bilgilerinin, hata ayıklama bölümünden hemen önce öznitelik sertifika tablosuyla bir görüntü dosyasının en sonuna yerleştirilmesi gerektiğidir, çünkü yükleyici bunları belleğe eşlemez. Bununla birlikte, öznitelik sertifikası ve hata ayıklama bilgileriyle ilgili kural nesne dosyaları için geçerli değildir.

Bölüm Verileri

Bir bölüm için başlatılan veriler basit bayt bloklarından oluşur. Ancak, tüm sıfırları içeren bölümler için bölüm verilerinin dahil edilmesi gerekmez.

Her bölümün verileri, bölüm üst bilgisindeki PointerToRawData alanı tarafından verilen dosya uzaklığında bulunur. Dosyadaki bu verilerin boyutu SizeOfRawData alanıyla gösterilir. SizeOfRawData, VirtualSize değerinden küçükse, kalan değer sıfırlarla doldurulur.

Görüntü dosyasında, bölüm verilerinin isteğe bağlı üst bilgideki FileAlignment alanı tarafından belirtildiği şekilde bir sınıra hizalanması gerekir. Bölüm verileri, ilgili bölümler için RVA değerlerinin sırasına göre görünmelidir (bölüm tablosundaki bölüm üst bilgileri gibi).

İsteğe bağlı üst bilgideki SectionAlignment değeri mimarinin sayfa boyutundan küçükse, görüntü dosyalarında ek kısıtlamalar vardır. Bu tür dosyalar için, görüntü yüklendiğinde dosyadaki bölüm verilerinin konumu bellekteki konumuyla eşleşmelidir, böylece bölüm verilerinin fiziksel uzaklığı RVA ile aynıdır.

COFF Yeniden Konumlandırmaları (Yalnızca Nesne)

Nesne dosyaları, görüntü dosyasına yerleştirildiğinde ve ardından belleğe yüklendiğinde bölüm verilerinin nasıl değiştirileceğini belirten COFF yeniden konumlandırmaları içerir.

Başvuruda bulunan tüm sembollere düz adres alanında zaten adres atandığından, görüntü dosyaları COFF yeniden konumlandırmaları içermez. Görüntü ,reloc bölümündeki temel yeniden konumlandırmalar biçiminde yeniden konumlandırma bilgileri içerir (görüntünün IMAGE_FILE_RELOCS_STRIPPED özniteliği olmadığı sürece). Daha fazla bilgi için bkz. .reloc Bölümü (Yalnızca Görüntü) .

Nesne dosyasındaki her bölüm için, bölümün COFF yeniden konumlarını sabit uzunlukta bir kayıt dizisi tutar. Dizinin konumu ve uzunluğu bölüm üst bilgisinde belirtilir. Dizinin her öğesi aşağıdaki biçime sahiptir.

Ofset Boyut Alan Açıklama
0
4
VirtualAddress
Yeniden konumlandırmanın uygulandığı öğenin adresi. Bu, bölümün başından uzaklık ve bölümün RVA/Uzaklık alanının değeridir. Bkz. Bölüm Tablosu (Bölüm Üst Bilgileri). Örneğin, bölümün ilk baytının adresi 0x10 ise, üçüncü bayt 0x12 adresine sahiptir.
4
4
SymbolTableIndex
Sembol tablosuna sıfır tabanlı bir dizin. Bu simge, yeniden konumlandırma için kullanılacak adresi verir. Belirtilen simgenin bölüm depolama sınıfı varsa, simgenin adresi aynı adı taşıyan ilk bölüme sahip adrestir.
8
2
Tür
Gerçekleştirilmesi gereken yeniden konumlandırma türünü gösteren değer. Geçerli yeniden konumlandırma türleri makine türüne bağlıdır. Bkz. Tür Göstergeleri.

 

SymbolTableIndex alanı tarafından başvuruda bulunılan simgenin depolama sınıfı IMAGE_SYM_CLASS_SECTION varsa, simgenin adresi bölümün başlangıcıdır. Nesne dosyasının bir arşivin (kitaplığın) parçası olması dışında bölüm genellikle aynı dosyadadır. Bu durumda, bölüm arşivdeki geçerli nesne dosyasıyla aynı arşiv üyesi adına sahip başka bir nesne dosyasında bulunabilir. (Arşiv üyesi adıyla ilişki, içeri aktarma tablolarının (yani .idata bölümünün) bağlanmasında kullanılır.)

Tür Göstergeleri

Yeniden konumlandırma kaydının Tür alanı, ne tür bir yeniden konumlandırmanın gerçekleştirilmesi gerektiğini gösterir. Her makine türü için farklı yeniden konumlandırma türleri tanımlanır.

x64 İşlemciler

X64 ve uyumlu işlemciler için aşağıdaki yeniden konumlandırma türü göstergeleri tanımlanır.

Sabit Değer Açıklama
IMAGE_REL_AMD64_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_AMD64_ADDR64
0x0001
Yeniden konumlandırma hedefinin 64 bit VA'sı.
IMAGE_REL_AMD64_ADDR32
0x0002
Yeniden konumlandırma hedefinin 32 bit VA'sı.
IMAGE_REL_AMD64_ADDR32NB
0x0003
Görüntü tabanı (RVA) olmayan 32 bit adres.
IMAGE_REL_AMD64_REL32
0x0004
Yeniden konumlandırma sonrasında bayttan alınan 32 bit göreli adres.
IMAGE_REL_AMD64_REL32_1
0x0005
Yeniden konumlandırmadan bayt uzaklığı 1'e göre 32 bit adres.
IMAGE_REL_AMD64_REL32_2
0x0006
Yeniden konumlandırmadan bayt uzaklığı 2'ye göre 32 bit adres.
IMAGE_REL_AMD64_REL32_3
0x0007
Yeniden konumlandırmadan 3 bayt uzaklığıyla göreli 32 bit adres.
IMAGE_REL_AMD64_REL32_4
0x0008
Yeniden konumlandırmadan 4 bayt uzaklığıyla ilgili 32 bit adres.
IMAGE_REL_AMD64_REL32_5
0x0009
Yeniden konumlandırmadan 5 bayt uzaklığı göreli 32 bit adres.
IMAGE_REL_AMD64_SECTION
0x000A
Hedefi içeren bölümün 16 bit bölüm dizini. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_AMD64_SECREL
0x000B
Hedefin bölümünün başından itibaren 32 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_AMD64_SECREL7
0x000C
Hedefi içeren bölümün tabanından 7 bit işaretsiz uzaklık.
IMAGE_REL_AMD64_TOKEN
0x000D
CLR belirteçleri.
IMAGE_REL_AMD64_SREL32
0x000E
Nesneye yayılan 32 bit imzalı bir yayılma alanına bağımlı değer.
IMAGE_REL_AMD64_PAIR
0x000F
Her yayılmaya bağımlı değeri hemen izlemesi gereken bir çift.
IMAGE_REL_AMD64_SSPAN32
0x0010
Bağlantı zamanında uygulanan 32 bit imzalı span bağımlı değeri.

 

ARM İşlemcileri

ARM işlemcileri için aşağıdaki yeniden konumlandırma türü göstergeleri tanımlanmıştır.

Sabit Değer Açıklama
IMAGE_REL_ARM_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_ARM_ADDR32
0x0001
Hedefin 32 bit VA'sı.
IMAGE_REL_ARM_ADDR32NB
0x0002
Hedefin 32 bit RVA'sı.
IMAGE_REL_ARM_BRANCH24
0x0003
Hedefe 24 bit göreli yer değiştirme.
IMAGE_REL_ARM_BRANCH11
0x0004
Alt yordam çağrısına başvuru. Başvuru, 11 bit uzaklıkları olan iki 16 bit yönergeden oluşur.
IMAGE_REL_ARM_REL32
0x000A
Yeniden konumlandırma sonrasında bayttan alınan 32 bit göreli adres.
IMAGE_REL_ARM_SECTION
0x000E
Hedefi içeren bölümün 16 bit bölüm dizini. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_ARM_SECREL
0x000F
Hedefin bölümünün başından itibaren 32 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_ARM_MOV32
0x0010
Hedefin 32 bit VA'sı. Bu yeniden konumlandırma, düşük 16 bit için MOVW yönergesi ve ardından yüksek 16 bit için bir MOVT kullanılarak uygulanır.
IMAGE_REL_THUMB_MOV32
0x0011
Hedefin 32 bit VA'sı. Bu yeniden konumlandırma, düşük 16 bit için MOVW yönergesi ve ardından yüksek 16 bit için bir MOVT kullanılarak uygulanır.
IMAGE_REL_THUMB_BRANCH20
0x0012
Yönerge, 2 bayt hizalı hedefe 21 bit göreli yer değiştirme ile düzeltilir. Yer değiştirme işleminin en az önemli kısmı her zaman sıfırdır ve depolanmaz. Bu yeniden konumlandırma, Thumb-2 32 bit koşullu B yönergesine karşılık gelir.
Kullanılma -yan
0x0013
IMAGE_REL_THUMB_BRANCH24
0x0014
Yönerge, 2 bayt hizalı hedefe 25 bit göreli yer değiştirme ile düzeltilir. Yer değiştirmenin en az önemli kısmı sıfırdır ve depolanmaz. Bu yeniden konumlandırma, Thumb-2 B yönergesine karşılık gelir.
IMAGE_REL_THUMB_BLX23
0x0015
Yönerge, 4 bayt hizalı hedefe 25 bit göreli yer değiştirme ile düzeltilir. Yer değiştirmenin düşük 2 biti sıfırdır ve depolanmaz.
Bu yeniden konumlandırma, Thumb-2 BLX yönergesine karşılık gelir.
IMAGE_REL_ARM_PAIR
0x0016
Yeniden konumlandırma yalnızca bir ARM_REFHI veya THUMB_REFHI hemen takip ettiğinde geçerlidir. SymbolTableIndex, sembol tablosuna dizin değil, yer değiştirme içeriyor.

 

ARM64 İşlemciler

ARM64 işlemciler için aşağıdaki yeniden konumlandırma türü göstergeleri tanımlanmıştır.

Sabit Değer Açıklama
IMAGE_REL_ARM64_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_ARM64_ADDR32
0x0001
Hedefin 32 bit VA'sı.
IMAGE_REL_ARM64_ADDR32NB
0x0002
Hedefin 32 bit RVA'sı.
IMAGE_REL_ARM64_BRANCH26
0x0003
B ve BL yönergeleri için hedefe 26 bit göreli yer değiştirme.
IMAGE_REL_ARM64_PAGEBASE_REL21
0x0004
ADRP yönergesi için hedefin sayfa tabanı.
IMAGE_REL_ARM64_REL21
0x0005
ADR yönergesi için hedefe 12 bit göreli yer değiştirme
IMAGE_REL_ARM64_PAGEOFFSET_12A
0x0006
Sıfır kaydırmalı ADD/ADDS (anında) yönergeleri için hedefin 12 bit sayfa uzaklığı.
IMAGE_REL_ARM64_PAGEOFFSET_12L
0x0007
LDR yönergesi için hedefin 12 bit sayfa uzaklığı (dizinli, imzasız hemen).
IMAGE_REL_ARM64_SECREL
0x0008
Hedefin bölümünün başından itibaren 32 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_ARM64_SECREL_LOW12A
0x0009
Sıfır kaydırmalı ADD/ADDS (anında) yönergeleri için hedefin bölüm uzaklığının bit 0:11'i.
IMAGE_REL_ARM64_SECREL_HIGH12A
0x000A
Sıfır kaydırmalı ADD/ADDS (anında) yönergeleri için hedefin bölüm uzaklığının 12:23 biti.
IMAGE_REL_ARM64_SECREL_LOW12L
0x000B
LDR yönergesi için hedefin bölüm uzaklığının bit 0:11'i (dizinli, imzasız hemen).
IMAGE_REL_ARM64_TOKEN
0x000C
CLR belirteci.
IMAGE_REL_ARM64_SECTION
0x000D
Hedefi içeren bölümün 16 bit bölüm dizini. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_ARM64_ADDR64
0x000E
Yeniden konumlandırma hedefinin 64 bit VA'sı.
IMAGE_REL_ARM64_BRANCH19
0x000F
Koşullu B yönergesi için yeniden konumlandırma hedefine 19 bit uzaklık.
IMAGE_REL_ARM64_BRANCH14
0x0010
TBZ ve TBNZ yönergeleri için yeniden konumlandırma hedefine 14 bit uzaklık.
IMAGE_REL_ARM64_REL32
0x0011
Yeniden konumlandırma sonrasında bayttan alınan 32 bit göreli adres.
Hitachi SuperH İşlemcileri

SH3 ve SH4 işlemciler için aşağıdaki yeniden konumlandırma türü göstergeleri tanımlanmıştır. SH5'e özgü yeniden konumlandırmalar SHM (SH Media) olarak not edilir.

Sabit Değer Açıklama
IMAGE_REL_SH3_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_SH3_DIRECT16
0x0001
Hedef sembolün VA'sını içeren 16 bit konuma başvuru.
IMAGE_REL_SH3_DIRECT32
0x0002
Hedef sembolün 32 bit VA'sı.
IMAGE_REL_SH3_DIRECT8
0x0003
Hedef sembolün VA'sını içeren 8 bitlik konuma başvuru.
IMAGE_REL_SH3_DIRECT8_WORD
0x0004
Hedef sembolün etkin 16 bit VA'sını içeren 8 bit yönergesine başvuru.
IMAGE_REL_SH3_DIRECT8_LONG
0x0005
Hedef sembolün etkili 32 bit VA'sını içeren 8 bit yönergesine başvuru.
IMAGE_REL_SH3_DIRECT4
0x0006
Düşük 4 biti hedef sembolün VA'sını içeren 8 bitlik konuma başvuru.
IMAGE_REL_SH3_DIRECT4_WORD
0x0007
Düşük 4 biti hedef sembolün etkin 16 bit VA'sını içeren 8 bit yönergesine başvuru.
IMAGE_REL_SH3_DIRECT4_LONG
0x0008
Düşük 4 biti hedef sembolün etkili 32 bit VA'sını içeren 8 bit yönergesine başvuru.
IMAGE_REL_SH3_PCREL8_WORD
0x0009
Hedef sembolün etkin 16 bit göreli uzaklığını içeren 8 bit yönergesine başvuru.
IMAGE_REL_SH3_PCREL8_LONG
0x000A
Hedef sembolün etkili 32 bit göreli uzaklığını içeren 8 bit yönergesine başvuru.
IMAGE_REL_SH3_PCREL12_WORD
0x000B
Düşük 12 biti hedef sembolün etkin 16 bit göreli uzaklığını içeren 16 bit yönergesine başvuru.
IMAGE_REL_SH3_STARTOF_SECTION
0x000C
Hedef simgeyi içeren bölümün VA'sı olan 32 bitlik bir konuma başvuru.
IMAGE_REL_SH3_SIZEOF_SECTION
0x000D
Hedef simgeyi içeren bölümün boyutu olan 32 bit konuma başvuru.
IMAGE_REL_SH3_SECTION
0x000E
Hedefi içeren bölümün 16 bit bölüm dizini. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_SH3_SECREL
0x000F
Hedefin bölümünün başından itibaren 32 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_SH3_DIRECT32_NB
0x0010
Hedef sembolün 32 bit RVA'sı.
IMAGE_REL_SH3_GPREL4_LONG
0x0011
GP görelisi.
IMAGE_REL_SH3_TOKEN
0x0012
CLR belirteci.
IMAGE_REL_SHM_PCRELPT
0x0013
Longwords içindeki geçerli yönergeden uzaklık. NOMODE biti ayarlanmadıysa PTA veya PTB'yi seçmek için düşük bitin tersini bit 32'ye ekleyin.
IMAGE_REL_SHM_REFLO
0x0014
32 bit adresin düşük 16 biti.
IMAGE_REL_SHM_REFHALF
0x0015
32 bit adresin yüksek 16 biti.
IMAGE_REL_SHM_RELLO
0x0016
Göreli adresin düşük 16 biti.
IMAGE_REL_SHM_RELHALF
0x0017
Göreli adresin yüksek 16 biti.
IMAGE_REL_SHM_PAIR
0x0018
Yeniden konumlandırma yalnızca REFHALF, RELHALF veya RELLO yeniden konumlandırmasını hemen takip ettiğinde geçerlidir. Yeniden konumlandırmanın SymbolTableIndex alanı, sembol tablosuna dizin değil, yer değiştirme içerir.
IMAGE_REL_SHM_NOMODE
0x8000
Yeniden konumlandırma bölüm modunu yoksayar.

 

IBM PowerPC İşlemcileri

Aşağıdaki yeniden konumlandırma türü göstergeleri PowerPC işlemcileri için tanımlanır.

Sabit Değer Açıklama
IMAGE_REL_PPC_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_PPC_ADDR64
0x0001
Hedefin 64 bit VA'sı.
IMAGE_REL_PPC_ADDR32
0x0002
Hedefin 32 bit VA'sı.
IMAGE_REL_PPC_ADDR24
0x0003
Hedefin VA'sinin düşük 24 biti. Bu yalnızca hedef simge mutlak olduğunda geçerlidir ve özgün değerine işaretle genişletilebilir.
IMAGE_REL_PPC_ADDR16
0x0004
Hedefin VA'sının 16 biti.
IMAGE_REL_PPC_ADDR14
0x0005
Hedefin VA'sının 14 biti. Bu yalnızca hedef simge mutlak olduğunda geçerlidir ve özgün değerine işaretle genişletilebilir.
IMAGE_REL_PPC_REL24
0x0006
Simgenin konumuna 24 bit pc göreli uzaklığı.
IMAGE_REL_PPC_REL14
0x0007
Simgenin konumuna göre 14 bit bilgisayar göreli uzaklığı.
IMAGE_REL_PPC_ADDR32NB
0x000A
Hedefin 32 bit RVA'sı.
IMAGE_REL_PPC_SECREL
0x000B
Hedefin bölümünün başından itibaren 32 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_PPC_SECTION
0x000C
Hedefi içeren bölümün 16 bit bölüm dizini. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_PPC_SECREL16
0x000F
Hedefin bölümünün başından 16 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_PPC_REFHI
0x0010
Hedefin 32 bit VA'sının yüksek 16 biti. Bu, tam adresi yükleyen iki yönergeli bir dizideki ilk yönerge için kullanılır. Bu yeniden konumlandırmanın hemen ardından SymbolTableIndex öğesinin, yeniden konumlandırılmakta olan konumdan alınan üst 16 bit'e eklenen imzalı bir 16 bit yer değiştirme içeren bir PAIR yeniden konumlandırması olması gerekir.
IMAGE_REL_PPC_REFLO
0x0011
Hedefin VA'sının 16 biti.
IMAGE_REL_PPC_PAIR
0x0012
Yalnızca REFHI veya SECRELHI yeniden konumlandırmanın hemen ardından geldiğinde geçerli olan bir yeniden konumlandırma. SymbolTableIndex, sembol tablosuna dizin değil, yer değiştirme içeriyor.
IMAGE_REL_PPC_SECRELLO
0x0013
Bölümün başından itibaren hedefin 32 bit uzaklığının düşük 16 biti.
IMAGE_REL_PPC_GPREL
0x0015
Hedefin GP yazmaçlarına göre 16 bit imzalı yer değiştirmesi.
IMAGE_REL_PPC_TOKEN
0x0016
CLR belirteci.

 

Intel 386 İşlemciler

Intel 386 ve uyumlu işlemciler için aşağıdaki yeniden konumlandırma türü göstergeleri tanımlanmıştır.

Sabit Değer Açıklama
IMAGE_REL_I386_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_I386_DIR16
0x0001
Desteklenmez.
IMAGE_REL_I386_REL16
0x0002
Desteklenmez.
IMAGE_REL_I386_DIR32
0x0006
Hedef 32 bit VA.
IMAGE_REL_I386_DIR32NB
0x0007
Hedef 32 bit RVA.
IMAGE_REL_I386_SEG12
0x0009
Desteklenmez.
IMAGE_REL_I386_SECTION
0x000A
Hedefi içeren bölümün 16 bit bölüm dizini. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_I386_SECREL
0x000B
Hedefin bölümünün başından itibaren 32 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_I386_TOKEN
0x000C
CLR belirteci.
IMAGE_REL_I386_SECREL7
0x000D
Hedefi içeren bölümün tabanından 7 bit uzaklık.
IMAGE_REL_I386_REL32
0x0014
Hedefe 32 bit göreli yer değiştirme. Bu, x86 göreli dalını ve çağrı yönergelerini destekler.

 

Intel Itanium İşlemci Ailesi (IPF)

Intel Itanium işlemci ailesi ve uyumlu işlemciler için aşağıdaki yeniden konumlandırma türü göstergeleri tanımlanmıştır. Yönergelerdeki yeniden konumlandırmaların, yeniden konumlandırma uzaklığı için paketin uzaklığını ve yuva numarasını kullandığını unutmayın.

Sabit Değer Açıklama
IMAGE_REL_IA64_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_IA64_IMM14
0x0001
Yönerge yeniden konumlandırması, değeri IMM14 paketindeki belirtilen yuvaya eklenmeden önce hedef adrese eklenen bir ADDEND yeniden konumlandırması tarafından takip edilebilir. Yeniden konumlandırma hedefi mutlak veya görüntünün sabit olması gerekir.
IMAGE_REL_IA64_IMM22
0x0002
Yönerge yeniden konumlandırması, değeri IMM22 paketindeki belirtilen yuvaya eklenmeden önce hedef adrese eklenen bir ADDEND yeniden konumlandırması tarafından takip edilebilir. Yeniden konumlandırma hedefi mutlak veya görüntünün sabit olması gerekir.
IMAGE_REL_IA64_IMM64
0x0003
Bu yeniden konumlandırmanın yuva numarası bir (1) olmalıdır. Yeniden konumlandırmanın ardından, değeri IMM64 paketinin üç yuvasında da depolanmadan önce hedef adrese eklenen BIR ADDEND yeniden konumlandırması olabilir.
IMAGE_REL_IA64_DIR32
0x0004
Hedef 32 bit VA. Bu yalnızca /LARGEADDRESSAWARE:NO görüntüleri için desteklenir.
IMAGE_REL_IA64_DIR64
0x0005
Hedef 64 bit VA.
IMAGE_REL_IA64_PCREL21B
0x0006
Yönerge, 16 bit hizalanmış hedefe 25 bit göreli yer değiştirme ile düzeltilir. Yer değiştirmenin düşük 4 biti sıfırdır ve depolanmaz.
IMAGE_REL_IA64_PCREL21M
0x0007
Yönerge, 16 bit hizalanmış hedefe 25 bit göreli yer değiştirme ile düzeltilir. Sıfır olan düşük 4 bit yer değiştirme depolanmaz.
IMAGE_REL_IA64_PCREL21F
0x0008
Bu yeniden konumlandırmanın uzaklığının LSB'leri yuva numarasını içermelidir, gerisi ise paket adresidir. Paket, 16 bit hizalanmış hedefe 25 bit göreli yer değiştirme ile düzeltilir. Yer değiştirmenin düşük 4 biti sıfırdır ve depolanmaz.
IMAGE_REL_IA64_GPREL22
0x0009
Yönerge yeniden konumlandırmasının ardından, değeri hedef adrese eklenen bir ADDEND yeniden konumlandırması ve ardından hesaplanan ve GPREL22 paketine uygulanan 22 bit GP göreli uzaklığı olabilir.
IMAGE_REL_IA64_LTOFF22
0x000A
Yönerge, hedef sembolün değişmez tablo girişine 22 bit GP göreli uzaklığıyla düzeltilir. Bağlayıcı, bu sabit tablo girdisini, bu yeniden konumlandırmayı ve sonrasında olabilecek ADDEND yeniden konumlandırmasını temel alarak oluşturur.
IMAGE_REL_IA64_SECTION
0x000B
Bölümün 16 bit bölüm dizini hedefi içerir. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_IA64_SECREL22
0x000C
Yönerge, bölümün başından itibaren hedefin 22 bit uzaklığıyla düzeltilir. Bu yeniden konumlandırma hemen ardından, Value alanı bölümün başından hedefin 32 bit işaretsiz uzaklığını içeren BIR ADDEND yeniden konumlandırması tarafından izlenebilir.
IMAGE_REL_IA64_SECREL64I
0x000D
Bu yeniden konumlandırma için yuva numarası bir (1) olmalıdır. Yönerge, bölümün başından itibaren hedefin 64 bit uzaklığıyla düzeltilir. Bu yeniden konumlandırmayı, Value alanı bölümün başından itibaren hedefin 32 bit işaretsiz uzaklığını içeren bir ADDEND yeniden konumlandırması takip edebilir.
IMAGE_REL_IA64_SECREL32
0x000E
Bölümün başından hedefin 32 bit uzaklığıyla düzeltilecek verilerin adresi.
IMAGE_REL_IA64_DIR32NB
0x0010
Hedef 32 bit RVA.
IMAGE_REL_IA64_SREL14
0x0011
Bu, iki yeniden konumlandırılabilir hedef arasındaki farkı içeren imzalı bir 14 bit anında uygulanır. Bu, bağlayıcı için derleyicinin bu değeri zaten yaydığını gösteren bildirim temelli bir alandır.
IMAGE_REL_IA64_SREL22
0x0012
Bu, iki yeniden konumlandırılabilir hedef arasındaki farkı içeren imzalı bir 22 bit anında uygulanır. Bu, bağlayıcı için derleyicinin bu değeri zaten yaydığını gösteren bildirim temelli bir alandır.
IMAGE_REL_IA64_SREL32
0x0013
Bu, iki yeniden konumlandırılabilir değer arasındaki farkı içeren imzalı bir 32 bit anında uygulanır. Bu, bağlayıcı için derleyicinin bu değeri zaten yaydığını gösteren bildirim temelli bir alandır.
IMAGE_REL_IA64_UREL32
0x0014
Bu, iki yeniden konumlandırılabilir değer arasındaki farkı içeren imzasız bir 32 bit anında uygulanır. Bu, bağlayıcı için derleyicinin bu değeri zaten yaydığını gösteren bildirim temelli bir alandır.
IMAGE_REL_IA64_PCREL60X
0x0015
MLX paketinin BRL yönergesi olarak her zaman kalan 60 bit pc göreli düzeltme.
IMAGE_REL_IA64_PCREL60B
0x0016
60 bit bilgisayar göreli düzeltmesi. Hedef yer değiştirme işaretli bir 25 bit alana sığıyorsa, paketin tamamını NOP içeren bir MBB paketine dönüştürün. Yuva 1'de B ve yuva 2'de 25 bit BR yönergesi (en düşük 4 bit sıfır ve bırakılarak).
IMAGE_REL_IA64_PCREL60F
0x0017
60 bit bilgisayar göreli düzeltmesi. Hedef yer değiştirme işaretli bir 25 bit alana sığıyorsa, paketin tamamını NOP içeren bir MFB paketine dönüştürün. Yuva 1'de F ve yuva 25 bit (4 en düşük bit sıfır ve bırakılan) BR yönergesi.
IMAGE_REL_IA64_PCREL60I
0x0018
60 bit bilgisayar göreli düzeltmesi. Hedef yer değiştirme işaretli bir 25 bit alana sığıyorsa, paketin tamamını NOP içeren bir MIB paketine dönüştürün. Yuva 1 ve 25 bit (4 en düşük bit tümü sıfır ve bırakılan) BR yönergesi 2. yuvada.
IMAGE_REL_IA64_PCREL60M
0x0019
60 bit bilgisayar göreli düzeltmesi. Hedef yer değiştirme işaretli bir 25 bit alana sığıyorsa, paketin tamamını NOP içeren bir MMB paketine dönüştürün. Yuva 1'de M ve yuva 25 bit (4 en düşük bit tüm sıfır ve bırakılan) BR yönergesi 2. yuvada.
IMAGE_REL_IA64_IMMGPREL64
0x001a
64 bit GP göreli düzeltme.
IMAGE_REL_IA64_TOKEN
0x001b
CLR belirteci.
IMAGE_REL_IA64_GPREL32
0x001c
32 bit GP göreli düzeltme.
IMAGE_REL_IA64_ADDEND
0x001F
Yeniden konumlandırma yalnızca aşağıdaki konum değiştirmelerden birini hemen takip ettiğinde geçerlidir: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I veya SECREL32. Değeri, veri için değil, bir paket içindeki yönergelere uygulanacak eklentiyi içerir.

 

MIPS İşlemcileri

MIPS işlemcileri için aşağıdaki yeniden konumlandırma türü göstergeleri tanımlanmıştır.

Sabit Değer Açıklama
IMAGE_REL_MIPS_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_MIPS_REFHALF
0x0001
Hedefin 32 bit VA'sının yüksek 16 biti.
IMAGE_REL_MIPS_REFWORD
0x0002
Hedef 32 bit VA.
IMAGE_REL_MIPS_JMPADDR
0x0003
Hedefin VA'sının düşük 26 biti. Bu, MIPS J ve JAL yönergelerini destekler.
IMAGE_REL_MIPS_REFHI
0x0004
Hedefin 32 bit VA'sının yüksek 16 biti. Bu, tam adresi yükleyen iki yönergeli bir dizideki ilk yönerge için kullanılır. Bu yeniden konumlandırmanın hemen ardından SymbolTableIndex öğesinin, yeniden konumlandırılmakta olan konumdan alınan üst 16 bit'e eklenen imzalı bir 16 bit yer değiştirme içeren bir PAIR yeniden konumlandırması olması gerekir.
IMAGE_REL_MIPS_REFLO
0x0005
Hedefin VA'sının 16 biti.
IMAGE_REL_MIPS_GPREL
0x0006
Hedefin GP yazmaçlarına göre 16 bit imzalı yer değiştirmesi.
IMAGE_REL_MIPS_LITERAL
0x0007
IMAGE_REL_MIPS_GPREL ile aynı.
IMAGE_REL_MIPS_SECTION
0x000A
Bölümün 16 bit bölüm dizini hedefi içerir. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_MIPS_SECREL
0x000B
Hedefin bölümünün başından itibaren 32 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_MIPS_SECRELLO
0x000C
Bölümün başından itibaren hedefin 32 bit uzaklığının düşük 16 biti.
IMAGE_REL_MIPS_SECRELHI
0x000D
Bölümün başından itibaren hedefin 32 bit uzaklığının yüksek 16 biti. Bir IMAGE_REL_MIPS_PAIR yeniden konumlandırma hemen bunu takip etmelidir. PAIR yeniden konumlandırmasının SymbolTableIndex değeri, yeniden konumlandırılmakta olan konumdan alınan üst 16 bitlere eklenen imzalı bir 16 bit yer değiştirme içerir.
IMAGE_REL_MIPS_JMPADDR16
0x0010
Hedefin VA'sının düşük 26 biti. Bu, MIPS16 JAL yönergesini destekler.
IMAGE_REL_MIPS_REFWORDNB
0x0022
Hedef 32 bit RVA.
IMAGE_REL_MIPS_PAIR
0x0025
Yeniden konumlandırma yalnızca REFHI veya SECRELHI yeniden konumlandırmasını hemen takip ettiğinde geçerlidir. SymbolTableIndex, sembol tablosuna dizin değil, yer değiştirme içeriyor.

 

Mitsubishi M32R

Mitsubishi M32R işlemciler için aşağıdaki yeniden konumlandırma türü göstergeleri tanımlanmıştır.

Sabit Değer Açıklama
IMAGE_REL_M32R_ABSOLUTE
0x0000
Yeniden konumlandırma yoksayılır.
IMAGE_REL_M32R_ADDR32
0x0001
Hedef 32 bit VA.
IMAGE_REL_M32R_ADDR32NB
0x0002
Hedef 32 bit RVA.
IMAGE_REL_M32R_ADDR24
0x0003
Hedef 24 bit VA.
IMAGE_REL_M32R_GPREL16
0x0004
Hedefin GP yazmaçtan 16 bit uzaklığı.
IMAGE_REL_M32R_PCREL24
0x0005
Hedefin program sayacından (PC) 24 bit uzaklığı, 2 bit sola kaydırılmış ve işaret genişletilmiş
IMAGE_REL_M32R_PCREL16
0x0006
Hedefin bilgisayardan 16 bit uzaklığı, 2 bit sola kaydırılmış ve işaret genişletilmiş
IMAGE_REL_M32R_PCREL8
0x0007
Hedefin bilgisayardan 8 bit uzaklığı, 2 bit sola kaydırılmış ve imza genişletilmiş
IMAGE_REL_M32R_REFHALF
0x0008
Hedef VA'nın 16 MSB'leri.
IMAGE_REL_M32R_REFHI
0x0009
Hedef VA'nın 16 MSB'i LSB işaret uzantısı için ayarlandı. Bu, tam 32 bit adres yükleyen iki yönergeli bir dizideki ilk yönerge için kullanılır. Bu yeniden konumlandırmanın hemen ardından SymbolTableIndex öğesinin, yeniden konumlandırılmakta olan konumdan alınan üst 16 bit'e eklenen imzalı bir 16 bit yer değiştirme içeren bir PAIR yeniden konumlandırması olması gerekir.
IMAGE_REL_M32R_REFLO
0x000A
Hedef VA'nın 16 LSB'sini.
IMAGE_REL_M32R_PAIR
0x000B
Yeniden konumlandırma, REFHI yeniden konumlandırmasını izlemelidir. SymbolTableIndex, sembol tablosuna dizin değil, yer değiştirme içeriyor.
IMAGE_REL_M32R_SECTION
0x000C
Hedefi içeren bölümün 16 bit bölüm dizini. Bu, hata ayıklama bilgilerini desteklemek için kullanılır.
IMAGE_REL_M32R_SECREL
0x000D
Hedefin bölümünün başından itibaren 32 bit uzaklığı. Bu, hata ayıklama bilgilerini ve statik iş parçacığı yerel depolama alanını desteklemek için kullanılır.
IMAGE_REL_M32R_TOKEN
0x000E
CLR belirteci.

 

COFF Satır Numaraları (Kullanım Dışı)

COFF satır numaraları artık üretilmiyor ve gelecekte kullanılmayacak.

COFF satır numaraları, kaynak dosyalarda kod ve satır numaraları arasındaki ilişkiyi gösterir. COFF satır numaraları için Microsoft biçimi standart COFF'ye benzer, ancak tek bir bölümün birden çok kaynak dosyadaki satır numaralarıyla ilişkilendirebilmesi için genişletilmiştir.

COFF satır numaraları sabit uzunlukta kayıt dizilerinden oluşur. Dizinin konumu (dosya uzaklığı) ve boyutu bölüm üst bilgisinde belirtilir. Her satır numarası kaydı aşağıdaki biçimdedir.

Ofset Boyut Alan Açıklama
0
4
Tür (*)
Bu iki alanın birleşimidir: SymbolTableIndex ve VirtualAddress. SymbolTableIndex veya RVA'nın kullanılıp kullanılmadığı, Linenumber değerine bağlıdır.
4
2
Satırsayısı
Sıfır olmadığında, bu alan tek tabanlı bir satır numarası belirtir. Sıfır olduğunda, Tür alanı bir işlev için sembol tablosu dizini olarak yorumlanır.

 

Tür alanı iki 4 baytlık alanın birleşimidir: SymbolTableIndex ve VirtualAddress.

Ofset Boyut Alan Açıklama
0
4
SymbolTableIndex
Satırsayısı sıfır olduğunda kullanılır: bir işlev için simge tablosu girdisine dizin. Bu biçim, bir grup satır numarası kaydının başvurduğu işlevi göstermek için kullanılır.
0
4
VirtualAddress
Satırsayısı sıfır olmadığında kullanılır: Belirtilen kaynak satıra karşılık gelen yürütülebilir kodun RVA'sı. Bir nesne dosyasında, bu bölüm içindeki VA'yı içerir.

 

Satır numarası kaydı, Satırsayısı alanını sıfır olarak ayarlayabilir ve sembol tablosundaki bir işlev tanımına işaret edebilir veya nesne kodunda pozitif bir tamsayı (satır numarası) ve karşılık gelen adres vererek standart bir satır-sayı girişi olarak çalışabilir.

Satır numarası girdileri grubu her zaman ilk biçimle başlar: işlev simgesinin dizini. Bu bölümdeki ilk satır numarası kaydıysa, bölümün COMDAT bayrağı ayarlanmışsa işlevin COMDAT sembol adı da olur. bkz. COMDAT Bölümleri (Yalnızca Nesne). İşlevin sembol tablosundaki yardımcı kaydı, aynı satır numarası kaydına işaret eden ÇizgiSayısı alanına işaret eden bir işaretçiye sahiptir.

bir işlevi tanımlayan bir kaydın ardından gerçek satır-numarası bilgilerini veren herhangi bir sayıda satır-numarası girdisi (yani, Sıfırdan büyük Satır numarası olan girişler) bulunur. Bu girdiler, işlevin başlangıcına göre tek tabanlıdır ve ilk satır dışında işlevdeki her kaynak satırı temsil eder.

Örneğin, aşağıdaki örneğin ilk satır numarası kaydı ReverseSign işlevini (SymbolTableIndex of ReverseSign ve Linenumber değeri sıfır olarak ayarlanır) belirtir. Ardından, 1, 2 ve 3 Satırsayısı değerlerine sahip kayıtlar, gösterildiği gibi kaynak satırlara karşılık gelen şekilde izleniyor:

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

COFF Sembol Tablosu

Bu bölümdeki sembol tablosu geleneksel COFF biçiminden devralınır. Microsoft Visual C++ hata ayıklama bilgilerinden farklıdır. Bir dosya hem COFF sembol tablosu hem de Visual C++ hata ayıklama bilgilerini içerebilir ve ikisi ayrı tutulur. Bazı Microsoft araçları, COMDAT bilgilerini bağlayıcıya iletme gibi sınırlı ama önemli amaçlar için sembol tablosunu kullanır. Bölüm adları ve dosya adlarının yanı sıra kod ve veri simgeleri, sembol tablosunda listelenir.

Sembol tablosunun konumu COFF üst bilgisinde gösterilir.

Sembol tablosu, her biri 18 bayt uzunluğunda bir kayıt dizisidir. Her kayıt standart veya yardımcı bir sembol tablosu kaydıdır. Standart kayıt bir simge veya ad tanımlar ve aşağıdaki biçime sahiptir.

Ofset Boyut Alan Açıklama
0
8
Ad (*)
Üç yapının birleşimiyle temsil edilen simgenin adı. Ad 8 bayttan uzun değilse 8 baytlık bir dizi kullanılır. Daha fazla bilgi için bkz. Sembol Adı Gösterimi.
8
4
Değer
Simgeyle ilişkili değer. Bu alanın yorumlanması SectionNumber ve StorageClass'a bağlıdır. Tipik bir anlam, yeniden konumlandırılabilir adrestir.
12
2
Bölüm Numarası
Bölüm tablosuna tek tabanlı bir dizin kullanarak bölümü tanımlayan imzalı tamsayı. Bazı değerlerin, bölüm 5.4.2, "Bölüm Numarası Değerleri" bölümünde tanımlandığı gibi özel bir anlamı vardır.
14
2
Tür
Türü temsil eden bir sayı. Microsoft araçları bu alanı 0x20 (işlev) veya 0x0 (işlev değil) olarak ayarlar. Daha fazla bilgi için bkz. Tür Gösterimi.
16
1
StorageClass
Depolama sınıfını temsil eden numaralandırılmış değer. Daha fazla bilgi için bkz. Depolama Sınıfı.
17
1
NumberOfAuxSymbols
Bu kaydı izleyen yardımcı sembol tablosu girdilerinin sayısı.

 

Sıfır veya daha fazla yardımcı sembol-tablo kaydı, her standart sembol-tablo kaydını hemen izler. Ancak, genellikle birden fazla yardımcı sembol-tablo kaydı standart bir sembol-tablo kaydı izler (uzun dosya adları olan .file kayıtları hariç). Her yardımcı kayıt, standart bir sembol-tablo kaydıyla (18 bayt) aynı boyuttadır, ancak yeni bir simge tanımlamak yerine yardımcı kayıt tanımlanan son simge hakkında ek bilgi verir. Hangi biçimlerden hangisinin kullanılacağı StorageClass alanına bağlıdır. Yardımcı sembol tablo kayıtları için şu anda tanımlanmış biçimler, "Yardımcı Sembol Kayıtları" başlıklı bölüm 5.5'te gösterilmiştir.

COFF sembol tablolarını okuyan araçlar, yorumu bilinmeyen yardımcı sembol kayıtlarını yoksamalıdır. Bu, mevcut araçları bozmadan yeni yardımcı kayıtlar eklemek için sembol tablosu biçiminin genişletilmesine olanak tanır.

Sembol Adı Gösterimi

Simge tablosundaki ShortName alanı, 8 bayttan uzun değilse adın kendisini içeren 8 bayttan oluşur veya ShortName alanı dize tablosuna uzaklık verir. Adın kendisinin mi yoksa uzaklığın mı verileceğini belirlemek için ilk 4 bayt değerini sıfıra eşit olacak şekilde test edin.

Kurala göre, adlar sıfır sonlandırılan UTF-8 kodlanmış dizeler olarak değerlendirilir.

Ofset Boyut Alan Açıklama
0
8
ShortName
8 baytlık bir dizi. Ad 8 bayttan kısaysa, bu dizi sağda null değerlerle doldurulur.
0
4
Sıfır
Ad 8 bayttan uzunsa tüm sıfırlara ayarlanmış bir alan.
4
4
Ofset
Dize tablosuna uzaklık.

 

Bölüm Numarası Değerleri

Normalde, bir sembol tablosu girdisindeki Bölüm Değeri alanı, bölüm tablosunun tek tabanlı bir dizinidir. Ancak, bu alan imzalı bir tamsayıdır ve negatif değerler alabilir. Aşağıdaki değerlerin ( birden az) özel anlamları vardır.

Sabit Değer Açıklama
IMAGE_SYM_UNDEFINED
0
Simge kaydına henüz bir bölüm atanmadı. Sıfır değeri, dış simgeye başvurunun başka bir yerde tanımlandığını gösterir. Sıfır olmayan bir değer, değer tarafından belirtilen boyuta sahip ortak bir simgedir.
IMAGE_SYM_ABSOLUTE
-1
Simge mutlak (yeniden konumlandırılamaz) bir değere sahiptir ve bir adres değildir.
IMAGE_SYM_DEBUG
-2
Simgesi genel tür veya hata ayıklama bilgileri sağlar ancak bir bölüme karşılık gelmez. Microsoft araçları bu ayarı .file kayıtlarıyla (depolama sınıfı FILE) birlikte kullanır.

 

Tür Gösterimi

Sembol tablosu girdisinin Tür alanı 2 bayt içerir ve burada her bayt tür bilgilerini temsil eder. LSB basit (temel) veri türünü, MSB ise karmaşık türü (varsa) temsil eder:

MSB LSB
Karmaşık tür: none, pointer, function, array.
Temel tür: tamsayı, kayan nokta vb.

 

Temel tür için aşağıdaki değerler tanımlanır, ancak Microsoft araçları genellikle bu alanı kullanmaz ve LSB'yi 0 olarak ayarlar. Bunun yerine, türleri belirtmek için Visual C++ hata ayıklama bilgileri kullanılır. Ancak, olası COFF değerleri tamlık için burada listelenir.

Sabit Değer Açıklama
IMAGE_SYM_TYPE_NULL
0
Tür bilgisi veya bilinmeyen temel tür yok. Microsoft araçları bu ayarı kullanır
IMAGE_SYM_TYPE_VOID
1
Geçerli bir tür yok; void işaretçileri ve işlevleri ile kullanılır
IMAGE_SYM_TYPE_CHAR
2
Karakter (imzalı bayt)
IMAGE_SYM_TYPE_SHORT
3
2 bayt işaretli tamsayı
IMAGE_SYM_TYPE_INT
4
Doğal bir tamsayı türü (Normalde Windows'ta 4 bayt)
IMAGE_SYM_TYPE_LONG
5
4 bayt işaretli tamsayı
IMAGE_SYM_TYPE_FLOAT
6
4 baytlık kayan noktalı sayı
IMAGE_SYM_TYPE_DOUBLE
7
8 baytlık kayan noktalı sayı
IMAGE_SYM_TYPE_STRUCT
8
Bir yapı
IMAGE_SYM_TYPE_UNION
9
Bir birleşim
IMAGE_SYM_TYPE_ENUM
10
Numaralandırılmış tür
IMAGE_SYM_TYPE_MOE
11
Sabit listesi üyesi (belirli bir değer)
IMAGE_SYM_TYPE_BYTE
12
Bayt; işaretsiz 1 baytlık tamsayı
IMAGE_SYM_TYPE_WORD
13
Bir kelime; işaretsiz 2 baytlık tamsayı
IMAGE_SYM_TYPE_UINT
14
Doğal boyutta işaretsiz bir tamsayı (normalde 4 bayt)
IMAGE_SYM_TYPE_DWORD
15
İşaretsiz bir 4 baytlık tamsayı

 

En önemli bayt, simgenin LSB'de belirtilen temel türün işaretçisi mi, döndüren işlev mi yoksa dizi mi olduğunu belirtir. Microsoft araçları bu alanı yalnızca simgenin bir işlev olup olmadığını belirtmek için kullanır; böylece sonuçta elde edilen yalnızca iki değer Tür alanı için 0x0 ve 0x20. Ancak, diğer araçlar daha fazla bilgi iletmek için bu alanı kullanabilir.

İşlev özniteliğini doğru belirtmek çok önemlidir. Artımlı bağlamanın düzgün çalışması için bu bilgiler gereklidir. Bazı mimariler için bilgiler başka amaçlar için gerekli olabilir.

Sabit Değer Açıklama
IMAGE_SYM_DTYPE_NULL
0
Türetilmiş tür yok; simgesi basit bir skaler değişkendir.
IMAGE_SYM_DTYPE_POINTER
1
Simge, temel türe işaret eden bir işaretçidir.
IMAGE_SYM_DTYPE_FUNCTION
2
Simge, temel bir tür döndüren bir işlevdir.
IMAGE_SYM_DTYPE_ARRAY
3
Simge, temel tür dizisidir.

 

Depolama Sınıfı

Sembol tablosunun StorageClass alanı, bir sembolün ne tür bir tanımı temsildiğini gösterir. Aşağıdaki tabloda olası değerler gösterilmektedir. StorageClass alanının işaretsiz bir 1 baytlık tamsayı olduğunu unutmayın. Bu nedenle, -1 özel değerin işaretsiz eşdeğeri 0xFF olarak alınması gerekir.

Geleneksel COFF biçimi birçok depolama sınıfı değeri kullansa da, Microsoft araçları sembolik bilgilerin çoğu için Visual C++ hata ayıklama biçimini kullanır ve genellikle yalnızca dört depolama sınıfı değeri kullanır: EXTERNAL (2), STATIC (3), FUNCTION (101) ve FILE (103). Aşağıdaki ikinci sütun başlığı dışında, sembol kaydının Value alanını (yorumu depolama sınıfı olarak bulunan sayıya göre değişir) ifade etmek için "Değer" alınmalıdır.

Sabit Değer Değer alanının açıklaması/yorumu
IMAGE_SYM_CLASS_END_OF_FUNCTION
-1 (0xFF)
Hata ayıklama amacıyla işlevin sonunu temsil eden özel bir simge.
IMAGE_SYM_CLASS_NULL
0
Atanmış depolama sınıfı yok.
IMAGE_SYM_CLASS_AUTOMATIC
1
Otomatik (yığın) değişkeni. Değer alanı yığın çerçevesi uzaklığını belirtir.
IMAGE_SYM_CLASS_EXTERNAL
2
Microsoft araçlarının dış simgeler için kullandığı bir değer. Değer alanı, bölüm numarasının IMAGE_SYM_UNDEFINED (0) olması durumunda boyutu gösterir. Bölüm numarası sıfır değilse, Değer alanı bölümün içindeki uzaklığı belirtir.
IMAGE_SYM_CLASS_STATIC
3
Bölümün içindeki simgenin uzaklığı. Değer alanı sıfırsa, simge bir bölüm adını temsil eder.
IMAGE_SYM_CLASS_REGISTER
4
Yazmaç değişkeni. Değer alanı, yazmaç numarasını belirtir.
IMAGE_SYM_CLASS_EXTERNAL_DEF
5
Harici olarak tanımlanan bir simge.
IMAGE_SYM_CLASS_LABEL
6
Modül içinde tanımlanan bir kod etiketi. Değer alanı, bölümü içindeki simgenin uzaklığını belirtir.
IMAGE_SYM_CLASS_UNDEFINED_LABEL
7
Tanımlanmamış bir kod etiketine başvuru.
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
8
Yapı üyesi. Değer alanı n. üyeyi belirtir.
IMAGE_SYM_CLASS_ARGUMENT
9
bir işlevin resmi bağımsız değişkeni (parametre). Değer alanı n. bağımsız değişkeni belirtir.
IMAGE_SYM_CLASS_STRUCT_TAG
10
Yapı etiket adı girdisi.
IMAGE_SYM_CLASS_MEMBER_OF_UNION
11
Bir sendika üyesi. Değer alanı n. üyeyi belirtir.
IMAGE_SYM_CLASS_UNION_TAG
12
Union etiket adı girdisi.
IMAGE_SYM_CLASS_TYPE_DEFINITION
13
Typedef girdisi.
IMAGE_SYM_CLASS_UNDEFINED_STATIC
14
Statik veri bildirimi.
IMAGE_SYM_CLASS_ENUM_TAG
15
Numaralandırılmış tür tagname girdisi.
IMAGE_SYM_CLASS_MEMBER_OF_ENUM
16
Bir sabit listesi üyesi. Değer alanı n. üyeyi belirtir.
IMAGE_SYM_CLASS_REGISTER_PARAM
17
Yazmaç parametresi.
IMAGE_SYM_CLASS_BIT_FIELD
18
Bit alanı başvurusu. Değer alanı, bit alanında n. biti belirtir.
IMAGE_SYM_CLASS_BLOCK
100
.bb (bloğun başlangıcı) veya .eb (bloğun sonu) kaydı. Değer alanı, kod konumunun yeniden konumlandırılabilir adresidir.
IMAGE_SYM_CLASS_FUNCTION
101
Microsoft araçlarının bir işlevin kapsamını tanımlayan sembol kayıtları için kullandığı bir değer: begin işlevi (.bf ), end işlevi ( .ef ) ve işlevdeki çizgiler ( .lf ). .lf kayıtları için Değer alanı işlevdeki kaynak satırların sayısını verir. .ef kayıtları için Value alanı işlev kodunun boyutunu verir.
IMAGE_SYM_CLASS_END_OF_STRUCT
102
Bir yapı sonu girişi.
IMAGE_SYM_CLASS_FILE
103
Microsoft araçlarının ve geleneksel COFF biçiminin kaynak dosya simgesi kaydı için kullandığı bir değerdir. Simgeyi, dosyayı adlandıran yardımcı kayıtlar izler.
IMAGE_SYM_CLASS_SECTION
104
Bölümün tanımı (Microsoft araçları bunun yerine STATIC depolama sınıfını kullanır).
IMAGE_SYM_CLASS_WEAK_EXTERNAL
105
Zayıf bir dış. Daha fazla bilgi için bkz. Yardımcı Biçim 3: Zayıf Dışlar .
IMAGE_SYM_CLASS_CLR_TOKEN
107
CLR belirteci simgesi. Ad, belirtecin onaltılık değerinden oluşan bir ASCII dizesidir. Daha fazla bilgi için bkz. CLR Belirteç Tanımı (Yalnızca Nesne).

 

Yardımcı Sembol Kayıtları

Yardımcı sembol tablosu kayıtları her zaman bazı standart sembol tablo kayıtlarını izler ve bu kayıtlara uygulanır. Yardımcı kayıt, araçların tanıyabileceği herhangi bir biçime sahip olabilir, ancak sembol tablosunun normal boyutta bir dizi olarak korunması için bunlar için 18 bayt ayrılması gerekir. Şu anda, Microsoft araçları şu tür kayıtlar için yardımcı biçimleri tanır: işlev tanımları, işlev başlangıç ve bitiş simgeleri (.bf ve .ef), zayıf dışlar, dosya adları ve bölüm tanımları.

Geleneksel COFF tasarımı, diziler ve yapılar için yardımcı kayıt biçimlerini de içerir. Microsoft araçları bunları kullanmaz, bunun yerine sembolik bilgileri hata ayıklama bölümlerine Visual C++ hata ayıklama biçimine yerleştirir.

Yardımcı Biçim 1: İşlev Tanımları

Simge tablosu kaydı, aşağıdakilerin tümüne sahipse işlev tanımının başlangıcını işaretler: EXTERNAL (2) depolama sınıfı, işlev olduğunu belirten tür değeri (0x20) ve sıfırdan büyük bir bölüm numarası. UNDEFINED (0) bölüm numarasına sahip bir sembol tablosu kaydının işlevi tanımlamadığını ve yardımcı kaydı olmadığını unutmayın. İşlev tanımı sembol kayıtlarının ardından aşağıda açıklanan biçimde bir yardımcı kayıt eklenir:

Ofset Boyut Alan Açıklama
0
4
TagIndex
karşılık gelen .bf (begin function) sembol kaydının sembol tablo dizini.
4
4
Toplam Toplam
İşlevin kendisi için yürütülebilir kodun boyutu. İşlev kendi bölümündeyse, bölüm üst bilgisindeki SizeOfRawData, hizalama konularına bağlı olarak bu alana eşit veya daha büyüktür.
8
4
PointerToLinenumber
İşlev için ilk COFF satır-numarası girişinin dosya uzaklığı veya yoksa sıfır. Daha fazla bilgi için bkz. COFF Satır Numaraları (Kullanım Dışı).
12
4
PointerToNextFunction
Sonraki işlev için kaydın sembol tablosu dizini. İşlev sembol tablosundaki son işlevse, bu alan sıfır olarak ayarlanır.
16
2
Kullanılma -yan

 

Yardımcı Biçim 2: .bf ve .ef Sembolleri

Sembol tablosundaki her işlev tanımı için, üç öğe satır başlangıcını, sonunu ve sayısını açıklar. Bu simgelerin her biri function (101) depolama sınıfına sahiptir:

.bf adlı bir sembol kaydı (begin işlevi). Değer alanı kullanılmamış.

.lf adlı bir sembol kaydı (işlevdeki satırlar). Değer alanı işlevdeki satır sayısını verir.

.ef adlı bir sembol kaydı (işlev sonu). Değer alanı, işlev tanımı sembol kaydındaki Toplam Boyut alanıyla aynı sayıya sahiptir.

.bf ve .ef sembol kayıtları (.lf kayıtları değil) aşağıdaki biçime sahip bir yardımcı kayıt tarafından takip edilir:

Ofset Boyut Alan Açıklama
0
4
Kullanılma -yan
4
2
Satırsayısı
Kaynak dosyadaki .bf veya .ef kaydına karşılık gelen gerçek sıralı satır numarası (1, 2, 3 vb.).
6
6
Kullanılma -yan
12
4
PointerToNextFunction (yalnızca .bf)
Sonraki .bf sembol kaydının sembol tablosu dizini. İşlev sembol tablosundaki son işlevse, bu alan sıfır olarak ayarlanır. .ef kayıtları için kullanılmaz.
16
2
Kullanılma -yan

 

Yardımcı Biçim 3: Zayıf Dışlar

"Zayıf dışlar", bağlantı zamanında esneklik sağlayan nesne dosyaları için bir mekanizmadır. Modül çözülmemiş bir dış simge (sym1) içerebilir, ancak bağlantı zamanında sym1 yoksa, başvuruları çözümlemek için başka bir dış simgenin (sym2) kullanıldığını gösteren yardımcı bir kayıt da içerebilir.

Sym1'in tanımı bağlıysa, simgeye yönelik dış başvuru normal şekilde çözümlenir. Sym1'in tanımı bağlı değilse, sym1 için zayıf dışa yapılan tüm başvurular bunun yerine sym2'ye başvurur. Sym2 dış simgesi her zaman bağlı olmalıdır; genellikle, sym1'e zayıf başvuruyu içeren modülde tanımlanır.

Zayıf dış öğeler EXTERNAL depolama sınıfı, UNDEF bölüm numarası ve sıfır değeri olan bir sembol tablosu kaydıyla temsil edilir. Zayıf-dış simge kaydının ardından aşağıdaki biçime sahip bir yardımcı kayıt eklenir:

Ofset Boyut Alan Açıklama
0
4
TagIndex
sym2'nin sembol-tablo dizini, sym1 bulunamazsa bağlanacak simge.
4
4
Özellik -lerini
IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY değeri, sym1 için kitaplık araması yapılmaması gerektiğini gösterir.
IMAGE_WEAK_EXTERN_SEARCH_LIBRARY değeri, sym1 için kitaplık araması yapılması gerektiğini gösterir.
IMAGE_WEAK_EXTERN_SEARCH_ALIAS değeri, sym1'in sym2 için bir diğer ad olduğunu gösterir.
8
10
Kullanılma -yan

 

Özellikler alanının WINNT'de tanımlanmadığını unutmayın. H; bunun yerine Toplam Boyut alanı kullanılır.

Yardımcı Biçim 4: Dosyalar

Bu biçim, FILE (103) depolama sınıfına sahip bir sembol tablosu kaydını izler. Simge adının kendisi .file olmalıdır ve bunu izleyen yardımcı kayıt bir kaynak kod dosyasının adını verir.

Ofset Boyut Alan Açıklama
0
18
Dosya Adı
Kaynak dosyanın adını veren ANSI dizesi. Bu, uzunluk üst sınırından küçükse null değerlerle doldurulur.

 

Yardımcı Biçim 5: Bölüm Tanımları

Bu biçim, bir bölümü tanımlayan bir sembol-tablo kaydını izler. Böyle bir kayıt, bir bölümün adı olan bir simge adına (.text veya .drectve gibi) ve static (3) depolama sınıfına sahiptir. Yardımcı kayıt, başvurduğu bölüm hakkında bilgi sağlar. Bu nedenle, bölüm üst bilgisindeki bazı bilgileri yineler.

Ofset Boyut Alan Açıklama
0
4
Uzunluk
Bölüm verilerinin boyutu; bölüm üst bilgisindeki SizeOfRawData ile aynıdır.
4
2
NumberOfRelocations
Bölümün yeniden konumlandırma girdilerinin sayısı.
6
2
NumberOfLinenumbers
Bölümün satır numarası girdilerinin sayısı.
8
4
Sağlama toplamı
Ortak veriler için sağlama toplamı. bölüm üst bilgisinde IMAGE_SCN_LNK_COMDAT bayrağı ayarlanmışsa geçerlidir. Daha fazla bilgi için bkz. COMDAT Bölümleri (Yalnızca Nesne).
12
2
Sayı
İlişkili bölümün bölüm tablosuna tek tabanlı dizin. Bu, COMDAT seçim ayarı 5 olduğunda kullanılır.
14
1
Seleksiyon
COMDAT seçim numarası. Bu, bölüm bir COMDAT bölümüyse geçerlidir.
15
3
Kullanılma -yan

 

COMDAT Bölümleri (Yalnızca Nesne)

Bölüm tanımı yardımcı biçiminin Seçim alanı, bölüm bir COMDAT bölümüyse geçerlidir. COMDAT bölümü, birden çok nesne dosyası tarafından tanımlanabilen bir bölümdür. (bayrak IMAGE_SCN_LNK_COMDAT, bölüm üst bilgisinin Bölüm Bayrakları alanında ayarlanır.) Seçim alanı, bağlayıcının COMDAT bölümlerinin birden çok tanımını nasıl çözümlediğini belirler.

COMDAT bölümünün bölüm değerine sahip ilk simge bölüm simgesi olmalıdır. Bu simgede bölümün adı, Sıfıra eşit Değer alanı, söz konusu COMDAT bölümünün bölüm numarası, IMAGE_SYM_TYPE_NULL eşit Tür alanı, IMAGE_SYM_CLASS_STATIC eşit Sınıf alanı ve bir yardımcı kayıt bulunur. İkinci simge "COMDAT simgesi" olarak adlandırılır ve bağlayıcı tarafından Seçim alanıyla birlikte kullanılır.

Seçim alanının değerleri aşağıda gösterilmiştir.

Sabit Değer Açıklama
IMAGE_COMDAT_SELECT_NODUPLICATES
1
Bu simge zaten tanımlanmışsa, bağlayıcı bir "tanımlı simgeyi çarpma" hatası döndürür.
IMAGE_COMDAT_SELECT_ANY
2
Aynı COMDAT simgesini tanımlayan herhangi bir bölüm bağlanabilir; geri kalanı kaldırılır.
IMAGE_COMDAT_SELECT_SAME_SIZE
3
Bağlayıcı, bu simgenin tanımları arasında rastgele bir bölüm seçer. Tüm tanımlar aynı boyutta değilse bir "tanımlı simgeyi çarpma" hatası verilir.
IMAGE_COMDAT_SELECT_EXACT_MATCH
4
Bağlayıcı, bu simgenin tanımları arasında rastgele bir bölüm seçer. Tüm tanımlar tam olarak eşleşmiyorsa bir "tanımlı simgeyi çarpma" hatası verilir.
IMAGE_COMDAT_SELECT_ASSOCIATIVE
5
Başka bir COMDAT bölümü bağlıysa bölüm bağlantılıdır. Bu diğer bölüm, bölüm tanımı için yardımcı sembol kaydının Sayı alanıyla gösterilir. Bu ayar, birden çok bölümde bileşenleri olan (örneğin, birindeki kod ve diğerindeki veriler) ancak bunların tümünün bir küme olarak bağlanması veya atılması gereken tanımlar için kullanışlıdır. Bu bölümün ilişkilendirildiği diğer bölüm, başka bir ilişkilendirilebilir COMDAT bölümü olabilecek bir COMDAT bölümü olmalıdır. İlişkili COMDAT bölümünün bölüm ilişkilendirme zinciri döngü oluşturamaz. Bölüm ilişkilendirme zincirinin sonunda IMAGE_COMDAT_SELECT_ASSOCIATIVE ayarlı olmayan bir COMDAT bölümüne gelmesi gerekir.
IMAGE_COMDAT_SELECT_LARGEST
6
Bağlayıcı, bu simgenin tüm tanımları arasından en büyük tanımı seçer. Bu boyuta sahip birden çok tanım varsa, aralarındaki seçim rastgeledir.

 

CLR Belirteci Tanımı (Yalnızca Nesne)

Bu yardımcı sembol genellikle IMAGE_SYM_CLASS_CLR_TOKEN izler. Bir belirteci COFF sembol tablosunun ad alanıyla ilişkilendirmek için kullanılır.

Ofset Boyut Alan Açıklama
0
1
bAuxType
IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1) olmalıdır.
1
1
bReserved
Ayrılmış, sıfır olmalıdır.
2
4
SymbolTableIndex
Bu CLR belirteci tanımının başvurduğu COFF simgesinin sembol dizini.
6
12
Ayrılmış, sıfır olmalıdır.

 

COFF Dize Tablosu

COFF sembol tablosunun hemen ardından COFF dize tablosu gelir. Bu tablonun konumu, COFF üst bilgisindeki sembol tablosu adresi alınarak ve simgenin boyutuyla çarpılan simge sayısı eklenerek bulunur.

COFF dize tablosunun başında, dize tablosunun geri kalanının toplam boyutunu (bayt cinsinden) içeren 4 bayt vardır. Bu boyut boyut alanının kendisini içerir, böylece bu konumdaki değer dize yoksa 4 olur.

Boyutun ardından, COFF sembol tablosundaki simgeler tarafından işaret edilen null ile sonlandırılan dizeler bulunur.

Öznitelik Sertifikası Tablosu (Yalnızca Görüntü)

Öznitelik sertifikaları, bir öznitelik sertifika tablosu eklenerek bir görüntüyle ilişkilendirilebilir. Öznitelik sertifikası tablosu, bitişik, dörtlüyle hizalanmış öznitelik sertifika girdileri kümesinden oluşur. Bu hizalamayı elde etmek için dosyanın özgün ucuyla öznitelik sertifikası tablosunun başlangıcı arasına sıfır doldurma eklenir. Her öznitelik sertifikası girdisi aşağıdaki alanları içerir.

Ofset Boyut Alan Açıklama
0
4
dwLength
Öznitelik sertifikası girişinin uzunluğunu belirtir.
4
2
wRevision
Sertifika sürüm numarasını içerir. Ayrıntılar için aşağıdaki metne bakın.
6
2
wCertificateType
bCertificate içindeki içerik türünü belirtir. Ayrıntılar için aşağıdaki metne bakın.
8
Aşağıdakilere bakın
bCertificate
Authenticode imzası gibi bir sertifika içerir. Ayrıntılar için aşağıdaki metne bakın.

 

İsteğe Bağlı Üst Bilgi Veri Dizini'ndeki Sertifika Tablosu girdisindeki sanal adres değeri, ilk öznitelik sertifika girdisine bir dosya uzaklığıdır. Sonraki girişlere, geçerli öznitelik sertifika girişinin başlangıcından 8 baytlık bir katına yuvarlanmış olan dwLength baytları ilerletilerek erişilir. Bu, yuvarlatılmış dwLength değerlerinin toplamı İsteğe Bağlı Üst Bilgi Veri Dizinindeki Sertifikalar Tablosu girdisindeki Boyut değerine eşit olana kadar devam eder. Yuvarlatılmış dwLength değerlerinin toplamı Boyut değerine eşit değilse, öznitelik sertifika tablosu veya Boyut alanı bozulur.

Örneğin, İsteğe Bağlı Üst Bilgi Veri Dizini'nin Sertifika Tablosu Girişi şunları içeriyorsa:

virtual address = 0x5000
size = 0x1000

İlk sertifika, disk üzerindeki dosyanın başlangıcından 0x5000 uzaklıkta başlar. Tüm öznitelik sertifikası girişlerinde ilerlemek için:

  1. İlk öznitelik sertifikasının dwLength değerini başlangıç uzaklığına ekleyin.
  2. İkinci öznitelik sertifika girişinin uzaklığını bulmak için 1. adımdaki değeri en yakın 8 baytlık katına yuvarlar.
  3. Üçüncü öznitelik sertifika girişinin uzaklığını belirlemek için 2. adımdaki uzaklık değerini ikinci öznitelik sertifika girişinin dwLength değerine ekleyin ve en yakın 8 baytlık kat yukarı yuvarlar.
  4. Hesaplanmış uzaklık 0x6000 eşit olana kadar (başlangıç + toplam boyut 0x5000 0x1000) sonraki her sertifika için 3. adımı yineleyin. Bu da tablonun tamamında yürüdüğünüz gösterir.

Alternatif olarak, döngüdeki Win32 ImageEnumerateCertificates işlevini çağırarak sertifika girdilerini numaralandırabilirsiniz. İşlevin başvuru sayfasına bağlantı için bkz. Başvurular.

Öznitelik sertifika tablosu girdileri, girdi doğru dwLength değerine, benzersiz bir wRevision değerine ve benzersiz bir wCertificateType değerine sahip olduğu sürece herhangi bir sertifika türü içerebilir. En yaygın sertifika tablosu girişi türü, Wintrust.h dosyasında belgelenen ve bu bölümün geri kalanında ele alınan WIN_CERTIFICATE bir yapıdır.

WIN_CERTIFICATE wRevision üyesinin seçenekleri aşağıdakileri içerir (ancak bunlarla sınırlı değildir).

Değer Ad Notlar
0x0100
WIN_CERT_REVISION_1_0
Sürüm 1, Win_Certificate yapısının eski sürümü. Yalnızca eski Authenticode imzalarını doğrulama amacıyla desteklenir
0x0200
WIN_CERT_REVISION_2_0
Sürüm 2, Win_Certificate yapısının geçerli sürümüdür.

 

wCertificateType üyesinin WIN_CERTIFICATE seçenekleri aşağıdaki tablodaki öğeleri içerir (ancak bunlarla sınırlı değildir). Bazı değerlerin şu anda desteklenmediğini unutmayın.

Değer Ad Notlar
0x0001
WIN_CERT_TYPE_X509
bCertificate bir X.509 Sertifikası içeriyor
Desteklenmiyor
0x0002
WIN_CERT_TYPE_PKCS_SIGNED_DATA
bCertificate bir PKCS#7 SignedData yapısı içeriyor
0x0003
WIN_CERT_TYPE_RESERVED_1
Ayrılmış
0x0004
WIN_CERT_TYPE_TS_STACK_SIGNED
Terminal Sunucusu Protokol Yığını Sertifika imzalama
Desteklenmiyor

 

WIN_CERTIFICATE yapısının bCertificate üyesi, wCertificateTypetarafından belirtilen içerik türüne sahip değişken uzunlukta bir bayt dizisi içerir. Authenticode tarafından desteklenen tür WIN_CERT_TYPE_PKCS_SIGNED_DATA, PKCS#7 SignedData yapısıdır. Authenticode dijital imza biçimiyle ilgili ayrıntılar için bkz. Windows Authenticode Taşınabilir Yürütülebilir İmza Biçimi.

bCertificate içeriği dörtlü bir sınırda bitmezse, öznitelik sertifikası girdisi, bCertificate sonundan sonraki dörtlü sınıra kadar sıfırlarla doldurulur.

dwLength değeri, son haline getirilmiş WIN_CERTIFICATE yapısının uzunluğudur ve şöyle hesaplanır:

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

Bu uzunluk, her WIN_CERTIFICATE yapısının dörte tek hizalı olması gereksinimini karşılamak için kullanılan doldurmaların boyutunu içermelidir:

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

İsteğe Bağlı Üst Bilgi Veri Dizinleri (Yalnızca Görüntü)SertifikaLar Tablosu girdisinde belirtilen Sertifika Tablosu boyutudoldurmayı içerir.

PE Dosyalarında sertifikaları listelemek, eklemek ve kaldırmak için ImageHlp API'sini kullanma hakkında daha fazla bilgi için bkz. imagehlp işlevleri .

Sertifika Verileri

Önceki bölümde belirtildiği gibi, öznitelik sertifika tablosundaki sertifikalar herhangi bir sertifika türü içerebilir. PE dosyasının bütünlüğünü sağlayan sertifikalar pe görüntü karması içerebilir.

PE görüntü karması (veya dosya karması), karma algoritmasının bir dosyanın bütünlüğüyle ilgili bir ileti özeti oluşturması içindeki bir dosya sağlama toplamına benzer. Ancak, sağlama toplamı basit bir algoritma tarafından oluşturulur ve öncelikle disk üzerindeki bir bellek bloğunun bozulup bozulmadığını ve orada depolanan değerlerin bozulup bozulmadığını algılamak için kullanılır. Dosya karması, dosya bozulmasını da algılayan sağlama toplamına benzer. Ancak çoğu sağlama toplamı algoritmasından farklı olarak, dosya karması değiştirilmemiş özgün değerinden değiştirilmeden bir dosyayı değiştirmek çok zordur. Bu nedenle bir dosya karması, virüsler, bilgisayar korsanları veya Truva atı programları tarafından tanıtılanlar gibi bir dosyada kasıtlı ve hatta ince değişiklikleri algılamak için kullanılabilir.

Bir sertifikaya dahil edildiğinde, görüntü özetinin PE Görüntüsündeki, İsteğe Bağlı Üst Bilgi Veri Dizinlerindeki Sağlama Toplamı ve Sertifika Tablosu girdisi gibi belirli alanları dışlaması gerekir. Bunun nedeni, Sertifika ekleme eyleminin bu alanları değiştirmesi ve farklı bir karma değerin hesaplanmasına neden olmasıdır.

Win32 ImageGetDigestStream işlevi, işlevleri karma olarak kullanmak için hedef PE dosyasından bir veri akışı sağlar. Sertifikalar pe dosyasına eklendiğinde veya pe dosyasından kaldırıldığında bu veri akışı tutarlı olmaya devam eder. ImageGetDigestStream'a geçirilen parametrelere bağlı olarak, PE görüntüsündeki diğer veriler karma hesaplamadan atlanabilir. İşlevin başvuru sayfasına bağlantı için bkz. Başvurular.

Delay-Load İçeri Aktarma Tabloları (Yalnızca Resim)

Bu tablolar, uygulamaların dll dosyasının yüklenmesini o DLL'ye ilk çağrıya kadar geciktirmesi için tekdüzen bir mekanizmayı desteklemek üzere görüntüye eklendi. Tabloların düzeni, .idata Bölümü bölüm 6.4'te açıklanan geleneksel içeri aktarma tablolarının düzeniyle eşleşir. Burada yalnızca birkaç ayrıntı ele alınıyor.

Delay-Load Dizin Tablosu

Delay-load dizin tablosu, içeri aktarma dizin tablosunun karşılığıdır. İsteğe bağlı üst bilgi veri dizinleri listesindeki (uzaklık 200) İçeri Aktarma Tanımlayıcısını Geciktir girdisi aracılığıyla alınabilir. Tablo aşağıdaki gibi düzenlenmiştir:

Ofset Boyut Alan Açıklama
0
4
Öznitelik
Sıfır olmalıdır.
4
4
Ad
Yüklenecek DLL'nin adının RVA'sı. Ad, görüntünün salt okunur veriler bölümünde bulunur.
8
4
Modül Tutamacı
Gecikmeli yüklenecek DLL'nin modül tanıtıcısının RVA'sı (görüntünün veri bölümünde). Gecikmeli yüklemeyi yönetmek için sağlanan yordam tarafından depolama için kullanılır.
12
4
Adres Tablosunu İçeri Aktarmayı Geciktir
Gecikmeli yükleme içeri aktarma adresi tablosunun RVA'sı. Daha fazla bilgi için bkz. İçeri Aktarma Adresi Tablosunu Geciktirme (IAT).
16
4
İçeri Aktarma Adı Tablosunu Geciktir
Yüklenmesi gerekebilecek içeri aktarmaların adlarını içeren delay-load ad tablosunun RVA'sı. Bu, içeri aktarma adı tablosunun düzeniyle eşleşir. Daha fazla bilgi için bkz. İpucu/Ad Tablosu.
20
4
İlişkili Gecikmeli İçeri Aktarma Tablosu
Varsa, ilişkili gecikme yükü adres tablosunun RVA'sı.
24
4
Gecikmeyi Kaldırma İçeri Aktarma Tablosu
Varsa, kaldırma gecikme yükü adres tablosunun RVA'sı. Bu, gecikmeli içeri aktarma adresi tablosunun tam kopyasıdır. Çağıran DLL'yi kaldırırsa, dll'ye yapılan sonraki çağrıların thunking mekanizmasını doğru kullanmaya devam etmesi için bu tablo gecikmeli içeri aktarma adresi tablosunun üzerine kopyalanmalıdır.
28
4
Zaman Damgası
Bu görüntünün bağlandığı DLL'nin zaman damgası.

 

Bu veri yapısında başvuruda bulunan tablolar, geleneksel içeri aktarma işlemleri için olduğu gibi düzenlenip sıralanır. Ayrıntılar için bkz. .idata Bölümü .

Öznitelik

Henüz hiçbir öznitelik bayrağı tanımlanmamıştır. Bağlayıcı, görüntüde bu alanı sıfır olarak ayarlar. Bu alan, yeni alanların varlığını belirterek kaydı genişletmek için veya gecikme veya yardımcı işlevleri kaldırma davranışlarını göstermek için kullanılabilir.

Ad

Gecikmeli yüklenecek DLL'nin adı görüntünün salt okunur veriler bölümünde yer alır. SzName alanı üzerinden başvurulur.

Modül Tutamacı

Gecikmeli yüklenecek DLL'nin tanıtıcısı, görüntünün veri bölümündedir. Phmod alanı tutamacı gösterir. Sağlanan gecikme yükleme yardımcısı, bu konumu kullanarak yüklenen DLL'nin tutamacını depolar.

Adres Tablosunu İçeri Aktarmayı Geciktir

Gecikmeli içeri aktarma adresi tablosuna (IAT), pIAT alanı aracılığıyla gecikmeli içeri aktarma tanımlayıcısı tarafından başvurulur. Gecikme yükleme yardımcısı, bu işaretçileri gerçek giriş noktalarıyla güncelleştirir, böylece thunks artık çağrı döngüsünde olmaz. İşlev işaretçilerine pINT->u1.Functionifadesi kullanılarak erişilir.

İçeri Aktarma Adı Tablosunu Geciktir

Gecikmeli içeri aktarma adı tablosu (INT), yüklenmesi gerekebilecek içeri aktarmaların adlarını içerir. Bunlar, IAT'deki işlev işaretçileriyle aynı şekilde sıralanır. Bunlar standart INT ile aynı yapılardan oluşur ve pINT->u1.AddressOfData->Name[0]ifadesi kullanılarak erişilir.

Gecikme Sınırı İçeri Aktarma Adresi Tablosu ve Zaman Damgası

Gecikme sınırı içeri aktarma adresi tablosu (BIAT), işlem sonrası bağlama aşaması tarafından gecikme yükleme dizin tablosunun zaman damgası alanıyla birlikte kullanılan isteğe bağlı bir IMAGE_THUNK_DATA öğeleri tablosudur.

İçeri Aktarma Adresi Tablosunu Kaldırmayı Geciktir

Gecikmeli yükleme kaldırma içeri aktarma adresi tablosu (UIAT), kaldırma kodunun açık bir kaldırma isteğini işlemek için kullandığı isteğe bağlı bir IMAGE_THUNK_DATA öğesi tablosudur. Kodu delay-load thunks'a yönlendiren özgün IAT'nin tam bir kopyası olan salt okunur bölümdeki başlatılan verilerden oluşur. Kaldırma isteğinde kitaplık serbest, *phmod temizlenebilir ve her şeyi önceden yükleme durumuna geri yüklemek için IAT üzerinden yazılan UIAT.

Özel Bölümler

Tipik COFF bölümleri, bağlayıcıların ve Microsoft Win32 yükleyicilerinin bölüm içeriği hakkında özel bir bilgi olmadan işlediği kod veya veriler içerir. İçerikler yalnızca bağlı olan veya yürütülen uygulamayla ilgilidir.

Ancak, bazı COFF bölümlerinin nesne dosyalarında veya görüntü dosyalarında bulunduğunda özel anlamları vardır. Araçlar ve yükleyiciler, bölüm üst bilgisinde ayarlanmış özel bayrakları olduğundan, resim isteğe bağlı üst bilgideki özel konumlar kendilerine işaret ettiğinden veya bölüm adının kendisi bölümün özel bir işlevini gösterdiğinden bu bölümleri tanır. (Bölüm adının kendisi bölümün özel bir işlevini belirtmese bile, bölüm adı kurala göre dikte edilir, bu nedenle bu belirtimin yazarları her durumda bir bölüm adına başvurabilir.)

Ayrılmış bölümler ve öznitelikleri aşağıdaki tabloda açıklanmıştır ve ardından yürütülebilir dosyalarda kalıcı olan bölüm türleri ve uzantılar için meta veriler içeren bölüm türleri için ayrıntılı açıklamalar yer alır.

Bölüm Adı İçerik Özellik -lerini
.Bss
Başlatılmamış veriler (ücretsiz biçim)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.cormeta
Nesne dosyasının yönetilen kod içerdiğini gösteren CLR meta verileri
IMAGE_SCN_LNK_INFO
.veri
Başlatılan veriler (ücretsiz biçim)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.debug$F
Oluşturulan FPO hata ayıklama bilgileri (yalnızca nesne, yalnızca x86 mimarisi ve artık kullanım dışı)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$P
Önceden derlenmiş hata ayıklama türleri (yalnızca nesne)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$S
Hata ayıklama simgeleri (yalnızca nesne)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$T
Hata ayıklama türleri (yalnızca nesne)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.drective
Bağlayıcı seçenekleri
IMAGE_SCN_LNK_INFO
.edata
Tabloları dışarı aktarma
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.idata
Tabloları içeri aktarma
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.idlsym
IDL özniteliklerini desteklemek için kayıtlı SEH (yalnızca görüntü) içerir. Daha fazla bilgi için, bu konunun sonundaki Başvurular "IDL Öznitelikleri" bölümüne bakın.
IMAGE_SCN_LNK_INFO
.pdata
Özel durum bilgileri
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.rdata
Salt okunur başlatılan veriler
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.reloc
Görüntü yeniden konumlandırmaları
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.rsrc
Kaynak dizini
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.sbss
GP göreli başlatılmamış veriler (ücretsiz biçim)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL IMAGE_SCN_GPREL bayrağı yalnızca IA64 mimarileri için ayarlanmalıdır; bu bayrak diğer mimariler için geçerli değil. IMAGE_SCN_GPREL bayrağı yalnızca nesne dosyaları içindir; Bu bölüm türü bir görüntü dosyasında göründüğünde, IMAGE_SCN_GPREL bayrağı ayarlanmamalıdır.
.sdata
GP göreli başlatılan veriler (ücretsiz biçim)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL IMAGE_SCN_GPREL bayrağı yalnızca IA64 mimarileri için ayarlanmalıdır; bu bayrak diğer mimariler için geçerli değil. IMAGE_SCN_GPREL bayrağı yalnızca nesne dosyaları içindir; Bu bölüm türü bir görüntü dosyasında göründüğünde, IMAGE_SCN_GPREL bayrağı ayarlanmamalıdır.
.srdata
GP göreli salt okunur veriler (ücretsiz biçim)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL IMAGE_SCN_GPREL bayrağı yalnızca IA64 mimarileri için ayarlanmalıdır; bu bayrak diğer mimariler için geçerli değil. IMAGE_SCN_GPREL bayrağı yalnızca nesne dosyaları içindir; Bu bölüm türü bir görüntü dosyasında göründüğünde, IMAGE_SCN_GPREL bayrağı ayarlanmamalıdır.
.sxdata
Kayıtlı özel durum işleyici verileri (yalnızca serbest biçim ve x86/nesne)
IMAGE_SCN_LNK_INFO Nesne dosyasındaki kod tarafından başvurulmakta olan özel durum işleyicilerinin her birinin sembol dizinini içerir. Simge bir UNDEF simgesi veya bu modülde tanımlanan simge olabilir.
.Metin
Yürütülebilir kod (ücretsiz biçim)
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
.tls
İş parçacığı yerel depolama (yalnızca nesne)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.tls$
İş parçacığı yerel depolama (yalnızca nesne)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.vsdata
GP göreli olarak başlatılan veriler (ücretsiz biçim ve yalnızca ARM, SH4 ve Thumb mimarileri için)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.xdata
Özel durum bilgileri (ücretsiz biçim)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

 

Burada listelenen bölümlerden bazıları, özel semantiklerinin sırasıyla yalnızca nesne dosyaları veya görüntü dosyaları için uygun olduğunu belirtmek için "yalnızca nesne" veya "yalnızca görüntü" olarak işaretlenir. "Yalnızca görüntü" olarak işaretlenmiş bir bölüm, görüntü dosyasına girmenin bir yolu olarak nesne dosyasında görünmeye devam edebilir, ancak bölümün bağlayıcı için özel bir anlamı yoktur, yalnızca görüntü dosyası yükleyicisi için geçerlidir.

.debug Bölümü

.debug bölümü, derleyici tarafından oluşturulan hata ayıklama bilgilerini içeren nesne dosyalarında ve görüntü dosyalarında oluşturulan tüm hata ayıklama bilgilerini içerecek şekilde kullanılır. Bu bölümde, nesne ve görüntü dosyalarındaki hata ayıklama bilgilerinin paketlenmesi açıklanmaktadır.

Sonraki bölümde, görüntünün herhangi bir yerinde bulunabilen hata ayıklama dizininin biçimi açıklanmaktadır. Sonraki bölümlerde hata ayıklama bilgileri içeren nesne dosyalarındaki "gruplar" açıklanmaktadır.

Bağlayıcı için varsayılan değer, hata ayıklama bilgilerinin görüntünün adres alanına eşlenmemesidir. .debug bölümü yalnızca hata ayıklama bilgileri adres alanına eşlendiğinde bulunur.

Dizinde Hata Ayıklama (Yalnızca Görüntü)

Görüntü dosyaları, hangi tür hata ayıklama bilgilerinin mevcut olduğunu ve nerede olduğunu gösteren isteğe bağlı bir hata ayıklama dizini içerir. Bu dizin, konumu ve boyutu isteğe bağlı görüntü üst bilgisinde belirtilen bir hata ayıklama dizini girdileri dizisini içerir.

Hata ayıklama dizini atılabilir bir .debug bölümünde (varsa) veya görüntü dosyasındaki başka bir bölüme dahil edilebilir veya hiç bir bölümde yer almayabilir.

Her hata ayıklama dizini girdisi, hata ayıklama bilgileri bloğunun konumunu ve boyutunu tanımlar. Hata ayıklama bilgileri bir bölüm üst bilgisi kapsamında değilse (yani, görüntü dosyasında bulunur ve çalışma zamanı adres alanına eşlenmemişse) belirtilen RVA sıfır olabilir. Eşlenmişse, adresi RVA'dır.

Hata ayıklama dizini girdisi aşağıdaki biçime sahiptir:

Ofset Boyut Alan Açıklama
0
4
Özellik -lerini
Ayrılmış, sıfır olmalıdır.
4
4
TimeDateStamp
Hata ayıklama verilerinin oluşturulduğu saat ve tarih.
8
2
MajorVersion
Hata ayıklama veri biçiminin ana sürüm numarası.
10
2
MinorVersion
Hata ayıklama veri biçiminin ikincil sürüm numarası.
12
4
Tür
Hata ayıklama bilgilerinin biçimi. Bu alan, birden çok hata ayıklayıcı desteği sağlar. Daha fazla bilgi için bkz. hata ayıklama türü .
16
4
SizeOfData
Hata ayıklama verilerinin boyutu (hata ayıklama dizini dahil değildir).
20
4
AddressOfRawData
Görüntü tabanına göre yüklendiğinde hata ayıklama verilerinin adresi.
24
4
PointerToRawData
Hata ayıklama verilerinin dosya işaretçisi.

 

Hata Ayıklama Türü

Hata ayıklama dizin girişinin Tür alanı için aşağıdaki değerler tanımlanır:

Sabit Değer Açıklama
IMAGE_DEBUG_TYPE_UNKNOWN
0
Tüm araçlar tarafından yoksayılan bilinmeyen bir değer.
IMAGE_DEBUG_TYPE_COFF
1
COFF hata ayıklama bilgileri (satır numaraları, sembol tablosu ve dize tablosu). Bu tür hata ayıklama bilgileri de dosya üst bilgilerindeki alanlara göre işaret edilir.
IMAGE_DEBUG_TYPE_CODEVIEW
2
Visual C++ hata ayıklama bilgileri.
IMAGE_DEBUG_TYPE_FPO
3
Çerçeve işaretçisi atla (FPO) bilgileri. Bu bilgiler hata ayıklayıcıya, EBP yazmacını çerçeve işaretçisi dışında bir amaç için kullanan standart olmayan yığın çerçevelerini yorumlamayı bildirir.
IMAGE_DEBUG_TYPE_MISC
4
DBG dosyasının konumu.
IMAGE_DEBUG_TYPE_EXCEPTION
5
.pdata bölümünün kopyası.
IMAGE_DEBUG_TYPE_FIXUP
6
Ayrılmış.
IMAGE_DEBUG_TYPE_OMAP_TO_SRC
7
Görüntüdeki RVA'dan kaynak görüntüdeki RVA'ya eşleme.
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
8
Kaynak görüntüdeki RVA'dan görüntüdeki RVA'ya eşleme.
IMAGE_DEBUG_TYPE_BORLAND
9
Borland için ayrılmış.
IMAGE_DEBUG_TYPE_RESERVED10
10
Ayrılmış.
IMAGE_DEBUG_TYPE_CLSID
11
Ayrılmış.
IMAGE_DEBUG_TYPE_REPRO
16
PE determinizmi veya yeniden üretilebilirliği.
Tanımsız
17
Hata ayıklama bilgileri, PointerToRawData tarafından belirtilen konumdaKI PE dosyasına eklenir.
Tanımsız
19
PE/COFF dosyasını derlemek için kullanılan sembol dosyasının içeriği için şifreleme karması depolar.
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20 Genişletilmiş DLL özellikleri bitleri.

 

Tür alanı IMAGE_DEBUG_TYPE_FPO olarak ayarlanırsa, hata ayıklama ham verileri her üyenin bir işlevin yığın çerçevesini açıkladığı bir dizidir. Hata ayıklama türü FPO olsa bile, görüntü dosyasındaki her işlev için FPO bilgileri tanımlanmamalıdır. FPO bilgileri olmayan bu işlevlerin normal yığın çerçeveleri olduğu varsayılır. FPO bilgilerinin biçimi aşağıdaki gibidir:

#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;

IMAGE_DEBUG_TYPE_REPRO türündeki bir girişin varlığı, PE dosyasının belirlenim veya yeniden üretilebilirlik elde etmek için bir şekilde derlenmiş olduğunu gösterir. Giriş değişmezse, PE dosyasının ne zaman veya nerede üretildiği fark etmez, çıkış PE dosyasının bit için bit aynı olması garanti edilir. PE dosyasındaki çeşitli tarih/saat damgası alanları, giriş olarak PE dosya içeriğini kullanan hesaplanan karma değerdeki bitlerin bir bölümü veya tamamıyla doldurulur ve bu nedenle pe dosyasının veya PE içindeki ilgili belirli verilerin oluşturulduğu gerçek tarih ve saati artık temsil etmemektedir. Bu hata ayıklama girdisinin ham verileri boş olabilir veya karma değer uzunluğunu temsil eden dört baytlık bir değerden önce hesaplanan karma değeri içerebilir.

Tür alanı IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS olarak ayarlanırsa, hata ayıklama ham verileri görüntünün isteğe bağlı üst bilgisinde ayarlanabilenlere ek olarak genişletilmiş DLL özellikleri bitleri içerir. İsteğe Bağlı Üst Bilgi Windows-Specific Alanları (Yalnızca Görüntü) bölümünde dll özellikleri bölümüne bakın.

Genişletilmiş DLL Özellikleri

Genişletilmiş DLL özellikleri bitleri için aşağıdaki değerler tanımlanır.

Sabit Değer Açıklama
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 Görüntü, Denetim Akışı Zorlama Teknolojisi (CET) Gölge Yığını ile uyumludur.
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040 Tüm görüntü kodu bölümlerindeki tüm dal hedefleri, x86 CET-Indirect Dalı İzleme (IBT) veya ARM Dal Hedef Belirleme (BTI) yönergeleri gibi ileri uç denetim akışı bütünlük koruması yönergeleriyle açıklama eklenir. Bu bit Windows tarafından kullanılmaz.

.debug$F (Yalnızca Nesne)

Bu bölümdeki verilerin yerini Visual C++ sürüm 7.0 ve sonraki sürümlerde .debug$S alt bölümüne yayılan daha kapsamlı bir veri kümesi almıştır.

Nesne dosyaları, içeriği bir veya daha fazla FPO_DATA kaydı (çerçeve işaretçisi eksik bilgileri) olan .debug$F bölümleri içerebilir. hata ayıklama türü "IMAGE_DEBUG_TYPE_FPO" bölümüne bakın.

Bağlayıcı bu .debug$F kayıtlarını tanır. Hata ayıklama bilgileri oluşturuluyorsa bağlayıcı, FPO_DATA kayıtlarını RVA yordamına göre sıralar ve bunlar için bir hata ayıklama dizini girişi oluşturur.

Derleyici, standart çerçeve biçimine sahip yordamlar için FPO kayıtları oluşturmamalıdır.

.debug$S (Yalnızca Nesne)

Bu bölüm Visual C++ hata ayıklama bilgilerini (sembolik bilgiler) içerir.

.debug$P (Yalnızca Nesne)

Bu bölüm Visual C++ hata ayıklama bilgilerini (önceden derlenmiş bilgiler) içerir. Bunlar, bu nesneyle oluşturulan önceden derlenmiş üst bilgi kullanılarak derlenen tüm nesneler arasında paylaşılan türlerdir.

.debug$T (Yalnızca Nesne)

Bu bölüm Visual C++ hata ayıklama bilgilerini (tür bilgileri) içerir.

Microsoft Hata Ayıklama Bilgileri için Bağlayıcı Desteği

Hata ayıklama bilgilerini desteklemek için bağlayıcı:

  • .debug$F, debug$S, .debug$Pve .debug$T bölümlerinden tüm ilgili hata ayıklama verilerini toplar.

  • Bu verileri bağlayıcı tarafından oluşturulan hata ayıklama bilgileriyle birlikte PDB dosyasına işler ve buna başvurmak için bir hata ayıklama dizini girişi oluşturur.

.drectve Bölümü (Yalnızca Nesne)

Bölüm üst bilgisinde IMAGE_SCN_LNK_INFO bayrağı ayarlanmışsa ve bölüm adı .drectve ise bölüm yönerge bölümüdür. Bağlayıcı, bilgileri işledikten sonra bir .drectve bölümünü kaldırır, böylece bölüm bağlı olan görüntü dosyasında görünmez.

.drectve bölümü, ANSI veya UTF-8 olarak kodlanabilen bir metin dizesinden oluşur. UTF-8 bayt sipariş işaretçisi (BOM, 0xEF, 0xBB ve 0xBF oluşan üç baytlık ön ek) yoksa, yönerge dizesi ANSI olarak yorumlanır. Yönerge dizesi, boşluklarla ayrılmış bir bağlayıcı seçenekleri dizisidir. Her seçenek bir kısa çizgi, seçenek adı ve uygun öznitelik içerir. Bir seçenek boşluk içeriyorsa, seçenek tırnak içine alınmalıdır. .drectve bölümünde yeniden konumlandırmalar veya satır numaraları olmamalıdır.

.edata Bölümü (Yalnızca Resim)

.edata adlı dışarı aktarma verileri bölümü, diğer görüntülerin dinamik bağlantı aracılığıyla erişebileceği simgeler hakkında bilgi içerir. Dışarı aktarılan simgeler genellikle DLL'lerde bulunur, ancak DLL'ler simgeleri de içeri aktarabilir.

Dışarı aktarma bölümünün genel yapısına genel bir bakış aşağıda açıklanmıştır. Açıklanan tablolar genellikle dosyada gösterilen sırayla bitişiktir (ancak bu gerekli değildir). Simgeleri sıra olarak dışarı aktarmak için yalnızca dizin tablosunu dışarı aktarma ve adres tablosunu dışarı aktarma gerekir. (Sıralı, dışarı aktarma adresi tablosu dizini tarafından doğrudan erişilen bir dışarı aktarmadır.) Ad işaretçisi tablosu, sıralı tablo ve dışarı aktarma adı tablosunun tümü, dışarı aktarma adlarının kullanımını desteklemek için mevcuttur.

Tablo Adı Açıklama
Dizin tablosunu dışarı aktarma
Tek satırlı bir tablo (hata ayıklama dizininden farklı olarak). Bu tablo, diğer dışarı aktarma tablolarının konumlarını ve boyutlarını gösterir.
Adres tablosunu dışarı aktarma
Dışarı aktarılan simgelerin RVA'ları dizisi. Bunlar, yürütülebilir kod ve veri bölümleri içindeki dışarı aktarılan işlevlerin ve verilerin gerçek adresleridir. Diğer görüntü dosyaları, bu tabloya bir dizin (sıralı) kullanarak veya isteğe bağlı olarak, genel bir ad tanımlanmışsa sıraya karşılık gelen ortak adı kullanarak bir simgeyi içeri aktarabilir.
Ad işaretçisi tablosu
Genel dışarı aktarma adlarına yönelik, artan düzende sıralanmış bir işaretçi dizisi.
Sıralı tablo
Ad işaretçisi tablosunun üyelerine karşılık gelen sıra dizisi. Yazışmalar konuma göredir; bu nedenle, ad işaretçisi tablosu ve sıralı tablo aynı sayıda üyeye sahip olmalıdır. Her sıra, dışarı aktarma adresi tablosundaki bir dizindir.
Ad tablosunu dışarı aktarma
Null olarak sonlandırılan bir dizi ASCII dizesi. Ad işaretçisi tablosunun üyeleri bu alanı işaret edebilir. Bu adlar, simgelerin içeri ve dışarı aktarıldığı ortak adlardır; bunlar, görüntü dosyasında kullanılan özel adlar ile aynı olmayabilir.

 

Başka bir görüntü dosyası ada göre bir simge içeri aktardığında, Win32 yükleyicisi ad işaretçisi tablosunda eşleşen bir dize arar. Eşleşen bir dize bulunursa, ilişkili sıra, sıra tablosunda karşılık gelen üye (yani, ad işaretçisi tablosunda bulunan dize işaretçisiyle aynı dizine sahip sıra tablosunun üyesi) aranarak tanımlanır. Sonuçta elde edilen sıra, istenen simgenin gerçek konumunu veren dışarı aktarma adresi tablosundaki bir dizindir. Her dışarı aktarma simgesine bir sıra ile erişilebilir.

Başka bir görüntü dosyası sıralı olarak bir simgeyi içeri aktardığında, ad işaretçisi tablosunda eşleşen bir dize aramak gereksizdir. Bu nedenle bir sıranın doğrudan kullanımı daha verimlidir. Ancak, dışarı aktarma adını anımsamak daha kolaydır ve kullanıcının simgenin tablo dizinini bilmesini gerektirmez.

Dizin Tablosunu Dışarı Aktar

Dışarı aktarma simgesi bilgileri, dışarı aktarma simgesi bilgilerinin geri kalanını açıklayan dışarı aktarma dizini tablosuyla başlar. Dışarı aktarma dizini tablosu, bu görüntüdeki giriş noktalarına yapılan içeri aktarmaları çözümlemek için kullanılan adres bilgilerini içerir.

Ofset Boyut Alan Açıklama
0
4
Bayrakları Dışarı Aktar
Ayrılmış, 0 olmalıdır.
4
4
Saat/Tarih Damgası
Dışarı aktarma verilerinin oluşturulduğu saat ve tarih.
8
2
Ana Sürüm
Ana sürüm numarası. Ana ve ikincil sürüm numaraları kullanıcı tarafından ayarlanabilir.
10
2
İkincil Sürüm
İkincil sürüm numarası.
12
4
RVA adını verin
DLL'nin adını içeren ASCII dizesinin adresi. Bu adres, görüntü tabanına göredir.
16
4
Sıra Tabanı
Bu görüntüdeki dışarı aktarmalar için başlangıç sıra numarası. Bu alan, dışarı aktarma adresi tablosunun başlangıç sıra numarasını belirtir. Genellikle 1 olarak ayarlanır.
20
4
Adres Tablosu Girdileri
Dışarı aktarma adresi tablosundaki girdilerin sayısı.
24
4
Ad İşaretçilerinin Sayısı
Ad işaretçisi tablosundaki girdilerin sayısı. Bu aynı zamanda sıra tablosundaki girdilerin sayısıdır.
28
4
Adres Tablosunu Dışarı Aktar RVA
Görüntü tabanına göre dışarı aktarma adresi tablosunun adresi.
32
4
Ad İşaretçisi RVA
Görüntü tabanına göre dışarı aktarma adı işaretçisi tablosunun adresi. Tablo boyutu, Ad İşaretçileri Sayısı alanı tarafından verilir.
36
4
Sıralı Tablo RVA
Görüntü tabanına göre sıralı tablonun adresi.

 

Adres Tablosunu Dışarı Aktar

Dışarı aktarma adresi tablosu, dışarı aktarılan giriş noktalarının ve dışarı aktarılan verilerin ve mutlakların adresini içerir. Sıra numarası, dışarı aktarma adresi tablosunda dizin olarak kullanılır.

Dışarı aktarma adresi tablosundaki her girdi, aşağıdaki tabloda yer alan iki biçimden birini kullanan bir alandır. Belirtilen adres dışarı aktarma bölümünde değilse (isteğe bağlı üst bilgide belirtilen adres ve uzunluk tarafından tanımlandığı gibi), alan kod veya verilerdeki gerçek bir adres olan dışarı aktarma RVA'sıdır. Aksi takdirde, alan başka bir DLL'deki bir simgeyi adlandıran bir iletici RVA'dır.

Ofset Boyut Alan Açıklama
0
4
RVA'ları dışarı aktarma
Görüntü tabanına göre belleğe yüklendiğinde dışarı aktarılan simgenin adresi. Örneğin, dışarı aktarılan işlevin adresi.
0
4
İletici RVA
Dışarı aktarma bölümünde null olarak sonlandırılan bir ASCII dizesinin işaretçisi. Bu dize, dışarı aktarma tablosu veri dizini girdisi tarafından verilen aralık içinde olmalıdır. bkz. İsteğe Bağlı Üst Bilgi Veri Dizinleri (Yalnızca Görüntü). Bu dize DLL adını ve dışarı aktarmanın adını (örneğin, "MYDLL.expfunc") veya DLL adını ve dışarı aktarmanın sıra numarasını (örneğin, "MYDLL.#27") verir.

 

İletici RVA, tanımı başka bir görüntüden dışarı aktararak geçerli görüntü tarafından dışarı aktarılıyor gibi görünmesini sağlar. Bu nedenle, simge aynı anda içeri ve dışarı aktarılır.

Örneğin, Windows XP'deki Kernel32.dll"HeapAlloc" adlı dışarı aktarma işlemi "NTDLL" dizesine iletilir. RtlAllocateHeap." Bu, uygulamaların windows XP'ye özgü modülü Ntdll.dll aslında içeri aktarma başvuruları içermeden kullanmasına olanak tanır. Uygulamanın içeri aktarma tablosu yalnızca Kernel32.dllbaşvurur. Bu nedenle, uygulama Windows XP'ye özgü değildir ve herhangi bir Win32 sisteminde çalıştırılabilir.

Ad İşaretçisi Tablosunu Dışarı Aktar

Dışarı aktarma adı işaretçi tablosu, dışarı aktarma adı tablosuna bir adres dizisidir (RVAs). İşaretçiler her birinde 32 bittir ve görüntü tabanına göredir. İşaretçiler, ikili aramalara izin vermek için sözcük temelli olarak sıralanır.

Dışarı aktarma adı yalnızca dışarı aktarma adı işaretçisi tablosunda işaretçi varsa tanımlanır.

Sıralı Tabloyu Dışarı Aktar

Dışarı aktarma sıralı tablosu, dışarı aktarma adresi tablosuna 16 bit sapmasız dizinlerden oluşan bir dizidir. Sıralar, dışarı aktarma dizini tablosunun Sıra Tabanı alanı tarafından taraflıdır. Başka bir deyişle, dışarı aktarma adresi tablosuna doğru dizinleri almak için sıra tabanının sıralardan çıkarılması gerekir.

Dışarı aktarma adı işaretçi tablosu ve dışarı aktarma sıralı tablosu, doğal alan hizalamasına izin vermek için ayrılmış iki paralel dizi oluşturur. Bu iki tablo, aslında, Dışarı Aktarma Adı İşaretçisi sütununun genel (dışarı aktarılan) bir ada işaret ettiği ve Dışarı Aktarma Sıralı sütununun bu genel ad için karşılık gelen sırayı verdiği tek bir tablo olarak çalışır. Dışarı aktarma adı işaretçi tablosunun bir üyesi ve dışarı aktarma sıra tablosunun bir üyesi, ilgili dizilerinde aynı konuma (dizin) sahip olarak ilişkilendirilir.

Bu nedenle, dışarı aktarma adı işaretçisi tablosunda arama yapıldığında ve i konumunda eşleşen bir dize bulunduğunda, sembolün RVA'sını ve yanlı sırayı bulma algoritması şöyle olur:

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

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

Bir simgeyi (taraflı) sıralı olarak ararken, sembolün RVA'sını ve adını bulma algoritması şu şekildedir:

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

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

Ad Tablosunu Dışarı Aktar

Dışarı aktarma adı tablosu, dışarı aktarma adı işaretçi tablosu tarafından işaret edilen gerçek dize verilerini içerir. Bu tablodaki dizeler, diğer görüntülerin simgeleri içeri aktarmak için kullanabileceği genel adlardır. Bu genel dışarı aktarma adları, simgelerin kendi görüntü dosyasında ve kaynak kodunda bulunan özel simge adlarıyla aynı olmayabilir, ancak olabilir.

Dışarı aktarılan her simgenin, dışarı aktarma adresi tablosundaki dizin olan bir sıra değeri vardır. Ancak dışarı aktarma adlarının kullanılması isteğe bağlıdır. Dışarı aktarılan simgelerin bazılarının, tümünün veya hiçbirinin dışarı aktarma adları olabilir. Dışarı aktarma adları olan dışarı aktarılan simgeler için, dışarı aktarma adı işaretçisi tablosundaki ve dışarı aktarma sıralı tablodaki karşılık gelen girdiler, her adı bir sırayla ilişkilendirmek için birlikte çalışır.

Dışarı aktarma adı tablosunun yapısı, değişken uzunlukta null olarak sonlandırılan bir dizi ASCII dizesidir.

.idata Bölümü

Neredeyse tüm yürütülebilir (EXE) dosyaları da dahil olmak üzere simgeleri içeri aktaran tüm görüntü dosyalarının bir .idata bölümü vardır. İçeri aktarma bilgileri için tipik bir dosya düzeni aşağıda verilmiştir:

  • Dizin Tablosu

    Null Dizin Girdisi

  • DLL1 Arama Tablosunu İçeri Aktar

    Sıfır

  • DLL2 İçeri Aktarma Arama Tablosu

    Sıfır

  • DLL3 İçeri Aktarma Arama Tablosu

    Sıfır

  • Hint-Name Tablosu

Dizin Tablosunu İçeri Aktar

İçeri aktarma bilgileri, içeri aktarma bilgilerinin geri kalanını açıklayan içeri aktarma dizin tablosuyla başlar. İçeri aktarma dizini tablosu, DLL görüntüsündeki giriş noktalarına düzeltme başvurularını çözümlemek için kullanılan adres bilgilerini içerir. İçeri aktarma dizini tablosu, görüntünün başvurduğu her DLL için bir giriş olan içeri aktarma dizin girdileri dizisini içerir. Son dizin girdisi boştur (null değerlerle doldurulur), bu da dizin tablosunun sonunu gösterir.

Her içeri aktarma dizini girdisi aşağıdaki biçime sahiptir:

Ofset Boyut Alan Açıklama
0
4
İçeri Aktarma Arama Tablosu RVA'sı (Özellikler)
İçeri aktarma arama tablosunun RVA'sı. Bu tablo her içeri aktarma için bir ad veya sıra içerir. (Winnt.h dosyasında "Özellikler" adı kullanılır, ancak artık bu alanı açıklamaz.)
4
4
Saat/Tarih Damgası
Görüntü bağlanana kadar sıfır olarak ayarlanan damga. Görüntü bağlandıktan sonra, bu alan DLL'nin zaman/veri damgasına ayarlanır.
8
4
İletici Zinciri
İlk iletici başvurusunun dizini.
12
4
RVA adını verin
DLL'nin adını içeren bir ASCII dizesinin adresi. Bu adres, görüntü tabanına göredir.
16
4
Adres Tablosunu İçeri Aktar RVA (Thunk Tablosu)
İçeri aktarma adresi tablosunun RVA'sı. Bu tablonun içeriği, görüntü bağlanana kadar içeri aktarma arama tablosunun içeriğiyle aynıdır.

 

Arama Tablosunu İçeri Aktar

İçeri aktarma arama tablosu, PE32 için 32 bit sayılardan oluşan bir dizi veya PE32+ için 64 bit sayı dizisidir. Her girdi, aşağıdaki tabloda açıklanan bit alanı biçimini kullanır. Bu biçimde, bit 31 PE32 için en önemli bit, 63 bit ise PE32+ için en önemli bittir. Bu girdilerin koleksiyonu, belirli bir DLL'den tüm içeri aktarmaları açıklar. Tablonun sonunu belirtmek için son girdi sıfır (NULL) olarak ayarlanır.

Bitler Boyut Bit alanı Açıklama
31/63
1
Sıralı/Ad Bayrağı
Bu bit ayarlandıysa, sıralı olarak içeri aktar. Aksi takdirde, ada göre içeri aktar. Bit PE32 için 0x80000000, PE32+ için 0x8000000000000000 olarak maskelenmiştir.
15-0
16
Sıra Numarası
16 bitlik bir sıra numarası. Bu alan yalnızca Sıralı/Ad Bayrağı bit alanı 1 ise (sıralı olarak içeri aktar) kullanılır. Bit 30-15 veya 62-15 0 olmalıdır.
30-0
31
İpucu/Ad Tablosu RVA
İpucu/ad tablosu girdisinin 31 bit RVA'sı. Bu alan yalnızca Sıralı/Ad Bayrağı bit alanı 0 (ada göre içeri aktar) olduğunda kullanılır. PE32+ bitler için 62-31 sıfır olmalıdır.

 

İpucu/Ad Tablosu

İçeri aktarma bölümünün tamamı için bir ipucu/ad tablosu yeterlidir. İpucu/ad tablosundaki her girdi aşağıdaki biçime sahiptir:

Ofset Boyut Alan Açıklama
0
2
İma
Dışarı aktarma adı işaretçi tablosuna bir dizin. Önce bu değerle bir eşleşme denendi. Başarısız olursa, DLL'nin dışarı aktarma adı işaretçi tablosunda ikili arama gerçekleştirilir.
2
değişken
Ad
İçeri aktaracak adı içeren bir ASCII dizesi. Bu, DLL'deki genel adla eşleşmesi gereken dizedir. Bu dize büyük/küçük harfe duyarlıdır ve null bayt ile sonlandırılır.
*
0 veya 1
Pad
Gerekirse, bir sonraki girişi çift bir sınıra hizalamak için sondaki null bayt'ın ardından görüntülenen sıfır tuş takımı.

 

Adres Tablosunu İçeri Aktar

İçeri aktarma adresi tablosunun yapısı ve içeriği, dosya bağlanana kadar içeri aktarma arama tablosunun yapısıyla aynıdır. Bağlama sırasında içeri aktarma adresi tablosundaki girdilerin üzerine, içeri aktarılan simgelerin 32 bit (PE32 için) veya 64 bit (PE32+) adresleri yazılır. Bu adresler, simgelerin gerçek bellek adresleridir, ancak teknik olarak hala "sanal adresler" olarak adlandırılırlar. Yükleyici genellikle bağlamayı işler.

.pdata Bölümü

.pdata bölümü, özel durum işleme için kullanılan bir işlev tablosu girdileri dizisi içerir. Görüntü veri dizinindeki özel durum tablosu girdisi tarafından işaret edilir. Girişler, son görüntüye yayılmadan önce işlev adreslerine (her yapıdaki ilk alan) göre sıralanmalıdır. Hedef platform, aşağıda açıklanan üç işlev tablosu giriş biçimi varyasyonunun hangilerinin kullanıldığını belirler.

32 bit MIPS görüntüleri için işlev tablosu girdileri aşağıdaki biçime sahiptir:

Ofset Boyut Alan Açıklama
0
4
Başlangıç Adresi
karşılık gelen işlevin VA'sı.
4
4
Bitiş Adresi
İşlevin sonunun VA'sı.
8
4
Özel Durum İşleyicisi
Yürütülecek özel durum işleyicisinin işaretçisi.
12
4
İşleyici Verileri
İşleyiciye geçirilecek ek bilgilerin işaretçisi.
16
4
Prolog Bitiş Adresi
İşlevin prologunun sonunun VA'sı.

 

ARM, PowerPC, SH3 ve SH4 Windows CE platformları için işlev tablosu girişleri aşağıdaki biçime sahiptir:

Ofset Boyut Alan Açıklama
0
4
Başlangıç Adresi
karşılık gelen işlevin VA'sı.
4
8 bit
Prolog Uzunluğu
İşlevin giriş günlüğündeki yönergelerin sayısı.
4
22 bit
İşlev Uzunluğu
İşlevdeki yönergelerin sayısı.
4
1 bit
32 bit Bayrak
Ayarlanırsa, işlev 32 bit yönergelerden oluşur. Açıksa, işlev 16 bit yönergelerden oluşur.
4
1 bit
Özel Durum Bayrağı
Ayarlanırsa, işlev için bir özel durum işleyicisi vardır. Aksi takdirde, hiçbir özel durum işleyicisi yoktur.

 

x64 ve Itanium platformları için işlev tablosu girdileri aşağıdaki biçime sahiptir:

Ofset Boyut Alan Açıklama
0
4
Başlangıç Adresi
karşılık gelen işlevin RVA'sı.
4
4
Bitiş Adresi
İşlevin sonunun RVA'sı.
8
4
Geri Sarma Bilgileri
Geri sarma bilgilerinin RVA'sı.

 

.reloc Bölümü (Yalnızca Görüntü)

Temel yeniden konumlandırma tablosu, görüntüdeki tüm temel yeniden konumlandırmalar için girdiler içerir. İsteğe bağlı üst bilgi veri dizinlerindeki Temel Yeniden Konumlandırma Tablosu alanı, temel yeniden konumlandırma tablosundaki bayt sayısını verir. Daha fazla bilgi için bkz. İsteğe Bağlı Üst Bilgi Veri Dizinleri (Yalnızca Görüntü). Temel yeniden konumlandırma tablosu bloklara ayrılır. Her blok, 4K sayfasının temel konumlarını temsil eder. Her bloğun 32 bitlik bir sınırda başlaması gerekir.

Yük görüntüsü PE üst bilgisinde belirtilen görüntü tabanına yüklenemediği sürece, bağlayıcı tarafından çözümlenen temel konumları işlemek için yükleyici gerekli değildir.

Temel Yeniden Konumlandırma Bloğu

Her temel yeniden konumlandırma bloğu aşağıdaki yapıyla başlar:

Ofset Boyut Alan Açıklama
0
4
Sayfa RVA'sı
Temel yeniden konumlandırmanın uygulanması gereken VA'yi oluşturmak için her uzaklık için görüntü tabanı artı sayfa RVA eklenir.
4
4
Blok Boyutu
Sayfa RVA'sı ve Blok Boyutu alanları ve izleyen Tür/Uzaklık alanları da dahil olmak üzere temel yeniden konumlandırma bloğundaki toplam bayt sayısı.

 

Daha sonra Blok Boyutu alanına herhangi bir sayıda Tür veya Uzaklık alanı girdisi eklenir. Her girdi bir WORD (2 bayt) ve aşağıdaki yapıya sahiptir:

Ofset Boyut Alan Açıklama
0
4 bit
Tür
UYGULANACAK temel yeniden konumlandırma türünü gösteren bir değer olan WORD'ün yüksek 4 bitinde depolanır. Daha fazla bilgi için bkz. Temel Konum Değiştirme Türleri.
0
12 bit
Ofset
WORD'ün kalan 12 bitinde depolanır; blok için Sayfa RVA alanında belirtilen başlangıç adresinden uzaklık. Bu uzaklık, temel yeniden konumlandırmanın nereye uygulanacağını belirtir.

 

Temel yeniden konumlandırma uygulamak için, tercih edilen temel adres ile görüntünün gerçekten yüklendiği taban arasındaki fark hesaplanır. Görüntü tercih edilen tabanda yüklenirse, fark sıfırdır ve bu nedenle temel yeniden konumlandırmaların uygulanması gerekmez.

Temel Yeniden Konumlandırma Türleri

Sabit Değer Açıklama
IMAGE_REL_BASED_ABSOLUTE
0
Temel yeniden konumlandırma atlanır. Bu tür bir bloğu doldurmada kullanılabilir.
IMAGE_REL_BASED_HIGH
1
Temel yeniden konumlandırma, farkın en yüksek 16 bitini uzaklıkta 16 bit alana ekler. 16 bit alanı, 32 bit bir sözcüğün yüksek değerini temsil eder.
IMAGE_REL_BASED_LOW
2
Temel yeniden konumlandırma, farkın düşük 16 bitini uzaklıkta 16 bit alana ekler. 16 bit alanı, 32 bit sözcüğün alt yarısını temsil eder.
IMAGE_REL_BASED_HIGHLOW
3
Temel yeniden konumlandırma, farkın tüm 32 bitini uzaklıkta 32 bit alana uygular.
IMAGE_REL_BASED_HIGHADJ
4
Temel yeniden konumlandırma, farkın en yüksek 16 bitini uzaklıkta 16 bit alana ekler. 16 bit alanı, 32 bit bir sözcüğün yüksek değerini temsil eder. 32 bit değerin düşük 16 biti, bu temel yeniden konumlandırmayı izleyen 16 bit sözcükte depolanır. Bu, bu temel yeniden konumlandırmanın iki yuva kaplar olduğu anlamına gelir.
IMAGE_REL_BASED_MIPS_JMPADDR
5
Yeniden konumlandırma yorumu makine türüne bağlıdır.
Makine türü MIPS olduğunda, temel yeniden konumlandırma bir MIPS atlama yönergesine uygulanır.
IMAGE_REL_BASED_ARM_MOV32
5
Bu yeniden konumlandırma yalnızca makine türü ARM veya Thumb olduğunda anlamlıdır. Temel yeniden konumlandırma, bir sembolün 32 bit adresini ardışık MOVW/MOVT yönerge çiftine uygular.
IMAGE_REL_BASED_RISCV_HIGH20
5
Bu yeniden konumlandırma yalnızca makine türü RISC-V olduğunda anlamlıdır. Temel yeniden konumlandırma, 32 bit mutlak adresin yüksek 20 bitine uygulanır.
6
Ayrılmış, sıfır olmalıdır.
IMAGE_REL_BASED_THUMB_MOV32
7
Bu yeniden konumlandırma yalnızca makine türü Başparmak olduğunda anlamlıdır. Temel yeniden konumlandırma, bir sembolün 32 bit adresini ardışık MOVW/MOVT yönerge çiftine uygular.
IMAGE_REL_BASED_RISCV_LOW12I
7
Bu yeniden konumlandırma yalnızca makine türü RISC-V olduğunda anlamlıdır. Temel yeniden konumlandırma, RISC-V I türü yönerge biçiminde oluşturulmuş 32 bitlik mutlak adresin 12 bitlik alt kısmı için geçerlidir.
IMAGE_REL_BASED_RISCV_LOW12S
8
Bu yeniden konumlandırma yalnızca makine türü RISC-V olduğunda anlamlıdır. Temel yeniden konumlandırma, RISC-V S türü yönerge biçiminde oluşturulmuş 32 bitlik mutlak adresin 12 bitlik alt kısmı için geçerlidir.
IMAGE_REL_BASED_LOONGARCH32_MARK_LA
8
Bu yeniden konumlandırma yalnızca makine türü LoongArch 32 bit olduğunda anlamlıdır. Temel yeniden konumlandırma, ardışık iki yönergede oluşturulan 32 bit mutlak adrese uygulanır.
IMAGE_REL_BASED_LOONGARCH64_MARK_LA
8
Bu yeniden konumlandırma yalnızca makine türü LoongArch 64 bit olduğunda anlamlıdır. Temel yeniden konumlandırma, ardışık dört yönergede oluşturulan 64 bit mutlak adrese uygulanır.
IMAGE_REL_BASED_MIPS_JMPADDR16
9
Yeniden konumlandırma yalnızca makine türü MIPS olduğunda anlamlıdır. Temel yeniden konumlandırma, MIPS16 atlama yönergesi için geçerlidir.
IMAGE_REL_BASED_DIR64
10
Temel yeniden konumlandırma, farkı uzaklıkta 64 bit alana uygular.

 

.tls Bölümü

.tls bölümü, statik iş parçacığı yerel depolama (TLS) için doğrudan PE ve COFF desteği sağlar. TLS, Bir veri nesnesinin otomatik (yığın) değişkeni olmadığı, ancak kodu çalıştıran her bir iş parçacığı için yerel olduğu, Windows'un desteklediği özel bir depolama sınıfıdır. Bu nedenle, her iş parçacığı TLS kullanılarak bildirilen bir değişken için farklı bir değer koruyabilir.

TLS verilerinin herhangi bir miktarının TlsAlloc, TlsFree, TlsSetValue ve TlsGetValue API çağrıları kullanılarak desteklenebileceğini unutmayın. PE veya COFF uygulaması, API'yi kullanmaya yönelik alternatif bir yaklaşımdır ve üst düzey dil programcı bakış açısından daha basit olma avantajına sahiptir. Bu uygulama, TLS verilerinin bir programdaki sıradan statik değişkenlere benzer şekilde tanımlanmasını ve başlatılmasını sağlar. Örneğin, Visual C++'da Statik TLS değişkeni, Windows API'si kullanılmadan aşağıdaki gibi tanımlanabilir:

__declspec (thread) int tlsFlag = 1;

Bu programlama yapısını desteklemek için PE ve COFF .tls bölümü şu bilgileri belirtir: başlatma verileri, iş parçacığı başına başlatma ve sonlandırma için geri çağırma yordamları ve aşağıdaki tartışmada açıklanan TLS dizini.

Not

Windows Vista'nın öncesinde, statik olarak bildirilen TLS veri nesneleri yalnızca statik olarak yüklenen görüntü dosyalarında kullanılabilir. Bu durum, DLL'nin veya statik olarak bağlı herhangi bir şeyin LoadLibrary API işleviyle hiçbir zaman dinamik olarak yüklenmeyeceğini bilmiyorsanız DLL'de statik TLS verilerinin kullanılmasını güvenilir hale getirir. Ancak, Windows Vista'dan başlayarak, statik TLS ile DLL'lerin dinamik yüklenmesini daha iyi desteklemek için Windows yükleyicide iyileştirmeler yapıldı. Bu değişiklik, statik olarak bildirilen TLS veri nesnelerine sahip DLL'lerin artık LoadLibrary kullanılarak dinamik olarak yüklenseler bile daha güvenilir bir şekilde kullanılabileceğini gösterir. Yükleyici, yükleme zamanında bu TÜR DLL'ler için TLS yuvaları ayırarak Windows'un önceki sürümlerinde mevcut sınırlamaları azaltabilmektedir.

 

Not

32 bit uzaklıklara ve 4 dizin çarpanlarına başvurular, 32 bit mimariye sahip sistemler için geçerlidir. 64 bit mimarileri temel alan bir sistemde bunları gerektiği gibi ayarlayın.

Yürütülebilir kod, aşağıdaki adımlarla statik bir TLS veri nesnesine erişir:

  1. Bağlantı zamanında, bağlayıcı TLS dizininin Dizin Adresi alanını ayarlar. Bu alan, programın TLS dizinini almayı beklediği bir konuma işaret eder.

    Microsoft çalışma zamanı kitaplığı, TLS dizininin bellek görüntüsünü tanımlayıp özel adı "__tls_used" (Intel x86 platformları) veya "_tls_used" (diğer platformlar) vererek bu işlemi kolaylaştırır. Bağlayıcı bu bellek görüntüsünü arar ve oradaki verileri kullanarak TLS dizinini oluşturur. TLS'yi destekleyen ve Microsoft bağlayıcısıyla çalışan diğer derleyicilerin de aynı tekniği kullanması gerekir.

  2. Bir iş parçacığı oluşturulduğunda, yükleyici iş parçacığı ortam bloğunun (TEB) adresini FS (x86 için) veya GS (x64 için) kaydına yerleştirerek iş parçacığının TLS dizisinin adresini iletir. TLS dizisi işaretçisi, TEB'in başından 0x2C uzaklığındadır. Bu davranış Intel x86'ya özgüdür.

  3. Yükleyici TLS dizininin değerini Dizin Adresi alanıyla belirtilen yere atar.

  4. Yürütülebilir kod TLS dizinini ve ayrıca TLS dizisinin konumunu alır.

  5. Kod, verilen program ve modülün TLS veri alanının adresini almak için TLS dizinini ve TLS dizi konumunu (dizini 4 ile çarparak ve dizi uzaklığı olarak kullanarak) kullanır. Her iş parçacığının kendi TLS veri alanı vardır, ancak bu, tek tek iş parçacıkları için verilerin nasıl ayrıldığını bilmesi gerekmeyen program için saydamdır.

  6. Tek bir TLS veri nesnesine, TLS veri alanına sabit bir uzaklık olarak erişilir.

TLS dizisi, sistemin her iş parçacığı için koruduğu bir adres dizisidir. Bu dizideki her adres, program içindeki belirli bir modül (EXE veya DLL) için TLS verilerinin konumunu verir. TLS dizini, dizinin hangi üyesinin kullanılacağını gösterir. Dizin, modülü tanımlayan bir sayıdır (yalnızca sistem için anlamlıdır).

TLS Dizini

TLS dizini aşağıdaki biçime sahiptir:

Uzaklık (PE32/ PE32+) Boyut (PE32/ PE32+) Alan Açıklama
0
4/8
Ham Veri Başlangıç VA'sı
TLS şablonunun başlangıç adresi. Şablon, TLS verilerini başlatmak için kullanılan bir veri bloğudur. Sistem her iş parçacığı oluşturulduğunda bu verilerin tümünü kopyalar, bu nedenle bozulmamalıdır. Bu adresin RVA olmadığını unutmayın; .reloc bölümünde temel yeniden konumlandırma olması gereken bir adrestir.
4/8
4/8
Ham Veri Sonu VA
Sıfır doldurma dışında TLS'nin son baytının adresi. Ham Veri Başlangıç VA'sı alanında olduğu gibi, bu RVA değil VA'dır.
8/16
4/8
Dizinin Adresi
Yükleyicinin atadığı TLS dizinini alacak konum. Bu konum sıradan bir veri bölümünde olduğundan, program tarafından erişilebilen sembolik bir ad verilebilir.
12/24
4/8
Geri Çağırmaların Adresi
TLS geri çağırma işlevleri dizisinin işaretçisi. Dizi null olarak sonlandırılır, bu nedenle hiçbir geri çağırma işlevi desteklenmiyorsa, bu alan sıfır olarak ayarlanmış 4 bayta işaret eder. Bu işlevlerin prototipi hakkında bilgi için bkz. TLS Geri Çağırma İşlevleri.
16/32
4
Sıfır Dolgu Boyutu
Şablonun bayt cinsinden boyutu, Raw Data Start VA ve Raw Data End VA alanları tarafından sınırlandırılan başlatılan verilerin ötesindedir. Toplam şablon boyutu, görüntü dosyasındaki TLS verilerinin toplam boyutuyla aynı olmalıdır. Sıfır doldurma, sıfır olmayan sıfırdan başlatılan verilerden sonra gelen veri miktarıdır.
20/36
4
Özellik -lerini
Dört bit [23:20] hizalama bilgilerini açıklar. Olası değerler, nesne dosyalarındaki bölümün hizalamasını açıklamak için de kullanılan IMAGE_SCN_ALIGN_* olarak tanımlanan değerlerdir. Diğer 28 bit daha sonra kullanılmak üzere ayrılmıştır.

 

TLS Geri Çağırma İşlevleri

Program, TLS veri nesneleri için ek başlatma ve sonlandırmayı desteklemek üzere bir veya daha fazla TLS geri çağırma işlevi sağlayabilir. Böyle bir geri çağırma işlevi için tipik bir kullanım, nesneler için oluşturucuları ve yıkıcıları çağırmaktır.

Genellikle birden fazla geri çağırma işlevi olmasa da, isterseniz ek geri çağırma işlevlerinin eklenmesini mümkün kılmak için bir geri çağırma bir dizi olarak uygulanır. Birden fazla geri çağırma işlevi varsa, her işlev adresinin dizide göründüğü sırayla çağrılır. Null işaretçi diziyi sonlandırır. Boş bir listeye (geri çağırma desteklenmez) sahip olmak mükemmel bir şekilde geçerlidir; bu durumda geri çağırma dizisinin tam olarak bir üye-null işaretçisi vardır.

Geri çağırma işlevinin prototipi (PIMAGE_TLS_CALLBACK türünde bir işaretçiyle işaret edilir) DLL giriş noktası işleviyle aynı parametrelere sahiptir:

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

Ayrılmış parametresi sıfır olarak ayarlanmalıdır. Reason parametresi aşağıdaki değerleri alabilir:

Ayar Değer Açıklama
DLL_PROCESS_ATTACH
1
İlk iş parçacığı da dahil olmak üzere yeni bir işlem başlatıldı.
DLL_THREAD_ATTACH
2
Yeni bir iş parçacığı oluşturuldu. Bu bildirim ilk iş parçacığı dışında tümü için gönderildi.
DLL_THREAD_DETACH
3
bir iş parçacığı sonlandırılacak. Bu bildirim ilk iş parçacığı dışında tümü için gönderildi.
DLL_PROCESS_DETACH
0
Özgün iş parçacığı da dahil olmak üzere bir işlem sonlandırılıyor.

 

Yük Yapılandırma Yapısı (Yalnızca Görüntü)

Yük yapılandırma yapısı (IMAGE_LOAD_CONFIG_DIRECTORY) daha önce Windows NT işletim sisteminin kendisinde çok sınırlı durumlarda, görüntünün dosya üst bilgisinde veya isteğe bağlı üst bilgisinde açıklanamayacak kadar zor veya çok büyük olan çeşitli özellikleri açıklamak için kullanılıyordu. Microsoft bağlayıcısının ve Windows XP'nin güncel sürümleri ve Windows'un sonraki sürümleri, ayrılmış SEH teknolojisi içeren 32 bit x86 tabanlı sistemler için bu yapının yeni bir sürümünü kullanır. Bu, işletim sisteminin özel durum gönderimi sırasında kullandığı güvenli yapılandırılmış özel durum işleyicilerinin listesini sağlar. İşleyici adresi bir görüntünün VA aralığında bulunuyorsa ve ayrılmış SEH kullanan olarak işaretlenmişse (yani, daha önce açıklandığı gibi isteğe bağlı üst bilginin DllCharacteristics alanında IMAGE_DLLCHARACTERISTICS_NO_SEH açıktır), işleyicinin bu görüntü için bilinen güvenli işleyiciler listesinde olması gerekir. Aksi takdirde, işletim sistemi uygulamayı sonlandırır. Bu, geçmişte işletim sisteminin denetimini almak için kullanılan "x86 özel durum işleyicisi ele geçirme" açıklarını önlemeye yardımcı olur.

Microsoft bağlayıcısı, ayrılmış SEH verilerini dahil etmek için otomatik olarak bir varsayılan yük yapılandırma yapısı sağlar. Kullanıcı kodu zaten bir yük yapılandırma yapısı sağlıyorsa, yeni ayrılmış SEH alanlarını içermelidir. Aksi takdirde bağlayıcı ayrılmış SEH verilerini içeremez ve görüntü ayrılmış SEH içeriyor olarak işaretlenmez.

Yapılandırma Dizinini Yükleme

İşletim sistemi yükleyicisi her zaman belirli bir değer olmasını beklediğinden, önceden ayrılmış bir SEH yük yapılandırma yapısı için veri dizini girdisinin yük yapılandırma yapısının belirli bir boyutunu belirtmesi gerekir. Bu bağlamda, boyut gerçekten yalnızca bir sürüm denetimidir. Windows XP ve Windows'un önceki sürümleriyle uyumluluk için x86 görüntüleri için boyut 64 olmalıdır.

Yapılandırma Düzenini Yükle

Yük yapılandırma yapısı, 32 bit ve 64 bit PE dosyaları için aşağıdaki düzene sahiptir:

Ofset Boyut Alan Açıklama
0
4
Özellik -lerini
Dosyanın şu anda kullanılmayan özniteliklerini gösteren bayraklar.
4
4
TimeDateStamp
Tarih ve saat damgası değeri. Değer, sistem saatine göre gece yarısından (00:00:00), 1 Ocak 1970,Evrensel Eşgüdümlü Saat'ten bu yana geçen saniye sayısıyla gösterilir. Zaman damgası, C çalışma zamanı (CRT) zaman işlevi kullanılarak yazdırılabilir.
8
2
MajorVersion
Ana sürüm numarası.
10
2
MinorVersion
İkincil sürüm numarası.
12
4
GlobalFlagsClear
Yükleyici işlemi başlatırken genel yükleyici bu işlem için temizlenecek şekilde bayraklar ekler.
16
4
GlobalFlagsSet
Yükleyici işlemi başlatırken bu işlem için ayarlanacağı genel yükleyici bayrakları.
20
4
CriticalSectionDefaultTimeout
Bu işlemin terk edilen kritik bölümleri için kullanılacak varsayılan zaman aşımı değeri.
24
4/8
DeCommitFreeBlockThreshold
Sisteme döndürülmeden önce bayt cinsinden boşaltılması gereken bellek.
28/32
4/8
DeCommitTotalFreeThreshold
Bayt cinsinden toplam boş bellek miktarı.
32/40
4/8
LockPrefixTable
[yalnızca x86] Tek işlemcili makinelerde NOP ile değiştirilebilmeleri için LOCK ön ekinin kullanıldığı adreslerin listesinin VA'sı.
36/48
4/8
MaximumAllocationSize
Bayt cinsinden en büyük ayırma boyutu.
40/56
4/8
VirtualMemoryThreshold
Bayt cinsinden maksimum sanal bellek boyutu.
44/64
4/8
ProcessAffinityMask
Bu alanı sıfır olmayan bir değere ayarlamak, işlem başlatma sırasında setProcessAffinityMask'i bu değerle çağırmaya eşdeğerdir (yalnızca.exe)
48/72
4
ProcessHeapFlags
YığınOluştur işlevinin ilk bağımsız değişkenine karşılık gelen işlem yığın bayrakları. Bu bayraklar, işlem başlatma sırasında oluşturulan işlem yığınına uygulanır.
52/76
2
CSDVersion
Hizmet paketi sürüm tanımlayıcısı.
54/78
2
DependentLoadFlags
İşletim sistemi bir modülün statik olarak bağlı içeri aktarmalarını çözümlediğinde kullanılan varsayılan yük bayrakları.
56/80
4/8
EditList
Sistem tarafından kullanılmak üzere ayrılmıştır.
60/88
4/8
SecurityCookie
Visual C++ veya GS uygulaması tarafından kullanılan bir tanımlama bilgisi işaretçisi.
64/96
4/8
SEHandlerTable
[yalnızca x86] Görüntüdeki her geçerli, benzersiz SE işleyicisinin sıralanmış RVA tablosunun VA'sı.
68/104
4/8
SEHandlerCount
[yalnızca x86] Tablodaki benzersiz işleyicilerin sayısı.
72/112
4/8
GuardCFCheckFunctionPointer
Control Flow Guard denetim işlevi işaretçisinin depolandığı VA.
76/120
4/8
GuardCFDispatchFunctionPointer
Control Flow Guard dispatch-function işaretçisinin depolandığı VA.
80/128
4/8
GuardCFFunctionTable
Görüntüdeki her Control Flow Guard işlevinin sıralanmış RVA tablosunun VA'sı.
84/136
4/8
GuardCFFunctionCount
Yukarıdaki tabloda yer alan benzersiz RVA'ların sayısı.
88/144
4
GuardFlags
Flow Guard ile ilgili bayrakları denetleme.
92/148
12
CodeIntegrity
Kod bütünlüğü bilgileri.
104/160
4/8
GuardAddressTakenIatEntryTable
Denetim Flow Guard adresinin aldığı IAT tablosunun depolandığı VA.
108/168
4/8
GuardAddressTakenIatEntryCount
Yukarıdaki tabloda yer alan benzersiz RVA'ların sayısı.
112/176
4/8
GuardLongJumpTargetTable
Control Flow Guard uzun atlama hedef tablosunun depolandığı VA.
116/184
4/8
GuardLongJumpTargetCount
Yukarıdaki tabloda yer alan benzersiz RVA'ların sayısı.

 

GuardFlags alanı, aşağıdaki bayraklardan ve alt alanlardan birinin veya daha fazlasının birleşimini içerir:

  • Modül, sistem tarafından sağlanan desteği kullanarak denetim akışı bütünlüğü denetimleri gerçekleştirir.

    #define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100

  • Modül, denetim akışı ve yazma bütünlüğü denetimleri gerçekleştirir.

    #define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200

  • Modül geçerli denetim akışı hedef meta verilerini içerir.

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400

  • Modül /GS güvenlik tanımlama bilgisini kullanmaz.

    #define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800

  • Modül salt okunur gecikmeli yük IAT'yi destekler.

    #define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000

  • İçeri aktarma tablosunu serbestçe yeniden korunabilen kendi .didat bölümünde (içinde başka hiçbir şey olmadan) gecikme yükü.

    #define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000

  • Modül, gizlenen dışarı aktarma bilgilerini içeriyor. Bu, alınan adres IAT tablosunun yük yapılandırmasında da mevcut olduğunu da ortaya çıkartır.

    #define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000

  • Modül, dışarı aktarmaların gizlenmesi sağlar.

    #define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000

  • Modül longjmp hedef bilgilerini içerir.

    #define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000

  • Control Flow Guard işlev tablosu girdilerinin adımlarını içeren alt alan için maske (başka bir ifadeyle, tablo girdisi başına ek bayt sayısı).

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000

Buna ek olarak, Windows SDK winnt.h üst bilgisi, Control Flow Guard işlev tablosu adımlarını sağa yaslayan GuardFlags değerini sağa kaydırmak için bit miktarı için bu makroyu tanımlar:

#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28

.rsrc Bölümü

Kaynaklar, çok düzeyli ikili sıralanmış ağaç yapısına göre dizinlenir. Genel tasarım 2**31 düzey içerebilir. Ancak, kural gereği Windows üç düzey kullanır:

Tür Adı Dili

Bir dizi kaynak dizin tablosu tüm düzeyleri şu şekilde ilişkilendirmektedir: Her dizin tablosunun ardından, bu düzey için ad veya tanımlayıcı (Kimlik) veren bir dizi dizin girdisi (Tür, Ad veya Dil düzeyi) ve bir veri açıklaması ya da başka bir dizin tablosu adresi bulunur. Adres bir veri açıklamasına işaret ederse, veriler ağaçtaki bir yapraktır. Adres başka bir dizin tablosuna işaret ederse, bu tabloda bir sonraki düzeydeki dizin girdileri listelenir.

Bir yaprağın Tür, Ad ve Dil Kimlikleri, sayfaya ulaşmak için dizin tablolarından geçen yola göre belirlenir. İlk tablo Tür Kimliği'ni, ikinci tablo (ilk tablodaki dizin girdisinin işaret ettiği) Ad Kimliğini, üçüncü tablo ise Dil Kimliği'ni belirler.

.rsrc bölümünün genel yapısı:

Veri Açıklama
Kaynak Dizini Tabloları (ve Kaynak Dizini Girdileri)
Ağaçtaki her düğüm grubu için bir tablo dizisi. Tüm üst düzey (Tür) düğümler ilk tabloda listelenir. Bu tablodaki girdiler ikinci düzey tablolara işaret eder. Her ikinci düzey ağaç aynı Tür Kimliğine ancak farklı Ad Kimliklerine sahiptir. Üçüncü düzey ağaçlar aynı Tür ve Ad Kimliklerine ancak farklı Dil Kimliklerine sahiptir.
Her bir tablonun hemen ardından, her girdinin bir adı veya sayısal tanımlayıcısı ve bir veri açıklaması ya da sonraki alt düzeyde bir tablo işaretçisi olan dizin girdileri gelir.
Kaynak Dizin Dizeleri
Dizin girdileri tarafından işaret edilen dize verileri olarak görev yapan iki bayt hizalı Unicode dizeleri.
Kaynak Verileri Açıklaması
Kaynak verilerinin gerçek boyutunu ve konumunu açıklayan tablolarla işaret edilen bir kayıt dizisi. Bu kayıtlar, kaynak açıklaması ağacındaki yapraklardır.
Kaynak Verileri
Kaynak bölümünün ham verileri. Kaynak Verileri Açıklamaları alanındaki boyut ve konum bilgileri, kaynak verilerinin tek tek bölgelerini sınırlandırıyor.

 

Kaynak Dizini Tablosu

Her kaynak dizini tablosu aşağıdaki biçime sahiptir. Tablo aslında dizin girdilerinden (bölüm 6.9.2, "Kaynak Dizini Girdileri" bölümünde açıklanmıştır) ve bu yapıdan oluştuğundan, bu veri yapısı tablonun başlığı olarak kabul edilmelidir:

Ofset Boyut Alan Açıklama
0
4
Özellik -lerini
Kaynak bayrakları. Bu alan gelecekte kullanılmak üzere ayrılmıştır. Şu anda sıfır olarak ayarlanmıştır.
4
4
Saat/Tarih Damgası
Kaynak verilerinin kaynak derleyicisi tarafından oluşturulduğu saat.
8
2
Ana Sürüm
Kullanıcı tarafından ayarlanan ana sürüm numarası.
10
2
İkincil Sürüm
Kullanıcı tarafından ayarlanan ikincil sürüm numarası.
12
2
Ad Girdilerinin Sayısı
Tür, Ad veya Dil girdilerini tanımlamak için dizeleri kullanan tablonun hemen ardından gelen dizin girdilerinin sayısı (tablonun düzeyine bağlı olarak).
14
2
Kimlik Girdilerinin Sayısı
Tür, Ad veya Dil girdileri için sayısal kimlikler kullanan Ad girdilerinin hemen ardından gelen dizin girdilerinin sayısı.

 

Kaynak Dizini Girdileri

Dizin girdileri bir tablonun satırlarını oluşturur. Her kaynak dizini girdisi aşağıdaki biçime sahiptir. Girdinin bir Ad veya Kimlik girdisi olup olmadığı, kaynak dizin tablosu tarafından belirtilir ve bu durum, bunu kaç Ad ve Kimlik girdisinin izlediğini gösterir (tüm Ad girdilerinin tablonun tüm kimlik girdilerinden önce geldiğini unutmayın). Tablonun tüm girişleri artan düzende sıralanır: Büyük/küçük harfe duyarlı dizeye göre Ad girdileri ve sayısal değere göre kimlik girdileri. Uzaklıklar, IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory'deki adrese göredir. Daha fazla bilgi için bkz. Eşleme: Win32 Taşınabilir Yürütülebilir Dosya Biçimi turu.

Ofset Boyut Alan Açıklama
0
4
Ad Uzaklığı
Tablonun düzeyine bağlı olarak Tür, Ad veya Dil Kimliği girdisi veren bir dizenin uzaklığı.
0
4
Tamsayı Kimliği
Tür, Ad veya Dil Kimliği girdisini tanımlayan 32 bitlik bir tamsayı.
4
4
Veri Girişi Uzaklığı
Yüksek bit 0. Kaynak Verileri girişinin adresi (yaprak).
4
4
Alt Dizin Uzaklığı
Yüksek bit 1. Alt 31 bit, başka bir kaynak dizini tablosunun adresidir (bir sonraki düzey aşağı).

 

Kaynak Dizin Dizesi

Kaynak dizini dize alanı, sözcük hizalı Unicode dizelerinden oluşur. Bu dizeler, son Kaynak Dizini girdisinin ardından ve ilk Kaynak Verileri girişinde birlikte depolanır. Bu, bu değişken uzunluklu dizelerin sabit boyutlu dizin girdilerinin hizalaması üzerindeki etkisini en aza indirir. Her kaynak dizini dizesi aşağıdaki biçime sahiptir:

Ofset Boyut Alan Açıklama
0
2
Uzunluk
Uzunluk alanının kendisi dahil değil, dizenin boyutu.
2
değişken
Unicode Dizesi
Değişken uzunlukta Unicode dize verileri, sözcük hizalı.

 

Kaynak Veri Girişi

Her Kaynak Verileri girdisi, Kaynak Verileri alanındaki gerçek bir ham veri birimini açıklar. Kaynak Verileri girdisi aşağıdaki biçime sahiptir:

Ofset Boyut Alan Açıklama
0
4
Veri RVA'sı
Kaynak Verileri alanındaki bir kaynak veri biriminin adresi.
4
4
Boyut
Veri RVA alanı tarafından işaret edilen kaynak verilerinin bayt cinsinden boyutu.
8
4
Kod sayfası
Kaynak verilerindeki kod noktası değerlerinin kodunu çözmek için kullanılan kod sayfası. Kod sayfası genellikle Unicode kod sayfası olur.
12
4
Ayrılmış, 0 olmalıdır.

 

.cormeta Bölümü (Yalnızca Nesne)

CLR meta verileri bu bölümde depolanır. Nesne dosyasının yönetilen kod içerdiğini belirtmek için kullanılır. Meta verilerin biçimi belgelenmez, ancak meta verileri işlemek için CLR arabirimlerine teslim edilebilir.

.sxdata Bölümü

Bir nesnenin geçerli özel durum işleyicileri, bu nesnenin .sxdata bölümünde listelenir. Bölüm IMAGE_SCN_LNK_INFO olarak işaretlenir. Dizin başına 4 bayt kullanarak her geçerli işleyicinin COFF sembol dizinini içerir.

Ayrıca derleyici, değer alanının LSB değerinin 1 olarak ayarlandığı mutlak simgeyi "@feat.00" yayarak bir COFF nesnesini kayıtlı SEH olarak işaretler. Kayıtlı SEH işleyicisi olmayan bir COFF nesnesinin "@feat.00" simgesi olur, ancak .sxdata bölümü yoktur.

Arşiv (Kitaplık) Dosya Biçimi

COFF arşiv biçimi, nesne dosyası koleksiyonlarını depolamak için standart bir mekanizma sağlar. Bu koleksiyonlar genellikle programlama belgelerindeki kitaplıklar olarak adlandırılır.

Bir arşivin ilk 8 baytlık kısmı dosya imzasını oluşturur. Arşivin geri kalanı aşağıdaki gibi bir dizi arşiv üyesinden oluşur:

  • birinci ve ikinci üyeler "bağlayıcı üyeleri"dir. Bu üyelerin her biri, İçeri Aktarma Adı Türübölümünde açıklandığı gibi kendi biçimine sahiptir. Bağlayıcı genellikle bilgileri bu arşiv üyelerine yerleştirir. Bağlayıcı üyeleri arşivin dizinini içerir.

  • Üçüncü üye "longnames" üyesidir. Bu isteğe bağlı üye, her dizenin başka bir arşiv üyesinin adı olduğu null sonlandırılan bir dizi ASCII dizeden oluşur.

  • Arşivin geri kalanı standart (object-file) üyelerden oluşur. Bu üyelerin her biri, bir nesne dosyasının içeriğini tamamen içerir.

Her üyenin önünde bir arşiv üyesi üst bilgisi bulunur. Aşağıdaki listede bir arşivin genel yapısı gösterilmektedir:

İmza :"!<kemer>\n"
Üstbilgi
1. Bağlayıcı Üyesi
Üstbilgi
2. Bağlayıcı Üyesi
Üstbilgi
Longnames Üyesi
Üstbilgi
OBJ Dosya 1'in İçeriği
(COFF biçimi)
Üstbilgi
OBJ Dosya 2'nin İçeriği
(COFF biçimi)

...

Üstbilgi
OBJ Dosyası N İçeriği
(COFF biçimi)

Arşiv Dosyası İmzası

Arşiv dosyası imzası, dosya türünü tanımlar. Arşiv dosyasını giriş olarak alan herhangi bir yardımcı program (örneğin, bağlayıcı) bu imzayı okuyarak dosya türünü denetleyebilir. İmza, aşağıdaki ASCII karakterlerden oluşur ve bu karakterlerden her biri, yeni satır (\n) karakteri dışında tam anlamıyla temsil edilir:

!<arch>\n

Windows SDK winnt.h üst bilgisi aşağıdaki makroları tanımlar:

#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>/   "

Üye Üst Bilgilerini Arşivle

Her üyenin (bağlayıcı, longnames veya object-file üyesi) önünde bir üst bilgi bulunur. Arşiv üyesi üst bilgisi, her alanın iki yana yaslanmış ve alanın sonuna boşluklarla doldurulmuş bir ASCII metin dizesi olduğu aşağıdaki biçimdedir. Bu alanların hiçbirinde sonlandırıcı null karakter yok.

Her üye üst bilgisi, önceki arşiv üyesinin sonundan sonra ilk çift adreste başlar; aşağıdaki üyenin çift adreste başlatılması için bir arşiv üyesinden sonra bir bayt '\n' (IMAGE_ARCHIVE_PAD) eklenebilir.

Ofset Boyut Alan Açıklama
0
16
Ad
Adı sonlandırmak için eğik çizgi (/) eklenmiş arşiv üyesinin adı. İlk karakter eğik çizgiyse, adın aşağıdaki tabloda açıklandığı gibi özel bir yorumu vardır.
16
12
Tarih
Arşiv üyesinin oluşturulduğu tarih ve saat: Bu, 1/1/1970 UCT'den bu yana saniye sayısının ASCII ondalık gösterimidir.
28
6
Kullanıcı Kimliği
Kullanıcı kimliğinin ASCII ondalık gösterimi. Microsoft araçları tüm boşlukları yaydığından bu alan Windows platformlarında anlamlı bir değer içermiyor.
34
6
Grup Kimliği
Grup kimliğinin ASCII ondalık gösterimi. Microsoft araçları tüm boşlukları yaydığından bu alan Windows platformlarında anlamlı bir değer içermiyor.
40
8
Mod
Üyenin dosya modunun ASCII sekizli gösterimi. Bu, C çalışma zamanı işlevi _wstat ST_MODE değeridir.
48
10
Boyut
Üst bilginin boyutu dahil değil, arşiv üyesinin toplam boyutunun ASCII ondalık gösterimi.
58
2
Üst Bilgi Sonu
"'\n" (IMAGE_ARCHIVE_END) C dizesindeki iki bayt (0x60 0x0A).

Ad alanı, aşağıdaki tabloda gösterilen biçimlerden birine sahiptir. Daha önce belirtildiği gibi, bu dizelerin her biri iki yana yaslanır ve 16 baytlık bir alanda sondaki boşluklarla doldurulur:

Ad alanının içeriği Açıklama
ad/
Arşiv üyesinin adı.
/
Arşiv üyesi, iki bağlayıcı üyesinden biridir. Bağlayıcı üyelerinin her ikisi de bu ada sahiptir.
//
Arşiv üyesi, null olarak sonlandırılan bir dizi ASCII dizeden oluşan longnames üyesidir. longnames üyesi üçüncü arşiv üyesidir ve isteğe bağlıdır.
/n
Arşiv üyesinin adı, longnames üyesi içinde n uzaklığında bulunur. n sayısı, uzaklık değerinin ondalık gösterimidir. Örneğin: "/26", arşiv üyesinin adının longnames üye içeriğinin başlangıcının 26 bayt ötesinde olduğunu gösterir.

 

İlk Bağlayıcı Üyesi

İlk bağlayıcı üyesinin adı "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Geriye dönük uyumluluk için ilk bağlayıcı üyesi eklenir. Geçerli bağlayıcılar tarafından kullanılmaz, ancak biçimi doğru olmalıdır. Bu bağlayıcı üyesi, ikinci bağlayıcı üyesi gibi simge adlarının bir dizinini sağlar. Her simge için bilgiler, simgeyi içeren arşiv üyesinin nerede bulunacağı gösterir.

İlk bağlayıcı üyesi aşağıdaki biçime sahiptir. Bu bilgiler üst bilgiden sonra görünür:

Ofset Boyut Alan Açıklama
0
4
Simge Sayısı
Dizine alınan simgelerin sayısını içeren işaretsiz uzun. Bu sayı büyük endian biçiminde depolanır. Her nesne dosyası üyesi genellikle bir veya daha fazla dış simge tanımlar.
4
4 * n
Kaydırır
Dosya uzaklıkları dizisi, n'nin Simge Sayısı alanına eşit olduğu arşiv üyesi üst bilgilerine kaydırılır. Dizideki her sayı, büyük endian biçiminde depolanan işaretsiz bir uzundur. Dize tablosunda adlandırılan her simge için offsets dizisindeki karşılık gelen öğe, simgeyi içeren arşiv üyesinin konumunu verir.
*
*
Dize Tablosu
Dizindeki tüm simgeleri adlandıran bir dizi null sonlandırılan dize. Her dize, önceki dizedeki null karakterden hemen sonra başlar. Dize sayısı, Simge Sayısı alanının değerine eşit olmalıdır.

 

Offsets dizisindeki öğeler artan düzende düzenlenmelidir. Bu olgu, dize tablosundaki simgelerin arşiv üyelerinin sırasına göre düzenlenmesi gerektiğini gösterir. Örneğin, birinci nesne dosyası üyesindeki tüm simgelerin ikinci nesne dosyasındaki simgelerinden önce listelenmiş olması gerekir.

İkinci Bağlayıcı Üyesi

İlk bağlayıcı üyesi gibi, ikinci bağlayıcı üyesi de "/" (IMAGE_ARCHIVE_LINKER_MEMBER) adına sahiptir. Her iki bağlayıcı üyesi de bunları içeren bir simge dizini ve arşiv üyeleri sağlasa da, ikinci bağlayıcı üyesi tüm geçerli bağlayıcılar tarafından tercih edilen ilk üye olarak kullanılır. İkinci bağlayıcı üyesi, ada göre daha hızlı arama sağlayan sözcük düzeninde sembol adlarını içerir.

İkinci üye aşağıdaki biçime sahiptir. Bu bilgiler üst bilgiden sonra görünür:

Ofset Boyut Alan Açıklama
0
4
Üye Sayısı
Arşiv üyesi sayısını içeren imzasız bir uzun.
4
4 * m
Kaydırır
Bir dosya dizisi, artan düzende düzenlenmiş, arşiv üyesi üst bilgilerine uzaklık sağlar. Her uzaklık işaretsiz bir uzundur. m sayısı, Üye Sayısı alanının değerine eşittir.
*
4
Simge Sayısı
Dizine alınan simge sayısını içeren işaretsiz bir uzun. Her nesne dosyası üyesi genellikle bir veya daha fazla dış simge tanımlar.
*
2 * n
Endeksi
Sembol adlarını üye uzaklıklarını arşivle eşleyen 1 tabanlı dizin dizisi (işaretsiz kısa). n sayısı, Simge Sayısı alanına eşittir. Dize tablosunda adı geçen her simge için, Indices dizisindeki karşılık gelen öğe offsets dizisine bir dizin verir. Offsets dizisi de simgeyi içeren arşiv üyesinin konumunu verir.
*
*
Dize Tablosu
Dizindeki tüm simgeleri adlandıran bir dizi null sonlandırılan dize. Her dize, önceki dizedeki null bayt'ın hemen ardından başlar. Dize sayısı, Simge Sayısı alanının değerine eşit olmalıdır. Bu tabloda tüm simge adları artan sözcük düzeninde listeleniyor.

 

Longnames Üyesi

Longnames üyesinin adı "//" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). longnames üyesi, arşiv üyesi adlarının bir dizi dizesidir. Burada bir ad yalnızca Ad alanında yeterli alan olmadığında (16 bayt) görüntülenir. longnames üyesi isteğe bağlıdır. Yalnızca üst bilgiyle boş olabilir veya üst bilgi olmadan tamamen eksik olabilir.

Dizeler null olarak sonlandırılır. Her dize, önceki dizedeki null bayt'ın hemen ardından başlar.

Kitaplık Biçimini İçeri Aktar

Geleneksel içeri aktarma kitaplıkları, yani bir görüntüden dışarı aktarmaları başka bir görüntü tarafından kullanılmak üzere açıklayan kitaplıklar, genellikle 7. bölümde açıklanan düzeni izler Arşiv (Kitaplık) Dosya Biçimi. Birincil fark, içeri aktarma kitaplığı üyelerinin gerçekler yerine sahte nesne dosyaları içermesidir; burada her üyenin bölüm 6.4'te açıklanan içeri aktarma tablolarını oluşturmak için gereken bölüm katkılarını içermesi .idata Bölümü Bağlayıcı, dışarı aktarma uygulamasını oluştururken bu arşivi oluşturur.

İçeri aktarmaya yönelik bölüm katkıları, küçük bir bilgi kümesinden çıkarılabilir. Bağlayıcı, kitaplığın oluşturulduğu sırada her üye için içeri aktarma kitaplığına eksiksiz, ayrıntılı bilgiler oluşturabilir veya yalnızca kurallı bilgileri kitaplığa yazabilir ve daha sonra kullanan uygulamanın gerekli verileri anında oluşturmasına izin verebilir.

Uzun biçimli bir içeri aktarma kitaplığında, tek bir üye aşağıdaki bilgileri içerir:

  • Arşiv üyesi üst bilgisi
  • Dosya üst bilgisi
  • Bölüm üst bilgileri
  • Bölüm üst bilgilerinin her birine karşılık gelen veriler
  • COFF sembol tablosu
  • Dize

Buna karşılık, kısa bir içeri aktarma kitaplığı aşağıdaki gibi yazılır:

  • Arşiv üyesi üst bilgisi
  • Üst bilgiyi içeri aktarma
  • Null olarak sonlandırılan içeri aktarma adı dizesi
  • Null olarak sonlandırılan DLL ad dizesi

Bu, kullanım sırasında üyenin tüm içeriğini doğru bir şekilde yeniden yapılandırmak için yeterli bilgidir.

Üst Bilgiyi İçeri Aktar

İçeri aktarma üst bilgisi aşağıdaki alanları ve uzaklıkları içerir:

Ofset Boyut Alan Açıklama
0
2
Sig1
IMAGE_FILE_MACHINE_UNKNOWN olmalı. Daha fazla bilgi için bkz. Makine Türleri.
2
2
Sig2
0xFFFF olmalı.
4
2
Sürüm
Yapı sürümü.
6
2
Makine
Hedef makinenin türünü tanımlayan sayı. Daha fazla bilgi için bkz. Makine Türleri.
8
4
Time-Date Damgası
Dosyanın oluşturulduğu saat ve tarih.
12
4
Veri boyutu
Üst bilgiden sonra gelen dizelerin boyutu.
16
2
Sıralı/İpucu
İçeri aktarma için Ad Türü alanındaki değer tarafından belirlenen sıralı veya ipucu.
18
2 bit
Tür
İçeri aktarma türü. Belirli değerler ve açıklamalar için bkz. İçeri Aktarma Türü.
3 bit
Ad Türü
İçeri aktarma adı türü. Daha fazla bilgi için bkz. Ad Türünü İçeri Aktar.
11 bit
Ayrılmış
Ayrılmış, 0 olmalıdır.

 

Bu yapıyı, içeri aktarılan simgenin adını ve geldiği DLL'yi açıklayan iki null ile sonlandırılan dize izler.

İçeri Aktarma Türü

İçeri aktarma üst bilgisindeki Tür alanı için aşağıdaki değerler tanımlanır:

Sabit Değer Açıklama
IMPORT_OBJECT_CODE
0
Yürütülebilir kod.
IMPORT_OBJECT_DATA
1
Veri.
IMPORT_OBJECT_CONST
2
.def dosyasında CONST olarak belirtilir.

Bu değerler, söz konusu verilere erişmesi gerekiyorsa kitaplığı kullanan araç tarafından hangi bölüm katkılarının oluşturulması gerektiğini belirlemek için kullanılır.

İçeri Aktarma Adı Türü

Null ile sonlandırılan içeri aktarma simgesi adı, ilişkili içeri aktarma üst bilgisini hemen izler. İçeri aktarma üst bilgisindeki Ad Türü alanı için aşağıdaki değerler tanımlanır. İçeri aktarmayı temsil eden doğru simgeleri oluşturmak için adın nasıl kullanılacağını belirtir:

Sabit Değer Açıklama
IMPORT_OBJECT_ORDINAL 0 İçeri aktarma sıralı olarak yapılır. Bu, içeri aktarma üst bilgisinin Sıra/İpucu alanındaki değerin içeri aktarmanın sıralı değeri olduğunu gösterir. Bu sabit belirtilmezse Sıra/İpucu alanı her zaman içeri aktarmanın ipucu olarak yorumlanmalıdır.
IMPORT_OBJECT_NAME 1 İçeri aktarma adı genel simge adıyla aynıdır.
IMPORT_OBJECT_NAME_NOPREFIX 2 İçeri aktarma adı genel simge adıdır, ancak başındaki ?, @ veya isteğe bağlı olarak _ atlanır.
IMPORT_OBJECT_NAME_UNDECORATE 3 İçeri aktarma adı genel simge adıdır, ancak başındaki ?, @ veya isteğe bağlı olarak _ atlanır ve ilk @ işaretinde kesilir.

Ek A: Authenticode PE Görüntü Karması Hesaplama

Görüntülerin bütünlüğünü doğrulamak için birkaç öznitelik sertifikasının kullanılması beklenir. Ancak en yaygın olanı Authenticode imzasıdır. Authenticode imzası, PE görüntü dosyasının ilgili bölümlerinin dosyanın özgün biçiminden herhangi bir şekilde değiştirilmediğini doğrulamak için kullanılabilir. Bu görevi gerçekleştirmek için Authenticode imzaları PE görüntü karması olarak adlandırılan bir öğe içerir

Authenticode PE Görüntü Karması nedir?

Authenticode PE görüntü karması veya kısaca dosya karması, dosyanın bütünlüğüyle ilgili küçük bir değer üretmesi açısından dosya sağlama toplamına benzer. Sağlama toplamı basit bir algoritma tarafından oluşturulur ve öncelikli olarak bellek hatalarını algılamak için kullanılır. Yani, disk üzerindeki bir bellek bloğunun bozulup bozulmadığını ve orada depolanan değerlerin bozulup bozulmadığını algılamak için kullanılır. Dosya karması, dosya bozulmasını da algılayan sağlama toplamına benzer. Ancak, çoğu sağlama toplamı algoritmasının aksine, bir dosyayı özgün (değiştirilmemiş) formuyla aynı dosya karması olacak şekilde değiştirmek çok zordur. Yani, sağlama toplamı bozulmaya yol açan basit bellek hatalarını algılamaya yöneliktir, ancak virüsler, bilgisayar korsanları veya Truva atı programları tarafından sunulanlar gibi bir dosyada kasıtlı ve hatta zarif değişiklikleri algılamak için bir dosya karması kullanılabilir.

Authenticode imzasında, dosya karması yalnızca dosyanın imzalayanı tarafından bilinen bir özel anahtar kullanılarak dijital olarak imzalanır. Yazılım tüketicisi, dosyanın karma değerini hesaplayıp Authenticode dijital imzasında yer alan imzalı karma değeriyle karşılaştırarak dosyanın bütünlüğünü doğrulayabilir. Dosya karmaları eşleşmiyorsa, PE görüntü karması kapsamındaki dosyanın bir bölümü değiştirilmiş olur.

Authenticode PE Görüntü Karmasında Neler Ele Alınmıştır?

PE görüntü karması hesaplamasına tüm görüntü dosyası verilerini eklemek mümkün veya arzu edilmez. Bazen istenmeyen özellikler sunar (örneğin, hata ayıklama bilgileri genel kullanıma açık dosyalardan kaldırılamaz); bazen imkansızdır. Örneğin, bir görüntü dosyasındaki tüm bilgileri Authenticode imzasına eklemek, ardından bu PE görüntü karması içeren Authenticode imzasını PE görüntüsüne eklemek ve daha sonra tüm görüntü dosyası verilerini hesaplamaya yeniden ekleyerek aynı PE görüntü karması oluşturmak mümkün değildir, çünkü dosya artık özgün olarak orada olmayan Authenticode imzasını içerir.

Authenticode PE Görüntü Karması Oluşturma İşlemi

Bu bölümde, PE görüntü karması nasıl hesaplandığı ve Authenticode imzası geçersiz kılınmadan PE görüntüsünün hangi bölümlerinin değiştirilebileceği açıklanmaktadır.

Not

Belirli bir dosyanın PE görüntü karması, karma dosyaya öznitelik sertifikası eklemeden ayrı bir katalog dosyasına eklenebilir. Bu, Authenticode imzalı bir katalog dosyasındaki PE görüntü karması aslında Authenticode imzası içermeyen bir PE görüntüsünü değiştirerek geçersiz kılmanın mümkün olması nedeniyle geçerlidir.

Pe görüntüsünün bölüm tablosunda belirtilen bölümlerindeki tüm veriler, aşağıdaki dışlama aralıkları dışında tamamen karma olarak oluşturulur:

  • İsteğe bağlı üst bilginin Windows'a özgü alanlarının CheckSum dosyası alanı. Bu sağlama toplamı dosyanın tamamını (dosyadaki öznitelik sertifikaları dahil) içerir. Tüm olasılıklarda, Authenticode imzası eklendikten sonra sağlama toplamı özgün değerden farklı olacaktır.

  • öznitelik sertifikalarıyla ilgili bilgiler. Authenticode imzaları görüntünün genel bütünlüğünü etkilemeden bir görüntüye eklenip kaldırılabildiğinden, PE görüntüsünün Authenticode imzası ile ilişkili alanları PE görüntü karması hesaplamasına dahil edilmez. PE görüntülerini yeniden imzalamaya veya zaman damgası eklemeye bağlı kullanıcı senaryoları olduğundan bu bir sorun değildir. Authenticode, aşağıdaki bilgileri karma hesaplamanın dışında tutar:

    • İsteğe bağlı üst bilgi veri dizinlerinin Sertifika Tablosu alanı.

    • Sertifika Tablosu ve hemen yukarıda listelenen Sertifika Tablosu alanı tarafından işaret edilen karşılık gelen sertifikalar.

    Authenticode, PE görüntü karması hesaplamak için bölüm tablosunda belirtilen bölümleri adres aralığına göre sıralar ve ardından elde edilen bayt dizisini karma olarak kullanarak dışlama aralıklarını geçirir.

  • Son bölümün sonundan önceki bilgiler. Son bölümü geçen alan (en yüksek uzaklık tarafından tanımlanır) karma değil. Bu alan genellikle hata ayıklama bilgilerini içerir. Hata ayıklama bilgileri genellikle hata ayıklayıcılara danışmanlık olarak kabul edilebilir; yürütülebilir programın gerçek bütünlüğünü etkilemez. Bir ürün teslim edildikten sonra görüntüden hata ayıklama bilgilerini kaldırmak ve programın işlevselliğini etkilememek tam anlamıyla mümkündür. Aslında, bu bazen disk tasarruflu bir ölçü olarak yapılır. PE Görüntüsünün belirtilen bölümlerinde yer alan hata ayıklama bilgilerinin Authenticode imzası geçersiz kılınmadan kaldırılamayacağına dikkat edin.

Authenticode imzaları oluşturma ve doğrulama denemeleri yapmak için Windows Platformu SDK'sında sağlanan makecert ve signtool araçlarını kullanabilirsiniz. Daha fazla bilgi için aşağıdaki Başvuru bölümüne bakın.

Başvuru

Windows için indirmeler ve araçlar (Windows SDK'sını içerir)

Sertifika Oluşturma, Görüntüleme ve Yönetme

Kernel-Mode Kod İmzalama kılavuzu (.doc)

SignTool

Windows Authenticode Taşınabilir Yürütülebilir İmza Biçimi (.docx)

ImageHlp İşlevleri