滴水 10/13号完成 打印出DOS PE头 节表 开源
#include<stdio.h>
#include<Windows.h>
int szie2;
#pragma warning(disable : 4996)
LPVOID readpe(char const* lp)//这里是传入的文件路径)
{
//文件打开的返回值
FILE* file = NULL; //取得开辟文件的大小,用于malloc
DWORD size = 0; /// pfilebufff取的malloc返回值开辟位置的地址
LPVOID pfilebuffer = NULL; file=fopen(lp,"rb");
if (!file) { printf("文件读取失败");
return NULL;
} //函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。
//在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
fseek(file, 0, SEEK_END);
size = ftell(file);
fseek(file, 0, SEEK_SET);
size2=size;
pfilebuffer = malloc(size);
if (!pfilebuffer) {
printf("分配空间失败");
fclose(file);
return NULL;
}
//将文件数据读取到缓冲区
size_t n = fread(pfilebuffer, size,1, file);
if (!n) {
printf("数据读取失败");
free(pfilebuffer);
fclose(file);
return NULL;
}
printf("%d\n", n);
//关闭文件
fclose(file);
return pfilebuffer;
}
//给这个程序一片内存运行 这个内存存储在pfilebuffer void pe()
{
char filePath[] = "D:\\测试程序.exe";
LPVOID pfilebuffer = NULL;
PIMAGE_DOS_HEADER dosHeader = NULL;
pfilebuffer = readpe(filePath);
if (!pfilebuffer) {
printf("文件读取失败");
} //判断是不是mz标志
if (*((PWORD)pfilebuffer) != IMAGE_DOS_SIGNATURE)
{
printf("不是有效MZ标志");
free(pfilebuffer);
return;
} printf("%x\n", *((PWORD)pfilebuffer)); dosHeader = (PIMAGE_DOS_HEADER)pfilebuffer;
printf("%x", dosHeader);
;
//打印DOC头
printf("********************DOC头********************\n");
printf("MZ标志:%x\n", dosHeader->e_magic);
printf("MZ标志:%x\n", dosHeader->e_cp); printf("PE偏移:%x\n", dosHeader->e_lfanew);
//判断是否是有效的PE标志
if (*((PDWORD)((DWORD)pfilebuffer + dosHeader->e_lfanew)) != IMAGE_NT_SIGNATURE)
{
printf("不是有效的PE标志\n");
free(pfilebuffer);
return;
} PIMAGE_NT_HEADERS pntheader = NULL;
pntheader = (PIMAGE_NT_HEADERS)((DWORD)pfilebuffer + dosHeader->e_lfanew); printf("********************NT头********************\n");
printf("MZ标志:%x\n", pntheader->Signature); PIMAGE_FILE_HEADER peheader = NULL;
peheader = (PIMAGE_FILE_HEADER)(((DWORD)pntheader) + 4);
printf("********************PE头********************\n");
printf("PE标志 MACHINE:%x\n", peheader->Machine);
printf("PE标志 MACHINE:%x\n", peheader->NumberOfSections);
printf("PE标志 MACHINE:%x\n", peheader->SizeOfOptionalHeader);
PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL; pOptionHeader = (PIMAGE_OPTIONAL_HEADER32)((DWORD)peheader + IMAGE_SIZEOF_FILE_HEADER);
printf("猜测:%d\n", IMAGE_SIZEOF_FILE_HEADER);
printf("********************可选PE头********************\n");
printf("PE标志 MACHINE:%x\n", pOptionHeader->Magic);
printf("PE标志 MACHINE:%x\n", pOptionHeader->AddressOfEntryPoint);
printf("PE标志 MACHINE:%x\n", pOptionHeader->ImageBase);
printf("PE标志 MACHINE:%x\n", pOptionHeader->FileAlignment);
printf("PE标志 MACHINE:%x\n", pOptionHeader->SizeOfImage);
printf("PE标志 MACHINE:%x\n", pOptionHeader->SizeOfHeaders);
PIMAGE_SECTION_HEADER JIB = NULL;
JIB=(PIMAGE_SECTION_HEADER)((DWORD)pOptionHeader + peheader->SizeOfOptionalHeader);
DWORD numberofsection = peheader->NumberOfSections;
for (DWORD i = 0; i < numberofsection; i++, JIB++) {
printf("第%d个表\n", i+1);
/* for (DWORD j = 0; j < IMAGE_SIZEOF_SHORT_NAME; j++)
{
printf("表名字:%s\n", JIB->Name[j]);
}*/
printf("表名字:%s\n", JIB->Name);
printf("内存中偏移%x\n", JIB->VirtualAddress);
printf("节在文件中对齐的尺寸:%x\n", JIB->SizeOfRawData);
printf("在文件中的偏移:%d\n", JIB->PointerToRawData);
/*PDWORD jie= 0;
jie= PDWORD(dosHeader) + JIB->PointerToRawData;
printf("214124124:%x\n", *(jie));*/
} } int main() {
//写入文件路径
char filePath2[] = "D:\\110.exe";
//给定读写权限
char type2[] = "wb+";
//读取原文件路径
char filePath[] = "D:\\测试程序.exe";
///获取返回值 (程序在内存中的数据保存在这里)
LPVOID fip = NULL;
fip =(readpe(filePath));
//打开文件传递文件流首地址
FILE* fileAdress = fopen(filePath2, type2);
写出文件
fwrite(fip, 1, size2, fileAdress);
return 0;
}
10/12 修复只打印一个节表的问题
10/12 新增读取文件后 又可以读内存写出文件
来一张吊图

