PE (Portable Executable) Nedir ?

7 Kas 2021
65
87
24
Berlin
Herkese merhaba THT ailesi. Bugün sizlere Windows işletim sistemi için kullanılan PE dosya formatından bahsedeceğim.
sbzcdf3.jpg

PORTABLE EXECUTABLE (PE) NEDİR ?
Portable Executable (PE), Windows'un çalıştırılabiilir dosya formatıdır. Portable Executable ".acm, .ax, .cpl, .drv, .efi, .mui, .ocx, .sys, .tsp" ve aşina olduğumuz; dinamik bağlantı kitaplıkları ".dll" ve yürütülebilir dosyaları ".exe." uzantılarını kapsar. Windows işletim sistemi, PE dosya formatını kullanarak programları yükler, çalıştırır ve yönetir. PE dosyaları, bir Windows uygulamasının veya programının içinde bulunan bilgileri düzenli bir biçimde depolayan bir dosya türüdür. PE dosyaları, işletim sistemi tarafından anlaşılır ve yürütülebilir bir formata sahiptir. Windows, PE dosyalarını çalıştırırken bu dosyaların içerdiği bilgileri kullanarak programları belleğe yükler ve yürütür. Bu süreç, kullanıcıların bilgisayarlarında uygulamaları çalıştırmalarını sağlar. PE dosyalarının içindeki yapı, işletim sistemi tarafından anlaşıldığı için Windows, bu dosyaları uygun şekilde yönetebilir. Bu dosya formatı, Windows'un önceki sürümlerinden itibaren kullanılmış ve günümüzde hala temel dosya formatı olarak varlığını sürdürmektedir. PE dosyaları, Windows uygulamalarının düzgün bir şekilde yüklenmesini ve çalıştırılmasını sağlamak üzere tasarlanmıştır.
c3m4idf.jpg

PE DOSYA FORMATI NEDEN ÖNEMLİDİR ?
Dosya formatındaki başlıklar o dosya ile ilgili kritik bilgiler içermektedir. Örneğin PE dosyasının yükleneceği makine türü, eğer çalıştırılabilen bir dosya ise programın entry point adresi, PE dosyasının oluşturulduğu tarih gibi önemli olabilecek bilgiler içermektedir. Ancak bu formatın Windows için önemi çok daha fazladır. Yürütülebilir kodların ve uygulamaların yüklenmesi, Windows uygulama geliştirmeleri, yürütülebilir dosya güvenliği, dinamik bağlantı kitaplıkları, dinamik yüklenme ve yürütme ve Windows uyumlu araçlar ve hata ayıklama araçları tarafından desteklenmesi gibi birçok kritik rol oynar.
wk600ry.jpg

RELATİVE VİRTUAL ADDRESS (RVA) NEDİR ?
İşletim sistemi, PE formatını beleğe yüklerken belleğin direk başından itibaren yüklemek zorunda değildir. PE formatının yükleme adresi kendi içinde zaten bulunmaktadır. Relative Virtual Address (RVA), dosya belleğe yüklendikten sonra dosya içerisindeki belli bir bölümün yükleme adresinden ne kadar uzakta olduğunu belirtir.
Peki bu bizim ne işimize yarıyacak ? Örnek vericek olursak dosyanın içerisindeki belli bir bölgenin RVA'sını biliyorsak, PE dosyası belleğe yüklendikten sonra o belirli bölge yükleme adresinden RVA kadar uzakta olacaktır. Böylece işletim sistemi PE dosya formatını belleğe yüklediğinde belirli bölgenin nerede olduğunu tespit edebiliriz.
c3m4idf.jpg
PE DOSYA FORMATI

q76u3ib.png

Yukarıda gördüğünüz gibi PE file format Headers (Başlıklar) ve Sections (Bölümler) den oluşuyor.
DOS HEADER
İlk olarak "DOS Header" dan bahsedelim. DOS Header (DOS Başlığı), aslında uyumluluk sağlamak için bulunmakta. Bu bölüm ile birlikte ufak bir DOS programı var. Programın yaptığı işlev ise, eğer bu PE dosyasını DOS sisteminde çalıştırmaya kalkarsanız ekrana bu PE dosyasını DOS ortamında çalıştırmayacağınızı söyleyen bir hata mesajı verip programı sonlandırmak. Yani çok bir olayı yok. Uyumluluk sağlamak için PE dosya formatına ekleniyor.
wk600ry.jpg

IMAGE FILE HEADER
Bu başlık, PE dosyasına ait önemli birkaç bigiyi tutuyor. Bu header dosyası IMAGE_FILE_HEADER yapısıyla yemsil edilmiştir. Yapıya göz atıcak olursak;
Kod:
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
Buradaki "WORD" ve "DWORD" sizde karışıklık yaratmasın. WORD 16 bit (2byte) işaretsiz tamsayı, DWORD 32 bit (4byte) işaretsiz tamsayı yerini tutmakta. Şimdi bu yapının elemanlarına göz atalım ve açıklayalım.
  • WORD_Machine: Bu alan PE dosyasının yükleneceği makinanın türünü belirtir. Aşağıda sıklıkla kullanılan birkaç değeri görebilirsiniz;
  • 0x0000 = Herhangi bir makine türü için
    • 0xlc40 = ARMv7 (yada daha yukarı)
    • 0xebc0 = EFI byte code
    • 0x8664 = x64 (64 bit PE formatı için)
    • 0x14c0 = Intel 386 ya da bununla uyumlu daha ileri model (32 bit PE formatı için)
  • WORD_NumberOfSections: Bu alanda section table (bölm tablosunun) eleman sayısı bulunur.
  • DWORD_TimeDateStamp: Bu alanda PE dosyasının yaratıldığı tarih bilgisi bulunmakta.
  • DWORD_PointerToSymbolTable: Çalıştırılabilir dosyalar için bu kısım önemsizdir ve sıfır (0) bulunur. Bu kısım, COFF formatı için önemlidir. COFF dosyalarının sembol tablosunun dosya offseti bulunur.
  • DWORD_NumberOfSymbols: Çalıştırılabilir dosyalar için bu kısım önemsizdir ve burası da sıfır (0) gösterir. COFF dosyaları için bu alanda sembol tablosunda ki eleman sayısı bulunur.
  • WORD_SizeOfOptionalHeader: Bu kısımda IMAGE_FILE_HEADER dan sonra gelen IMAGE_OPTIONAL_HEADER başlığımım byte cinsinden değeri bulunur.
  • WORD_Characteristics: Bu alanda PE dosyasına ilişkin bazı özellikler bitsel olarak kodlanmıştır. Bazı önemli bitler ve karşılıklarını aşağıda listeliyorum.
    • 0x0001 = Bu bitin anlamı; relocation bilgisi eklenmemiştir. Yani dosya sadece belirtilen adrese yüklenebilir aksi takdirde dosya yüklenmez.
    • 0x002 = Bu bitin anlamı, dosya çalıştırılabilir dosyadır.
    • 0x0100 = Dosyanın çalışacağı makina 32 bit işlemcili bir makinadır.
    • 0x2000 = Dosya bir .dll dosyasıdır.
