主頁 > 區塊鏈 > PE檔案與脫殼初探

PE檔案與脫殼初探

2021-06-10 08:26:58 區塊鏈

PE檔案與殼

  • 一、PE檔案的載入機制:
    • (一)相對虛擬地址RVA:
    • (二)檔案偏移地址(物理地址):
  • 二、PE檔案結構簡述
    • (一)MS-DOS頭部
    • (二)PE檔案頭
      • ——DataDirectory[16](資料目錄表):
    • (三)區塊表與區塊
      • ——區塊合并
      • ——區塊對齊與地址轉換運算
  • 三、輸入表(.idata區塊)
    • (一)輸入函式的呼叫
    • (二)輸入表的結構 與 IAT/INT
    • (三)實體分析
      • 載入前的輸入表實體分析
      • 載入后的輸入表實體分析

一、PE檔案的載入機制:

PE檔案并不是作為單一映射檔案被載入,它先被Windows加載器(PE裝載器)遍歷,決定哪個部分要被映射,(映射是高偏移地址對應高記憶體地址),
然后PE檔案被載入記憶體,資料結構布局與原始的一致之外,資料間的相對位置不一定一致(如下圖),所以某一部分的載入偏移地址不一定等于原始偏移地址,被載入到記憶體的部分統稱模塊,那么模塊句柄其實就是映射檔案(等同于 PE檔案 的虛擬空間 )的起始地址(但 Windows CE 除外),它還有另一個名字叫基地址,我們在Windows編程時用到的API函式GetModuleHandle就是用來獲取模塊句柄,即基地址 用的,

PE檔案的基地址由檔案自身決定,按照默認設定,VC++編譯鏈接生成的EXE檔案的基地址是400000h,DLL檔案則是10000000h

在這里插入圖片描述

(一)相對虛擬地址RVA:

相對虛擬地址是PE檔案在 記憶體中的相對于PE檔案載入地址(基地址)的偏移地址,它被采用的意義就在于,載入的指標可以在記憶體中的任意位置,可以很好地確定某一部分的具體位置,

相 對 虛 擬 地 址 = 目 標 地 址 ( 虛 擬 地 址 ) ? 載 入 地 址 ( 基 地 址 ) 相對虛擬地址 = 目標地址(虛擬地址) - 載入地址(基地址) =?

(二)檔案偏移地址(物理地址):

檔案偏移地址是PE檔案在磁盤中相對于檔案頭的偏移地址,
其實我們用winhex等16進制編輯器打開一個PE檔案后,在左邊欄呈現的就是檔案偏移地址,即物理地址
在這里插入圖片描述

二、PE檔案結構簡述

(一)MS-DOS頭部

DOS MZ(MZ頭)和緊隨其后的DOS stub(DOS塊)組成

  • MZ頭告訴DOS這是一個有效執行體【就把他當作檔案頭就好】
  • DOS塊由編譯器自動生成

這個結構中有用的欄位主要是e_magice_lfanew

  • e_magicMZ的ASCII編碼,可執行檔案都以其開頭,
  • e_lfanew:記錄真正PE頭的RVA,

在這里插入圖片描述

(二)PE檔案頭

Windows加載器會讀取e_lfanew欄位,進而算出PE檔案頭的指標,PE檔案頭又可以被劃分成3個部分,分別是SignatureIMAGE_FILE_HEADER(映像檔案頭)IMAGE_OPTIONAL_HEADER(可選檔案頭)

  • Signature:"PE\0\0"的ASCII編碼
  • 映像檔案頭:記錄一些PE檔案的基本資訊,里面的一個欄位指出可選映像頭的大小,具體參考 《加密與解密(第四版)》P.409
  • 可選映像頭:更詳盡地描述了PE檔案的基本資訊,一些有用的資訊可以通過LordPE等PE編輯器直觀地看出來,在這里詳細說說位于可選映像頭的一個重要欄位DataDirectory[16],其他的具體參考 《加密與解密(第四版)》P.409

