免殺筆記 ---> PE

本來是想先把Shellcode Loader給更新了的,但是涉及到一些PE相關的知識,所以就先把PE給更了,后面再把Shellcode Loader 給補上。

聲明:本文章內容來自于B站小甲魚

1.PE的結構

首先我們要講一個PE文件,就得知道它的結構,可以參考下面的這張照片

2.DOS頭部

首先一個PE文件,就是它的DOS結構。 其中,需要我們去了解的,就是一開始的那個DOS標記以及我們執行的PE文件頭

那么我們隨便打開一個EXE來看一下。我門可以看見標志性的MZ

然后我們直接定位到3C這個位置,這里指向PE文件的頭(寫死的)??

可以看見在這個PE文件中,它的PE開始是在80這個位置

于是我們就去到80這個位置

3.IMAGE_NT_HEADERS

1.Signature

這個字段,是用來標志著這是一個真正的PE文件,從上面,我們跳到了這里,就能看見我們的Signature標識字段。

2.IMAGE_FILE_HEADER

這個結構如下

其中重要的,就是SizeOfOptionalHeader這個值,這個就決定了后面的IMAGE_OPTIONAL_HEADER32的大小

3.IMAGE_OPTIONAL_HEADER32

其中一些比較重要的結構

  • AddressOfEntryPoint 程序執行入口RVA? 在偏移值為28的地方?

我們去那個偏移位置找一找(相對于PE頭的偏移)DWORD類型 ,指向的是我們的14C

  • ImageBase

  • SectionAlignment和FileAlignment字段

其中FileAlignment默認是200,我們自己去PE文件找找是不是這么回事(它的偏移地址是3C)

而且他是DWORD類型,四個字節,我們在對應的地方確實是能看到是200!!?

  • DataDirectory(數組)

其實可以這樣子理解? 他定義了一個長度為16的數組,然后數組的每一個元素都是一個結構,這個結構里面都存儲了兩個元素,一個就是數據的起始RVA,另外一個就是數據塊的長度

