// PE.cpp : 定义控制台应用程序的入口点。
//DOS版PE工具制作 #include "stdafx.h"
#include <windows.h>
#include <winnt.h> int filelength(FILE *fp);
int _tmain(int argc, _TCHAR* argv[])
{
FILE *Fp;
int FpSize = 0;
short e_lfanew = 0;
fopen_s(&Fp, "C:\\Users\\Administrator\\Desktop\\MSG.exe", "rb");
FpSize = filelength(Fp);//获取文件大小
char * TempBuffer = (char *)malloc(FpSize);//申请存放文件的内存空间
if (TempBuffer == NULL)
{
fclose(Fp);
free(TempBuffer);
return 0;
}
fread_s(TempBuffer, FpSize + 1, 1, FpSize, Fp);//将文件读入内存中
TempBuffer = (char *)(TempBuffer + *(int *)(TempBuffer + 0x3c));//获取PE标志地址
PIMAGE_FILE_HEADER MyFileHeader;
printf("----------------------------------------------\n");
printf("PE标记:%08x\n", *(int *)TempBuffer);
printf("----------------------------------------------\n");
TempBuffer = TempBuffer + 0x4;//指针指向标准PE头首地址
MyFileHeader = (PIMAGE_FILE_HEADER)TempBuffer;
printf("IMAGE_FILE_HEADER结构:\n");
printf("----------------------------------------------\n");
printf("Machine : %04X\n", MyFileHeader->Machine);//运行平台
printf("NumberOfSections : %04X\n", MyFileHeader->NumberOfSections);//区块数目
printf("TimeDateStamp : %08X\n", MyFileHeader->TimeDateStamp);//文件日期时间戳
printf("PointerToSymbolTable : %08X\n", MyFileHeader->PointerToSymbolTable);//指向符号表
printf("NumberOfSymbols : %08X\n", MyFileHeader->NumberOfSymbols);//符号表中的符号数量
printf("SizeOfOptionalHeader : %04X\n", MyFileHeader->SizeOfOptionalHeader);//映像可选头结构的大小
printf("Characteristics : %04X\n", MyFileHeader->Characteristics);//文件特征值
printf("----------------------------------------------\n");
TempBuffer = TempBuffer + 0x14;//指针指向可选PE头首地址
PIMAGE_OPTIONAL_HEADER MyOptionalHeader;
MyOptionalHeader = (PIMAGE_OPTIONAL_HEADER)TempBuffer;
printf("IMAGE_OPTIONAL_HEADER结构:\n");
printf("----------------------------------------------\n");
printf("Magic : %04X\n", MyOptionalHeader->Magic);//幻数,32位pe文件总为010bh
printf("MajorLinkerVersion : %02X\n", MyOptionalHeader->MajorLinkerVersion);//连接器主版本号
printf("MinorLinkerVersion : %02X\n", MyOptionalHeader->MinorLinkerVersion);//连接器副版本号
printf("SizeOfCode : %08X\n", MyOptionalHeader->SizeOfCode);//代码段总大小
printf("SizeOfInitializedData : %08X\n", MyOptionalHeader->SizeOfInitializedData);//已初始化数据段总大小
printf("SizeOfUninitializedData : %08X\n", MyOptionalHeader->SizeOfUninitializedData);//未初始化数据段总大小
printf("AddressOfEntryPoint : %08X\n", MyOptionalHeader->AddressOfEntryPoint);//程序执行入口地址(RVA)
printf("BaseOfCode : %08X\n", MyOptionalHeader->BaseOfCode);//代码段起始地址(RVA)
printf("BaseOfData : %08X\n", MyOptionalHeader->BaseOfData);//数据段起始地址(RVA)
printf("ImageBase : %08X\n", MyOptionalHeader->ImageBase);//程序默认的装入起始地址
printf("SectionAlignment : %08X\n", MyOptionalHeader->SectionAlignment);//内存中区块的对齐单位
printf("FileAlignment : %08X\n", MyOptionalHeader->FileAlignment);//文件中区块的对齐单位
printf("MajorOperatingSystemVersion : %04X\n", MyOptionalHeader->MajorOperatingSystemVersion);//所需操作系统主版本号
printf("MinorOperatingSystemVersion : %04X\n", MyOptionalHeader->MinorOperatingSystemVersion);//所需操作系统副版本号
printf("MajorImageVersion : %04X\n", MyOptionalHeader->MajorImageVersion);//自定义主版本号
printf("MinorImageVersion : %04X\n", MyOptionalHeader->MinorImageVersion);//自定义副版本号
printf("MajorSubsystemVersion : %04X\n", MyOptionalHeader->MajorSubsystemVersion);//所需子系统主版本号
printf("MinorSubsystemVersion : %04X\n", MyOptionalHeader->MinorSubsystemVersion);//所需子系统副版本号
printf("Win32VersionValue : %08X\n", MyOptionalHeader->Win32VersionValue);//总是0
printf("SizeOfImage : %08X\n", MyOptionalHeader->SizeOfImage);//pe文件在内存中的映像总大小
printf("SizeOfHeaders : %08X\n", MyOptionalHeader->SizeOfHeaders);//从pe文件开始到节表(包含节表)的总大小
printf("CheckSum : %08X\n", MyOptionalHeader->CheckSum);//pe文件CRC校验和
printf("Subsystem : %04X\n", MyOptionalHeader->Subsystem);//用户界面使用的子系统类型
printf("DllCharacteristics : %04X\n", MyOptionalHeader->DllCharacteristics);//为0
printf("SizeOfStackReserve : %08X\n", MyOptionalHeader->SizeOfStackReserve);//为线程的栈初始保留的虚拟内存的默认值
printf("SizeOfStackCommit : %08X\n", MyOptionalHeader->SizeOfStackCommit);//为线程的栈初始提交的虚拟内存的大小
printf("SizeOfHeapReserve : %08X\n", MyOptionalHeader->SizeOfHeapReserve);//为进程的堆保留的虚拟内存的大小
printf("SizeOfHeapCommit : %08X\n", MyOptionalHeader->SizeOfHeapCommit);//为进程的堆初始提交的虚拟内存的大小
printf("LoaderFlags : %08X\n", MyOptionalHeader->LoaderFlags);//为0
printf("NumberOfRvaAndSizes : %08X\n", MyOptionalHeader->NumberOfRvaAndSizes);//数据目录结构数组的项数,总为 00000010h
TempBuffer = TempBuffer + MyFileHeader->SizeOfOptionalHeader;//指针指向区块首地址
printf("----------------------------------------------\n");
printf("节表信息:\n");
printf("----------------------------------------------\n");
PIMAGE_SECTION_HEADER MySectionHeader;
MySectionHeader = (PIMAGE_SECTION_HEADER)TempBuffer;
for (int i = 0; i < MyFileHeader->NumberOfSections; i++)
{
printf("Name : %s\n", MySectionHeader->Name);//区块名字
printf("Misc : %08X\n", MySectionHeader->Misc);//在没有对齐前的真实大小
printf("VirtualAddress : %08X\n", MySectionHeader->VirtualAddress);//节区在内存中的偏移地址
printf("SizeOfRawData : %08X\n", MySectionHeader->SizeOfRawData);//节在文件中对齐后的大小
printf("PointerToRawData : %08X\n", MySectionHeader->PointerToRawData);//节区在文件中的偏移
printf("PointerToRelocations : %08X\n", MySectionHeader->PointerToRelocations);//在OBJ文件中使用 无意义
printf("PointerToLinenumbers : %08X\n", MySectionHeader->PointerToLinenumbers);//行号表的位置 调试的时候用
printf("NumberOfRelocations : %04X\n", MySectionHeader->NumberOfRelocations);//在OBJ文件中使用 对EXE无意义
printf("NumberOfLinenumbers : %04X\n", MySectionHeader->NumberOfLinenumbers);//行号表中行号的数量 调试的时候用
printf("Characteristics : %08X\n", MySectionHeader->Characteristics);//节的属性
printf("----------------------------------------------\n");
MySectionHeader++;
} fclose(Fp);
getchar();
free(TempBuffer);
return 0;
}
//获取文件大小 int filelength(FILE *fp)
{
int num;
fseek(fp, 0, SEEK_END);
num = ftell(fp);
fseek(fp, 0, SEEK_SET);
return num; }

