仿LordPE获取PE结构
乍一看LordPE一个小工具一般般,真的动手做起来才知道技术含量高的很。
当前只是获取到PE结构并打印,仅此而已。
PE.h
#pragma once
#include <stdio.h>
#include <stdarg.h> #include <Windows.h>
#include <time.h> HANDLE m_hFile = NULL; // 文件句柄
HANDLE m_hMap = NULL; // 文件映射句柄
LPVOID m_lpBase = NULL; // 映射基址
DWORD m_dwLen = ; // 文件数据大小
IMAGE_DOS_HEADER *m_pDosHeader = NULL; // Dos头
IMAGE_NT_HEADERS *m_pNtHeaders = NULL; // NT头
IMAGE_SECTION_HEADER *m_pSecHeader = NULL; /*
读取PE磁盘文件
fileUrl:文件路径
lpSaveData:保存数据的指针
成功返回数据大小,失败返回0.
*/
DWORD ReadPeFile(char *fileUrl, LPVOID lpSaveData); VOID DestroryFunc(void);
PE.cpp
#include "PE.h" DWORD ReadPeFile(char *fileUrl, LPVOID lpSaveData)
{
m_hFile = CreateFile(fileUrl, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
printf("[ReadPeFile]:Can't open file!\n");
return ;
}
m_hMap = CreateFileMapping(m_hFile, NULL, PAGE_READWRITE | SEC_IMAGE, , , );
if (!m_hMap)
{
printf("[ReadPeFile]:Can't create filemap!\n");
return ;
}
m_lpBase = MapViewOfFile(m_hMap, FILE_MAP_READ | FILE_MAP_WRITE, , , );
if (!m_lpBase)
{
printf("[ReadPeFile]:MapViewOfFile bad!\n");
return ;
}
m_dwLen = GetFileSize(m_hFile, &m_dwLen);
m_pDosHeader = (PIMAGE_DOS_HEADER)m_lpBase;
if (m_pDosHeader->e_magic != IMAGE_DOS_SIGNATURE)
{
printf("[ReadPeFile]:Not is pe file!\n");
return ;
}
m_pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)m_lpBase + m_pDosHeader->e_lfanew);
if (m_pNtHeaders->Signature != IMAGE_NT_SIGNATURE)
{
printf("[ReadPeFile]:Not is execut programmer!\n");
return ;
}
m_pSecHeader = (PIMAGE_SECTION_HEADER)((DWORD)&(m_pNtHeaders->OptionalHeader) + m_pNtHeaders->FileHeader.SizeOfOptionalHeader);
return m_dwLen;
} VOID DestroryFunc(void)
{
CloseHandle(m_hMap);
CloseHandle(m_hFile);
UnmapViewOfFile(m_lpBase);
} LPCSTR _getMachineName(WORD wMachine)
{
char *name = (char *)malloc(); switch (wMachine)
{
case :
lstrcpy(name, "Unknown");
break;
case 0x14c:
lstrcpy(name, "Intel 386");
break;
case 0x0162:
lstrcpy(name, "MIPS little-endian, 0x160 big-endian");
break;
case 0x0166:
lstrcpy(name, "MIPS little-endian");
break;
case 0x0168:
lstrcpy(name, "MIPS little-endian");
break;
case 0x0169:
lstrcpy(name, "MIPS little-endian WCE v2");
break;
case 0x0184:
lstrcpy(name, "Alpha_AXP");
break;
case 0x01a2:
lstrcpy(name, "SH3 little-endian");
break;
case 0x01a4:
lstrcpy(name, "SH3E little-endian");
break;
case 0x01a6:
lstrcpy(name, "SH4 little-endian");
break;
case 0x01a8:
lstrcpy(name, "SH5");
break;
case 0x01c0:
lstrcpy(name, "ARM Little-Endian");
break;
case 0x01c2:
lstrcpy(name, "ARM Thumb/Thumb-2 Little-Endian");
break;
case 0x01c4:
lstrcpy(name, "ARM Thumb-2 Little-Endian");
break;
case 0x01F0:
lstrcpy(name, "IBM PowerPC Little-Endian");
break;
case 0x0200:
lstrcpy(name, "Intel 64");
break;
case 0x0266:
lstrcpy(name, "MIPS");
break;
case 0x0284:
lstrcpy(name, "ALPHA64");
break;
case 0x0366:
lstrcpy(name, "MIPS");
break;
case 0x0466:
lstrcpy(name, "MIPS");
break;
case 0x0520:
lstrcpy(name, "Infineon");
break;
case 0x0EBC:
lstrcpy(name, "EFI Byte Code");
break;
case 0x8664:
lstrcpy(name, "AMD64 (K8)");
break;
case 0x9041:
lstrcpy(name, "M32R little-endian");
break;
default:
free(name);
return NULL;
break;
}
return name;
} VOID _printFormat(char *dataName, WORD *dataAddr, int nSize)
{
printf("\t%s:", dataName);
for (int i = ; i < (int)( - strlen(dataName)); i++)
{
printf(" ");
}
printf("0x");
for (int i = ; i < nSize; i++)
{
printf("%04X", dataAddr[i]);
}
printf("\n");
} VOID test_PrintPeInfo(void)
{
char infoTmp[] = { }; printf("->DOS Header\n");
_printFormat("e_magic", &m_pDosHeader->e_magic, );
_printFormat("e_cblp", &m_pDosHeader->e_cblp, );
_printFormat("e_cp", &m_pDosHeader->e_cp, );
_printFormat("e_crlc", &m_pDosHeader->e_crlc, );
_printFormat("e_cparhdr", &m_pDosHeader->e_cparhdr, );
_printFormat("e_minalloc", &m_pDosHeader->e_minalloc, );
_printFormat("e_maxalloc", &m_pDosHeader->e_maxalloc, );
_printFormat("e_ss", &m_pDosHeader->e_ss, );
_printFormat("e_sp", &m_pDosHeader->e_sp, );
_printFormat("e_csum", &m_pDosHeader->e_csum, );
_printFormat("e_ip", &m_pDosHeader->e_ip, );
_printFormat("e_cs", &m_pDosHeader->e_cs, );
_printFormat("e_lfarlc", &m_pDosHeader->e_lfarlc, );
_printFormat("e_ovno", &m_pDosHeader->e_ovno, );
_printFormat("e_res", m_pDosHeader->e_res, );
_printFormat("e_oeminfo", &m_pDosHeader->e_oemid, );
_printFormat("e_oeminfo", &m_pDosHeader->e_oeminfo, );
_printFormat("e_res2", m_pDosHeader->e_res2, );
printf("\te_lfanew: 0x%08X\n\n", m_pDosHeader->e_lfanew); printf("->File Header\n");
printf("\tMachine: 0x%04X (%s)\n", m_pNtHeaders->FileHeader.Machine,_getMachineName(m_pNtHeaders->FileHeader.Machine));
printf("\tNumberOfSections: 0x%04X\n", m_pNtHeaders->FileHeader.NumberOfSections);
struct tm Tm = { };
gmtime_s(&Tm, (time_t *)&(m_pNtHeaders->FileHeader.TimeDateStamp));
printf("\tTimeDateStamp: 0x%04X (%d/%d/%d %d:%d:%d)\n", m_pNtHeaders->FileHeader.TimeDateStamp, Tm.tm_year + , Tm.tm_mon + , Tm.tm_mday, Tm.tm_hour, Tm.tm_min, Tm.tm_sec);
printf("\tPointerToSymbolTable: 0x%04X\n", m_pNtHeaders->FileHeader.PointerToSymbolTable);
printf("\tNumberOfSymbols: 0x%04X\n", m_pNtHeaders->FileHeader.NumberOfSymbols);
printf("\tSizeOfOptionalHeader: 0x%04X\n", m_pNtHeaders->FileHeader.SizeOfOptionalHeader);
printf("\tCharacteristics: 0x%04X\n\n", m_pNtHeaders->FileHeader.Characteristics); printf("->Optional Header\n");
printf("\tMagic: 0x%04X",m_pNtHeaders->OptionalHeader.Magic);
switch (m_pNtHeaders->OptionalHeader.Magic)
{
case IMAGE_NT_OPTIONAL_HDR32_MAGIC:
printf(" (HDR32_MAGIC)\n");
break;
case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
printf(" (HDR64_MAGIC)\n");
break;
case IMAGE_ROM_OPTIONAL_HDR_MAGIC:
printf(" (ROM_MAGIC)\n");
break;
default:
printf(" (Unknown)\n");
break;
}
printf("\tMajorLinkerVersion: 0x%02X\n", m_pNtHeaders->OptionalHeader.MajorLinkerVersion);
printf("\tMinorLinkerVersion: 0x%02X -> %d.%02d\n", m_pNtHeaders->OptionalHeader.MinorLinkerVersion,m_pNtHeaders->OptionalHeader.MajorLinkerVersion,m_pNtHeaders->OptionalHeader.MinorLinkerVersion);
printf("\tSizeOfCode: 0x%08X\n", m_pNtHeaders->OptionalHeader.SizeOfCode);
printf("\tSizeOfInitializedData: 0x%08X\n", m_pNtHeaders->OptionalHeader.SizeOfInitializedData);
printf("\tSizeOfUninitializedData: 0x%08X\n", m_pNtHeaders->OptionalHeader.SizeOfUninitializedData);
printf("\tAddressOfEntryPoint: 0x%08X\n", m_pNtHeaders->OptionalHeader.AddressOfEntryPoint);
printf("\tBaseOfCode: 0x%08X\n", m_pNtHeaders->OptionalHeader.BaseOfCode);
printf("\tBaseOfData: 0x%08X\n", m_pNtHeaders->OptionalHeader.BaseOfData);
printf("\tImageBase: 0x%08X\n", m_pNtHeaders->OptionalHeader.ImageBase);
printf("\tSectionAlignment: 0x%08X\n", m_pNtHeaders->OptionalHeader.SectionAlignment);
printf("\tFileAlignment: 0x%08X\n", m_pNtHeaders->OptionalHeader.FileAlignment);
printf("\tMajorOperatingSystemVersion: 0x%08X\n", m_pNtHeaders->OptionalHeader.MajorOperatingSystemVersion);
printf("\tMinorOperatingSystemVersion: 0x%08X -> %d.%02d\n", m_pNtHeaders->OptionalHeader.MinorOperatingSystemVersion, m_pNtHeaders->OptionalHeader.MajorOperatingSystemVersion, m_pNtHeaders->OptionalHeader.MinorOperatingSystemVersion);
printf("\tMajorImageVersion: 0x%08X\n", m_pNtHeaders->OptionalHeader.MajorImageVersion);
printf("\tMinorImageVersion: 0x%08X -> %d.%02d\n", m_pNtHeaders->OptionalHeader.MinorImageVersion, m_pNtHeaders->OptionalHeader.MajorImageVersion, m_pNtHeaders->OptionalHeader.MinorImageVersion);
printf("\tMajorSubsystemVersion: 0x%08X\n", m_pNtHeaders->OptionalHeader.MajorSubsystemVersion);
printf("\tMinorSubsystemVersion: 0x%08X -> %d.%02d\n", m_pNtHeaders->OptionalHeader.MinorSubsystemVersion, m_pNtHeaders->OptionalHeader.MajorSubsystemVersion, m_pNtHeaders->OptionalHeader.MinorSubsystemVersion);
printf("\tWin32VersionValue: 0x%08X\n", m_pNtHeaders->OptionalHeader.Win32VersionValue);
printf("\tSizeOfImage: 0x%08X\n", m_pNtHeaders->OptionalHeader.SizeOfImage);
printf("\tSizeOfHeaders: 0x%08X\n", m_pNtHeaders->OptionalHeader.SizeOfHeaders);
printf("\tCheckSum: 0x%08X\n", m_pNtHeaders->OptionalHeader.CheckSum);
printf("\tSubsystem: 0x%04X", m_pNtHeaders->OptionalHeader.Subsystem);
switch (m_pNtHeaders->OptionalHeader.Subsystem)
{
case IMAGE_SUBSYSTEM_UNKNOWN:
printf(" (Unknown)\n");
break;
case IMAGE_SUBSYSTEM_NATIVE:
printf(" (Driver And SysPro)\n");
break;
case IMAGE_SUBSYSTEM_WINDOWS_GUI:
printf(" (Windows_GUI)\n");
break;
case IMAGE_SUBSYSTEM_WINDOWS_CUI:
printf(" (Windows_CUI)\n");
break;
case IMAGE_SUBSYSTEM_OS2_CUI:
printf(" (OS/2_CUI)\n");
break;
case IMAGE_SUBSYSTEM_POSIX_CUI:
printf(" (POSIX_CUI)\n");
break;
case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
printf(" (WinCE_GUI)\n");
break;
case IMAGE_SUBSYSTEM_EFI_APPLICATION:
printf(" (EFI)\n");
break;
case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
printf(" (EFI_Driver)\n");
break;
case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
printf(" (EFI_Dirver Run-Time)\n");
break;
case IMAGE_SUBSYSTEM_EFI_ROM:
printf(" (EFI_ROM)\n");
break;
case IMAGE_SUBSYSTEM_XBOX:
printf(" (XBox)\n");
break;
case IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION:
printf(" (Boot Application)\n");
break;
default:
printf(" (Unknown!)");
break;
}
printf("\tDllCharacteristics: 0x%04X\n", m_pNtHeaders->OptionalHeader.DllCharacteristics);
printf("\tSizeOfStackReserve: 0x%08X\n", m_pNtHeaders->OptionalHeader.SizeOfStackReserve);
printf("\tSizeOfStackCommit: 0x%08X\n", m_pNtHeaders->OptionalHeader.SizeOfStackCommit);
printf("\tSizeOfHeapReserve: 0x%08X\n", m_pNtHeaders->OptionalHeader.SizeOfHeapReserve);
printf("\tLoaderFlags: 0x%08X\n", m_pNtHeaders->OptionalHeader.LoaderFlags);
printf("\tNumberOfRvaAndSizes: 0x%08X\n\n", m_pNtHeaders->OptionalHeader.NumberOfRvaAndSizes); printf("\tDataDirectory(16) RVA Size\n");
printf("\t----------------- ---------- ----------\n");
for (DWORD dwI = ; dwI < m_pNtHeaders->OptionalHeader.NumberOfRvaAndSizes; dwI++)
{
switch (dwI)
{
case :
printf("\t%-29s", "ExportTable");
break;
case :
printf("\t%-29s", "ImportTable");
break;
case :
printf("\t%-29s", "Resource");
break;
case :
printf("\t%-29s", "Exception");
break;
case :
printf("\t%-29s", "Security");
break;
case :
printf("\t%-29s", "Relocation");
break;
case :
printf("\t%-29s", "Debug");
break;
case :
printf("\t%-29s", "Copyright");
break;
case :
printf("\t%-29s", "GlobalPtr");
break;
case :
printf("\t%-29s", "TLSTable");
break;
case :
printf("\t%-29s", "LoadConfig");
break;
case :
printf("\t%-29s", "BoundImport");
break;
case :
printf("\t%-29s", "IAT");
break;
case :
printf("\t%-29s", "DelayImport");
break;
case :
printf("\t%-29s", "COM");
break;
case :
printf("\t%-29s", "Reserved");
break;
default:
printf("\t%-29s", "Unknown");
break;
}
printf("0x%08X 0x%08X", m_pNtHeaders->OptionalHeader.DataDirectory[dwI].VirtualAddress, m_pNtHeaders->OptionalHeader.DataDirectory[dwI].Size);
for (WORD wI = ; wI < m_pNtHeaders->FileHeader.NumberOfSections; wI++)
{
// 如果该数据目录的起始地址>某节起始地址 && 该数据目录的结束地址<某节结束地址,那么就说明该数据目录存在此节中.
if ((m_pSecHeader[wI].VirtualAddress <= m_pNtHeaders->OptionalHeader.DataDirectory[dwI].VirtualAddress) && ((m_pSecHeader[wI].VirtualAddress + m_pSecHeader[wI].Misc.VirtualSize) >= (m_pNtHeaders->OptionalHeader.DataDirectory[dwI].VirtualAddress + m_pNtHeaders->OptionalHeader.DataDirectory[dwI].Size)))
{
printf(" (\"%s\")", m_pSecHeader[wI].Name);
break;
}
}
printf("\n");
}
return;
} int main(void)
{ LPVOID lpData = NULL;
printf("Hello Pe!\n");
ReadPeFile("C:\\Users\\Hades\\Desktop\\测试程序.exe", lpData);
test_PrintPeInfo();
DestroryFunc();
system("pause");
return ;
}
效果图:

