#include "stdafx.h"

#include "PEFuncs.h"

#include

//需要引入如下.lib文件

//#pragma comment (lib, "imagehlp.lib")

//或者在Project->XXXX

properties->Linker->Additional

Dependencies中添加.lib文件,为VS2008的方式。

BOOL LoadFileR(CString lpFileName, PMAP_FILE_STRUCT

pstMapFile)

{

HANDLE hFile;

HANDLE hMapping;

LPVOID ImageBase;

memset(pstMapFile, 0, sizeof(MAP_FILE_STRUCT));

hFile = CreateFile(lpFileName, GENERIC_READ,

FILE_SHARE_READ,NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

if (!hFile)

return FALSE;

hMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0,

NULL);

if(!hMapping)

{

CloseHandle(hFile);

return FALSE;

}

ImageBase = MapViewOfFile(hMapping, FILE_MAP_READ, 0, 0,

0);

if(!ImageBase)

{

CloseHandle(hMapping);

CloseHandle(hFile);

return FALSE;

}

pstMapFile->hFile = hFile;

pstMapFile->hMapping = hMapping;

pstMapFile->ImageBase = ImageBase;

return TRUE;

}

void UnLoadFile(PMAP_FILE_STRUCT pstMapFile)

{

if (pstMapFile->ImageBase)

UnmapViewOfFile(pstMapFile->ImageBase);

if (pstMapFile->hMapping)

CloseHandle(pstMapFile->hMapping);

if (pstMapFile->hFile)

CloseHandle(pstMapFile->hFile);

}

//判断是否为PE文件

BOOL IsPEFile(LPVOID ImageBase)

{

PIMAGE_DOS_HEADER pDH = NULL;

PIMAGE_NT_HEADERS pNtH = NULL;

if (!ImageBase)

{

return FALSE;

}

pDH = (PIMAGE_DOS_HEADER)ImageBase;

if (pDH->e_magic != IMAGE_DOS_SIGNATURE)

{

return FALSE; //IMAGE_DOS_SIGNATURE为"MZ"

}

pNtH = (PIMAGE_NT_HEADERS32)((DWORD)pDH +

pDH->e_lfanew);

if (pNtH->Signature !=

IMAGE_NT_SIGNATURE)

{

return FALSE; //IMAGE_NT_SIGNATURE为"PE00"

}

return TRUE;

}

//获得NTHeaders,IMAGE_NT_HEADERS,然后获得IMAGE_FILE_HEADER和IMAGE_OPTIONAL_HEADER32

PIMAGE_NT_HEADERS GetNTHeaders(LPVOID ImageBase)

{

if (!IsPEFile(ImageBase))

{

return NULL;

}

PIMAGE_NT_HEADERS pNtH;

PIMAGE_DOS_HEADER pDH;

pDH = (PIMAGE_DOS_HEADER)ImageBase;

pNtH = (PIMAGE_NT_HEADERS)((DWORD)pDH +

pDH->e_lfanew);

//pDH->e_lfanew,获得PE头的文件偏移地址

return pNtH;

}

//获得IMAGE_FILE_HEADER

PIMAGE_FILE_HEADER GetFileHeader(LPVOID ImageBase)

{

PIMAGE_DOS_HEADER pDH = NULL;

PIMAGE_NT_HEADERS pNtH = NULL;

PIMAGE_FILE_HEADER pFH = NULL;

if (!IsPEFile(ImageBase))

{

return NULL;

}

pDH = (PIMAGE_DOS_HEADER)ImageBase;

pNtH = (PIMAGE_NT_HEADERS)((DWORD)pDH +

pDH->e_lfanew);

pFH = &pNtH->FileHeader;

return pFH;

}

PIMAGE_OPTIONAL_HEADER GetOptionalHeader(LPVOID

ImageBase)

{

PIMAGE_DOS_HEADER pDH = NULL;

PIMAGE_NT_HEADERS pNtH = NULL;

PIMAGE_OPTIONAL_HEADER pOH = NULL;

if (!IsPEFile(ImageBase))

{

return NULL;

}

pDH = (PIMAGE_DOS_HEADER)ImageBase;

pNtH = (PIMAGE_NT_HEADERS)((DWORD)pDH +

pDH->e_lfanew);

pOH =

&pNtH->OptionalHeader;

return pOH;

}

