1. 程式人生 > >《逆向工程核心原理》學習總結(四)

《逆向工程核心原理》學習總結(四)

介紹

PE檔案是windows作業系統的可執行檔案格式(包括.exe、.scr、.dll、.sys、.obj等檔案),PE檔案指32位的可執行檔案,也稱為PE3264位可執行檔案稱為PE+或PE32+,是PE32檔案的一種擴充套件形式。

基本結構

PE檔案包含PE頭與PE體,研究PE檔案格式,就是研究構成PE頭的結構體。
PE頭包含的基本結構如下:

1.DOS頭
2.DOS存根
3.NT頭
4.節區頭(sectionHeader)

PE頭中一些重要的資訊

NT頭:可選頭(IMAGE_OPTIONAL_HEADER32)

1.AddressOfEntryPoint : EP的RVA值,程式最先執行的程式碼起始地址。
2.DataDirectory:IMAGE_DATA_DIRECTORY結構體陣列

DataDirectory[0]:EXPORT Directory 匯出表(EDT)的RVA地址
DataDirectory[1]:IMPORT Directory 匯入表(IAT)的RVA地址
DataDirectory[9]:TLS Directory

IAT

IMAGE_IMPORT_DESCRIPTOR 結構體描述PE裝載時的必須資訊。每一個dll對應一個IMAGE_IMPORT_DESCRIPTOR 結構體,結構體的結構如下:

OriginalFirstThunk; //INT(Import Name Table) address(RVA)
TimeDateStamp;
ForwarderChain;
Name;//the name(string) of the dll
FirstThunk;//IAT(Import Address Table) address (RVA)

以裝載kernel32.dll為例,PE裝載器將匯入函式輸入至IAT的流程:

1.讀取IID的Name,獲取到庫名稱(“kernel32.dll”)
2.裝載庫(LoadLibrary(“kernel32.dll”))
3.讀取IID的OriginalFirstThunk成員,獲取INT地址
4.逐一讀取INT中的函式名地址
5.通過函式名地址獲取到函式名(eg.GetCurrentThreadId),獲取函式的起始地址:GetProcAddress(“GetCurrentThreadId”)
6.讀取IID的FirstThunk,獲取IAT地址;
7.將函式地址填入到IAT項
8.重複4-7,直到INT結束

EAT

IMAGE_EXPORT_DIRECTORY 結構體描述PE檔案的EAT資訊,一個PE檔案只包含一個IMAGE_EXPORT_DIRECTORY結構體。其結構如下:

NumberOfFunctions // Export函式的個數
NumberOfNames //Export函式中具名的函式個數
AddressOfFunctions // Export函式地址陣列
AddressOfNames // 函式名稱地址陣列
AddressOfNameOrdinals // Ordinal地址陣列

注:AddressOfFunctions與AddressOfNames的下標一般不互相對應, Ordinal地址陣列是它們下標之間的對映。

相關推薦

逆向工程核心原理學習總結

介紹 PE檔案是windows作業系統的可執行檔案格式(包括.exe、.scr、.dll、.sys、.obj等檔案),PE檔案指32位的可執行檔案,也稱為PE32。64位可執行檔案稱為PE+或PE32+,是PE32檔案的一種擴充套件形式。 基本結構 P

JAVA學習總結

服務 共同點 運行 blog 重要 程序員 ride 處理 mob 1.接口 interface 1.1語法:   修飾符 interface 接口名{     常量     都是抽象方法  } 修飾符:默認 | public接口名:自定義,規則與類名相同,一般I字母打頭:

JavaSE學習總結——Java面向對象十分鐘入門

組織 table 運行時 order 3.1 project park 得到 row 目錄 一、理解類與對象及他們間的關系 1.1、對象 1.3、類與對象間的關系 二、了解面向對象編程的意義 三、定義類與實例化對象 3.1、定義類 3.2、實例化對象 四、區別

OO學習總結

string 質量 人員 其他 png ext 內部 支持 分支 一、 測試與正確性論證的比較 測試和正確性論證分別從用戶角度和開發者角度對工程進行評估。前者能夠評測程序在一般情況和可預見的特殊情況下的執行效果,後者能夠較為全面地測試到每一個細節。 測試的優點: 所需時間

SpringCloud開發學習總結—— 客戶端負載均衡Ribbon

均衡 spring java www ref discovery 聯合 方式 嘗試   通過上一章《SpringCloud開發學習總結(三)—— 服務治理Eureka》,我們已經搭建起微服務架構中的核心組件——服務註冊中心(包括單點模式和高可用模式)。同時還註冊了一個服務,

Flutter 學習總結Widget框架概述

介紹 Flutter Widget採用現代響應式框架構建,這是從 React 中獲得的靈感,中心思想是用widget構建你的UI。 Widget描述了他們的檢視在給定其當前配置和狀態時應該看起來像什麼。當widget的狀態發生變化時,widget會重新構建UI,Flutt

微信開發學習總結——自定義選單5——個性化選單介面

