C++通過讀取二進制流的方式來解析PE(靜態文件讀取法)

步驟解讀

  1. 先選擇文件
  2. 讀取文件二進制流
  3. 從二進制流讀取DOS頭(DOS_HEADER),長度64字節
  4. 讀取DOS殼(DOS_STUB),DOS頭開始,長度至到dosHeader->e_lfanew偏移量
  5. 讀取PE標識(Signature),e_lfanew偏移量開始,長度4字節
  6. 讀取PE文件頭(FILE_HEADER),PE標識開始,長度20字節
  7. 讀取PE可選頭(OPTIONAL_HEADER),PE文件頭開始,長度peHeader->sizeOfOptionalHeader

直接上代碼

代碼中只解析了重要信息

#include<iostream>
#include<windows.h>using namespace std;BOOL selectFile(char* filePath) {OPENFILENAMEA ofn;char filename[MAX_PATH];ZeroMemory(&ofn, sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = NULL;ofn.lpstrFilter = "ALL Files\0*.*\0";ofn.lpstrFile = filename;ofn.nMaxFile = sizeof(filename);ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;ofn.lpstrFile[0] = '\0';if (GetOpenFileNameA(&ofn) == TRUE) {//MessageBoxA(NULL, filename, "提示", MB_OK);strcpy_s(filePath,MAX_PATH,filename);return TRUE;}return FALSE;
}int main() {char filePath[MAX_PATH];if (selectFile(filePath)) {//打開文件HANDLE hfile = CreateFileA(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);//根據文件句柄獲取文件大小DWORD fileSize = GetFileSize(hfile,NULL);//文件流緩沖區char* fileBuffer = new char[fileSize];//實際接收字節數DWORD realRead = 0;//讀取文件if (ReadFile(hfile, fileBuffer, fileSize, &realRead, NULL)) {WORD e_magic = *(WORD*)fileBuffer;	//MZ標識DWORD e_lfanew = *(DWORD*)(fileBuffer + 60);	//NT頭偏移量printf("e_magic:%04X\n", e_magic);printf("e_lfanew:%08X\n", e_lfanew);printf("\n");DWORD Signatrue = *(DWORD*)(fileBuffer + e_lfanew);	//PE標識printf("Siganture:%08X\n", Signatrue);printf("\n");WORD Machine = *(WORD*)(fileBuffer + e_lfanew + 0x04);	//運行平臺WORD NumberOfSections = *(WORD*)(fileBuffer + e_lfanew + 0x06);	//區段數量DWORD TimeDateStamp = *(DWORD*)(fileBuffer + e_lfanew + 0x08);	//區段數量WORD SizeOfOptionHeader = *(WORD*)(fileBuffer + e_lfanew + 0x14);	//可選頭大小WORD Characteristics = *(WORD*)(fileBuffer + e_lfanew + 0x16);	//特征printf("Machine:%04X\n", Machine);printf("NumberOfSections:%04X\n", NumberOfSections);printf("TimeDateStamp:%04X\n", TimeDateStamp);printf("SizeOfOptionHeader:%04X\n", SizeOfOptionHeader);printf("Characteristics.EXECUTABLE_IMAGE:%d\n", Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE);	//是否是可執行文件printf("Characteristics.IMAGE_FILE_LINE_NUMS_STRIPPED:%d\n", Characteristics & IMAGE_FILE_LINE_NUMS_STRIPPED);	//文件中不包含行號信息。printf("Characteristics.IMAGE_FILE_LOCAL_SYMS_STRIPPED:%d\n", Characteristics & IMAGE_FILE_LOCAL_SYMS_STRIPPED);	//文件中不包含局部符號。printf("Characteristics.IMAGE_FILE_32BIT_MACHINE:%d\n", Characteristics & IMAGE_FILE_32BIT_MACHINE);	//目標平臺是32位。printf("Characteristics.IMAGE_FILE_DEBUG_STRIPPED:%d\n", Characteristics & IMAGE_FILE_DEBUG_STRIPPED);	//調試信息被移除。printf("Characteristics.IMAGE_FILE_SYSTEM:%d\n", Characteristics & IMAGE_FILE_SYSTEM);	//文件是系統文件。printf("Characteristics.IMAGE_FILE_DLL:%d\n", Characteristics & IMAGE_FILE_DLL);	//文件是dll文件。printf("\n");WORD Magic = *(WORD*)(fileBuffer  + e_lfanew + 0x18);	//0x10B是32位,0x20B是64位DWORD AddressOfEntryPoint = *(DWORD*)(fileBuffer + e_lfanew + 0x28);	//OEP程序入口偏移量DWORD ImageBase = *(DWORD*)(fileBuffer + e_lfanew + 0x34);	//程序入口,固定值+偏移量DWORD SectionAlignment = *(DWORD*)(fileBuffer + e_lfanew + 0x38);	//內存對齊大小DWORD FileAlignment = *(DWORD*)(fileBuffer + e_lfanew + 0x3C);	//文件對齊大小DWORD SizeOfIamge = *(DWORD*)(fileBuffer + e_lfanew + 0x50);	//文件在內存中的大小,按SectionAlignment對齊后的大小DWORD SizeOfHeaders = *(DWORD*)(fileBuffer + e_lfanew + 0x54);	//DOS,NT,PE,可選PE+區段 各種頭加一塊,按照FileAlignment對齊后的大小DWORD NumberOfRvaAndSizes = *(DWORD*)(fileBuffer + e_lfanew + 0x74);	//數據目錄表的個數printf("Magic:%04X\n", Magic);printf("AddressOfEntryPoint:%08X\n", AddressOfEntryPoint);printf("ImageBase:%08X\n", ImageBase);printf("SectionAlignment:%08X\n", SectionAlignment);printf("FileAlignment:%08X\n", FileAlignment);printf("SizeOfIamge:%08X\n", SizeOfIamge);printf("SizeOfHeaders:%08X\n", SizeOfHeaders);printf("NumberOfRvaAndSizes:%08X\n", NumberOfRvaAndSizes);CloseHandle(hfile);}else {int errcode = GetLastError();cout << "文件讀取失敗:"<< errcode << endl;}}else {cout << "文件選擇失敗。" << endl;}
}

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

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

相關文章

520節日特別篇:構建浪漫互動網站實戰技巧

520節日特別篇&#xff1a;構建浪漫互動網站實戰技巧 一、非零分積分資源概覽二、基礎概念與作用說明HTML5 Canvas & SVGCSS3 動畫與過渡JavaScript 動態交互 三、實戰代碼示例&#xff1a;打造浪漫愛心雨HTML 結構CSS 樣式JavaScript 邏輯 四、實際開發應用思路1. 個性化祝…

怎么畫思維導圖?方法介紹

怎么畫思維導圖&#xff1f;在數字化時代&#xff0c;思維導圖已成為我們工作、學習和生活中的得力助手。它不僅能幫助我們更好地組織和表達思想&#xff0c;還能提升我們的思維能力和創造力。那么&#xff0c;哪些軟件可以畫思維導圖呢&#xff1f;本文將為你揭秘幾款功能強大…

Linux 應用入門(一)

1. 交叉編譯 概念&#xff1a;在當前編譯平臺下&#xff0c;編譯出來的程序能運行在體系結構不同的另一種目標平臺上&#xff0c;但是編譯平臺本身卻不能運行該程序。 為什么需要交叉編譯&#xff1f; 速度&#xff1a;目標平臺得運行速度比主機往往慢得多&#xff0c;因為許多…

Docker+nginx部署SpringBoot+vue前后端分離項目(保姆及入門指南)

前后分離項目部署 項目回顧工具上線準備1、win1.1、前端1.2、后端 2、linux環境2.1、安裝docker2.2、安裝docker compose2.3、編寫Dockerfile文件2.4、編寫docker-compose.yml文件2.5、修改application-pro.yml2.6、準備好nginx的掛載目錄和配置2.7、部署后端服務 項目回顧 書…

數據挖掘實戰-基于內容協同過濾算法的電影推薦系統

&#x1f935;?♂? 個人主頁&#xff1a;艾派森的個人主頁 ?&#x1f3fb;作者簡介&#xff1a;Python學習者 &#x1f40b; 希望大家多多支持&#xff0c;我們一起進步&#xff01;&#x1f604; 如果文章對你有幫助的話&#xff0c; 歡迎評論 &#x1f4ac;點贊&#x1f4…

【從C++到Java一周速成】章節9:構造器

章節9&#xff1a;構造器 對于一個類來說&#xff0c;一般有三種常見的成員&#xff1a;屬性、方法、構造器。 這三種成員都可以定義零個或多個。 構造方法也叫構造器&#xff0c;是一個創建對象時被自動調用的特殊方法&#xff0c;用于對象的初始化。 Java通過new關鍵字來調用…

OpenHarmony集成OCR三方庫實現文字提取

1. 簡介 Tesseract(Apache 2.0 License)是一個可以進行圖像OCR識別的C庫&#xff0c;可以跨平臺運行 。本樣例基于Tesseract庫進行適配&#xff0c;使其可以運行在OpenAtom OpenHarmony&#xff08;以下簡稱“OpenHarmony”&#xff09;上&#xff0c;并新增N-API接口供上層應…

.Net Core學習筆記 框架特性(注入、配置)

注&#xff1a;直接學習的.Net Core 6&#xff0c;此版本有沒有startup.cs相關的內容 項目Program.cs文件中 是定義項目加載 啟動的地方 //通過builder對項目進行配置、服務的加載 var builder WebApplication.CreateBuilder(args); builder.Services.AddControllers();//將…

Ubuntu服務器運行Subspace節點和Farm

提供Subspace 節點部署&性能優化&機房托管&運維監控等服務。myto88 磁盤格式化 將插入的磁盤格式化。 sudo mkfs.ext4 -m 0 -T largefile4 /dev/sd*磁盤掛載 此處為語雀內容卡片&#xff0c;點擊鏈接查看&#xff1a;https://www.yuque.com/u25096009/lvoxa…

企商在線榮登甲子光年“2024中國AI算力層創新企業”榜單

5月15日&#xff0c;「AI創生時代——2024甲子引力X科技產業新風向」大會在北京順利舉辦&#xff0c;大會發布2024【星辰100】創新企業榜。企商在線憑借全棧式一體化AI算力能力&#xff0c;與超聚變、寒武紀等企業共同入選“2024中國AI算力層創新企業”榜單。 本次大會由中國科…

AJAX(JQuery版本)

目錄 前言 一.load方法 1.1load()簡介 1.2load()方法示例 1.3load()方法回調函數的參數 二.$.get()方法 2.1$.get()方法介紹 2.2詳細說明 2.3一些例子 2.3.1請求test.php網頁并傳送兩個參數 2.3.2顯示test返回值 三.$.post()方法 3.1$.post()方法介紹 3.2詳細說明 …

什么是云計算安全?如何保障云計算安全

云計算徹底改變了數據存儲的世界&#xff0c;它使企業可以遠程存儲數據并隨時隨地從任何位置訪問數據。存和取變得簡單&#xff0c;也使得云上數據極易造成泄露或者被篡改&#xff0c;所以云計算安全就顯得非常重要了。那么什么是云計算安全&#xff1f; 其實&#xff0c;云計…

WPS PPT學習筆記 1 排版4原則等基本技巧整理

排版原則 PPT的排版需要滿足4原則&#xff1a;密性、對齊、重復和對比4個基本原則。 親密性 彼此相關的元素應該靠近&#xff0c;成為一個視覺單位&#xff0c;減少混亂&#xff0c;形成清晰的結構。 兩端對齊&#xff0c;1.5倍行距 在本例中&#xff0c;19年放左邊&#x…

是誰的項目還在爛大街?一個基于 SpringBoot 的高性能短鏈系統

看了幾百份簡歷&#xff0c;真的超過 90% 的小伙伴的項目是商城、RPC、秒殺、論壇、外賣、點評等等爛大街的項目&#xff0c;人人都知道這些項目爛大街了&#xff0c;但大部分同學還是得硬著頭皮做&#xff0c;沒辦法&#xff0c;網絡上能找到的、教程比較完善的就這些項目了&a…

基于機器學習預測未來的二氧化碳排放量(隨機森林和XGBoost)

基于機器學習預測未來的二氧化碳排放量&#xff08;隨機森林和XGBoost&#xff09; 簡介&#xff1a; CO2排放是當今全球關注的環境問題之一。本文將使用Python對OWID提供的CO2排放數據集進行分析&#xff0c;并嘗試構建機器學習模型來預測未來的CO2排放趨勢。我們將探索數據…

kafka Kerberos集群環境部署驗證

背景 公司需要對kafka環境進行安全驗證,目前考慮到的方案有Kerberos和SSL和SASL_SSL,最終考慮到安全和功能的豐富度,我們最終選擇了SASL_SSL方案。處于知識積累的角度,記錄一下kafka keberos安裝部署的步驟。 機器規劃 目前測試環境公搭建了三臺kafka主機服務,現在將詳細…

ViLT學習

多模態里程碑式的文章&#xff0c;總結了四種多模態方法&#xff0c;根據文字和圖像特征特征抽取方式不通。 文章的貢獻主要是速度提高了&#xff0c;使用了數據增強&#xff0c;文本的mask 學習自b站朱老師的論文講解

電賽控制類PID算法實現

一、什么是PID PID&#xff08;Proportional-Integral-Derivative&#xff09;是一種經典的控制算法&#xff0c;廣泛應用在自動化控制系統中。它是通過對被控對象的測量值和設定值進行比較&#xff0c;并根據誤差的大小來調整輸出信號&#xff0c;實現對被控對象的穩定控制。 …

【C++】map和set的封裝

目錄 前言一、紅黑樹的設計1.1 紅黑樹存儲節點的設計1.2 紅黑樹的迭代器1.3 map的設計1.4 set的設計1.5關于map與set的const_iterator設計 前言 我們知道map和set的底層都是用紅黑樹實現的&#xff0c;但是set和map的結構不一樣&#xff0c;set只有一個參數K&#xff0c;而map…