逆向工程核心原理 第十八章

2022-08-23 23:42:14 字數 1567 閱讀 7758

我們使用add.exe檔案

我們將add.exe檔案拖入upack加殼工具,這裡的版本是0.39final,lc選擇6:

點選確定後得到add.exe.bak的檔案,我們去掉.bak後就可以直接使用了,這裡為了區分,我將加殼後的檔案取名為add_upack_6.exe。

首先我們先使用hex瀏覽器檢視加殼和沒加殼的區別吧:

加殼的:

不加殼的:

我們可以看到,加殼和不加殼的區別還是很明顯的。

重疊資料夾也是其他壓縮器經常使用的方法,該方法可以把mz檔案頭,pe檔案頭巧妙重疊在一起。

接下來我們使用stud_pe看一下mz檔案頭。

mz檔案頭有兩個重要的成員:

根據pe檔案格式規範,image_nt_headers的起始位置是可變動的。而nt頭的起始位置是由e_lfanew決定的,在一般的檔案中e_lfanew擁有不同的。

​ 而在upack中e_lfanew的值為40,而40正好就可以把mz檔案頭和pe檔案頭重疊在一起。

​ upack的作者就是修改了image_file_header-sizeofoptionalheader的值,使得標頭檔案的大小增加了,因此就可以在標頭檔案中加入解碼**了。

​ 我們知道sizeofoptionalheader是確定節區頭(image_section_header)的起始偏移。image_section_header的起始位置=sizeofoptionalheader+image_optional_header的起始偏移位址。

​ 而沒有加殼的檔案,(32位)sizeofoptionalheader為e0,64位為f0。而upack則將這個值加大到了148,因此image_section_header的偏移位置就變為了170(image_optional_header的起始偏移(28)+sizeofoptionalheader(148)=170)。這樣,在image_optional_header和image_section_header之間就產生了乙個原來沒有的空間,upack的作者就是將upack的解壓**放在這個空間中的。

numberofrvaandsizes的值用來指出image_data_directory結構體陣列的元素個數。正常的檔案中image_data_directory陣列元素的個數是0x10,但是在upack中將其改為了a個。

本來有16個元素,但現在被改為了10個,所以image_data_directory結構體後6個元素被忽略了,因此這6個元素的位置,也可以用來放置解壓**。

第十八章 B樹

施工中施工中 基本操作主要包括 搜尋b樹,建立空b樹,插入關鍵字。18.3放出刪除關鍵字的 class program region 磁碟操作 為結點初始化對應的磁碟頁 private static node t allocate node t 磁碟寫操作 private static void d...

第十八章 定製特性

目錄 18.1 使用定製特性 18.2 定義自己的特性類 18.3 特性構造器和字段 屬性資料型別 18.4 檢測定製特性 18.5 兩個特性例項的相互匹配 18.6 檢測定製特性時不建立從attribute派生的物件 18.7 條件特性類 定製特性 利用定製特性,可宣告式地為自己的 構造新增註解來...

第十八章 18 2 3節練習

練習18.18 已知遊俠面的swap的典型定義 參見13.3節,第457頁 當mem1是乙個string時程式使用swap的哪個版本?如果mem1是int呢?說明在這兩種情況下名字查詢的過程。void swap t v1,t v2 解答 這裡典型定義應該指的是有乙個專為string交換而建立的swa...