——DataDirectory[16](資料目錄表):

這16個元素的結構都是IMAGE_DATA_DIRECTORY(記錄偏移地址和占用空間大小),指向輸入表、輸出表、資源塊等資料,用于定位輸入輸出表等資源,
打開LordPE,進入目錄界面可以直觀的看到資料目錄表的資訊,
在這里插入圖片描述

(三)區塊表與區塊

  • 區塊表:緊接著可選映像頭就是區塊表,是一個IMAGE_SECTION_HEADER結構陣列,一個IMAGE_SECTION_HEADER結構對應一個區塊,每個這樣的結構記錄的是對應區塊的基本資訊,而這個陣列有多少個取決于PE檔案頭映像檔案頭NumberOfSections欄位的數值,

我們用LordPE編輯一個PE檔案的時候,進入區段視窗可以清晰的看到各個區塊即它們的一些重要資訊
在這里插入圖片描述
關于塊屬性欄位Characteristic,它的值是由下表中的值相或得到:

地址用途
00000020h包含代碼,常與10000000h一起設定
00000040h該塊包含已經初始化的資料
00000080h該塊包含未初始化的資料
02000000h該塊可丟棄,一旦被載入,行程便不再需要它,例如重定位塊.reloc
10000000h該塊為共享塊
20000000h該塊可執行,通常00000020h被設定時它也被設定
40000000h該塊可讀,可執行檔案中的塊總是設定該標志
80000000h該塊可寫,如果PE檔案中沒有設定該標志,裝載程式就將記憶體映像頁標記為可讀或者可執行
  • 區塊:一個PE檔案至少有兩個區塊(代碼塊資料塊)組成,在映像中的排列順序按照起始地址排列而非字母表,不額外自定義區塊名的情況下,聯結器給這些區塊的命名是由聯結器本身決定的(微軟的聯結器和Borland的聯結器設定的名稱不同),常見區塊命名詳見《加密與解密(第四版)》P.417

——區塊合并

從源代碼到可執行檔案的程序中,一些區塊在OBJ檔案時就已經被放置了,可能還有特殊的用于給聯結器傳遞訊息的區塊,而聯結器做的就是按照一定規則合并OBJ和區塊,這樣做可以節省磁盤與記憶體空間
(要是合并的程序中要合并的區塊有一個是只讀屬性,那么系統臨時將其設定為可讀可寫,再進行合并操作,初始化之后恢復)

——區塊對齊與地址轉換運算

PE檔案頭可選映像頭中的FIleAlignment欄位定義了磁盤區塊的對齊值,SectionAligment欄位定義了記憶體區塊的對齊值,

  • 磁盤中,每一個區塊以磁盤區塊對齊值的整數倍作為偏移地址,不足的地方(區塊間隙)用00h填充,
  • 記憶體中,區塊至少從一個頁邊界處開始
    在這里插入圖片描述

當區塊在記憶體中的偏移跟檔案中的偏移一致時可以提高載入速度,但會使可執行檔案變大,這么做取決于檔案是否足夠小,
結合下面的磁盤到記憶體的映射圖我們發現,MS-DOS到塊表的部分無論是在磁盤中還是在記憶體中,它們的偏移都是一致的,不一致的是其后的塊的偏移,由于區塊對齊,對于不同塊來說,各個塊在記憶體中的偏移與磁盤中的偏移的差值是不一定相同,但在同一個區塊中磁盤與記憶體的對應地址,這個差值又是相同的,不難得出下面的公式:
F i l e O f f s e t = RVA ? Δ k \textcolor{red}{{\mathnormal{FileOffset}} = \text{RVA} -\varDelta{k}} FileOffset=RVA?Δk
F i l e O f f s e t = RVA ? I m a g e B a s e ? Δ k \textcolor{red}{\mathnormal{FileOffset} = \text{RVA} - {ImageBase} - \varDelta{k}} FileOffset=RVA?ImageBase?Δk
在這里插入圖片描述