PIMAGE_SECTION_HEADER GetFirstSectionHeader(LPVOID

ImageBase)

{

PIMAGE_NT_HEADERS pNtH = NULL;

PIMAGE_SECTION_HEADER pSH =NULL;

pNtH = GetNTHeaders(ImageBase);

pSH = IMAGE_FIRST_SECTION(pNtH);

return pSH;

}

LPVOID RvaToPtr(PIMAGE_NT_HEADERS pNtH,LPVOID ImageBase,DWORD

dwRVA)

{

return ImageRvaToVa(pNtH,ImageBase,dwRVA,NULL);

}

LPVOID GetDirectoryEntryToData(LPVOID ImageBase, USHORT

DirectoryEntry)

{

DWORD dwDataStartRVA;

LPVOID pDirData = NULL;

PIMAGE_NT_HEADERS pNtH = NULL;

PIMAGE_OPTIONAL_HEADER  pOH = NULL;

pNtH = GetNTHeaders(ImageBase);

if (!pNtH)

{

return NULL;

}

pOH = GetOptionalHeader(ImageBase);

if (!pOH)

{

return NULL;

}

dwDataStartRVA =

pOH->DataDirectory[DirectoryEntry].VirtualAddress;

if (!dwDataStartRVA)

{

return NULL;

}

pDirData = RvaToPtr(pNtH, ImageBase, dwDataStartRVA);

if (!pDirData)

{

return NULL;

}

return pDirData;

}

PIMAGE_EXPORT_DIRECTORY GetExportDirectory(LPVOID

ImageBase)

{

PIMAGE_EXPORT_DIRECTORY pExportDir = NULL;

pExportDir =

(PIMAGE_EXPORT_DIRECTORY)GetDirectoryEntryToData(ImageBase,

IMAGE_DIRECTORY_ENTRY_EXPORT);

if (!pExportDir)

{

return NULL;

}

return pExportDir;

}

PIMAGE_IMPORT_DESCRIPTOR GetFirstImportDesc(LPVOID

ImageBase)

{

PIMAGE_IMPORT_DESCRIPTOR pImportDesc;

pImportDesc =

(PIMAGE_IMPORT_DESCRIPTOR)GetDirectoryEntryToData(ImageBase,

IMAGE_DIRECTORY_ENTRY_IMPORT);

if (!pImportDesc)

{

return NULL;

}

return pImportDesc;

}

DWORD GetNumOfExportFuncs(LPVOID ImageBase,

PIMAGE_EXPORT_DIRECTORY pExportDir)

{

DWORD dwnum = 0;

PDWORD pdwRvas = NULL;

PIMAGE_NT_HEADERS pNtH = GetNTHeaders(ImageBase);

pdwRvas = (PDWORD)RvaToPtr (pNtH, ImageBase,

pExportDir->AddressOfFunctions);

for(DWORD i = 0; i <

pExportDir->NumberOfFunctions; i++)

{

if (*pdwRvas)

{

++dwnum;

}

++pdwRvas;

}

return dwnum;

}

BOOL IsDataDirPresent(LPVOID ImageBase, USHORT

DirectoryEntry)

{

if (!GetDirectoryEntryToData(ImageBase, DirectoryEntry))

{

return FALSE;

}

return TRUE;

}

