#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头 节表 开源的更多相关文章

  1. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  2. 联想小新Air 15 安装黑苹果macOS High Sierra 10.13.6过程

    联想小新Air 15 安装黑苹果全过程 本文参考:https://blog.csdn.net/qq_28735663/article/details/80634300 本人是联想小新AIr 15 , ...

  3. 背水一战 Windows 10 (13) - 绘图: Stroke, Brush

    [源码下载] 背水一战 Windows 10 (13) - 绘图: Stroke, Brush 作者:webabcd 介绍背水一战 Windows 10 之 绘图 Stroke - 笔划 Brush ...

  4. 使用FROM确认按钮(键盘13号键)提交特性并使用ajax.POST提交.

    如果又想使用FROM确认按钮(键盘13号键)提交特性  还能继续用AJAX.POST提交.就需要使用return false 来阻止FROM默认提交 代码如下: HTML页面 这里最关键就是用了ret ...

  5. macOs升级到10.13.1Beta || JAVA升级到最新版之后PhpStorm菜单栏问题

    macOs升级到10.13.1Beta || JAVA升级到最新版之后PhpStorm菜单栏会消失,估计不止出现在PhpStorm,一系列jetbrains的产品可能都会有这个问题,包括eclipis ...

  6. 关于MacOS升级10.13系统eclipse菜单灰色无法使用解决方案

    最近,苹果发布了macOS High Sierra,版本为10.13,专门针对mac pro的用户来着,至于好处大家到苹果官网看便是,我就是一个升级新版本系统的受益者,同时也变成了一个受害者:打开ec ...

  7. 解锁 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 ...

  8. MacOS 10.13.6 下装xcode 流程

    1.最好先安装brew https://github.com/Homebrew/brew/releases 自动安装脚本 /usr/bin/ruby -e "$(curl -fsSL htt ...

  9. 荣耀MagicBook黑苹果(i7)High Sierra 10.13.6

    这里有大佬维护的新版本EFI,对应10.14.4:https://github.com/hjmmc/Honor-Magicbook ---------------------------------- ...

  10. 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盘,因 ...

随机推荐

  1. i春秋Login

    打开是个很普通的登录网页 查看源码看看有没有东西 找到绿色的提示,可能是账号密码,试试 成功进来了,再右键源码,没东西...抓包试试,传repeater里go一下 发现一个奇怪的变量,在request ...

  2. C温故补缺(五):main函数的参数

    main()的参数 main()函数的参数,用于在外部执行时传入参数,类似windows的bat脚本或linux的sh脚本.在bat脚本中传入参数,用%接收.sh脚本的参数用$接收. c语言编译成可执 ...

  3. vscode,java中文乱码

    1.vscode默认是utf-8,但最好再打开自动检测 2.在vscode设置里搜 auto guess,启用auto guess encoding 3.windows默认的是gbk,在windows ...

  4. py周结04

    py周结04 异常类型,理语法结构及实践案例 1.异常类型 SyntaxError 语法错误 NameError 名字错误 IndexError 指数错误 KeyError 关键字错误 Indenta ...

  5. vulnhub靶场渗透实战11-Deathnote

    ​网络模式,怎么方便怎么来. 靶场地址:https://download.vulnhub.com/deathnote/Deathnote.ova 这个靶机很简单.vbox装好.​ 1:主机发现,和端口 ...

  6. DHorse的链路追踪

    目前,DHorse的链路追踪功能是通过SkyWalking来实现.实现原理是DHorse在部署应用时,通过指定SkyWalking的Agent来收集服务的调用链路信息.下面就来具体看一下DHorse如 ...

  7. 分布式计算MapReduce究竟是怎么一回事?

    前言 如果要对文件中的内容进行统计,大家觉得怎么做呢?一般的思路都是将不同地方的文件数据读取到内存中,最后集中进行统计.如果数据量少还好,但是面对海量数据.大数据的场景这样真的合适吗?不合适的话,那有 ...

  8. Django中ORM多对多三种创建方式(全自动-纯手动-半自动)

    一:多对多三种创建方式 1.全自动: 利用orm自动帮我们创建第三张关系表 class Book(models.Model): name = models.CharField(max_length=3 ...

  9. <五>基于CAS操作的atomic原子类型

    C++11多线程类库中提供了 include包含了很多原子类型 原子操作 若干汇编指令具有读-修改-写类型,也就是说它们访问存储器单元两次,第一次读原值,第二次写新值 假定运行在两个cpu上的两个内核 ...

  10. 如何在SpringBoot中优雅地重试调用第三方API?

    前言 作为后端程序员,我们的日常工作就是调用一些第三方服务,将数据存入数据库,返回信息给前端.但你不能保证所有的事情一直都很顺利.像有些第三方API,偶尔会出现超时.此时,我们要重试几次,这取决于你的 ...