三、輸入表(.idata區塊)

(一)輸入函式的呼叫

PE檔案載入記憶體前,要用到的輸入函式的基本資訊已經存在于PE檔案中,但Windows加載器在PE檔案載入記憶體之后才將相關DLL載入記憶體,并將呼叫輸入函式的指令與輸入函式的實際地址關聯,同時輸入地址表IAT)中也被寫入了輸入函式的地址,

由于使用來自其他DLL的代碼和資料的程序叫輸入,所以輸入函式外部函式

有的時候程式本可以直接用下面匯編陳述句高效呼叫API

call DWORD PTR [某API的地址]

但因為編譯器分辨不出輸入函式的呼叫和普通函式的呼叫而一視同仁使用下面的低效呼叫方式,

	call 地址1                    ;子程式
	  …… ……
地址1:
	jmp dword ptr [某API的地址]

我們只需要在輸入函式的申明前面加上_declspec(dllimport)即可解決這個問題

(二)輸入表的結構 與 IAT/INT

  • IAT:輸入地址表
  • INT:輸入名稱表

輸入表以一個IMAGE_IMPORT_DIRECTORY(IID)結構陣列開始,一個IID對應一個DLL等等,陣列的最后一個元素是一個內容全0的IID作為該陣列結束的標志,

IID中有兩個很重要的欄位OriginalFirstThunkFirstThunk,分別指向輸入名稱表INT輸入地址表IAT的虛擬偏移地址,

IAT和INT本質上是一個IMAGE_THUNK_DATA陣列,陣列中的一個元素即一個IMAGE_THUNK_DATA(雙字)對應一個輸入函式,而IMAGE_THUNK_DATA本質上是指標,在不同的時刻有不同含義

  • IMAGE_THUNK_DATA的最高位為1:函式以序號方式輸入,此時低31位代表被輸入API的序數值,
  • IMAGE_THUNK_DATA的最高位為0:函式以字串型別的函式名方式輸入,此時雙字指向一個IMAGE_IMPORT_BY_NAME結構(單字)

IMAGE_IMPORT_BY_NAME結構存盤一個輸入函式的相關資訊如下:

  • hint:占一個字,輸入函式在外部DLL輸出表中的序號
  • name:所占空間可變,輸入函式的函式名稱

在PE檔案加載到記憶體前,所有IMAGE_THUNK_DATA結構都指向IMAGE_IMPORT_BY_NAME結構
IAT和INT都是以一個內容全為0的IMAGE_THUNK_DATA結構作為結束標志,
在這里插入圖片描述
也就是說,在載入記憶體前,PE檔案的IAT和INT都是指向IMAGE_IMPORT_BY_NAME結構的,但在載入記憶體之后,Windows加載器通過INT找到所有輸入函式的地址,然后用這些地址去替代IAT中指向IMAGE_IMPORT_BY_NAME結構的地址,此時IAT存入了輸入函式的地址,輸入表中別的部分已經不再重要,
在這里插入圖片描述

(三)實體分析

下面我們以一個PE檔案為例用010 EditorLordPE分別從載入記憶體前載入記憶體后分析它的輸入表

載入前的輸入表實體分析

我們知道,可選映像頭中資料目錄欄位的第二個元素記錄的就是輸入表的RVA資料目錄表相對于PE頭的偏移是80h,在010 Editor中可以很容易定位得到輸入表的RVA的值為13A1EC
在這里插入圖片描述
LordPE中也可以一目了然得到,
在這里插入圖片描述
目錄表界面下輸入表旁點擊H按鈕即可立即查看輸入表的內容(黑色底紋處)
在這里插入圖片描述

要想在010 Editor中定位輸入表的位置需要知道的是物理地址,但物理地址并不等于相對虛擬地址(RVA),所以就要用到物理地址跟虛擬地址的轉換,
可以直接用LordPE內置的檔案位置計算器就可以得到檔案偏移地址
在這里插入圖片描述
在這里插入圖片描述
提取出來如下,5個雙字為一個IID

