File->FileBuffer->ImageBuffer
发布日期:2022-04-22 13:46:49
浏览次数:8
分类:博客文章
本文共 3785 字,大约阅读时间需要 12 分钟。
1 #define _CRT_SECURE_NO_WARNINGS 2 #include3 #include 4 #include 5 6 typedef unsigned char BYTE; 7 typedef unsigned short WORD; 8 typedef unsigned int DWORD; 9 10 #define IMAGE_SIZEOF_SHORT_NAME 8 11 typedef struct _Section_Header 12 { 13 BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; 14 union 15 { 16 DWORD Physical_Address; 17 DWORD Virtual_Size; 18 }Misc; 19 DWORD Virtual_Address; 20 DWORD SizeOfRawData; 21 DWORD PointerToRawData; 22 DWORD PointerToRelocations; 23 DWORD PointerToLinenumbers; 24 WORD NumberOfRelocations; 25 WORD NumberOfLinenumbers; 26 DWORD Characteristics; 27 28 }Section_Header; 29 30 typedef struct _PE_Information 31 { 32 DWORD Dos_Header_e_lfanew; 33 WORD File_Header_NumberOfSections; 34 WORD File_Header_SizeOfOptionHeader; 35 DWORD Option_Header_SectionAlignment; 36 DWORD Option_Header_FileAlignment; 37 DWORD Option_Header_SizeOfImage; 38 DWORD Option_Header_SizeOfHeaders; 39 DWORD File_Header_Offset; 40 DWORD Optional_Header_Offset; 41 DWORD Section_Header_Offset; 42 Section_Header* PSection = (Section_Header*)malloc(sizeof(Section_Header) * File_Header_NumberOfSections); 43 44 }PE_Information; 45 46 typedef struct _Rva_And_Raw 47 { 48 DWORD Raw; 49 DWORD Rva; 50 }Rva_And_Raw; 51 52 //读取文件长度 53 int File_Lenth(FILE* p) 54 { 55 fseek(p, 0, SEEK_END); 56 int len = ftell(p); 57 fseek(p, 0, SEEK_SET); 58 return len; 59 } 60 61 //生成文件缓冲区 62 char* File_Read(const char* p, int& length) 63 { 64 //文件指针 65 FILE* pf = fopen(p, "rb"); 66 67 //获得文件长度 68 length = File_Lenth(pf); 69 70 //分配FileBuffer的空间 71 char* pt = (char*)malloc(sizeof(char) * length); 72 73 //读入到空间中 74 fread(pt, length, 1, pf); 75 76 fclose(pf); 77 return pt; 78 } 79 80 //读取PE_Header的数据 81 void Get_PE_Information(PE_Information* PE,char* pt) 82 { 83 memcpy(&PE->Dos_Header_e_lfanew, pt + 0x3C, 4); 84 85 PE->File_Header_Offset = PE->Dos_Header_e_lfanew + 4; 86 87 memcpy(&PE->File_Header_NumberOfSections, pt + PE->File_Header_Offset + 2, 2); 88 89 memcpy(&PE->File_Header_SizeOfOptionHeader, pt + PE->File_Header_Offset + 0x10, 2); 90 91 PE->Optional_Header_Offset = PE->File_Header_Offset + 0x14; 92 93 PE->Section_Header_Offset = PE->Optional_Header_Offset + PE->File_Header_SizeOfOptionHeader; 94 95 memcpy(&PE->Option_Header_FileAlignment, pt + PE->Optional_Header_Offset + 0x24, 4); 96 97 memcpy(&PE->Option_Header_SectionAlignment, pt + PE->Optional_Header_Offset + 0x20, 4); 98 99 memcpy(&PE->Option_Header_SizeOfHeaders, pt + PE->Optional_Header_Offset + 0x3c, 4);100 101 memcpy(&PE->Option_Header_SizeOfImage, pt + PE->Optional_Header_Offset + 0x38, 4);102 103 memcpy(PE->PSection, pt + PE->Section_Header_Offset, sizeof(Section_Header) * PE->File_Header_NumberOfSections);104 105 }106 107 //创建ImageBuffer108 char* Image_Read(char* pt,PE_Information PE)109 {110 //申请ImageBuffer的空间111 char* pi = (char*)malloc(PE.Option_Header_SizeOfImage);112 113 //填充0114 memset(pi, 0, PE.Option_Header_SizeOfImage);115 116 //复制头117 memcpy(pi, pt, PE.Option_Header_SizeOfHeaders);118 119 //复制节区120 for (int i = 0; i < PE.File_Header_NumberOfSections; i++)121 {122 memcpy(pi + PE.PSection[i].Virtual_Address, pt + PE.PSection[i].PointerToRawData, PE.PSection[i].SizeOfRawData);123 }124 125 return pi;126 }127 int main()128 {129 int length;130 char* pt = File_Read("C:/Windows/System32/notepad.exe", length);131 132 PE_Information PE;133 134 Get_PE_Information(&PE, pt);135 136 char* pi = Image_Read(pt, PE);137 138 return 0;139 140 }
转载地址:https://www.cnblogs.com/yanmo/p/14526095.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月03日 04时30分38秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
学以致用设计模式 之 “组合模式”
2019-04-27
我用过的设计模式(7)--享元模式
2019-04-27
MySQL数据库从入门到实战应用(学习笔记一)
2019-04-27
MySQL数据库从入门到实战应用(学习笔记二)
2019-04-27
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
2019-04-27
【C++】攻克哈希表(unordered_map)
2019-04-27
转:【答学员问】- 该如何根据岗位学习相关技能
2019-04-27
转:【答学员问】有什么经验教训,是你在面试很多次之后才知道的?
2019-04-27
消息队列:解耦、异步、削峰,现有MQ对比以及新手入门该如何选择MQ?
2019-04-27
【奇技淫巧】-- 三角形最小路径和
2019-04-27
【小技巧】argc和argv的用法
2019-04-27
学不下去了怎么办?
2021-06-30
二叉树的前中后序遍历(迭代法)(带动画)
2021-06-30
【小技巧】【XShell】【Xftp】Windows桌面与Linux虚拟机互传文件
2021-06-30
【redis入门】Centos下安装redis
2021-06-30
【redis入门】redis安装后相关知识串讲
2021-06-30
【redis】来吧,展示一下redis 发布-订阅模式
2021-06-30
当下热点词再学:redis缓存预热、更新、降级,限流
2021-06-30