这节课的重点是:模拟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. GYM 101128 G.Game of Cards(博弈论) 或者 UVALIVE 7278

    题目链接:http://codeforces.com/gym/101128/my 如果可以,就看这个人的代码吧,我还不是很懂唉:http://blog.csdn.net/loy_184548/arti ...

  2. <LC刷题一>相加为0的数之leetcode1&2&15&16

    --题目导航见页面左上角的悬浮框#目录导航#-- 相似题型导航 1.1 twosum两数之和  ||  2.2 3Sum三数之和  ||  2.3 3Sum Closest最接近的三数之和 ----- ...

  3. 区分IE8 、IE9 的专属css hack

    一般来说,我们写的结构比较好的时候,IE8/9下是没区别的.所以可能很少人关注只有IE8或只有IE9才识别的css hack. 因为IE8及以下版本是不支持CSS3的,但是我们如果使用css3,在IE ...

  4. Linux 操作系统下 VI 编辑器常用命令详细介绍

    一.Vi 简介 vi是unix世界中最通用的全屏编辑器,linux中是用的是vi的加强版vim,vim同vi完全兼容,vi就是"visual interface"的缩写.它可以执行 ...

  5. 【CodeForces】704 B. Ant Man

    [题目]B. Ant Man [题意]给定n个人的xi,ai,bi,ci,di,起点为s,终点为e,移动: In simpler words, jumping from i-th chair to j ...

  6. 【洛谷 P3203】 [HNOI2010]弹飞绵羊(LCT)

    题目链接 把每个点和能跳到的点连边,于是就构成了一个森林. 查询操作就是该点到根的路径长度,修改操作就相当于删边再重新连边. 显然是\(LCT\)的强项. 查询时\(access(x),splay(x ...

  7. i春秋第二届春秋欢乐赛RSA256writeup

    i春秋第二届春秋欢乐赛writeup 下载之后进行解压 发现四个文件 0x01看到题目是RSA的  又看到public.key 所以直接用kali linux的openssl 0x02可以看到e就是E ...

  8. flask基础之jijia2模板使用基础(二)

    前言 在以前前后端不分离的时代,后台程序员往往又当爹又当妈,需要将前端程序员写的h5页面填充模板语言.而jijia2是一门十分强大的python的模板语言,是flask框架的核心模块之一.先简单介绍一 ...

  9. screen命令使用方法【转】

    在linux的环境中,我们想要在后台持续运行一些脚本,但是又因为关闭这个tty的话,脚本就会中断,这个时候我们就需要screen这个工具的帮助啦! 基础   1 首先先查看下否则有这个工具.如果运行s ...

  10. 省市区ajax联动

    function setCity1(){ var areaId1 = $('#areaId1').val(); var cityId1 = $('#cityId1'); var cityOpt = $ ...