初识PE结构:编程在任意节空白区添加代码(一)

原创 2017年01月03日 07:30:50

我们如果想在任意节空白区添加隐藏代码:首先我们先实验对PE文件进行正确的读写,是要将.exe文件从硬盘中完整地拷贝到内存中,这时我们称这个在内存数据块为FileBuffer,然后我们要将FileBuffer按照操作系统能运行的要求进行拉伸对齐生成内存映像文件ImageBuffer,我们才能得到正确的偏移,之后将ImageBuffer按照文件对齐的形式转成新的文件NewBuffer,最后将NewBuffer存储到硬盘中。


在这里详细说说从fileBuffer(文件缓冲区)转成ImageBuffer(镜像缓冲区)和ImageBuffer(镜像缓冲区)转成NewBuffer(新文件缓冲区两个步骤,这是PE文件读写的关键步骤:


从filebuffer转成imagebuffer
1、申请空间,大小为pOptionHeader->SizeOfImage,并初始化为零。
2、拷贝头,拷贝的大小为pOptionHeader->SizeOfHeaders。
3、按照节表的信息循环拷贝节,VisualSize(在内存中对齐前的大小),RawSize(在文件中对齐后的大小),从文件中哪里拷(PointToRawData),拷到内存中的位置(VisualAddress),拷贝的大小(SizeOfRawData)。
部分代码:

 //先拷贝头
    memcpy(pTempImageBuffer,pDosHeader,pOptionHeader->SizeOfHeaders);
//根据节表,循环拷贝节
    PIMAGE_SECTION_HEADER ptempSectionHeader = pSectionHeader;
    int i = 0;
    for( i= 0;i<pPEHeader->NumberOfSections;i++,ptempSectionHeader++)
    {
        memcpy((void*)((DWORD)pTempImageBuffer + ptempSectionHeader->VirtualAddress),(void*)((DWORD)pDosHeader + ptempSectionHeader->PointerToRawData),ptempSectionHeader->SizeOfRawData);
    }


imagebuffer转成newbuffer
1、申请空间,申请大小为找到最后一个节在文件中的起始位置加上一个节对齐后的大小,PointToRawData+sizeofraw。并初始化为零
2、拷贝头,大小为SizeOfHeader。
3、按照节表信息拷贝节,从内存中的位置(VisualAddress)开始拷,拷到文件中(PointToRawData),拷贝的大小为(SizeOfRawData)。
部分代码:

//先拷贝头
    memcpy(pTempNewBuffer,pDosHeader,pOptionHeader->SizeOfHeaders);
//拷贝节
    ptempSectionHeader = pSectionHeader;
    for( i= 0;i<pPEHeader->NumberOfSections;i++,ptempSectionHeader++)
    {
        memcpy((void*)((DWORD)pTempNewBuffer + ptempSectionHeader->PointerToRawData),(void*)((DWORD)pDosHeader + ptempSectionHeader->VirtualAddress),ptempSectionHeader->SizeOfRawData);
    }

PE 添加新节 执行指定程序

/********************************************************************author:  Hanker98purpose: 增加一个新...
  • iiprogram
  • iiprogram
  • 2008年04月16日 22:06
  • 661

学习PE写的一个添加节区的工具

前段时间学习PE写了一个添加节区的小工具,拿计算器测试了一下,可以添加90多个节区. 先介绍一下手动添加节区的方法 方法一:(适用于最后一个节区头部与第一个节区数据之间有0x28字节的空间) ...
  • zhangmiaoping23
  • zhangmiaoping23
  • 2013年08月02日 14:38
  • 1206

PE文件操作-末尾添加节

有时候为了某些原因,需要在PE末尾添加节,比如加壳,补丁等等,需要对PE文件进行扩展。 在末尾添加节是最简单的方式,只需要做如下修改: 修改FILE_HEADER中的节数目字段 修改OPTIONAL...
  • yeshahayes
  • yeshahayes
  • 2016年08月08日 20:30
  • 1062

PE结构详解

1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址”而不是“物理地址”。为什么不是“物理地址”呢?因为数据在内存的位置经常在变,这样可以节省...
  • qiming_zhang
  • qiming_zhang
  • 2012年03月01日 15:42
  • 21892

初识PE结构:编程在任意节空白区添加代码(一)

我们如果想在任意节空白区添加隐藏代码:首先我们先实验对PE文件进行正确的读写,是要将.exe文件从硬盘中完整地拷贝到内存中,这时我们称这个在内存数据块为FileBuffer,然后我们要将FileBuf...
  • laobingzai
  • laobingzai
  • 2017年01月03日 07:30
  • 850

PE文件详解(二)--节表和节

PE文件到内存的映射 在执行一个PE文件的时候,windows 并不在一开始就将整个文件读入内存的,二十采用与内存映射文件类似的机制。也就是说,windows 装载器在装载的时候仅仅建立好虚...
  • lj94093
  • lj94093
  • 2016年01月12日 14:37
  • 1088

手动修改PE文件:修改节表

目前想到的关于修改节表就是新增节和节表移位,其它的改节的读写什么的就改个Flag而已就不说了。以后有新的想法再添加。 1.新增节 现在很多解析PE格式的软件都有添加节的功能,具体代...
  • nargnos
  • nargnos
  • 2014年11月06日 00:00
  • 907

PE文件结构

本章提要·           PE文件格式概述·           PE文件结构·           如何获取PE文件中的OEP·           如何获取PE文件中的资源·        ...
  • yczz
  • yczz
  • 2007年12月19日 21:48
  • 7441

PE文件结构(懒的写博客我直接贴代码还不行么!)

1.常见PE文件 可执行文件:EXE,SCR,COM 驱动程序:SYS,VSD 库文件:DLL,OCX,CPL,DRV 对象文件:OBJ2.PE32(32位)、PE32+或者PE+(64位)3.PE组...
  • u013613980
  • u013613980
  • 2016年05月14日 09:30
  • 468

基于VC++实现PE的修改编程

在Windows系统下的可执行文件的一种(还有NE、LE),是微软设计、TIS(Tool Interface Standard,工具接口标准)委员会批准的一种可执行文件格式。PE的意思是Portabl...
  • yincheng01
  • yincheng01
  • 2012年05月11日 18:08
  • 2973
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初识PE结构:编程在任意节空白区添加代码(一)
举报原因:
原因补充:

(最多只允许输入30个字)