記錄一下關於書中pe檔案格式內容的學習(上部分)
pe(portable executable)格式,是微軟win32環境可移植可執行檔案(如exe、dll、vxd、sys和vdm等)的標準檔案格式。pe格式衍生於早期建立在vax(r)vms(r)上的coff(common object file format)檔案格式。
預設的**區塊,它的內容全是指令**,鏈結器把所有目標檔案的text塊連線成乙個大的.text塊,使用borland c++,編譯器產生的**存放在code的區域裡
.data
預設的讀/寫資料塊,全域性變數,靜態變數一般放在這個區段
.rdata
預設唯讀資料區塊,但程式中很少用到該塊中的資料,一般兩種情況用到,一是ms 的鏈結器產生exe檔案中用於存放除錯目錄,二是用於存放說明字串,如果程式的def檔案中指定了description,字串就會出現在rdata中
.idata
包含其他外來的dll的函式及資料資訊,即輸入表,將.idata區塊合併成另乙個區塊已成為一種慣例,典型的是.rdata區塊,預設的,鏈結器只在建立乙個release模式的可執行檔案時才能將idata合併到另外乙個區塊中
.edata
輸出表,當建立乙個輸出api或資料的可執行檔案時,聯結器會建立乙個.exp檔案,這個.exp檔案包含乙個.edata區塊,其會被載入到可執行檔案中,經常被合併到.text或.rdata 區塊中
.rsrc
資源,包括模組的全部資源,如圖示,選單,點陣圖等,這個區塊是唯讀的,無論如何不應該把它命名為.rsrc以外的名字,也不能合併到其他的區塊裡
.bss
未初始化的資料,很少在用,取而代之的是執行檔案的.data區塊的的virtualsize被擴充套件大的空間裡用來裝未初始化的資料.
.crt
用於c++ 執行時(crt)所新增的資料
.tls
tls的意思是執行緒區域性儲存器,用於支援通過_declspec(thread)宣告的執行緒區域性儲存變數的資料,這包括資料的初始化值,也包括執行時所需要的額外變數
.reloc
可執行檔案的基址重定位,基址重定位一般僅dll需要的
.sdata
相對於全域性指標的可被定位的 短的讀寫資料
.pdata
異常表,包含cpu特定的iamge_runtime_funtion_entry結構陣列,datadirectory中的image_directory_entry_exception指向它.
.didat
延遲裝入輸入資料,在非release模式下可以找到
這裡我就用自己總結的白話來描述每個pe檔案都是以dos頭開始的,image_dos_header 結構如下所示:在乙個程式執行起來的時候,會被載入到記憶體中,並且每個程序都有自己的4gb,這個4gb當中的某個位置叫做**虛擬位址**,由物理位址對映過來的,4gb的空間,並沒有全部被用到。
磁碟中的檔案載入到記憶體當中的時候可以載入到任意位置,而這個位置就是程式的基址。exe預設的載入基址是400000h,dll檔案預設基址是10000000h。需要注意的是基位址不是程式的入口點。
為了避免pe檔案中有確定的記憶體位址,引入了相對虛擬位址的概念。rva是在記憶體中相對與載入位址(基位址)的偏移量,所以你可以發現前三個概念的關係:虛擬位址(va)= 基位址+相對虛擬位址(rva)
當pe檔案儲存在某個磁碟當中的時候,某個資料的位置相對於檔案頭的偏移量。
首先明確乙個概念就是oep是乙個rva,然後使用oep +imagebase ==入口點的va,通常情況下,oep指向的不是main函式。
ps:32位的windows系統,各程序會分配4gb的虛擬記憶體,所以va範圍為00000000-ffffffff
(最左邊是檔案頭的偏移量。)
需要關注的點是結構體的第乙個和第二個元素。image_dos_header struct
image_dos_header ends
e_magic: dos頭的標記位,值為 4d5ah 。ascii為 」mz「 ,判斷乙個檔案是否為pe檔案是會用。
e_lfanew: 這是乙個rva,代表了pe檔案頭到基址的偏移量,我們可以用它來找到pe檔案頭的位置。
我們用010editor開啟乙個exe檔案:
image_nt_headers struct 結構體
在乙個pe檔案中signature欄位被設定為 4550h ,ascii碼為 」pe00「 。如上圖所示。image_nt_headers struct
image_nt_headers ends
在010 editor上檢視一下:structimage_file_header
重要的有:
來看一下資料目錄的定義:addressofentrypoint: 也就是上文提到的oep,程式源入口點。
imagebase: 預設載入基址。
sectionalignment: 記憶體當中的塊對齊數,一般為0x1000。
filealignment:磁碟當中塊對齊數,一般為0x200。
sizeofheaders:所有頭部大小 也就是dos頭 檔案頭 以及區塊頭的總大小,檔案主體相對檔案其實的偏移。
image_data_directory datadirectory[image_numberof_directory_entries]:資料目錄表,儲存了各種表的rva及大小。
image_data_directory struct
virtualaddress dword ? ; 資料的起始rva
size dword ? ; 資料塊的長度
收藏
《逆向工程核心原理》學習筆記6 執行時壓縮
一 壓縮檔案十分常見,只要通過一定的壓縮演算法,就能縮減檔案的大小。二 而執行時壓縮是針對pe可執行檔案而言的,和普通壓縮器相比,執行時壓縮器的明顯不同是 pe檔案的可執行性 三 常見的壓縮器有 upx,aspack等 upx o notepad upx.exe notepad.exe可以看到not...
逆向工程核心原理 第六章
第六章是分析乙個crackme檔案 首先還是看看這個檔案,開啟之後是什麼樣子的 開啟後是兩個彈窗 點了確定之後就沒有了。根據書本的步驟,我們要通過修改關鍵跳,破解。首先我們看到這個程式 所以我們將關鍵跳的命令修改為 可以看到我們把指令由原來的 je 改為了現在的 jmp 因為 je 是需要滿足條件才...
逆向工程核心原理 2019 8 28早上
早起傻一天,位元組序大端序和小端序 學過彙編一般都能看懂是什麼意思。大端序 就是按著順序來排列 看起來比較直觀 但如果按高地位來分的話。大端序就是 資料的高位放在記憶體的低位 資料的低位放在記憶體的高位。小端序 看上去是反正來放。但是按高地位來分的話。小端序就是資料的高位放在記憶體的高位 資料的低位...