以后有机会我要一步步的仿造出LordPE的所有功能。
仿LordPE获取PE结构的更多相关文章
- 【PE结构】由浅入深PE基础学习-菜鸟手动查询导出表、相对虚拟地址(RVA)与文件偏移地址转换(FOA)
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解 ...
- 手写PE结构解析工具
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...
- 【转】pe结构详解
(一)基本概念 PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等, 事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是 ...
- 羽夏笔记——PE结构(不包含.Net)
写在前面 本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...
- 修改记事本PE结构弹计算器Shellcode
目录 修改记事本PE结构弹计算器Shellcode 0x00 前言 0x01 添加新节 修改节数量 节表位置 添加新节表信息 0x02 添加弹计算器Shellcode 修改代码 0x03 修改入口点 ...
- 羽夏壳世界—— PE 结构(上)
羽夏壳世界之 PE 结构(上),介绍难度较低的基本 PE 相关结构体.
- Greenplum获取表结构
最近在折腾greenplum,遇到一个蛋疼的问题,那就是获取表结构,也就是建表语句.大家都知道在MySQL里面是非常easy的,show create table table_name 就搞定了,在g ...
- Sql中获取表结构(字段名称,类型,长度,说明)
Sql中获取表结构(字段名称,类型,长度,说明) SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Descript ...
- PE结构学习笔记--关于AddressOfEntryPoint位置在文件中怎么确定问题
第一次学习PE结构,也不知道有没有更好的办法. 1.AddressOfEntryPoint 这个成员在OptionalHeader里面,OptionalHeader的类型是一个IMAGE_OPTION ...
随机推荐
- Thrift笔记(二)--Thrift框架分层设计
thrift架构设计使用了分层设计,类似TCP/IP分层,上次使用下层提供的服务.分层设计在计算机中是一个常用的设计,上层和下层定义好接口或者说协议,下层实现可以随意更换,只要实现好定义的接口和协议就 ...
- 2018.10.17NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...
- PHP time() date() strtotime()日期函数总结
日期函数总结—— 一.返回时间戳——若整体数值超出计算机能力范围,返回空. 1. time();返回当前的 Unix 时间戳 例:$a=time(); var_dump($a); //输出:int( ...
- SharePoint Server 2010的移动设备配置方案
随着微软全新一代办公系统Office 2010 的推出,其所支持的移动方案也日渐受到人们的关注,而这些移动功能则是依赖于 SharePoint 2010 的移动性支持.下面就将大家介绍如何设置 Sha ...
- solidity语言2
变量类型(Value Types) # 布尔型 关键字 bool 值 true , false 操作符 !, &&, ||, ==, != # 整型 关键字 int(int256), ...
- 从java9开始就不再提供32位jdk
- IIS中X509Certificate遇见的问题
由于开发过程中需要用到证书,所以通过调用 X509Certificate2 访问p12文件. 代码开发完成后,在本地VS上测试通过,本地IIS上测试通过,发布到线上服务器IIS后不通过:提示找不到文件 ...
- MFC 鼠标事件
1. 新建项目 项目名称:MFCBaseMessage 2. 选择基本对话框模式,如图 ,点击完成3. 最终如图 4.右键添加类向导 5.添加鼠标事件 6.在ON_LButtonDown添加如下代 ...
- poj 1753、2965枚举
1753题目链接 题目大意: 一个4乘4的棋盘,上面放满了正反两面分别为黑和白的棋子,翻转一个棋子会让这个棋子上下左右的棋子也翻转,给定一个初始状态,求使所有棋子颜色相同所需的最少翻转次数. 解题思路 ...
- 从产品展示页面谈谈Hybris的特有概念和设计结构
今天这篇文章来自我的同事,SAP成都研究院Hybris开发团队的开发人员Zhang Jonathan(张健).需要特别介绍的是,张健和成都研究院的其他开发同事不同,张健毕业于电子科技大学,读的专业是英 ...