Görüldüğü gibi bir dosyanın .exe veya .dll olmasını bu kısım belirliyor.
wk600ry.jpg

İMAGE OPTİONAL HEADER
İsmine kesinlikle aldanmayın, bu başlık sanılan aksine kesinlikle isteğe bağlı değildir. Tam tersine ilk sack boyutu, programın entry pointi, işletim sisteminin versiyonu gibi çok kritik blgiler taşır. Bu kısmın 32 bit ve 64 bit versiyonları var fakat sadece boyut olarak farklılıklar barındırıyor.
Bu header dosyası içerisinde IMAGE_OPTIONAL_HEADER yapısıyla temsil edilmiştir. Yapıya göz atıcak olursak;
Kod:
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
USHORT Magic;
UCHAR MajorLinkerVersion;
UCHAR MinorLinkerVersion;
ULONG SizeOfCode;
ULONG SizeOfInitializedData;
ULONG SizeOfUninitializedData;
ULONG AddressOfEntryPoint;
ULONG BaseOfCode;
ULONG BaseOfData;
//
// NT additional fields.
//
ULONG ImageBase;
ULONG SectionAlignment;
ULONG FileAlignment;
USHORT MajorOperatingSystemVersion;
USHORT MinorOperatingSystemVersion;
USHORT MajorImageVersion;
USHORT MinorImageVersion;
USHORT MajorSubsystemVersion;
USHORT MinorSubsystemVersion;
ULONG Reserved1;
ULONG SizeOfImage;
ULONG SizeOfHeaders;
ULONG CheckSum;
USHORT Subsystem;
USHORT DllCharacteristics;
ULONG SizeOfStackReserve;
ULONG SizeOfStackCommit;
ULONG SizeOfHeapReserve;
ULONG SizeOfHeapCommit;
ULONG LoaderFlags;
ULONG NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

