FileBuffer-ImageBuffer 模拟PE
这节课的重点是:模拟PE加载过程,按照运行的要求给FileBuffer拉伸放到内存当中,从 FileBuffer 到 ImageBuffer 再到 运行Buffer。
PE 加载 过程:
根据sizeofImage 分配空间
根据sizeofheader copy头
按照节表, 根据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的更多相关文章
- 文件中pe到内存中pe
前言 学pe的时候被困扰了很久,终于在某处给我找到了,打算打出来读一读代码 这边我们是从文件中的pe转到运行中的pe,然后再缩小存储到文件的pe 这边我们需要知道内存中对齐是0x1000,文件对齐是0 ...
- PE文件动态加载执行过程
主要步骤: 1.将要加载的文件读取到内存中(简称为文内),检查文件格式无误后,根据可选PE头(简称op头)的SizeOfImage,申请出一块空间用于存储该文件加载到内存后展开的数据(简称为内内).记 ...
- Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术
catalogue 1. 引言2. 使用注册表注入DLL3. 使用Windows挂钩来注入DLL4. 使用远程线程来注入DLL5. 使用木马DLL来注入DLL6. 把DLL作为调试器来注入7. 使用c ...
- 内存加载DLL
1.前言 目前很多敏感和重要的DLL(Dynamic-link library) 都没有提供静态版本供编译器进行静态连接(.lib文件),即使提供了静态版本也因为兼容性问题导致无法使用,而只提供DLL ...
- C/C++ 对代码节的动态加解密
加壳的原理就是加密或者压缩程序中的已有资源,然后当程序执行后外壳将模拟PE加载器对EXE中的区块进行动态装入,下面我们来自己实现一个简单的区块加解密程序,来让大家学习了解一下壳的基本运作原理. 本次使 ...
- 在PE中,新增节,添加代码
在PE中,新增节,添加代码 一.先判断节表后是否有空闲位置,添加节表信息,必须多出两个节表位置,最后以零结尾. 二.新增节后,需要修改以下信息 1.添加一个新节,可以复制一份,最好是拥有可执行属性的节 ...
- 向PE文件中空白处添加代码
// mem.cpp : 定义控制台应用程序的入口点. //PE文件从文件加载到内存,再从内存读取,然后存盘到文件 #include "stdafx.h" #include < ...
- PE文件从文件加载到内存,再从内存读取,然后存盘到文件
// mem.cpp : 定义控制台应用程序的入口点. //PE文件从文件加载到内存,再从内存读取,然后存盘到文件 #include "stdafx.h" #include < ...
- 【转】别人写的pe代码
// PEOperate.cpp: implementation of the PEOperate class. // //////////////////////////////////////// ...
随机推荐
- ① 设计模式的艺术-01.单例(Singleton)模式
单例模式为何要出现 在工作过程中,发现所有可以使用单例模式的类都有一个共性,那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的. 如果我们不将这个类控制成单例的结构,应用中 ...
- Java 注解全面解析
1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...
- 51Nod 1256 扩展欧几里得求乘法逆元
给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K * M % N = 1,如果有多个满足条件的,输出最小的. Input 输入2个数M, N中间用 ...
- 天梯赛 L2-006 树的遍历 (二叉树)
给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(<=30),是二叉树中结点的个数.第二行给出其后序遍历序 ...
- 如何写出优雅的js以及js特殊技巧
由于代码和解释都写在了github的readme内部,这里就直接附上github:https://github.com/jiangzhenfei/pretty-js/tree/master
- Hibernate总结之Hello,World
1. 引入相关maven依赖: <dependency> <groupId>org.hibernate</groupId> <artifactId>hi ...
- Django之ModelForm(一)
要说ModelForm,那就先说Form吧! 先给出一个Form示例: models.py from django.db import models class UserType(models.Mod ...
- PHP深浅拷贝
举个栗子: <?php class Example1 { public $name; public function __construct($name) { $this->name = ...
- imperva系统升级遇见的错误(配置文件的导入导出)
今天心态有点炸了 今天去东兴证券做waf升级.浪费了两天才弄完.把客户都弄得有点急了.好歹原厂的工程师耐心的讲解这才弄完.感谢路哥.... 赶紧总结一下. 事情是这样的.东兴 证券的imperva是v ...
- 【BubbleCup X】D. Exploration plan
这个题首先一眼能看出二分答案…… 毕竟连可爱的边界都给你了. 下面就是怎么check 首先预处理跑一遍floyed,预处理出最短路. 用网络流判断能否达到即可. #include<bits/st ...