这节课的重点是:模拟PE加载过程,按照运行的要求给FileBuffer拉伸放到内存当中,从 FileBuffer 到 ImageBuffer 再到 运行Buffer。

PE  加载  过程:

  1. 根据sizeofImage    分配空间

  2. 根据sizeofheader    copy头

  3. 按照节表, 根据VaSize,RawSize,SizeOfRawData     copy节

一,介绍FileBuffer

sizeofHeanders(位于可选PE头中) 它是 所有头+所有节表 按照 文件对齐以后的大小

节表和节的关系:节表是节的目录。

Misc  未初始化,没对齐的节 代表在内存中映射完的大小

SizeOfRawData 对应的节里面的数据按照文件对齐后的大小

PointerToRawData 文件的偏移 (在文件中离DOS头有多远)

二,FileBuffer call到ImageBuffer中

先call SizeOfHeaders ,然后call节的数据(节表已经交代了节的大小内容)

ImageBuffer中的地址对应FileBuffer的地址:

VirtualAddress 代表虚拟的偏移 也就是离DOS头的距离,如何确定在第几个节?

① 501234-50000=1234

②1234 > VirtualAddress    123456 < VirtualAddress+misc.VirtualSize

③1234-1000=234

④400+234=我们想要的地址

附:

RVA 相对偏移地址 例如1234就是RVA ,离开始头有多远!注!RVA不是VirtualAddress!!!

FOA就是上面的 400+234 F是 File 文件 OA就是 offset 偏移

主要就是要学会把FileBuffer拉伸成为ImageBuffer后 再写成运行Buffer,以后方便把自己的代码塞进去。

例题、编写一个函数,能够将RVA的值转换成FOA.

//函数声明

//**************************************************************************

//ReadPEFile:将文件读取到缓冲区

//参数说明:

//lpszFile 文件路径 //pFileBuffer 缓冲区指针

//返回值说明:

//读取失败返回0  否则返回实际读取的大小

//******************************************************DWORD ReadPEFile(IN LPSTR lpszFile,OUT LPVOID* pFileBuffer); //******************************************************

//CopyFileBufferToImageBuffer:将文件从FileBuffer复制到ImageBuffer

//参数说明:

//pFileBuffer  FileBuffer指针

//pImageBuffer ImageBuffer指针

//返回值说明: //读取失败返回0  否则返回复制的大小 //****************************************************** DWORD CopyFileBufferToImageBuffer(IN LPVOID pFileBuffer,OUT LPVOID* pImageBuffer); //******************************************************

//CopyImageBufferToNewBuffer:将ImageBuffer中的数据复制到新的缓冲区

//参数说明:

//pImageBuffer ImageBuffer指针

//pNewBuffer NewBuffer指针

//返回值说明:

//读取失败返回0  否则返回复制的大小

//******************************************************DWORD CopyImageBufferToNewBuffer(IN LPVOID pImageBuffer,OUT LPVOID* pNewBuffer); //******************************************************

//MemeryTOFile:将内存中的数据复制到文件

//参数说明:

//pMemBuffer 内存中数据的指针

//size 要复制的大小

//lpszFile 要存储的文件路径

//返回值说明:

//读取失败返回0  否则返回复制的大小

//******************************************************BOOL MemeryTOFile(IN LPVOID pMemBuffer,IN size_t size,OUT LPSTR lpszFile); //******************************************************

//RvaToFileOffset:将内存偏移转换为文件偏移

//参数说明:

//pFileBuffer FileBuffer指针

//dwRva RVA的值

//返回值说明:

//返回转换后的FOA的值  如果失败返回0

//****************************************************** DWORD RvaToFileOffset(IN LPVOID pFileBuffer,IN DWORD dwRva); 

