滴水 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盘,因 ...
随机推荐
- PP视频(PPTV聚力)web接口分析
前言 前几天我想看一个番剧, 正好搜索到了 PP视频,我才知道PP视频就是PPTV聚力,我想把番剧下载下来,结果发现视频竟然不是m3u8格式,而是多段mp4,所以简单的写了个脚本,可以在不登录的情况下 ...
- js day04 综合案例秒数计算
<script> //用户输入总秒数 let second = +prompt('请输入总秒数:') //计算时分秒 fun ...
- 【笔面试真题】Flow++赋乐科技-面试-2022年1月25日
一.概括 涉及JVM的GC.三色标记 并发部分的锁 Java集合中的hashmap.list kafka中ISR相关 硬件相关-有无DMA 自定义类(代码) 缺陷:锁.list 二.JVM相关内容 1 ...
- 【Spark】Day04-Spark Streaming:与离线批量比较、架构特点、入门案例、创建(队列、数据源)、转换(有状态、无状态)、输出方式、进阶(累加、转换为DF、缓存持久化)、实战(窗口统计)
一.概述 1.离线和实时计算 离线:数据量大,数据不会变化,MapReduce 实时:数据量小,计算过程要短 2.批量和流式处理 批量:冷数据,数据量大,速度慢 流:在线.实时产生的数据(快速持续到达 ...
- openpyxl写数据
import osimport openpyxlos.chdir(r'D:/openpyxl') wb = openpyxl.Workbook() sht = wb.create_sheet('dat ...
- 常用内置模块os sys json
今日内容回顾 目录 今日内容回顾 os模块 sys模块 json模块 json模块实战 os模块 sys模块 json模块 os模块 os模块主要与代码运行的操作系统打交道 1.创建目录(文件夹) i ...
- 源码解读之TypeScript类型覆盖检测工具type-coverage
因为团队内部开启了一个持续的前端代码质量改进计划,其中一个专项就是TS类型覆盖率,期间用到了type-coverage这个仓库,所以借这篇文章分享一下这个工具,并顺便从源码阅读的角度来分析一下该工具的 ...
- 使用 BenchmarkDotNet 比较指定容量的 List 的性能
我们之前提到 List 是 .NET 中常用的数据结构,其在存储大量数据时,如果能够指定它的初始化容量,就会有性能提升.这个优化的方法并不是很明显,因此本文将使用 BenchmarkDotNet 库, ...
- 第一章 --------------------WPF基础概述
1.在使用WPF之前我一直在思考为什么要使用WPF? 主要原因在于我已经受够了MFC和Winform 和QT的界面设计.尤其是MFC的界面设计,使用一个界面库十分的复杂,并且我的绝大多数时间都是用在这 ...
- [深度学习] caffe分类模型训练、结果可视化、部署及量化笔记
本文为本人caffe分类网络训练.结果可视化.部署及量化具体过程的心得笔记.caffe目前官方已经停止支持了,但是caffe是目前工业落地最常用的深度学习框架,用的人挺多.其实主要怕自己忘了,弄个备份 ...