
File->FileBuffer->ImageBuffer
发布日期:2022-04-22 13:46:49
浏览次数:5
分类:博客文章
本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2023年09月07日 02时46分59秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java多线程编程之volatile和CAS
2019-03-07
JAVA中金额数据的处理
2019-03-07
规则引擎drools封装
2019-03-07
电商财务结算系统重构实践
2019-03-07
大数据量业务报表实现思考
2019-03-07
跨进程调用实现之消息组件RabbitMq实例
2019-03-07
小谈mysql存储引擎优化
2019-03-07
java疫苗之殇?关于java类加载器的一些思考
2019-03-07
Java正则表达式简单介绍
2019-03-07
数据库连接池原理
2019-03-07
预防缓存穿透方案设计
2019-03-07
浅谈软件工程中的代码评审
2019-03-07
日常工作中数据特征引发的慢查询
2019-03-07
Vue前端测试实践
2019-03-07
财务系统库存重构现有量方案追忆
2019-03-07
一致性算法Raft的原理简介与源码初探
2019-03-07
关于mysql事务&MVCC以及锁机制的总结
2019-03-07
equals和==
2019-03-07
JVM、JRE、JDK、Java SE、Java EE、Java ME
2019-03-07