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
- MS-DOS Saptama (Yalnızca Görüntü)
- İmzası (Yalnızca Resim)
- COFF Dosya Üst Bilgisi (Nesne ve Görüntü)
- İsteğe Bağlı Üst Bilgi (Yalnızca Resim)
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
- Bölüm Verileri
- COFF Yeniden Konumlarını (Yalnızca Nesne)
- COFF Satır Numaralarını (Kullanım Dışı)
- COFF Sembol Tablosu
- Sembol Adı Gösterimi
- bölüm numarası değerlerini
- Tür Gösterimi
- Depolama Sınıfı
-
Yardımcı Sembol Kayıtları
- Yardımcı Biçim 1: İşlev Tanımları
- Yardımcı Biçim 2: .bf ve .ef Sembolleri
- Yardımcı Biçim 3: Zayıf Dışlar
- Yardımcı Biçim 4: Dosyalar
- Yardımcı Biçim 5: Bölüm Tanımları
- COMDAT Bölümlerini (Yalnızca Nesne)
- CLR Belirteci Tanımı (Yalnızca Nesne)
- COFF Dize Tablosu
- Öznitelik Sertifika Tablosunu (Yalnızca Görüntü)
- Tabloları İçeri Aktarma (Yalnızca Resim) Delay-Load
Ş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:
- İlk öznitelik sertifikasının dwLength değerini başlangıç uzaklığına ekleyin.
- İkinci öznitelik sertifika girişinin uzaklığını bulmak için 1. adımdaki değeri en yakın 8 baytlık katına yuvarlar.
- Üçü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.
- 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.Function
ifadesi 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
- .debug Bölümü
- Hata Ayıklama Dizini (Yalnızca Görüntü)
- Hata Ayıklama Türü
- .debug$F (Yalnızca Nesne)
- .debug$S (Yalnızca Nesne)
- .debug$P (Yalnızca Nesne)
- .debug$T (Yalnızca Nesne)
- Microsoft Hata Ayıklama Bilgileri için Bağlayıcı Desteği
- .drectve Bölümü (Yalnızca Nesne)
- .edata Bölümü (Yalnızca Resim)
- Dizin Tablosu Dışarı Aktarma
- Adres Tablosunu dışarı aktarma
- Dışarı Aktarma Adı İşaretçisi Tablosu
- Sıralı Tablo dışarı aktarmayı
- Ad Tablosunu dışarı aktarma
- .idata Bölümü
- Dizin Tablosunu İçeri Aktarma
- Arama Tablosunu İçeri Aktarma
- İpucu/Ad Tablosu
- Adres Tablosunu İçeri Aktarma
- .pdata Bölümü
- .reloc Bölümü (Yalnızca Görüntü)
- .tls Bölümü
- Yük Yapılandırma Yapısı (Yalnızca Görüntü)
- yapılandırma dizini yükleme
- Yükleme Yapılandırma Düzeni
- .rsrc Bölümü
- Kaynak Dizini Tablosu
- Kaynak Dizini Girdileri
- Kaynak Dizin Dizesi
- kaynak veri girişi
- .cormeta Bölümü (Yalnızca Nesne)
- .sxdata Bölümü
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:
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:
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.
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.
Yükleyici TLS dizininin değerini Dizin Adresi alanıyla belirtilen yere atar.
Yürütülebilir kod TLS dizinini ve ayrıca TLS dizisinin konumunu alır.
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.
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
- Dosya İmzası Arşivle
- Üye Üst Bilgilerini Arşivle
- İlk Bağlayıcı Üyesi
- İkinci Bağlayıcı Üyesi
- Longnames Üyesi
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
- Üst Bilgi İçeri Aktarma
- İçeri Aktarma Türü
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)
Windows Authenticode Taşınabilir Yürütülebilir İmza Biçimi (.docx)