Gördüğünüz gibi yapı "standart fields" ve "nt additionals field" ile iki kısımdan oluşuyor. Standart Fields genellikle Unix executable dosyaları, Common Object File Format, COFF için kullanır. Fakat sadece Unix executable dosyaları kullanmaz bu kısmı, Windows'ta farklı amaçlarla kullanılır. Şimdi buradaki yapıyı inceleyelim;
  • Magic: Burada 0x010b ve 0x020b değerleri bulunabilir. 32 bit 0x010b' yi ifade ederken, 64 bit ise 0x020b' yi ifade eder.
  • MajorLinkerVersion & MinorLinkerVersion: Bu kısımda linkerin majör ve minör versiyon bilgileri bulunur.
  • SizeOfCode: Executable kodun boyutunu tutar.
  • SizeOfInitializedData: İlk değer atanmış verilerin toplam boyutunu tutar. (Genelde .data kısmında bulunur.)
  • SizeOfUnintializedData: İlk değer atanmamış verilerin toplam boyutunu tutar. ( .bss kısmında bulunurlar.)
  • AddressOfEntryPoint: Bu kısım executable dosyların başlangıç noktasının RVA' sını, .dll dosyalarının ise DIIMain fonksiyonunun RVA'sını tutar. Genellikle .text bölümünde bi yer belirtir.
  • BaseOfCode: Bu kısımda executable kodların olduğu bölümün (genellikle .text bölümü) RVA'sını tutar.
  • BaseOfData: İlk değer atanmış verilerin bulnduğu (.data bölümü) bölümün RVA'sını tutar.
  • ImageBase: Linker, PE formatının yükleneceği adresi bu kısma yazar. Genel olarak 32 bit .exe için bu kısımda 0x00400000 (4MB) bulunur. Tabiki linker ayarlarından bu kısım değiştirilebilir ancak genel olarak bu kısımda 0x00400000 bulunur. Peki PE dosylarında çoğunlukla aynı değer bulunuyor ise birden fazla dosyayı çalıştırmaya çalıştığımız zaman nasıl karışmıyor ? Yer değiştirme (relocation) ile. Dosya içinde bulunan relocation bilgisi ile bilgisi ile dosya farklı bir adresten itibaen yüklenir.
  • SectionAlignment: Buradaki değer bölümlerin yüklenirken nasıl bir hizalamaya uyacağını gösterir. Tipik olarak 0x00001000 (4KB) değeri bulunur. (Windowsta page (sayfa) boyutu 4KB' tır.)
  • FileAlignment: Bölümlerin diskte hangi değerin katlarına uygun şekilde sıralacağını tutar. Varsayılan olarak 512 bulunur.
  • MajorOperatingSystemVersion, MinorOperatingSystemVersion: Bu kısımda PE dosyasının yükleneceği minimum işletim sisteminin versiyon bilgisi mevcuttur.
  • MajorImage Version & MinorImage Version: Bu kısımda yüklenecek PE dosyasının minör ve major versiyon numaraları bulunur.
  • MajorSubsystemVersion, MinorSubsystemVersion: Burada işletim sisteminde kullanılan minör ve major değerler bulunur
  • SizeOfImage: Dosyanın bölümlerinin toplam boyutunu tutar.
  • SizeOfHeaders: PE headerın ve section tablosunun boyutunu bulundurur.
  • CheckSum: CRC checksum için ayrılmıştır. Fakat genellikle sıfır (0) bulunur.
  • Subsystem: Kullanıcının kullanacağı interface' i belirtir.
    • 1(Native): Subsystem gerekli olmayan uygulamalar için (örn. Driver...)
    • 2(Windows_GUI)
    • 3(Windows_CUI)
    • 5(OS2_CUI)
    • 7(POSIX_CUI)
  • DllCharacteristics: Dll için belirli flagleri akif eder.
  • SizeOfStackReserve: Her thread için stack bulunur. Bu kısımda stack için ayrılıcak alanın büyüklüğünü belirliyor. Default olarak 0x100000 (1MB) dir.
  • SizeOfStackCommit: İlk thread için commit edilecek stack boyutu bulunur. Default olarak 0x1000 bytes (1page).
  • SizeOfHeapReserve: Program için ayrılacak heap alanı boyutunu belirtir.
  • SizeOfHeapCommit: Başlangıçta commit edilecek heap miktarını belirtir. Default olarak 0x1000 bytes (1 page).
  • NumberOfRvaAndSizes: Dosya içerisindeki veri dizininde kaç adet girdi olduğunu belirtir.
wk600ry.jpg

DATA DIRECTORY (VERİ DİZİNİ)
Veri dizini, PE formatı için önemli olan tabloların yerlerini ve uzunluklarını tutar. Toplamda 8 byte büyüklüğünde; 4 byte RVA, 4 byte uzunluk bilgisi
q1x28tq.png

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

Bu yapdaki VirtualAddress tablonun RVA'sını, Size ise büyüklüğünü tutuyor. Yani bu yapı tablonun kendisini değil, onun başlangıç adresi ve büyüklüğünü tutuyor.
c3m4idf.jpg

SECTİON TABLE (BÖLÜM TABLOSU)
Bölüm tablosu PE headerı ve raw data kısımları arasında bulunur. Bu tablo her bir section ile alakalı kayıt tutar.
kwee5id.jpg
PE dosyası sectionlardan oluşur. Bu sectionlar içindeki verinin nasıl bir yapıda olduğunu belirtir. Örneğin code section'nında execute edilicek opcode'lar bulunur. Data section'nında ilk değer verilmiş global ve statik veriler bulunur. Bss section'nunda ise ilk değer verilmemiş global ve statik veriler bulunur.
Kod:
static int a = 0; // Data section
static int b; // Bss section
Fark edildiği gibi sadece global ve statik veriler section'larda saklanıyor. Lokal değişkenler .data, .bss gibi section'larda saklanmıyor. Bunun yerine ptogramı execute ettiğimizde çalışma zamanında oluşturulup stack te depolanır ve gerektiğinde stack'ten okunup gerekli işlem yapılır. Şimdi section tablosundaki IMAGE_SECTION_HEADER başlığını inceleyelim.
  • BYTE Name [IMAGE_SIZEOF_SHORT_NAME]: Bu kısımda section'ın ismi bulunuyor.
  • union{DWORD PhysicalAddress, DWORD VirtualSize}Misc: Bu kısım .exe ve .obj için farklı anlamlara geliyor. .Exe için kodun veya verinin gerçek boyutunu tutuyor.
  • DWORD VirtualAddress: Bu kısım .exe içindir. Section'nun nereye map edileceğinin RVA'sını tutar.
  • DWORD SizeOfRawData: Bu kısım section'nun yuvarlanmış boyutunu tutar.
  • DWORD PointertoRawData: Raw datanın adresini tutar.
  • DWORD PointerToRelocations
  • DWORD PointerToLinenumbers
  • WORD NumberOfRelocations
  • WORD NumberOfLinenumbers
  • DWORD Characteristics: Section'ın karaktesristliğini belirler. 0x00000020 bu bölümde kodların olduğunu belirtir. 0x00000040 bu bölümde ilk değer verilmiş verilerin bulunduğunu belirtir. 0x00000080 bu bölümde ilk değer verilmemiş verilerin olduğunu belirtir. 0x20000000 bölümün executable olduğunu belirtir. 0x40000000 bölümün okunabilir olduğunu belirtir.
c3m4idf.jpg


PE FİLE IMPORT
Bildiğiniz üzere yazılan programlarda başka .dll' lerde ki fonksiyonları kullanıyoruz. Bu fonksiyonları kullanabilmek için kullandığımız dll'lerin kayıtlarının PE dosya formatında bir yerde bulunması gerekiyor. Aksi halde bu fonksiyonları kullanamayız. İşte bu kayıtlar ".idata" section'ında yer alıyor. Loader(PE dosyamızı rame map eden program) .idata section'ındaki bilgileri kullanarak gerekli dll'lerin ve fonksiyonların adreslerini executable image'ye bağlar.
.idata section'u (Import Table) IMAGE_IMPORT_DESCRIPTOR dizisi ile başlar ve execute için gerekli olan her bir dll için dizide bir eleman bulunur. Toplam kaç adet eleman olduğunu tutan bir şey olmadığından dizinin bittiği "NULL" karakteri ile anlaşılır.
IMAGE_IMPORT_DECRİPTOR yapısını inceleyelim;
  • DWORD Characteristics: Bu kısım, IMAGE_IMPORT_BYNAME structure'ını gösteren pointer bulunduruyor.
  • DWORD TimeDateStamp: Dosya build edilirkenki tarih bulunuyor.
  • DWORD ForwarderChain: Burada Fİrst Thunk dizisinin index'i bulunuyor. Bu kısım .dll yönlendirme ile alakalı.
  • DWORD Name: Tahmin edeceğiniz gibi .dll'in ismi bulunuyor burda.
  • PIMAGE_THUNK_DATA First Thunk: Bu kısımda IMAGE_THUNK_DATA union'nın offseti bulunuyor. Union'ı genellikle IMAGE_IMPORT_BYNAME structure'ının offseti olarak yorumlanır.
Farkedileceği gibi Characteristic ve First Thunk aynı yeri (IMAGE_IMPORT_BYNMAE) gösteriyor. FirstThunk ve Characteristic paralel olarak işliyorlar.
p1bawl0.png

Yukarıdaki resimde gördğünüz gibi First Thunk'ın gösterdiği IAT, loader tarafından tekrardan yazılıyor. Bunun nedeni Loader dizi içerisindeki pointerları gezerek her bir fonksiyonun adresini bulur, daha sonra IMAGE_IMPORT_BYNAME ppointerlarının yerine yazar.

c3m4idf.jpg


PE FİLE EXPORT
Biz normalde başka .dll'lerin içerisindeki fonksiyonları kullanıyoruz (import), export bunun tam tersi bizim dışarıya kullanılabilecek bir fonksiyon vermemiz denebilir. Genellikle oluşturduğumuz programlarda export kısmı boş kalır, bu yüzden .edata section'ı göremeyiz. Şimdi ise IMAGE_EXPORT_DİRECTORY formatını verelim.
  • DWORD Characteristics
  • DWORD TimeDateStamp
  • WORD MajorVersion
  • DWORD Name
  • DWORD Base
  • DWORD NumberOffunctions
  • DWORD NumberOfNames
c3m4idf.jpg


PE FİLE RESOURCES
Portable-Executable-PE-File-Format-2.png


Portable Executable (PE) dosya formatındaki kaynaklar, bir uygulamanın veya yürütülebilir dosyanın içinde bulunan metin, grafik, ses, ikonlar ve diğer öğeleri içeren veri parçacıklarıdır. Bu kaynaklar, bir uygulamanın görsel ve işitsel unsurlarını, dil seçeneklerini, simgelerini ve diğer öğelerini içerir. PE dosya formatında kaynakları temsil etmek için özel bir bölüm vardır ve bu bölüm "RESOURCE" adını taşır.PE dosyalarındaki kaynaklar, çeşitli özelliklere ve türlerde verilere sahip olabilir. Bu kaynaklar, uygulamanın kullanıcı arayüzünü, dil seçeneklerini, ikonlarını, resimlerini, metin kaynaklarını ve daha fazlasını içerebilir. RESOURCE bölümü, kaynakların düzenli bir şekilde depolanmasını sağlar ve uygulamaların bu kaynaklara erişimini kolaylaştırır. Bu kaynaklar genellikle bir başka özel dosya formatı olan "Resource Script File" (.rc uzantılı dosyalar) kullanılarak tanımlanır. Kaynaklar, kaynak betik dosyalarında açıkça belirtilir ve derleme sürecinde bu kaynaklar PE dosyasına dahil edilir. Dosya hiyerarşisi bulunur.
  • DWORD Characteristic
  • DWORD TimeDateStamp
  • WORD MajorVersion
  • WORD MinorVersion
  • WORD NumberOfNamedEntries
  • WORD NumberOfIdEnteries
  • _İMAGE_RESOURCE_DIRECTORY_ENTRY DirectorEntries[]_

c3m4idf.jpg


Portatable Executable File Format Genel olarak bu şekilde değerli forum sakinleri. Eğer ki bu konu hakkında daha derine inmek isterseniz veya kafanızda herhengi bi soru işraeti kalırsa veya yanlış yazdığım birşey olduğunu düşünüyorsanız size kaynak aldığım Microsoft makale linkini bırakıyorum;
Peering Inside the PE: A Tour of the Win32 Portable Executable File Format
Bugün sizlere PE dosya formatını açıkladım. Umarım okurken zevk alırsınız ve size yardımcı olur.



BLUE TEAM JUNIOR HUNTER
wintersoldier1903
Zafer, ancak kendisinden daha büyük olan gâyeyi elde etmek için gerekir en belli başlı vasıtadır.
kemal-ataturk-imza-6.png


 
Moderatör tarafında düzenlendi:

PanchiaNN

Junior Hunter
29 Tem 2022
138
113
United States & Türkiye
Herkese merhaba THT ailesi. Bugün sizlere Windows işletim sistemi için kullanılan PE dosya formatından bahsedeceğim.
sbzcdf3.jpg

PORTABLE EXECUTABLE (PE) NEDİR ?
Portable Executable (PE), Windows'un çalıştırılabiilir dosya formatıdır. Portable Executable ".acm, .ax, .cpl, .drv, .efi, .mui, .ocx, .sys, .tsp" ve aşina olduğumuz; dinamik bağlantı kitaplıkları ".dll" ve yürütülebilir dosyaları ".exe." uzantılarını kapsar. Windows işletim sistemi, PE dosya formatını kullanarak programları yükler, çalıştırır ve yönetir. PE dosyaları, bir Windows uygulamasının veya programının içinde bulunan bilgileri düzenli bir biçimde depolayan bir dosya türüdür. PE dosyaları, işletim sistemi tarafından anlaşılır ve yürütülebilir bir formata sahiptir. Windows, PE dosyalarını çalıştırırken bu dosyaların içerdiği bilgileri kullanarak programları belleğe yükler ve yürütür. Bu süreç, kullanıcıların bilgisayarlarında uygulamaları çalıştırmalarını sağlar. PE dosyalarının içindeki yapı, işletim sistemi tarafından anlaşıldığı için Windows, bu dosyaları uygun şekilde yönetebilir. Bu dosya formatı, Windows'un önceki sürümlerinden itibaren kullanılmış ve günümüzde hala temel dosya formatı olarak varlığını sürdürmektedir. PE dosyaları, Windows uygulamalarının düzgün bir şekilde yüklenmesini ve çalıştırılmasını sağlamak üzere tasarlanmıştır.
c3m4idf.jpg

PE DOSYA FORMATI NEDEN ÖNEMLİDİR ?
Dosya formatındaki başlıklar o dosya ile ilgili kritik bilgiler içermektedir. Örneğin PE dosyasının yükleneceği makine türü, eğer çalıştırılabilen bir dosya ise programın entry point adresi, PE dosyasının oluşturulduğu tarih gibi önemli olabilecek bilgiler içermektedir. Ancak bu formatın Windows için önemi çok daha fazladır. Yürütülebilir kodların ve uygulamaların yüklenmesi, Windows uygulama geliştirmeleri, yürütülebilir dosya güvenliği, dinamik bağlantı kitaplıkları, dinamik yüklenme ve yürütme ve Windows uyumlu araçlar ve hata ayıklama araçları tarafından desteklenmesi gibi birçok kritik rol oynar.
wk600ry.jpg

RELATİVE VİRTUAL ADDRESS (RVA) NEDİR ?
İşletim sistemi, PE formatını beleğe yüklerken belleğin direk başından itibaren yüklemek zorunda değildir. PE formatının yükleme adresi kendi içinde zaten bulunmaktadır. Relative Virtual Address (RVA), dosya belleğe yüklendikten sonra dosya içerisindeki belli bir bölümün yükleme adresinden ne kadar uzakta olduğunu belirtir.
Peki bu bizim ne işimize yarıyacak ? Örnek vericek olursak dosyanın içerisindeki belli bir bölgenin RVA'sını biliyorsak, PE dosyası belleğe yüklendikten sonra o belirli bölge yükleme adresinden RVA kadar uzakta olacaktır. Böylece işletim sistemi PE dosya formatını belleğe yüklediğinde belirli bölgenin nerede olduğunu tespit edebiliriz.
c3m4idf.jpg
PE DOSYA FORMATI

q76u3ib.png

Yukarıda gördüğünüz gibi PE file format Headers (Başlıklar) ve Sections (Bölümler) den oluşuyor.
DOS HEADER
İlk olarak "DOS Header" dan bahsedelim. DOS Header (DOS Başlığı), aslında uyumluluk sağlamak için bulunmakta. Bu bölüm ile birlikte ufak bir DOS programı var. Programın yaptığı işlev ise, eğer bu PE dosyasını DOS sisteminde çalıştırmaya kalkarsanız ekrana bu PE dosyasını DOS ortamında çalıştırmayacağınızı söyleyen bir hata mesajı verip programı sonlandırmak. Yani çok bir olayı yok. Uyumluluk sağlamak için PE dosya formatına ekleniyor.
wk600ry.jpg

IMAGE FILE HEADER
Bu başlık, PE dosyasına ait önemli birkaç bigiyi tutuyor. Bu header dosyası IMAGE_FILE_HEADER yapısıyla yemsil edilmiştir. Yapıya göz atıcak olursak;
Kod:
typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
Buradaki "WORD" ve "DWORD" sizde karışıklık yaratmasın. WORD 16 bit (2byte) işaretsiz tamsayı, DWORD 32 bit (4byte) işaretsiz tamsayı yerini tutmakta. Şimdi bu yapının elemanlarına göz atalım ve açıklayalım.
  • WORD_Machine: Bu alan PE dosyasının yükleneceği makinanın türünü belirtir. Aşağıda sıklıkla kullanılan birkaç değeri görebilirsiniz;
  • 0x0000 = Herhangi bir makine türü için
    • 0xlc40 = ARMv7 (yada daha yukarı)
    • 0xebc0 = EFI byte code
    • 0x8664 = x64 (64 bit PE formatı için)
    • 0x14c0 = Intel 386 ya da bununla uyumlu daha ileri model (32 bit PE formatı için)
  • WORD_NumberOfSections: Bu alanda section table (bölm tablosunun) eleman sayısı bulunur.
  • DWORD_TimeDateStamp: Bu alanda PE dosyasının yaratıldığı tarih bilgisi bulunmakta.
  • DWORD_PointerToSymbolTable: Çalıştırılabilir dosyalar için bu kısım önemsizdir ve sıfır (0) bulunur. Bu kısım, COFF formatı için önemlidir. COFF dosyalarının sembol tablosunun dosya offseti bulunur.
  • DWORD_NumberOfSymbols: Çalıştırılabilir dosyalar için bu kısım önemsizdir ve burası da sıfır (0) gösterir. COFF dosyaları için bu alanda sembol tablosunda ki eleman sayısı bulunur.
  • WORD_SizeOfOptionalHeader: Bu kısımda IMAGE_FILE_HEADER dan sonra gelen IMAGE_OPTIONAL_HEADER başlığımım byte cinsinden değeri bulunur.
  • WORD_Characteristics: Bu alanda PE dosyasına ilişkin bazı özellikler bitsel olarak kodlanmıştır. Bazı önemli bitler ve karşılıklarını aşağıda listeliyorum.
    • 0x0001 = Bu bitin anlamı; relocation bilgisi eklenmemiştir. Yani dosya sadece belirtilen adrese yüklenebilir aksi takdirde dosya yüklenmez.
    • 0x002 = Bu bitin anlamı, dosya çalıştırılabilir dosyadır.
    • 0x0100 = Dosyanın çalışacağı makina 32 bit işlemcili bir makinadır.
    • 0x2000 = Dosya bir .dll dosyasıdır.
Görüldüğü gibi bir dosyanın .exe veya .dll olmasını bu kısım belirliyor.
wk600ry.jpg

İMAGE OPTİONAL HEADER
İsmine kesinlikle aldanmayın, bu başlık sanılan aksine kesinlikle isteğe bağlı değildir. Tam tersine ilk sack boyutu, programın entry pointi, işletim sisteminin versiyonu gibi çok kritik blgiler taşır. Bu kısmın 32 bit ve 64 bit versiyonları var fakat sadece boyut olarak farklılıklar barındırıyor.
Bu header dosyası içerisinde IMAGE_OPTIONAL_HEADER yapısıyla temsil edilmiştir. Yapıya göz atıcak olursak;
Kod:
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
USHORT Magic;
UCHAR MajorLinkerVersion;
UCHAR MinorLinkerVersion;
ULONG SizeOfCode;
ULONG SizeOfInitializedData;
ULONG SizeOfUninitializedData;
ULONG AddressOfEntryPoint;
ULONG BaseOfCode;
ULONG BaseOfData;
//
// NT additional fields.
//
ULONG ImageBase;
ULONG SectionAlignment;
ULONG FileAlignment;
USHORT MajorOperatingSystemVersion;
USHORT MinorOperatingSystemVersion;
USHORT MajorImageVersion;
USHORT MinorImageVersion;
USHORT MajorSubsystemVersion;
USHORT MinorSubsystemVersion;
ULONG Reserved1;
ULONG SizeOfImage;
ULONG SizeOfHeaders;
ULONG CheckSum;
USHORT Subsystem;
USHORT DllCharacteristics;
ULONG SizeOfStackReserve;
ULONG SizeOfStackCommit;
ULONG SizeOfHeapReserve;
ULONG SizeOfHeapCommit;
ULONG LoaderFlags;
ULONG NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;

Gördüğünüz gibi yapı "standart fields" ve "nt additionals field" ile iki kısımdan oluşuyor. Standart Fields genellikle Unix executable dosyaları, Common Object File Format, COFF için kullanır. Fakat sadece Unix executable dosyaları kullanmaz bu kısmı, Windows'ta farklı amaçlarla kullanılır. Şimdi buradaki yapıyı inceleyelim;
  • Magic: Burada 0x010b ve 0x020b değerleri bulunabilir. 32 bit 0x010b' yi ifade ederken, 64 bit ise 0x020b' yi ifade eder.
  • MajorLinkerVersion & MinorLinkerVersion: Bu kısımda linkerin majör ve minör versiyon bilgileri bulunur.
  • SizeOfCode: Executable kodun boyutunu tutar.
  • SizeOfInitializedData: İlk değer atanmış verilerin toplam boyutunu tutar. (Genelde .data kısmında bulunur.)
  • SizeOfUnintializedData: İlk değer atanmamış verilerin toplam boyutunu tutar. ( .bss kısmında bulunurlar.)
  • AddressOfEntryPoint: Bu kısım executable dosyların başlangıç noktasının RVA' sını, .dll dosyalarının ise DIIMain fonksiyonunun RVA'sını tutar. Genellikle .text bölümünde bi yer belirtir.
  • BaseOfCode: Bu kısımda executable kodların olduğu bölümün (genellikle .text bölümü) RVA'sını tutar.
  • BaseOfData: İlk değer atanmış verilerin bulnduğu (.data bölümü) bölümün RVA'sını tutar.
  • ImageBase: Linker, PE formatının yükleneceği adresi bu kısma yazar. Genel olarak 32 bit .exe için bu kısımda 0x00400000 (4MB) bulunur. Tabiki linker ayarlarından bu kısım değiştirilebilir ancak genel olarak bu kısımda 0x00400000 bulunur. Peki PE dosylarında çoğunlukla aynı değer bulunuyor ise birden fazla dosyayı çalıştırmaya çalıştığımız zaman nasıl karışmıyor ? Yer değiştirme (relocation) ile. Dosya içinde bulunan relocation bilgisi ile bilgisi ile dosya farklı bir adresten itibaen yüklenir.
  • SectionAlignment: Buradaki değer bölümlerin yüklenirken nasıl bir hizalamaya uyacağını gösterir. Tipik olarak 0x00001000 (4KB) değeri bulunur. (Windowsta page (sayfa) boyutu 4KB' tır.)
  • FileAlignment: Bölümlerin diskte hangi değerin katlarına uygun şekilde sıralacağını tutar. Varsayılan olarak 512 bulunur.
  • MajorOperatingSystemVersion, MinorOperatingSystemVersion: Bu kısımda PE dosyasının yükleneceği minimum işletim sisteminin versiyon bilgisi mevcuttur.
  • MajorImage Version & MinorImage Version: Bu kısımda yüklenecek PE dosyasının minör ve major versiyon numaraları bulunur.
  • MajorSubsystemVersion, MinorSubsystemVersion: Burada işletim sisteminde kullanılan minör ve major değerler bulunur
  • SizeOfImage: Dosyanın bölümlerinin toplam boyutunu tutar.
  • SizeOfHeaders: PE headerın ve section tablosunun boyutunu bulundurur.
  • CheckSum: CRC checksum için ayrılmıştır. Fakat genellikle sıfır (0) bulunur.
  • Subsystem: Kullanıcının kullanacağı interface' i belirtir.
    • 1(Native): Subsystem gerekli olmayan uygulamalar için (örn. Driver...)
    • 2(Windows_GUI)
    • 3(Windows_CUI)
    • 5(OS2_CUI)
    • 7(POSIX_CUI)
  • DllCharacteristics: Dll için belirli flagleri akif eder.
  • SizeOfStackReserve: Her thread için stack bulunur. Bu kısımda stack için ayrılıcak alanın büyüklüğünü belirliyor. Default olarak 0x100000 (1MB) dir.
  • SizeOfStackCommit: İlk thread için commit edilecek stack boyutu bulunur. Default olarak 0x1000 bytes (1page).
  • SizeOfHeapReserve: Program için ayrılacak heap alanı boyutunu belirtir.
  • SizeOfHeapCommit: Başlangıçta commit edilecek heap miktarını belirtir. Default olarak 0x1000 bytes (1 page).
  • NumberOfRvaAndSizes: Dosya içerisindeki veri dizininde kaç adet girdi olduğunu belirtir.
wk600ry.jpg

DATA DIRECTORY (VERİ DİZİNİ)
Veri dizini, PE formatı için önemli olan tabloların yerlerini ve uzunluklarını tutar. Toplamda 8 byte büyüklüğünde; 4 byte RVA, 4 byte uzunluk bilgisi
q1x28tq.png

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

Bu yapdaki VirtualAddress tablonun RVA'sını, Size ise büyüklüğünü tutuyor. Yani bu yapı tablonun kendisini değil, onun başlangıç adresi ve büyüklüğünü tutuyor.
c3m4idf.jpg

SECTİON TABLE (BÖLÜM TABLOSU)
Bölüm tablosu PE headerı ve raw data kısımları arasında bulunur. Bu tablo her bir section ile alakalı kayıt tutar.
kwee5id.jpg
PE dosyası sectionlardan oluşur. Bu sectionlar içindeki verinin nasıl bir yapıda olduğunu belirtir. Örneğin code section'nında execute edilicek opcode'lar bulunur. Data section'nında ilk değer verilmiş global ve statik veriler bulunur. Bss section'nunda ise ilk değer verilmemiş global ve statik veriler bulunur.
Kod:
static int a = 0; // Data section
static int b; // Bss section
Fark edildiği gibi sadece global ve statik veriler section'larda saklanıyor. Lokal değişkenler .data, .bss gibi section'larda saklanmıyor. Bunun yerine ptogramı execute ettiğimizde çalışma zamanında oluşturulup stack te depolanır ve gerektiğinde stack'ten okunup gerekli işlem yapılır. Şimdi section tablosundaki IMAGE_SECTION_HEADER başlığını inceleyelim.
  • BYTE Name [IMAGE_SIZEOF_SHORT_NAME]: Bu kısımda section'ın ismi bulunuyor.
  • union{DWORD PhysicalAddress, DWORD VirtualSize}Misc: Bu kısım .exe ve .obj için farklı anlamlara geliyor. .Exe için kodun veya verinin gerçek boyutunu tutuyor.
  • DWORD VirtualAddress: Bu kısım .exe içindir. Section'nun nereye map edileceğinin RVA'sını tutar.
  • DWORD SizeOfRawData: Bu kısım section'nun yuvarlanmış boyutunu tutar.
  • DWORD PointertoRawData: Raw datanın adresini tutar.
  • DWORD PointerToRelocations
  • DWORD PointerToLinenumbers
  • WORD NumberOfRelocations
  • WORD NumberOfLinenumbers
  • DWORD Characteristics: Section'ın karaktesristliğini belirler. 0x00000020 bu bölümde kodların olduğunu belirtir. 0x00000040 bu bölümde ilk değer verilmiş verilerin bulunduğunu belirtir. 0x00000080 bu bölümde ilk değer verilmemiş verilerin olduğunu belirtir. 0x20000000 bölümün executable olduğunu belirtir. 0x40000000 bölümün okunabilir olduğunu belirtir.
c3m4idf.jpg


PE FİLE IMPORT
Bildiğiniz üzere yazılan programlarda başka .dll' lerde ki fonksiyonları kullanıyoruz. Bu fonksiyonları kullanabilmek için kullandığımız dll'lerin kayıtlarının PE dosya formatında bir yerde bulunması gerekiyor. Aksi halde bu fonksiyonları kullanamayız. İşte bu kayıtlar ".idata" section'ında yer alıyor. Loader(PE dosyamızı rame map eden program) .idata section'ındaki bilgileri kullanarak gerekli dll'lerin ve fonksiyonların adreslerini executable image'ye bağlar.
.idata section'u (Import Table) IMAGE_IMPORT_DESCRIPTOR dizisi ile başlar ve execute için gerekli olan her bir dll için dizide bir eleman bulunur. Toplam kaç adet eleman olduğunu tutan bir şey olmadığından dizinin bittiği "NULL" karakteri ile anlaşılır.
IMAGE_IMPORT_DECRİPTOR yapısını inceleyelim;
  • DWORD Characteristics: Bu kısım, IMAGE_IMPORT_BYNAME structure'ını gösteren pointer bulunduruyor.
  • DWORD TimeDateStamp: Dosya build edilirkenki tarih bulunuyor.
  • DWORD ForwarderChain: Burada Fİrst Thunk dizisinin index'i bulunuyor. Bu kısım .dll yönlendirme ile alakalı.
  • DWORD Name: Tahmin edeceğiniz gibi .dll'in ismi bulunuyor burda.
  • PIMAGE_THUNK_DATA First Thunk: Bu kısımda IMAGE_THUNK_DATA union'nın offseti bulunuyor. Union'ı genellikle IMAGE_IMPORT_BYNAME structure'ının offseti olarak yorumlanır.
Farkedileceği gibi Characteristic ve First Thunk aynı yeri (IMAGE_IMPORT_BYNMAE) gösteriyor. FirstThunk ve Characteristic paralel olarak işliyorlar.
p1bawl0.png

Yukarıdaki resimde gördğünüz gibi First Thunk'ın gösterdiği IAT, loader tarafından tekrardan yazılıyor. Bunun nedeni Loader dizi içerisindeki pointerları gezerek her bir fonksiyonun adresini bulur, daha sonra IMAGE_IMPORT_BYNAME ppointerlarının yerine yazar.

c3m4idf.jpg


PE FİLE EXPORT
Biz normalde başka .dll'lerin içerisindeki fonksiyonları kullanıyoruz (import), export bunun tam tersi bizim dışarıya kullanılabilecek bir fonksiyon vermemiz denebilir. Genellikle oluşturduğumuz programlarda export kısmı boş kalır, bu yüzden .edata section'ı göremeyiz. Şimdi ise IMAGE_EXPORT_DİRECTORY formatını verelim.
  • DWORD Characteristics
  • DWORD TimeDateStamp
  • WORD MajorVersion
  • DWORD Name
  • DWORD Base
  • DWORD NumberOffunctions
  • DWORD NumberOfNames
c3m4idf.jpg


PE FİLE RESOURCES
Portable-Executable-PE-File-Format-2.png


Portable Executable (PE) dosya formatındaki kaynaklar, bir uygulamanın veya yürütülebilir dosyanın içinde bulunan metin, grafik, ses, ikonlar ve diğer öğeleri içeren veri parçacıklarıdır. Bu kaynaklar, bir uygulamanın görsel ve işitsel unsurlarını, dil seçeneklerini, simgelerini ve diğer öğelerini içerir. PE dosya formatında kaynakları temsil etmek için özel bir bölüm vardır ve bu bölüm "RESOURCE" adını taşır.PE dosyalarındaki kaynaklar, çeşitli özelliklere ve türlerde verilere sahip olabilir. Bu kaynaklar, uygulamanın kullanıcı arayüzünü, dil seçeneklerini, ikonlarını, resimlerini, metin kaynaklarını ve daha fazlasını içerebilir. RESOURCE bölümü, kaynakların düzenli bir şekilde depolanmasını sağlar ve uygulamaların bu kaynaklara erişimini kolaylaştırır. Bu kaynaklar genellikle bir başka özel dosya formatı olan "Resource Script File" (.rc uzantılı dosyalar) kullanılarak tanımlanır. Kaynaklar, kaynak betik dosyalarında açıkça belirtilir ve derleme sürecinde bu kaynaklar PE dosyasına dahil edilir. Dosya hiyerarşisi bulunur.
  • DWORD Characteristic
  • DWORD TimeDateStamp
  • WORD MajorVersion
  • WORD MinorVersion
  • WORD NumberOfNamedEntries
  • WORD NumberOfIdEnteries
  • _İMAGE_RESOURCE_DIRECTORY_ENTRY DirectorEntries[]_

c3m4idf.jpg


Portatable Executable File Format Genel olarak bu şekilde değerli forum sakinleri. Eğer ki bu konu hakkında daha derine inmek isterseniz veya kafanızda herhengi bi soru işraeti kalırsa veya yanlış yazdığım birşey olduğunu düşünüyorsanız size kaynak aldığım Microsoft makale linkini bırakıyorum;
Peering Inside the PE: A Tour of the Win32 Portable Executable File Format
Bugün sizlere PE dosya formatını açıkladım. Umarım okurken zevk alırsınız ve size yardımcı olur.



BLUE TEAM JUNIOR HUNTER
wintersoldier1903
Zafer, ancak kendisinden daha büyük olan gâyeyi elde etmek için gerekir en belli başlı vasıtadır.
kemal-ataturk-imza-6.png






















































Ellerine sağlık
 
7 Kas 2021
65
87
24
Berlin
Eline Sağlık tersine mühendislikte bilinmesi gereken seyler bunlar
teşekkürler, size katılıyorum

Ellerine sağlık
teşekkürler dostum

Ellerinize sağlık
çok teşekkür ediyorum

teşekkürler

Güzel bir konuyu , mükemmel şekilde açıklamışsın. Eline , emeğine sağlık.
çok teşekkürler hocam

Eline sağlık hocam mükemmel ve uzun bir konu olmuş
teşekkür ediyorum amacım en kısa, doğru ve anlaşılır biçimde yansıtmak oldu ama en az bu kadar çıktı

Teşekkürler.
 

aliabdolmalak1

Yeni üye
7 Kas 2019
44
11
Eğer ki bu konu hakkında daha derine inmek isterseniz veya kafanızda herhengi bi soru işraeti kalırsa veya yanlış yazdığım birşey olduğunu düşünüyorsanız size kaynak aldığım Microsoft makale linkini bırakıyorum;

yoo, buradan almamışsın ki. burası ile ilgisi yok


buradan almışsın. birebir aynısı. sadece bazı kelimelerin eklerini değişmişsin ve bazı kelimeleri eş anlamlarıyla değişmişsin

fotoğraflar bile aynı
 
7 Kas 2021
65
87
24
Berlin
yoo, buradan almamışsın ki. burası ile ilgisi yok


buradan almışsın. birebir aynısı. sadece bazı kelimelerin eklerini değişmişsin ve bazı kelimeleri eş anlamlarıyla değişmişsin

fotoğraflar bile aynı
eleştirin için teşekkürler. Ama biraz mantık çerçevesi içinde düşünürsek bu bilgiler bu adama gökten zembille değil bunları yazanların (yani ana kaynağın) makaleleriyle almış olabilir. bu da demek oluyor ki asıl kaynak benim oraya bıraktığım link. resimlere gelicek olursak resimlerde orjinal microsoftun kaynak makalesinden alıntı. Yani kimsenin emeğini çalmam söz konusu değil. Bu da demek oluyor ki sen daha linkini bıraktığın makalenin bile sonuna gelememiş, ve kaynak olarak belirtilen linki görememişsin. Kısacası sadece benim yazımla kıyaslama yapıp ordaki anlatılan konuyu bile okumadan ve anlamadan esgeçmişsin. Ben böyle esgeçmen ve beni uyarman yerine konuyu öğrenmeni ve hatamı daha biçimli ve kendine yakışır şekilde ifade etmeni beklerdim. Benim burda ki amacım bu blogta gördüğüm bilgileri güncelleyip daha açık hale getirip size sunmak ve birşeylerden faydalanmanızı sağlamak. Ama eğer benim paylaştığım ve üzerine uğraştığım yazımın işe yaramaz ve aynı olduğunu düşünüyorsan bıraktığın linkten gidip anlayarak okuyabilir, ve Son Kısmında ki microsoft referansını görebilirsin. At gözlükleri yerine daha geniş bir bakış açısı ile bakmanız dileğiyle sağlıcakla kalın.

Eline emeğine sağlık 👏
Teşekkürler
 

aliabdolmalak1

Yeni üye
7 Kas 2019
44
11
eleştirin için teşekkürler. Ama biraz mantık çerçevesi içinde düşünürsek bu bilgiler bu adama gökten zembille değil bunları yazanların (yani ana kaynağın) makaleleriyle almış olabilir. bu da demek oluyor ki asıl kaynak benim oraya bıraktığım link. resimlere gelicek olursak resimlerde orjinal microsoftun kaynak makalesinden alıntı. Yani kimsenin emeğini çalmam söz konusu değil. Bu da demek oluyor ki sen daha linkini bıraktığın makalenin bile sonuna gelememiş, ve kaynak olarak belirtilen linki görememişsin. Kısacası sadece benim yazımla kıyaslama yapıp ordaki anlatılan konuyu bile okumadan ve anlamadan esgeçmişsin. Ben böyle esgeçmen ve beni uyarman yerine konuyu öğrenmeni ve hatamı daha biçimli ve kendine yakışır şekilde ifade etmeni beklerdim. Benim burda ki amacım bu blogta gördüğüm bilgileri güncelleyip daha açık hale getirip size sunmak ve birşeylerden faydalanmanızı sağlamak. Ama eğer benim paylaştığım ve üzerine uğraştığım yazımın işe yaramaz ve aynı olduğunu düşünüyorsan bıraktığın linkten gidip anlayarak okuyabilir, ve Son Kısmında ki microsoft referansını görebilirsin. At gözlükleri yerine daha geniş bir bakış açısı ile bakmanız dileğiyle sağlıcakla kalın.
sadece kopyala yapıştır yapmışsın, insanlar zaten google aracılığı ile bu tür kaynakları görebiliyorken burada bunları birleştirmedeki amaç nedir. konuya yazdığın mesaj sadece merhaba, görüşürüz. bu konudaki bilgilerin neye yaradığını, nerede kullanıldığını dahi bilmiyorsun. sadece ezberliyorsun, pratiğin yok. tekerleği yeniden icat etmenin mantığı da yok. pe formatını anlatan binlerce makale var, o makalelerden biri de tht'de zaten hali hazırda vardı. neden o konuyu güncellemek yerine böyle bir konu açma girişiminde bulunuyorsun ki

ayrıca güncellenecek bir şey de yok, pe formatı uyumluluk açısından her gün güncellenen bir zımbırtı değil
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.