c语言读取exe的pe标记,PE文件信息读取程序(1.关键函数部分)相关推荐

  1. C语言编程>第二十二周 ③ 下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值:

    例题:下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值: 例如,若n=1000,则应输出0.000155. 注意:不要改动main函数,不能增行或删行,也不能更改程序的结构. 代码 ...

  2. 练习:【三国游戏文件信息读取分类、键盘录入学生信息写入文件、 GBK与UTF-8文件内容互相转换】

    练习:[三国游戏文件信息读取分类.键盘录入学生信息写入文件. GBK与UTF-8文件内容互相转换] 三国游戏文件信息读取分类 txt文件信息 1 阿会喃 云南 男 190 225 74 2 伊籍 江陵 ...

  3. Visual C++网络编程经典案例详解 第9章 实用播放器 数据读取与播放控制 识别数据文件信息

    识别数据文件信息主要是指对mp3数据格式识别 定义顺序代码如下 typedef struct mp3_struct //自定义mp3结构体 {char heade[3]; //tag字符标记char ...

  4. matlab读取表格读成mat文件,MATLAB 视频读取 Excel读写 Excel2txt txt2mat 按文件夹读取文件...

    视频转图片,图片取大小 clc;clear; obj=VideoReader('双闪.avi'); numFrames = obj.NumberOfFrames;% 帧的总数 for i=1:numF ...

  5. android的读取xml配置文件,android中XMl文件的读取

    废话不多说了直接上代码: 新建一个Xml文件用于读取: test.xml java Eclipse Swift Xcode C# Visual Studio 后台: import android.su ...

  6. 从文件中读取一个long型数_Python 从文件中读取数据

    问题:在python中如何从文件中读取数据,比如有一个mydata.txt文件包含10000行,50列的数据,想提取某几列出来,比如1, 3,5列. 方法一,编一个读取数据的函数. import js ...

  7. mysql读取工具下载_百度云文件数据库读取工具

    百度云文件数据库读取工具是网络共享频道下深受用户喜爱的软件,太平洋下载中心提供百度云文件数据库读取工具官方下载. 百度云文件数据库读取工具免费版是一款相当实用的百度云文件数据库管理工具,百度云文件数据 ...

  8. python提高文件读取速度_Python提高了HDF5文件的读取速度

    我正在构建一个存储财务数据的数据库(特别是选项链) . 我每天检索每个交易日的数据,即5d /周或250d /年 . 我这样做了300个代码,数据库正在以150Mb /天的速度增长,到目前为止达到了9 ...

  9. jmeter单线程读取csv_jmeter中如何使用csv文件并读取数据

    我现在要测试一个新的网站,需要负载测试这个功能"加入购物车".要做到 这一点,我需要模拟多个用户登录并进行购物操作,具体的场景为每一个人将同样的物品加入到购物车. JMeter 处 ...

最新文章

  1. 在GridView里使用上下箭头(小键盘旁边)来选择记录
  2. lora近几年发展的具体介绍
  3. 【转】Android 如何获取SDCard 内存(二)
  4. 烟台市与拼多多达成战略合作 启动烟台优品线上云购节活动
  5. MySQL-02-windows下查看frm,myi,myd
  6. Spring学习总结(17)——Spring AOP权限管理
  7. code第一部分数组:第十七题 爬楼梯问题
  8. 485. 最大连续 1 的个数
  9. 是男人就下100层【第二层】——帮美女更衣(1)
  10. mappedBy reference an unknown target entity property解决方法
  11. android 数字 余额宝,仿余额宝数字滚动增长的效果实现
  12. 点击给导航条加背景颜色
  13. 支付宝转账提现相关问题
  14. 以下选项属于python哲学内容的是_[南开大学]18秋学期(清考)《哲学与人生》在线作业...
  15. 著书立说,就现在——IT东方会T-Book出书专场第二期圆满举办
  16. 【U3D日记-2016年10月28日】float转int 误差!
  17. Oracle 正则表达式详解(regexp_substr、regexp_instr、regexp_replace、regexp_like)
  18. vue.js json_带有Vue.js的JSON编辑器
  19. 多线程---线程池的使用
  20. Maven依赖中scope的runtime和provied的区别

热门文章

  1. [你必须知道的.NET]第一回:恩怨情仇:is和as
  2. Linux安装Apache报错:Cannot find a valid baseurl for repo: base/7/x86_64解决方案
  3. caffe中在某一层获得迭代次数的方法以及caffe编译时报错 error: ‘to_string‘ is not a member of ‘std‘解决方法
  4. JAVA大文件上传断点续传解决方案
  5. 在vuejs 中使用axios不能获取属性data的解决方法
  6. ssh 免密码登录(设置后仍需输密码的原因及解决方法)
  7. c3p0数据源配置抛出Could not load driverClass com.mysql.jdbc.Driver的解决方案
  8. 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
  9. 如何使用jQuery检查单选按钮?
  10. 如何在Git历史记录中grep(搜索)已提交的代码