數組中的有些元素十分的重要(導入表,導出表,資源,重定位表,IAT表

當我們需要尋找特定的資源的時候,我們就可以去找到這個數組的第三個元素,獲取到對應的RVA以及長度,當我們要查看PE文件導入了哪些DLL的API的時候,我們就可以去導入表里面獲取RVA(Relative Virtual Address)和長度!!!!??

4.區塊

接下來就是塊表,首先他是這么一個結構

然后,我們來看name,像這種以.開頭的(當然這個.不是必須的)

接下來就是相應的一些結構,比較重要一點的就是PointerToRawData 和 SizeOfRawData ,通過這兩個,我們就能找到下一個塊表的位置

除此,還有一個比較重要,這個標定了該區塊的屬性!!!

最后的判斷,是通過存在的屬性進行OR的操作判斷的,比如我們看到它的characteristic是6000000的話,我們就知道是通過20(Code) OR 20000000(Execute) OR 40000000(Read) == (60000020)? 這樣就能判斷這個對應的屬性

對于區塊,一般都有以下的類型

然后就是區塊的對對齊

RVA

相對虛擬地址

目標RVA和文件偏移的計算

在處理PE文件的時候,任何的RVA必須經過文件的偏移的換算,才能用來定位并訪問文件中的數據。

  1. 首先,我們要循環掃描每個區塊在內存中的起始RVA,并且根據區塊的大小,算出區塊的結束RVA,判斷目標的RVA是否落在該區塊內
  2. 然后通過獲取到了目標區塊之后,用目標RVA減去起始的RVA,這樣就得到了目標RVA相對于起始地址的偏移量RVA2
  3. 最后,根據該區塊表在文件中所處的偏移地址,將這個值加上RV2,就得到了文件的偏移地址!!!

假設我們有一個虛擬地址666666,那么我們就要去區塊中查找

通過定位,我們可以發現他在.reloc這個區塊中

那么RVA2 = 666666 - 66000 = 666,然后我們看到這個區塊在文件中的偏移地址在60E00

所以我們這個虛擬地址在物理內存中的地址就是60E00 + 666 = 61466?

5.導入表

說到導入表,我們肯定不會陌生,我們在一開始的PE頭中,就講過一個IMAGE_OPTIONAL_HEADER里面有一個特別重要的DataDirectory這個地方,里面放著我們的導入表!!!!

其中的第二個成員就是導入表,如果我們跳轉到它的RVA之后,我們就能看見一個以IMAGE_IMPORT_DESCRIPTOR(簡稱IID)的數組開始的,每一個被加載進來的DLL文件都分別對應一個IID數組結構,當我們看到一個IID全為0的時候,就代表結束!!!!


對于每一個IID,它的結構如下:

它的長度為5個DWORD,其中重要的兩個就是我們的FirstTrunk 和 OriginalFirstTrunk

6.IAT &&? IMAGE_IMPORT_BY_NAME

終于,我們學免殺要學的IAT表終于要出現了!!!!? 不過在此之前,我們先來看一張圖片

其中能看見IID的第一個DWORD OriginalFirstTrunk指向了INT表的IMAGE_THUNK_DATA

然后DWORD FirstThunk 指向了IAT表中的IMAGE_THUNK_DATA ,并且這兩個都指向了IMAGE_IMPORT_BY_NAME這個表

其中,對于我們的IMAGE_THUNK_DATA

然后就是IMAGE_IMPORT_BY_NAME

IAT(Import Address Table)導入地址表

那么下面,我們就來舉個栗子演示一下:

首先我們來找一個程序,直接看他的DataDirectory中的導入表的地址

然后定位到塊中的 .idata中

我們可以追蹤到之后發現它存在兩個IID,即調用了兩個動態連接庫

并且我們去查看第一個IID的Original_First_Thunk,指向的是INT表中的IMAGE_THUNK_DATA,并且這個值是2A15C,但是這是一個RVA,所以我們要找到它的實際偏移我們用這個RVA減去.idata塊的RVA 得到的RVA2再加上Raw Data offs 就是我們的實際偏移地址,2815C

然后又找到一個02A2DC ,我們在上面說過,如果開頭是0的話,它的值是RVA,指向一個IMAGE_IMPORT_BY_NAME,所以,我們就還要去找282DC這個地方

這樣,我們就找到了我們的真正的函數的地址(在此期間指針指向了兩次),來看這么一個圖(第一個盒子里面是ORIGINAL_FIRST_THUNK一開始寫錯了)

那么剛才我們講了通過OriginalFirstThunk找,那么現在我們通過FirstThunk查找

首先還是找到iid中的FirstThunk,然后轉換為實際偏移地址就是282AC

然后我們就去282AC,找到指向的實際偏移地址是282DC

然后再去282DC處找,發現282dc處也能找到我們的這個函數的真實位置

過程如下

然后我們去讓這個程序運行起來,并且將他的內存dump出來,然后再去跟蹤它的導入表

這時候我們再去跟蹤IAT表,282AC這個部分。終于,我們就找到了這個函數的真正的地址

這時候,我們的IAT表就是這樣的了(在內存中,IAT表不在需要通過名字索引,而是通過地址了)

然后本次的PE文件就到這了,當然了PE文件遠不止這些,導入表,重定位表,資源等等,當日后在免殺中用到的時候,我們再相應進行更新。

下一篇Blog,我們就會更新對應的Shellcode Loader了!!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39501.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SPI四種模式--極性與相位

SPI的四種模式:相位和極性 極性 定義時鐘空閑狀態: CPOL0:時鐘線在空閑狀態為低電平 CPOL1:時鐘線在空閑狀態為高電平 這個設置決定了設備不進行通信時時鐘線的狀態。 兼容性: 不同的SPI設備可能需要不同的時鐘極性…

java.lang.classnotfoundexception jakarta.xml.bind.jaxbexception java 17問題

解決 <dependency><groupId>jakarta.xml.bind</groupId><artifactId>jakarta.xml.bind-api</artifactId><version>4.0.2</version> </dependency>參考&#xff1a; Handling NoClassDefFoundError for JAXBException in Jav…

【Linux開發實戰指南】基于TCP、進程數據結構與SQL數據庫:構建在線云詞典系統(含注冊、登錄、查詢、歷史記錄管理功能及源碼分享)

目錄 項目演示&#xff1a; 1. 主界面 技術講解&#xff1a; TCP連接 進程的并發 鏈表 SQLite3 IO對文件的讀寫 功能實現 實現邏輯 我遇到的問題&#xff1a; 服務器端代碼思路解析 必要條件 步驟詳解 客戶端代碼思路解析 步驟詳解 服務器源碼如下&#xff1a;…

windows電腦如何運行python的定時任務

這里需要使用&#xff1a;windows系統設置-控制面板里的計劃任務 1.打開計劃任務之后&#xff0c;選擇&#xff1a;創建基本任務 2.填寫名稱&#xff0c;這里根據自己具體的項目需求填寫&#xff0c;然后點擊下一步。 3.選擇每日&#xff0c;再點擊下一步 4.設置時間&…

Python 學習之常用第三方庫(五)

Python 常用第三方庫 Python 是一門功能強大的編程語言&#xff0c;其生態系統中包含了許多優秀的第三方庫&#xff0c;這些庫極大地擴展了 Python 的功能。以下是一些常用的 Python 第三方庫&#xff1a; 1. NumPy&#xff1a; a. 用于數值計算的庫&#xff0c;提供了大量的…

科普文:linux I/O原理、監控、和調優思路

Linux 文件系統 磁盤和文件系統的關系&#xff1a; 磁盤為系統提供了最基本的持久化存儲。 文件系統則在磁盤的基礎上&#xff0c;提供了一個用來管理文件的樹狀結構。 文件系統工作原理 索引節點和目錄項 文件系統&#xff0c;本身是對存儲設備上的文件&#xff0c;進行…

多維度多場景文檔門戶,鴻翼ECM文檔云打造文檔管理新范式

?在現代企業運營中&#xff0c;內容協作的效率直接影響到組織的整體表現和競爭力。傳統的文檔管理系統都是通過目錄結構的方式進行文件管理&#xff0c;在實際業務中無法滿足用戶多視角、多維度、多場景的文檔業務需求。因此&#xff0c;搭建結合文檔體系的業務門戶是許多企業…

策略模式入門:基本概念與應用

目錄 策略模式策略模式結構策略模式應用場景策略模式優缺點練手題目題目描述輸入描述輸出描述題解 策略模式 策略模式&#xff0c;又稱政策模式&#xff0c;是一種行為型設計模式&#xff0c;它能讓你定義一系列算法&#xff0c;并將每種算法分別放入獨立的類中&#xff0c;以…

數字研發·驅動變革 | 2024達索系統裝備行業數字化研發專題研討會成功舉辦

2024年6月28日&#xff0c;由百世慧舉辦的“數字研發驅動變革|2024達索系統裝備行業數字化研發專題研討會”在達索系統&#xff08;重慶&#xff09;智能制造創新中心成功舉辦。 隨著全球制造業向著智能化、數字化轉型&#xff0c;我國工業裝備行業也面臨著轉型升級的壓力和機遇…

Gym cuda error: invalid resource handle

gym模擬的時候&#xff0c; 出現問題&#xff1a; sim和gym的定義如下&#xff1a; from isaacgym import gymapi,gymtorch import math,random# 1. Simulation Setup gym gymapi.acquire_gym()# get default set of parameters sim_params gymapi.SimParams() sim_params.u…

網關,路由器,交換機

一、網關 (Gateway) 是一種設備&#xff0c;用于連接不同網絡&#xff0c;能夠轉發數據包并翻譯協議&#xff0c;允許不同類型的網絡通信。網關通常工作在OSI模型的應用層或傳輸層&#xff0c;提供連接和路由服務。 應用場景例子&#xff1a; 在企業網絡中&#xff0c;網關可…

四倍體和六倍體小麥抗赤霉病的比較研究

核心總結&#xff1a;四倍體和六倍體小麥抗赤霉病的比較研究 研究背景 小麥赤霉病&#xff08;Fusarium head blight, FHB&#xff09;由Fusarium graminearum引起&#xff0c;是全球范圍內對小麥生產造成嚴重威脅的疾病。FHB感染不僅會顯著降低糧食產量和質量&#xff0c;還…

2024年能在一個月內錄用的EI檢索會議CCPQT 2024

第三屆計算、通信、感知與量子技術國際會議&#xff08;CCPQT 2024&#xff09;將于2024 年10月25日-10月27日在中國珠海召開。&#xff08;往屆均已順利見刊檢索&#xff09; 會議信息 大會官網&#xff1a;http://www.ccpqt.org/ 會議地點&#xff1a;中國珠海 會議時間&…

企業多存儲方式如何兼顧安全統一管理、便捷流暢訪問的雙向需求?

數據和文件存儲是企業最基礎的需求&#xff0c;常見的存儲方式有磁盤存儲、NAS存儲、SAN存儲、云存儲、分布式存儲、閃存存儲等&#xff1b;隨著企業規模的擴大、業務結構的復雜化&#xff0c;企業內部可能會同時出現多種存儲方式、多個存儲設備并行使用的情況。 這樣的使用場景…

python之音頻處理(1)語速快慢的改變

方案1&#xff1a;使用pydub 處理 from pydub import AudioSegment sound AudioSegment.from_file(r"D:\websiteDownload\我今天被一件事情搞得很煩.wav") print(sound.duration_seconds) rate 0.75 sound_with_altered_frame_rate sound._spawn(sound.raw_data,…

【啟明智顯技術分享】Model3C芯片電阻屏RTP配置、調試與測試指南

一、背景 本指南將詳細介紹啟明智顯的Model3C芯片電阻屏RTP配置、調試與測試指南。無論您是電子愛好者、開發者還是工程師&#xff0c;這份指南都能助您快速上手并充分利用這款觸摸屏的各項功能。 二、芯片介紹 Model3C是一款基于RISC-V的高性能、國產自主、工業級高清顯示與…

java通過jts獲取點在線段中的位置

在Java中&#xff0c;可以使用JTS&#xff08;Java Topology Suite&#xff09;庫來獲取點在線段的垂足點位置。以下是一個簡單的示例代碼&#xff0c;展示了如何使用JTS獲取點到線段的垂足點位置&#xff1a; 首先&#xff0c;確保你的項目中包含了JTS庫。 import org.locati…

面試篇-系統設計題總結

這里記錄一些有趣的系統設計類的題目&#xff0c;一般大家比較喜歡出的設計類面試題目會和高可用系統相關比如秒殺和搶紅包等。歡迎大家在評論中評論自己遇到的題目&#xff0c;本篇文章會持續更新。 1、設計一個搶紅包系統 搶紅包系統其實也是秒殺類中的一個場景&#xff0…

深度學習中的反向傳播算法的原理

深度學習中的反向傳播算法的原理&#xff0c;以及如何計算梯度 反向傳播算法&#xff08;Backpropagation&#xff09;是深度學習中最核心的優化技術之一&#xff0c;用于訓練神經網絡。它基于鏈式法則&#xff0c;通過從輸出層逆向計算誤差并逐層傳遞到輸入層來更新模型參數&…

類的動態加載-雙親委派模型

java反射基礎 Java 基礎 - 反射機制詳解 | Java 全棧知識體系 (pdai.tech) 類的動態加載 參考鏈接&#xff1a;類的動態加載 構造是和實例化也就是對象相關的。 靜態代碼塊是在初始化的時候就調用的 Class.forName();就會調用靜態代碼塊 forName&#xff0c;加載類時默認…