滴水 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盘,因 ...
随机推荐
- SQL语句查询关键字前期数据准备
前期数据准备 create table emp( id int primary key auto_increment, name varchar(20) not null, gender enum(' ...
- TS编写发布订阅模式
interface PubSubType { events: { [key: string]: { name: string, once: boolean, cb: Function }[] } on ...
- C#不提升自己程序的权限实现操作注册表
1. 绪论 当我们编写了自己的C#程序,有程序自定义的文件类型时,通常希望它满足以下需求: 双击自定义文件打开自定义程序 自定义文件有着自己的图标 此时,在网上检索可以发现,大多数回答是使用Micro ...
- CTF中RSA常见类型解法
Python脚本 #十六进制转ASCII编码 import binascii print(binascii.unhexlify(hex(m)[2:])) #rsa import gmpy2 phi = ...
- day02-功能实现01
家具网购项目实现01 1.项目开发环境搭建 创建一个web项目,添加需要的jar包(暂不使用Maven) 依照5.1的表格来创建项目的大体分层: 2.功能01-搭建前端页面 2.1需求分析/图解 2. ...
- 三步快速搭建Typora图床(SM.MS+PicGo)
三步快速搭建Typora图床(基于SM.MS+PicGo) 前言 在有些同学使用Typora的过程中,会发现Typora不像Word一样,在文档脱离本机后依然正常显示图片,自己的tyopora文件在发 ...
- SpringCloud微服务框架复习笔记
SpringCloud微服务框架复习笔记 什么是微服务架构? 微服务是一种软件开发技术,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调.互相配合,为用户提供最终价值.每个服务运行在其独立的进 ...
- vivo 云原生容器探索和落地实践
作者:vivo 互联网容器团队- Pan Liangbiao 本文根据潘良彪老师在"2022 vivo开发者大会"现场演讲内容整理而成.公众号回复[2022 VDC]获取互联网技术 ...
- .Net 7 的AOT的程序比托管代码更容易破解?
楔子 .Net 7的一个重要功能是把托管的源码编译成Native Code,也就是二进制文件.此举看似增加了程序反编译难度,实际上是减少了程序的破解难度.本篇在不触及整个程序架构的前提下,以简单的例子 ...
- BBS项目(二): 登录功能 首页导航条搭建 首页主体部分 个人站点页面搭建 文章分类与标签 日期归档
目录 登录功能 pillow模块生成验证码 前端发送ajax请求 后端auth模块校验 sweetalert弹窗提示登录失败 首页导航条搭建 修改密码 退出登录 首页主体部分 首页前端框架搭建 adm ...