OriginalFirstThunkTimeDateStampForwardName(指向了DLL的名稱)First Thunk
E4A3 13000000 00000000 000022A4 1300BCA1 1300
28A2 13000000 00000000 00004EAA 130000A0 1300
0000 00000000 00000000 00000000 00000000 0000

以第一個IID為例,Name是指向DLL名稱的指標,因為高位對應高地址,所以22A4 1300倒置過來就是 RVA = 0013 A 422 \textcolor{red}{\text{RVA} = 0013A422} RVA=0013A422,位置計算器計算出物理地址E0A22
在這里插入圖片描述
010 Editor中定位,可以發現第一個DLL對應USER32.dll
在這里插入圖片描述
之前探討過,加載到記憶體之前,IAT和INT結構相同,數值一致,OriginalFirstThunk指向INT,第一個IIDOriginalFirstThunk0013A3E4,物理地址對應0E09E4
在這里插入圖片描述
定位到0E09E4
在這里插入圖片描述
再看看第一個IID中指向IAT的First Thunk欄位, RVA = 0013 A 1 B C \textcolor{red}{\text{RVA} = 0013A1BC} RVA=0013A1BC,對應物理地址0E07BC
在這里插入圖片描述
定位到0E07BC,發現IAT與INT此時的值一致,都是0013A414
在這里插入圖片描述
最高位為0,說明以函式名的方式輸入,包含了函式名名稱的IMAGE_IMPORT_BY_NAME結構的RVA為0013A414,物理地址是000E0A14
在這里插入圖片描述
得到物理地址后010 Editor中定位,可以發現這個IMAGE_IMPORT_BY_NAME結構對應的輸入函式是MessageBoxA函式
在這里插入圖片描述

載入后的輸入表實體分析

我們把程式運行程序中記憶體中的資料dump下來,然后再分析輸入表,這里可以寫個程式dump,也可以直接用OD插件,我選擇的是用OD插件的方式

先用LordPE找到輸入表的RVA為0013A1EC,由于是dump出來的程式,此時的RVA已經是等于物理地址了,不需要再轉換,
在這里插入圖片描述
010 Editor中定位,與載入記憶體前的輸入表一致,
在這里插入圖片描述
現在看看第一個IID的OriginalFirstThunk欄位指向的INT,物理地址即RVA 為0013A3E4,資料相比載入記憶體前沒有改變
在這里插入圖片描述
再分析一下FirstThunk指向的IAT,物理地址即RVA 為0013A1BC,資料產生了變化,變成了75A1 ED60,這應該就是USER32.dll鏈接庫MessageBox函式的地址
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/286446.html

標籤:區塊鏈

上一篇:go 語言開發環境如何搭建?