DOS版PE工具制作的更多相关文章

  1. Ubuntu Builder —— 一个制作自己的发行版的工具

    Ubuntu Builder 是一个使用起来很简单的用来构建基于 Ubunut 的自己的发行版的工具. 你可以下载最新的 Ubuntu Builder 的 DEB 安装包.下载和安装请前往:http: ...

  2. PE工具

    PE编辑工具 Stud_PE v. 2.4.0.1 PE工具,用来学习PE格式十分方便. http://www.cgsoftlabs.ro/ 汉化版:http://bbs.pediy.com/show ...

  3. 怎样用通用pe工具箱制作U盘启动盘

    U盘启动盘制作过程,随着网络的普及,电脑已经成为我们日常生活中的重要一环,最近自己重装了下电脑系统,无意中发现一个傻瓜式的U盘装系统方法,就把怎么制作通用pe工具箱u盘启动盘的经验拿出来跟大家分享下. ...

  4. 如何让你的手机U盘集PE工具、系统安装、无线破解等众多功能于一身

    不久前,手里的U盘坏了,于是乎,又在网上淘了一个Type-C U盘,刚好手机电脑都可以用. 那么现在U有了,我们要做什么呢? 第一:让U盘插在手机上时,可以供手机读写,实现手机存储扩容,随插随用,简单 ...

  5. PE工具列表(看雪学院)

    PE编辑工具 Stud_PE v. 2.6.0.5 Stud_PE v.2.6.1.0 (2.61汉化版)   PE工具,用来学习PE格式十分方便. LordPE DLX增强版(2008.5.31) ...

  6. 使用MBROSTool 工具制作本地硬盘F3救急模式的方法总结

    前面写了一篇使用MBROSTool 工具制作本地硬盘多启动盘的方法总结.里面就是可以把一些系统安装到硬盘上面方便使用,比如安装PE到硬盘,不过启动的时候会先进入多UDm菜单,然后选择[启动本地系统]后 ...

  7. 使用MBROSTool 工具制作U盘多启动盘的方法总结

    前段时间写了一个自用五合一多启动盘分享--分别用来维护娱乐,wifi密码破解,win&mac登陆密码绕过/清除,反馈的同学还是挺多,觉得大家都有这方面的需求,于是再把自己的使用经验总结一下. ...

  8. 使用MBROSTool 工具制作本地硬盘多启动盘的方法总结

    前段时间写了一个自用五合一多启动盘分享--分别用来维护娱乐,wifi密码破解,win&mac登陆密码绕过/清除,反馈的同学还是挺多,觉得大家都有这方面的需求,于是再把自己的使用经验总结一下. ...

  9. Windows PE 工具

    通过大白菜.老毛桃等装机软件,然后制作 U 盘启动工具, 1. 什么是 windows pe 工具 PE(Preinstall Environment),Win pe 全称 Windows Prein ...