FileBuffer-ImageBuffer 模拟PE的更多相关文章

  1. 文件中pe到内存中pe

    前言 学pe的时候被困扰了很久,终于在某处给我找到了,打算打出来读一读代码 这边我们是从文件中的pe转到运行中的pe,然后再缩小存储到文件的pe 这边我们需要知道内存中对齐是0x1000,文件对齐是0 ...

  2. PE文件动态加载执行过程

    主要步骤: 1.将要加载的文件读取到内存中(简称为文内),检查文件格式无误后,根据可选PE头(简称op头)的SizeOfImage,申请出一块空间用于存储该文件加载到内存后展开的数据(简称为内内).记 ...

  3. Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术

    catalogue 1. 引言2. 使用注册表注入DLL3. 使用Windows挂钩来注入DLL4. 使用远程线程来注入DLL5. 使用木马DLL来注入DLL6. 把DLL作为调试器来注入7. 使用c ...

  4. 内存加载DLL

    1.前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL ...

  5. C/C++ 对代码节的动态加解密

    加壳的原理就是加密或者压缩程序中的已有资源,然后当程序执行后外壳将模拟PE加载器对EXE中的区块进行动态装入,下面我们来自己实现一个简单的区块加解密程序,来让大家学习了解一下壳的基本运作原理. 本次使 ...

  6. 在PE中,新增节,添加代码

    在PE中,新增节,添加代码 一.先判断节表后是否有空闲位置,添加节表信息,必须多出两个节表位置,最后以零结尾. 二.新增节后,需要修改以下信息 1.添加一个新节,可以复制一份,最好是拥有可执行属性的节 ...

  7. 向PE文件中空白处添加代码

    // mem.cpp : 定义控制台应用程序的入口点. //PE文件从文件加载到内存,再从内存读取,然后存盘到文件 #include "stdafx.h" #include < ...

  8. PE文件从文件加载到内存,再从内存读取,然后存盘到文件

    // mem.cpp : 定义控制台应用程序的入口点. //PE文件从文件加载到内存,再从内存读取,然后存盘到文件 #include "stdafx.h" #include < ...

  9. 【转】别人写的pe代码

    // PEOperate.cpp: implementation of the PEOperate class. // //////////////////////////////////////// ...

随机推荐

  1. --BEA官方网站(http: //www.bea.com)甲骨文已完成对该公司的收购BEA Weblogic Server 7.0x应用服务器简明安 装、配置手册 1

    ====================简 介: BEA公司是业内著名的中间件产商,以Tuxedo及Weblogic闻名于世,而其基础件平台(infrastructure)Weblogic platf ...

  2. DES加密解密类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.S ...

  3. AJAX流程

    创建一个XHR对象 var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari ...

  4. 使用HTML5、CSS3和jQuery增强网站用户体验[留存]

    记得几年前如果你需要添加一些互动元素到你的网站中用来改善用户体验?是不是立刻就想到了flash实现?这彷佛年代久远的事了.使用现在最流行的Web技术HTML5,CSS3和jQuery,同样也可以实现类 ...

  5. 【BZOJ】2154: Crash的数字表格 莫比乌斯反演

    [题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...

  6. 【洛谷 P2865】 [USACO06NOV]路障Roadblocks(最短路)

    题目链接 次短路模板题. 对每个点记录最短路和严格次短路,然后就是维护次值的方法了. 和这题一样. #include <cstdio> #include <queue> #in ...

  7. 【洛谷 P4542】 [ZJOI2011]营救皮卡丘(费用流)

    题目链接 用最多经过\(k\)条经过\(0\)的路径覆盖所有点. 定义\(ds[i][j]\)表示从\(i\)到\(j\)不经过大于\(max(i,j)\)的点的最短路,显然可以用弗洛伊德求. 然后每 ...

  8. VC孙鑫老师第八课:你能捉到我吗?

    第一步,首先在对话框窗口上放上两个一模一样的按钮控件 第二步,由于是按钮响应鼠标移动上去的事件,因此需要重新派生按钮类: 第三步,在窗口类中声明并使用自定义按钮对象(记得在窗口类中包含自定义按钮类的头 ...

  9. AngularJs 文件上传(实现Multipart/form-data 文件的上传)

    <!-- 上传yml文件 --> <div class="blackBoard" ng-show="vm.showUpop==true"> ...

  10. java你应该学会什么

    给初学者之一:浅谈java及应用学java 先说什么是Javajava是一种面向对象语言,真正的面向对象,任何函数和变量都以类(class)封装起来至于什么是对象什么是类,我就不废话了关于这两个概念的 ...