下一篇:Java基礎--多執行緒和分布式

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • JAVA使用 web3j 進行token轉賬

    最近新學習了下區塊鏈這方面的知識,所學不多,給大家分享下。 # 1. 關于web3j web3j是一個高度模塊化,反應性,型別安全的Java和Android庫,用于與智能合約配合并與以太坊網路上的客戶端(節點)集成。 # 2. 準備作業 jdk版本1.8 引入maven <dependency> < ......

    uj5u.com 2020-09-10 03:03:06 more
  • 以太坊智能合約開發框架Truffle

    前言 部署智能合約有多種方式,命令列的瀏覽器的渠道都有,但往往跟我們程式員的風格不太相符,因為我們習慣了在IDE里寫了代碼然后打包運行看效果。 雖然現在IDE中已經存在了Solidity插件,可以撰寫智能合約,但是部署智能合約卻要另走他路,沒辦法進行一個快捷的部署與測驗。 如果團隊管理的區塊節點多、 ......

    uj5u.com 2020-09-10 03:03:12 more
  • 谷歌二次驗證碼成為區塊鏈專用安全碼,你怎么看?

    前言 谷歌身份驗證器,前些年大家都比較陌生,但隨著國內互聯網安全的加強,它越來越多地出現在大家的視野中。 比較廣泛接觸的人群是國際3A游戲愛好者,游戲盜號現象嚴重+國外賬號安全應用廣泛,這類游戲一般都會要求用戶系結名為“兩步驗證”、“雙重驗證”等,平臺一般都推薦用谷歌身份驗證器。 后來區塊鏈業務風靡 ......

    uj5u.com 2020-09-10 03:03:17 more
  • 密碼學DAY1

    目錄 ##1.1 密碼學基本概念 密碼在我們的生活中有著重要的作用,那么密碼究竟來自何方,為何會產生呢? 密碼學是網路安全、資訊安全、區塊鏈等產品的基礎,常見的非對稱加密、對稱加密、散列函式等,都屬于密碼學范疇。 密碼學有數千年的歷史,從最開始的替換法到如今的非對稱加密演算法,經歷了古典密碼學,近代密 ......

    uj5u.com 2020-09-10 03:03:50 more
  • 密碼學DAY1_02

    目錄 ##1.1 ASCII編碼 ASCII(American Standard Code for Information Interchange,美國資訊交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單位元組編碼系統,并等同于國際標準ISO/IE ......

    uj5u.com 2020-09-10 03:04:50 more
  • 密碼學DAY2

    ##1.1 加密模式 加密模式:https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html ECB ECB : Electronic codebook, 電子密碼本. 需要加密的訊息按照塊密碼的塊大小被分為數個塊,并對每個塊進 ......

    uj5u.com 2020-09-10 03:05:42 more
  • NTP時鐘服務器的特點(京準電子)

    NTP時鐘服務器的特點(京準電子) NTP時鐘服務器的特點(京準電子) 京準電子官V——ahjzsz 首先對時間同步進行了背景介紹,然后討論了不同的時間同步網路技術,最后指出了建立全球或區域時間同步網存在的問題。 一、概 述 在通信領域,“同步”概念是指頻率的同步,即網路各個節點的時鐘頻率和相位同步 ......

    uj5u.com 2020-09-10 03:05:47 more
  • 標準化考場時鐘同步系統推進智能化校園建設

    標準化考場時鐘同步系統推進智能化校園建設 標準化考場時鐘同步系統推進智能化校園建設 安徽京準電子科技官微——ahjzsz 一、背景概述隨著教育事業的快速發展,學校建設如雨后春筍,隨之而來的學校教育、管理、安全方面的問題成了學校管理人員面臨的最大的挑戰,這些問題同時也是學生家長所擔心的。為了讓學生有更 ......

    uj5u.com 2020-09-10 03:05:51 more
  • 位元幣入門

    引言 位元幣基本結構 位元幣基礎知識 1)哈希演算法 2)非對稱加密技術 3)數字簽名 4)MerkleTree 5)哪有位元幣,有的是UTXO 6)位元幣挖礦與共識 7)區塊驗證(共識) 總結 引言 上一篇我們已經知道了什么是區塊鏈,此篇說一下區塊鏈的第一個應用——位元幣。其實先有位元幣,后有的區塊 ......

    uj5u.com 2020-09-10 03:06:15 more
  • 北斗對時服務器(北斗對時設備)電力系統應用

    北斗對時服務器(北斗對時設備)電力系統應用 北斗對時服務器(北斗對時設備)電力系統應用 京準電子科技官微(ahjzsz) 中國北斗衛星導航系統(英文名稱:BeiDou Navigation Satellite System,簡稱BDS),因為是目前世界范圍內唯一可以大面積提供免費定位服務的系統,所以 ......

    uj5u.com 2020-09-10 03:06:20 more
