滴水 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盘,因 ...
随机推荐
- Android开发之线程间通信
Android开发之线程间通信 当我们的软件启动的时候,计算机会分配进程给到我们运行的程序,在进程中包含多个线程用于提高软件运行速度. 在android网络请求中,我们知道在日常开发中不能在子线程中跟 ...
- Servlet层
package com.neu.servlet; import java.io.IOException;import java.io.PrintWriter;import java.util.Arra ...
- 如何使用Java获取货币符号?
1. 前言 最近做了一个支付相关的需求,要求在收银台页面显示商品的价格时带上货币符号¥,类似下图中的格式: 最初我是用的下面这样的代码: System.out.println(Currency.get ...
- 《MySQL必知必会》之快速入门存储过程
使用存储过程 本章介绍什么是存储过程,为什么使用.如何使用,并介绍如何创建和使用存储过程的基本语法 存储过程 在实际应用中,往往需要执行多个表的多条sql语句 存储过程就是为以后的使用而保存的一条或者 ...
- 模型驱动设计的构造块(上)——DDD
为了保证软件实践得简洁并且与模型保持一致,不管实际情况如何复杂,必须运用建模和设计的实践. 某些设计决策能够使模型和程序紧密结合在一起,互相促进对方的效用.这种结合要求我们注意每个元素的细节,对细节问 ...
- C++11(列表初始化+变量类型推导+类型转换+左右值概念、引用+完美转发和万能应用+定位new+可变参数模板+emplace接口)
列表初始化 用法 在C++98中,{}只能够对数组元素进行统一的列表初始化,但是对应自定义类型,无法使用{}进行初始化,如下所示: // 数组类型 int arr1[] = { 1,2,3,4 }; ...
- 如何配置 SLO
前言 无论是对外提供 IaaS PaaS SaaS 的云公司,还是提供信息技术服务的乙方公司,亦或是金融 制造等各行各业的数据中心.运维部门,我们的一个非常重要的合同承诺或考核评估指标就是:SLA(即 ...
- Java时间加减操作
Java时间加减操作 /** * 时间计算 * * @param str 时间字符串 * @param format 时间格式 * @param type Calendar内置常量 * @param ...
- MySQL join语句怎么优化?
在MySQL的实现中,Nested-Loop Join有3种实现的算法: 1. Simple Nested-Loop Join:简单嵌套循环连接 2. Block Nested-Loop Join:缓 ...
- DVWA靶场实战(四)——File Inclusion
DVWA靶场实战(四) 四.File Inclusion: 1.漏洞原理: 随着网站的业务的需求,程序开发人员一般希望代码更加灵活,所以将被包含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通 ...