初识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结构:如何对程序加料

我们如果想对已有的程序做手脚,就要在原有的结构中添加自己的代码,这样当用户在打开这个做过手脚的程序时就会自动运行其中我们加进去的代码,至于这些代码能做什么,你懂得。这个实验的目的是在一个EXE可执行文...

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

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

【EXE PE】初识pe结构--手写可执行程序

原文地址http://bbs.pediy.com/showthread.php?t=48590 【文章标题】: 手写可执行程序 【文章作者】: dncwbc 【作者邮箱】: dnc2588@...

[React-Native]初识代码结构

一、了解index.ios.jsReact-Native就是在开发效率和用户体验间做的一种权衡。React-native是使用JS开发,开发效率高、发布能力强,不仅拥有hybrid的开发效率,同时拥有...

运筹帷幄之中决胜千里之外 菜鸟初识代码编程规范二 命名规范

良好的命名规范可以为团队合作开发推波助澜,无论在项目开发,还是产品维护上都起到了至关重要的作用。应该说命名规范是一种约定,也是程序员之间良好沟通的桥梁。另外古人相信只要知道一个人真正的名字就会获得凌驾...
  • lishehe
  • lishehe
  • 2012年08月06日 06:34
  • 2051

初识-----基于Socket的UDP和TCP编程及测试代码

一、概述 TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议。 TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字...

算法结构初识

  • 2015年12月08日 16:59
  • 418KB
  • 下载

ARM体系结构_初识ARM

  • 2013年06月05日 17:17
  • 1.2MB
  • 下载

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

1.常见PE文件 可执行文件:EXE,SCR,COM 驱动程序:SYS,VSD 库文件:DLL,OCX,CPL,DRV 对象文件:OBJ2.PE32(32位)、PE32+或者PE+(64位)3.PE组...

从PE结构取调试信息 代码

从PE结构取调试信息 代码
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:初识PE结构:编程在任意节空白区添加代码(一)
举报原因:
原因补充:

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