最新发布
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:46:47 more
  • Hyperledger Fabric 使用 CouchDB 和復雜智能合約開發

    在上個實驗中,我們已經實作了簡單智能合約實作及客戶端開發,但該實驗中智能合約只有基礎的增刪改查功能,且其中的資料管理功能與傳統 MySQL 比相差甚遠。本文將在前面實驗的基礎上,將 Hyperledger Fabric 的默認資料庫支持 LevelDB 改為 CouchDB 模式,以實作更復雜的資料... ......

    uj5u.com 2023-04-16 07:28:31 more
  • .NET Core 波場鏈離線簽名、廣播交易(發送 TRX和USDT)筆記

    Get Started NuGet You can run the following command to install the Tron.Wallet.Net in your project. PM> Install-Package Tron.Wallet.Net 配置 public reco ......

    uj5u.com 2023-04-14 08:08:00 more
  • DKP 黑客分析——不正確的代幣對比率計算

    概述: 2023 年 2 月 8 日,針對 DKP 協議的閃電貸攻擊導致該協議的用戶損失了 8 萬美元,因為 execute() 函式取決于 USDT-DKP 對中兩種代幣的余額比率。 智能合約黑客概述: 攻擊者的交易:0x0c850f,0x2d31 攻擊者地址:0xF38 利用合同:0xf34ad ......

    uj5u.com 2023-04-07 07:46:09 more
  • Defi開發簡介

    Defi開發簡介 介紹 Defi是去中心化金融的縮寫, 是一項旨在利用區塊鏈技術和智能合約創建更加開放,可訪問和透明的金融體系的運動. 這與傳統金融形成鮮明對比,傳統金融通常由少數大型銀行和金融機構控制 在Defi的世界里,用戶可以直接從他們的電腦或移動設備上訪問廣泛的金融服務,而不需要像銀行或者信 ......

    uj5u.com 2023-04-05 08:01:34 more
  • solidity簡單的ERC20代幣實作

    // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; import "hardhat/console.sol"; //ERC20 同質化代幣,每個代幣的本質或性質都是相同 //ETH 是原生代幣,它不是ERC20代幣, ......

    uj5u.com 2023-03-21 07:56:29 more
  • solidity 參考型別修飾符memory、calldata與storage 常量修飾符C

    在solidity語言中 參考型別修飾符(參考型別為存盤空間不固定的數值型別) memory、calldata與storage,它們只能修飾參考型別變數,比如字串、陣列、位元組等... memory 適用于方法傳參、返參或在方法體內使用,使用完就會清除掉,釋放記憶體 calldata 僅適用于方法傳參 ......

    uj5u.com 2023-03-08 07:57:54 more
  • solidity注解標簽

    在solidity語言中 注釋符為// 注解符為/* 內容*/ 或者 是 ///內容 注解中含有這幾個標簽給予我們使用 @title 一個應該描述合約/介面的標題 contract, library, interface @author 作者的名字 contract, library, interf ......

    uj5u.com 2023-03-08 07:57:49 more
  • 評價指標:相似度、GAS消耗

    【代碼注釋自動生成方法綜述】 這些評測指標主要來自機器翻譯和文本總結等研究領域,可以評估候選文本(即基于代碼注釋自動方法而生成)和參考文本(即基于手工方式而生成)的相似度. BLEU指標^[^?88^^?^]^:其全稱是bilingual evaluation understudy.該指標是最早用于 ......

    uj5u.com 2023-02-23 07:27:39 more
  • 基于NOSTR協議的“公有制”版本的Twitter,去中心化社交軟體Damus

    最近,一個幽靈,Web3的幽靈,在網路游蕩,它叫Damus,這玩意詮釋了什么叫做病毒式營銷,滑稽的是,一個Web3產品卻在Web2的產品鏈上瘋狂傳銷,各方大佬紛紛為其背書,到底發生了什么?Damus的葫蘆里,賣的是什么藥? 注冊和簡單實用 很少有什么產品在用戶注冊環節會有什么噱頭,但Damus確實出 ......

    uj5u.com 2023-02-05 06:48:39 more