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. // //////////////////////////////////////// ...
随机推荐
- 关于Linux运维的一些题目总结
一.有文件file1 1.查询file1里面空行的所在行号 awk ‘{if($0~/^$/)print NR}’ fileorgrep -n ^$ file |awk ‘BEGIN{FS=”:”}{ ...
- java网络传输数据
网络文件传输的问题,实际也是一种IO读写的基本问题.对于网络的文件数据写入到服务器的进程中,然后把进程中的网络IO系统传递到客户机,这个阶段,数据以字节流的形式保存.当该字节流被客户进程接受后,客户进 ...
- (4.1)LingPipe在Eclipse中的运行
酒店评论情感分析系统(四)——LingPipe在Eclipse中的运行 本来打算在做这个项目的时候,使用基于语义的文本倾向性分析方法,即先通过对评论文本进行中文分析,去停用词,然后在倾向性语义模式库的 ...
- 【Hadoop】大数据时代,我们为什么使用hadoop
博客已转移,请借一步说话.http://www.daniubiji.cn/archives/538 我们先来看看大数据时代, 什么叫大数据,“大”,说的并不仅是数据的“多”!不能用数据到了多少TB , ...
- hihocoder1415 后缀数组三·重复旋律3
传送门:http://hihocoder.com/problemset/problem/1415 [题解] 考虑求出两串合在一起(中间加分隔符)后缀数组,就是要求任意在两个串中的$i, j$,$\mi ...
- NYOJ 1012 RMQ with Shifts (线段树)
题目链接 In the traditional RMQ (Range Minimum Query) problem, we have a static array A. Then for each q ...
- NB二人组(一)----堆排序
堆排序前传--树与二叉树简介 特殊且常用的树--二叉树 两种特殊的二叉树 二叉树的存储方式 二叉树小结 堆排序 堆这个玩意....... 堆排序过程: 构造堆: 堆排序的算法程序(程序需配合着下图理 ...
- Linux是对用户的密码的复杂度要求设置【转】
那么Linux是如何实现对用户的密码的复杂度的检查的呢?其实系统对密码的控制是有两部分组成: 1 cracklib 2 /etc/login.defs pam_cracklib.so 才是控制密码复杂 ...
- .NET 处理视频-MediaInfo 获取视频信息
获取视频信息的组件很多,本节介绍的是:MediaFile. 第一步.添加 MediaInfoDotNet 在项目上右键,选择“管理 NuGet 程序包”,浏览以选中 MediaInfoDotNet,然 ...
- 016 sleep,wait,yield,join区别
1.线程通常有五种状态,创建,就绪,运行.阻塞和死亡状态.2.阻塞的情况又分为三种:(1).等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中.进入 ...