随机推荐

  1. 【Java集合源码剖析】Java集合框架

    Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭 ...

  2. 用 Flask 来写个轻博客

    用 Flask 来写个轻博客 用 Flask 来写个轻博客 (1) — 创建项目 用 Flask 来写个轻博客 (2) — Hello World! 用 Flask 来写个轻博客 (3) — (M)V ...

  3. 站在C#和JS的角度细谈函数式编程与闭包

    1.函数式编程是什么? 摘自百度的说法是.函数式编程是种编程典范,它将电脑运算视为函数的计算.函数编程语言最重要的基础是 λ 演算(lambda calculus).而且λ演算的函数可以接受函数当作输 ...

  4. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目11

    2014-03-21 20:20 题目:给定一个只包含‘0’.‘1’.‘|’.‘&’.‘^’的布尔表达式,和一个期望的结果(0或者1).如果允许你用自由地给这个表达式加括号来控制运算的顺序,问 ...

  5. Spring Web MVC 笔记

    Spring Web MVC 流程 Dispatcher Servlet 这是一个前端分派 Servlet(前端控制器模式),外部所有的请求都会先到达这里,然后由其将请求分派给其他组件进行实际的处理. ...

  6. Linux运维文档之nginx

    NGINX安装配置1.检查并且安装依赖组件检查安装nginx的依赖性,nginx的模块需要第三方库的支持,检查是否安装下列库:zlib.zlib-devel.openssl.openssl-devel ...

  7. Ddos攻击防护

    Ddos攻击防护 首先我们说说ddos攻击方式,记住一句话,这是一个世界级的难题并没有解决办法只能缓解 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要 ...

  8. 2017 多校5 Rikka with String

    2017 多校5 Rikka with String(ac自动机+dp) 题意: Yuta has \(n\) \(01\) strings \(s_i\), and he wants to know ...

  9. OAuth2.0 用户验证授权标准 理解

    OAuth2.0是一套标准. 一.问题 这个标准解决了这样的一个问题. 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.  ...

  10. POJ -1679(次小生成树)模板

    The Unique MST Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:34617   Accepted: 12637 D ...