视频讲解
https://www.bilibili.com/video/BV1RT411P7UG/
{我是菜,视频中有很多错}
滴水 10/13号完成 打印出DOS PE头 节表 开源的更多相关文章
- 2019第一期《python测试开发》课程,10月13号开学
2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...
- 联想小新Air 15 安装黑苹果macOS High Sierra 10.13.6过程
联想小新Air 15 安装黑苹果全过程 本文参考:https://blog.csdn.net/qq_28735663/article/details/80634300 本人是联想小新AIr 15 , ...
- 背水一战 Windows 10 (13) - 绘图: Stroke, Brush
[源码下载] 背水一战 Windows 10 (13) - 绘图: Stroke, Brush 作者:webabcd 介绍背水一战 Windows 10 之 绘图 Stroke - 笔划 Brush ...
- 使用FROM确认按钮(键盘13号键)提交特性并使用ajax.POST提交.
如果又想使用FROM确认按钮(键盘13号键)提交特性 还能继续用AJAX.POST提交.就需要使用return false 来阻止FROM默认提交 代码如下: HTML页面 这里最关键就是用了ret ...
- macOs升级到10.13.1Beta || JAVA升级到最新版之后PhpStorm菜单栏问题
macOs升级到10.13.1Beta || JAVA升级到最新版之后PhpStorm菜单栏会消失,估计不止出现在PhpStorm,一系列jetbrains的产品可能都会有这个问题,包括eclipis ...
- 关于MacOS升级10.13系统eclipse菜单灰色无法使用解决方案
最近,苹果发布了macOS High Sierra,版本为10.13,专门针对mac pro的用户来着,至于好处大家到苹果官网看便是,我就是一个升级新版本系统的受益者,同时也变成了一个受害者:打开ec ...
- 解锁 vmware esxi 6.7 并安装 mac os 10.13
1.安装 esxi 6.7 2.下载 unlocker 2.1.1.zip 3.上传 unlocker 2.1.1.zip esxi的磁盘中 4.开启esxi的ssh登录 5.使用 ssh 登录 es ...
- MacOS 10.13.6 下装xcode 流程
1.最好先安装brew https://github.com/Homebrew/brew/releases 自动安装脚本 /usr/bin/ruby -e "$(curl -fsSL htt ...
- 荣耀MagicBook黑苹果(i7)High Sierra 10.13.6
这里有大佬维护的新版本EFI,对应10.14.4:https://github.com/hjmmc/Honor-Magicbook ---------------------------------- ...
- window64位电脑如何通过VMware Workstation12.5.6安装苹果操作系统 macOS High Sierra 10.13
1.下载 VMware-workstation-full-12.5.6.exe,macOS High Sierra 10.13.iso 2.安装 VMware-workstation时不要选择C盘,因 ...
随机推荐
- 交叉编译GDB
PC主机安装必要软件 sudo apt-get install bison flex expect-dev build-essential m4 autoconf automake texi2html ...
- C++ 动态规划:一维动态规划,背包问题,区间动态规划
C++ 动态规划 动态规划的定义 动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程.动态规划是一种在数学.管理科学.计算机科学.经济学和生物信息学 ...
- 关于deepin-wine或wine更换字体方法
前言 首先要知道,deepin-wine打包的QQ和你自己用 deepin-wine跑的windows软件,他们所在不是同一个容器 deepin打包QQ所在的容器,在你的 ~/.deepinwine ...
- CSS伪类使用详解
基本描述 CSS伪类是很常用的功能,主要应用于选择器的关键字,用来改变被选择元素的特殊状态下的样式. 伪类类似于普通CSS类的用法,是对CSS选择器的一种扩展,增强选择器的功能. 目前可用的伪类有大概 ...
- 【Java EE】Day03 DQL、约束、数据库设计、范式、备份和还原
〇.总结 1.DQL 聚合函数有空值需要使用ifnull函数 where不能使用聚合函数 分页开始索引的计算,及mysql和oracle的方言 2.约束 删除唯一约束DROP INDEX 列名; 3. ...
- 解决SpringMVC重定向参数无法携带问题
解决SpringMVC重定向参数无法携带问题 场景 重定向时请求参数会丢失,我们往往需要重新携带请求参数,我们可以进⾏⼿动参数拼接如下: return "redirect:handle01? ...
- uniapp 微信小程序 改变头部的信号、时间、电池显示颜色
修改前 修改后 修改方法:"navigationBarTextStyle":"white"
- 使用nodejs编写api接口并部署到服务器上
一.用node.js编写api接口 1.安装node环境,没有就去下载nodejs, 下载地址 2.创建一个node项目, 新建一个目录文件,例node_proxy 3.在新建的node项目执行npm ...
- anaconda peompt 、labalimg 数据标注
安装anaconda,进行数据标注 1.安装前准备:下好安装包和所需文件 https://www.aliyundrive.com/s/XyH2JQ5TjCz 提取码: 3c2w 2.运行anacond ...
- 使用 Bitnami Helm 安装 Kafka
服务器端 K3S 上部署 Kafka Server Kafka 安装 ️ Quote: charts/bitnami/kafka at master · bitnami/charts (github. ...