一、個性化選單介面說明 為了幫助公眾號實現靈活的業務運營,微信公眾平臺新增了個性化選單介面,開發者可以通過該介面,讓公眾號的不同使用者群體看到不一樣的自定義選單。該介面開放給已認證訂閱號和已認證服務號。 開發者可以通過以下條件來設定使用者看到的選單: 1、使用者標籤(開發者的

微信開發學習總結——自定義選單4——自定義選單事件推送

一、自定義選單事件推送介面說明 使用者點選自定義選單後,微信會把點選事件推送給開發者,請注意,點選選單彈出子選單,不會產生上報。請注意,第3個到第8個的所有事件,僅支援微信iPhone5.4.1以上版本,和Android5.4以上版本的微信使用者,舊版本微信使用者點選後將沒有迴應,開

微信開發學習總結——自定義選單3——自定義選單刪除介面

自定義選單刪除介面 使用介面建立自定義選單後,開發者還可使用介面刪除當前使用的自定義選單。另請注意,在個性化選單時,呼叫此介面會刪除預設選單及全部個性化選單。 請求說明 http請求方式:GET https://api.weixin.qq.com/cgi-bin/menu/d

微信開發學習總結——自定義選單2——自定義選單查詢介面

自定義選單查詢介面 使用介面建立自定義選單後,開發者還可使用介面查詢自定義選單的結構。另外請注意,在設定了個性化選單後,使用本自定義選單查詢介面可以獲取預設選單和全部個性化選單資訊。 請求說明 http請求方式:GET https://api.weixin.qq.com/cg

微信開發學習總結——自定義選單1——自定義選單建立介面

一、自定義選單建立介面說明 自定義選單能夠幫助公眾號豐富介面,讓使用者更好更快地理解公眾號的功能。開啟自定義選單後,公眾號介面如圖所示: 請注意: ①自定義選單最多包括3個一級選單,每個一級選單最多包含5個二級選單。 ②一級選單最多4個漢字,二級選單最多7個漢字,多出來的部分將

c++學習總結——運算子過載與標準模板庫STL

一、心得總結     運算子過載使得使用者自定義的資料以一種更簡潔的方式工作。例如在做ATM模擬系統時,使用過載“<”來比較時間,可以簡化程式,減少程式碼。另外,我們也可以過載運算子函式,將運算子用於操作自定義的資料型別。過載運算子函式可以對運算子做出新的解釋,即定義使用

Mybatis學習總結---一對多對映

建立house表,一個使用者有多個房子,所以一個使用者對應多條房屋資訊。 以下sql查詢出使用者和所在部門資訊以及其房屋資訊 SELECT user.*, dept.dept

資料庫學習總結——單表查詢

select語句單表查詢 1.簡單查詢 1.1查詢所有欄位 1.2查詢指定欄位 2.按條件查詢 2.1 帶關係運算符的查詢 2.2 帶in關鍵字的查詢 2.3 帶between and 關鍵字的查詢

微信開發學習總結——自定義選單——自定義選單建立介面

一、自定義選單建立介面說明 自定義選單能夠幫助公眾號豐富介面,讓使用者更好更快地理解公眾號的功能。開啟自定義選單後,公眾號介面如圖所示: 請注意: ①自定義選單最多包括3個一級選單,每個一級選單最多包含5個二級選單。 ②一級選單最多4個漢字,二級選單最多7個漢

MyBatis學習總結——MyBatis快取與程式碼生成

 一、MyBatis快取 快取可以提高系統性能,可以加快訪問速度,減輕伺服器壓力,帶來更好的使用者體驗。快取用空間換時間,好的快取是快取命中率高的且資料量小的。快取是一種非常重要的技術。 1.0、再次封裝SqlSessionFactoryUtils 為了配置快取的學習我們將工具類再次封裝。 原SqlS

Maven學習總結:更改maven的編碼格式方式

fis mtu avd WAD nav npe env unp bcp 安裝系統之後,一般中文系統默認字符集是GBK。我們安裝的軟件一般都繼承使用操作系統的默認字符集。所以當在中文XP或者win7系統開發,在使用maven(mvn compile)編譯項目的時候,就會出現“

JavaWeb學習總結:Servlet開發

一、ServletConfig講解 1.1、配置Servlet初始化引數   在Servlet的配置檔案web.xml中,可以使用一個或多個<init-param>標籤為servlet配置一些初始化引數。 例如: 1 <servlet&g

ElasticSearch學習總結:分散式特性

本文主要對Elasticsearch的分散式相關特性進行總結 1. 分片與副本 1.1 分片&副本 索引分片機制用來儲存超過單個節點儲存容量的資料,分片副本用來應對不斷攀升的吞吐量以及確保資料的安全性。 當一個節點的主分片丟失,ElasticSearch可以把任意一個

NG機器學習總結-邏輯迴歸以及python實現

在第一篇部落格NG機器學習總結一中,我們提到了監督學習通常一般可以分為兩類:迴歸和分類。線性迴歸屬於迴歸問題,例如房價的預測問題。而判斷一封郵件是否是垃圾郵件、腫瘤的判斷(良性還是惡性)、線上交易是否欺詐都是分類問題,當然這些都是二分類的問題。 Email:Spam /