PE文件加载和修改

PE加载与反射式注入 一、PE加载 在PE结构非常熟系的情况下,往往我们都会想要实现一套PE加载器,其基本流程可以分为以下几点: 将PE文件从磁盘中读出 根据PE结构获取镜像大小,再申请一段可读可写可执行的内存并填充为0 将读取数据映射到内存中 修复导出导入入表 修复重定位 跳转到PE入口点进行执行 相信各位对以上流程都非常熟悉,而且只有实现了PE加载才能真正掌握PE结构,作为抛砖引玉下面我们就聊聊一种DLL注... 阅读详情

一、        Windows加载器

加载器读取一个PE文件的过程如下:
1. 先读入PE文件的DOS头,PE头和Section头。
2. 然后根据PE头里的ImageBase所定义的加载地址是否可用,如果已被其他模块占用,则重新分配一块空间。
3. 根据Section头部的信息,把文件的各个Section映射到分配的空间,并根据各个Section定义的数据来修改所映射的页的属性。
4. 如果文件被加载的地址不是ImageBase定义的地址,则重新修正ImageBase。
5. 根据PE文件的输入表加载所需要的DLL到进程空间。
6. 然后替换IAT表内的数据为实际调用函数的地址。
7. 根据PE头内的数据生成初始化的堆和栈。
8. 创建初始化线程,开始运行进程。
这里要提的是加载PE文件所需DLL的过程是建立在六个底层的API上。
LdrpCheckForLoadedDll:检查要加载的模块是否已经存在。
LdrpMapDll:映射模块和所需信息到内存。
LdrpWalkImportDescriptor:遍历模块的输入表来加载其所需的其他模块。
LdrpUpdateLoadCount:计数模块的使用次数。
LdrpRunInitializeRoutines:初始化模块。
LdrpClearLoadInProgress:清楚某些标志,表明加载已经完成。
 
二、        插入代码到PE文件
有三种方式可以插入代码到PE文件:
1. 把代码加入到一个存在的Section的未用空间里。
2. 扩大一个存在的Section,然后把代码加入。
3. 新增一个Section。
方法一、增加代码到一个存在的Section。
首先我们需要找到一个被映射到一个块有执行权限的Section。最简单的方式就是直接利用CODE Section。
然后我们需要查找这块Section内的多余空间(也就是填满了00h)。我们知道一个Section有两个数据来表示其大小。VirtualSize和SizeOfRawData。这个VirtualSize代表Section里代码实际所占用的磁盘空间。SizeOfRawData代表根据磁盘对齐后所占的空间。通常SizeofRawData都会比VirtualSize要大。如下图。

图中的SizeOfRawData是0002A000,而VirtualSize是00029E88。当PE文件被加载到内存的时候,他们之间的多余空间的数据是不会被加载到内存去。那么如果要把加入到这个间隙中间的代码也被加载到内存去,就需要修改VirtualSize的值,这里把VirtualSize的值可以改为00029FFF。这样,我们就有了一小段空间加入自己的代码。下面需要做的就是先找到PE文件的入口点OriginalEntryPoint,比如这个OriginalEntryPoint是0002ADB4,ImageBase是400000,那么入口点的实际虚拟地址是0042ADB4。然后计算出自己代码的起始RVA,更换掉PE头内的OriginalEntryPoint,在自己的代码最后加上:
MOV EAX,00042ADB4
JMP EAX
这样就可以在PE文件被加载的时候,先运行自己的代码,然后再运行PE文件本身的代码。成功的把代码加入到了PE文件内。
  
方法二、扩大一个存在的Section来加入代码。
如果在一个Section末尾没有足够的空间存放自己的代码,那么另外一种方法就是扩大一个存在的Section。一般我们只扩大PE文件最尾部的Section,因为这样可以避免很多问题,比如对其他Section的影响。
首先我们的找到最后一个Section使之可读可执行。这可以通过修改其对应Section头部的Characteristics来获得。然后根据PE头内文件对齐的大小,修改其SizeOfRawData。比如文件对齐的大小是200h,原先SizeOfRawData=00008000h, 那么我们增加的空间大小应该是200h的整数倍,修改完的SizeOfRawData至少是00008200h。增加完空间后,需要修改PE头内的两个字段的数值,SizeOfCode和SizeOfInitialishedData。分别为它们增加200h的大小。这样我们就成功的扩大了一个Section,然后根据方法一内的方式把代码加入到增加的空间。
 
方法三、新增一个Section来加入代码。
如果要加入的代码很多,那么就需要新增一个Section来存放自己的代码。
l         首先,我们需要在PE头内找到NumberOfSections,使之加1。
l         然后,在文件末尾增加一个新的空间,假设为200h,记住起始行到PE文件首部的偏移。假如这个值是00034500h。同时将PE头内的SizeOfImage的值加200h。
l         然后,找到PE头内的Section头部。通常在Section头部结束到Section数据部分开始间会有一些空间,找到Section头部的最后然后加入一个新的头部。假设最后一个Section头部的数据是:
1. Virtual offset : 34000h
2. Virtual size : 8E00h
3. Raw offset: 2F400h
4. Raw size : 8E00h
而文件对齐和Section对齐的数据分别是:
5. Section Alignment : 1000h
6. File Alignment : 200h
l         那么新增加的Section必须与最后一个Section的边界对齐。它的数据分别:
1. Virtual offset : 3D000h (因为最后一个Section的最后边界是34000h + 8E00h = 3CE00h,加上Section对齐,则Virtual offset的值为3D000h)。
2. Virtual size : 200h。
3. Raw offset: 00034500h。
4. Raw size: 200h.
5. Characteristics : E0000060 (可读、可写、可执行)。
l         最后,只需要修改一下PE头内的SizeOfCode和SizeOfInitialishedData两个字段,分别加上200h。
l         剩下的就是按照方法一的方式把代码放入即可。
 
 
三、        增加执行文件的输入表项目。
在一些特殊用途上,我们需要为执行文件或DLL增加其不包含的API。那么可以通过增加这些API在输入表中的注册来达到。
1. 每一个输入的DLL都有一个IMAGE_IMPORT_DESCRIPTOR (IID)与之对应。PE头中的最后一个IID是以全0来表示整个IID数组的结束。
2. 每一个IID至少需要两个字段Name1和FirstThunk。其他字段都可以设置为0。
3. 每一个FirstThunk的数据必须是一个指向IMAGE_THUNK_DATA数组的RVA。每一个IMAGE_THUNK_DATA又包含了指向一个API名称的RVA。
4. 如果IID数组发生改变,那么只需要修改数据目录数组中对应输入表的数据结构IMAGE_DATA_DIRECTORY的iSize。
增加一个新的IID到输入表的末尾,就是把输入表末尾的全是0的IID修改成增加的新的IID,然后在增加一个全0的IID作为输入表新的末尾。但是如果在输入表末尾没有空间的话,那就需要拷贝整个输入表到一个新的足够的空间,同时修改数据目录数组对应输入表的数据结构IMAGE_DATA_DIRECTORY的RVA和iSize。
步骤一、增加一个新的IID。
  •   把整个IID数组移到一个有足够空间来增加一个新的IID的地方。这个地方可以是.idata段的末尾或是新增一个Section来存放。
  •   修改数据目录数组对应输入表的数据结构IMAGE_DATA_DIRECTORY的RVA和iSize。
  •   如果必要,将存放新IID数组的Section大小按照Section Alignment向上取整(比如,原来大小是1500h, 而section Alignment为1000h,则调整为2000h)以便于整个段可以被映射到内存。
  •   运行移动过IID数组的执行文件,如果正常的话,则进行第二步骤。如果不工作的话,需要检查新增的IID是否已经被映射到内存及IID数组新的偏移位置是否正确。
 
步骤二、增加一个新的DLL及其需要的函数。
  • 在.idata节内增加两个以null结尾的字符串,一个用来存放新增的DLL的名字。 一个用来存放需要导入的API的名称。这个字符串前需要增加一个为null的WORD字段来构成一个 Image_Import_By_Name数据结构。
  •  计算这个新增的DLL名称字符串的RVA.
  •  把这个RVA赋予新增的IID的Name1字段。
  •  再找到一个DWORD的空间,来存放Image_Import_by_name的RVA。这个RVA就是新增DLL的IAT表。
  •  计算上面DWORD空间的RVA,将其赋予新增IID的FirstThunk字段。
  •  运行修改完的程序。
PEloader——32位PE文件简单加载器 32位PE加载器的简单实现 阅读详情

相关推荐

把dll模块注入到游戏进程的方法_基于文件修改的注入方式

通过对pe结构的了解,我们会发现进程加载时依赖的dll主要来源于PE的导入表,因此我们可以自己写代码修改pe文件的导入表,也可以利用LordPe等Pe工具自行修改文件的导入表,从而让想注入的dll在原PE文件中有一席之地。(4)再用PrcoessExplorer查看test.exe所加载的dll,会发现dbghelp_0.dll(改名后的系统dll)和dbghelp.dll(我们的dll,MyDbghelp.dll改名得到的)都会被加载,如下图所示,请注意两个dll的路径。

douluo998的博客 1839

深入剖析PE文件(续1)---扩展知识

 不赖猴的笔记,转载请注明出处。一、        Windows加载器加载器读取一个PE文件的过程如下:1. 先读入PE文件的DOS头,PE头和Section头。2. 然后根据PE头里的ImageBase所定义的加载地址是否可用,如果已被其他模块占用,则重新分配一块空间。3. 根据Section头部的信息,把文件的各个Section映射到分配的空间,并根据各个Section定

A00553344的专栏 3216

PE文件操作-动态加载

有时会有这样的需求,要把一个dll加载到进程空间或者对付地址空间随机化技术,这就需要自己实现一个PELoader。在PE文件中,许多数据在内存中的位置已经以RVA的形式在链接时给出,我们只需要根据节表的描述准确的按位置加载,大部分程序就可以正确运行了,但有几个类型的数据还是需要loader来调整的: IAT 在PE文件中,调用静态链接的DLL例程一般都是以call ds:[xxxxxxxxh]的

yeshahayes的博客 2075

PE文件结构的介绍并使用C++读取PE文件信息

PE文件结构分为五个部分:DOS文件头DOS加载模块PE文件头区段表区段 windows环境中会直接跳过前两个部分直接从PE文件头开始,所以直接略过这两个部分。PE文件头大小为224字节左右,因为有个可选头所以实际长度不定。里面包含许多关于PE文件的整体信息,这些信息主要是描述PE文件的大概情况,但是更细节信息在区段表中。如上图所示,PE文件头分为三个结构,第一个为签名字段,第二个为文件头字段,第三个为可选头字段。signature字段 在一个PE文件中Signature字段被设置为4550h,ASCII码

陈子青的博客 2229

pe-loader:Windows PE格式的文件加载器

Windows可执行文件加载器 这是Windows PE格式的文件加载器应用程序,提供与OS内部可执行文件加载器类似的功能,但从用户模式运行。 它将可执行文件映射到内存,打补丁并初始化几种机制,然后将控制流传递给加载的映像。 该项目是为教育目的而开发的。 用法 可以使用Visual Studio 2013/2015或MSBuild构建该项目。 编译的可执行文件可以在build\(Debug|Release)用法示例中找到: loader.exe " C:\WINDOWS\system32\ping.exe " -t 127.0.0.1 局限性 大部分与Windows XP兼容(已在Windows XP,7、8上测试) 仅32位图像 根据官方PE格式文档进行图像验证 支持 影像记忆体对应 Craft.io信息修补 激活上下文 崔 API重定向(EAT修补) 图像重定位 IAT处理 T

OCCT(Open CASCADE Technology)入门-2.搭建开发环境

安装完成后,在【扩展】菜单下会看到【Qt VS Tools】菜单,打开子菜单【options】进入qt配置窗口。打开VS后随便创建一个新项目,进入开发环境主页,打开顶部菜单【扩展】->【管理扩展】打开管理扩展窗口。然后点击右下角【创建】,一路【next】即可,最后会进入到开发主界面,得到一个下面的工程结构。好了,到这里基本的环境我们已经安装好了,下面我们开始创建项目并配置开发环境。打开顶部菜单【项目】,点击最后一个菜单项【xxx属性】,进入项目配置界面。这里的配置一般不用改,我们看【Versions】

2501_91235145的博客 2875

PE文件的加载和修改

一、        Windows加载器 加载器读取一个PE文件的过程如下: 1. 先读入PE文件的DOS头,PE头和Section头。 2. 然后根据PE头里的ImageBase所定义的加载地址是否可用,如果已被其他模块占用,则重新分配一块空间。 3. 根据Section头部的信息,把文件的各个Section映射到分配的空间,并根据各个Section定义的数据来修改所映射

丸子头的专栏 3490

【面试经验】京东-技术产品经理一面:从紧张到反思的全流程复盘

本文详细复盘了京东技术产品经理一面的全流程,从面试前的简历打磨、业务理解和技术基础准备,到面试中的高压对话和突发状况应对,再到面试后的深度反思与改进方案。文章特别强调了技术产品经理需要具备的技术理解力、数据敏感度和商业思维,并提供了实用的面试建议和准备技巧。

weixin_28730927的博客 162

DLL系列------编程实现感染PE文件加载DLL

编程实现感染PE文件加载DLL 这篇文章是在网上看到的,貌似我找不到原文了。但是网上的排版非常乱,而且觉得此篇此篇文章对学习pe文件有很大帮助。 首先发张图让大家对PE文件有个整体认识 PE文件是Windows系统可执行文件采用的普遍格式,像我们平时接触的EXE、DLL、OCX,甚至SYS文件都是属于PE文件的范畴。很多Win32病毒都是基于感染PE文件来进行

ebxds的专栏 3201

给排水工程师的SWMM初体验:从软件界面到第一个简单模型的保姆级上手教程

本文为给排水工程师提供SWMM软件的保姆级上手教程,从界面解析到创建第一个简单模型,详细介绍了SWMM的核心功能和操作步骤。通过30分钟的实践指导,帮助新手快速掌握雨水管网建模的基本技能,提升工作效率。

weixin_28736355的博客 323

H3C交换机Console口连接全攻略:从接线到PuTTY配置(附常见问题排查)

本文详细介绍了H3C交换机Console口的连接与配置方法,包括硬件线缆选择、驱动安装、PuTTY参数设置及常见问题排查。特别针对Console转USB线缆的兼容性和驱动安装难点提供实用建议,帮助网络工程师快速掌握串联调试技巧,解决连接中的黑屏、乱码等典型问题。

weixin_42549451的博客 674

PE文件结构

什么是可执行文件 可执行文件(executable file)指的是可以由操作系统进行加载执行的文件 windows平台:PE(Portable Executable)文件结构 Linux平台:ELF(Executable and Linking Format)文件结构 一些用到的概念 地址空间:这个地址空间指的是PE文件被加载到内存的空间,是一个虚拟的地址空...

南宫封清的博客 5933

Polyworks脚本开发实战指南:高效生成数据彩图与报告的关键指令解析

本文深入解析了Polyworks脚本开发中生成数据彩图与自动化报告的核心指令。通过实战案例,详细介绍了REFERENCE_SURFACE、THICKNESS和CLEARANCE等关键彩图生成指令的正确用法与常见避坑点,并阐述了如何利用REPORT_ITEM命令实现从截图、表格生成到智能排版的全流程自动化,旨在帮助三维检测与质量控制工程师大幅提升工作效率与报告标准化水平。

weixin_29209825的博客 555

[DLL注入的方法]进程创建期修改PE输入表法

  进程创建期修改PE输入表法的原理和静态修改PE输入表完全相同,可以在R3/R0的各个阶段进行干预(必须在主线程运行之前)。 1.以读写方式打开目标文件: 2 //以读写方式打开目标文件 3 HANDLE hFile = CreateFile(szImageFilePath, 4 GENERIC_READ|GENERIC_WRITE, ...

diheqiu3577的博客 556

57、各向异性材料力学问题的分析与求解

本文系统分析了各向异性材料在扭转和平面变形问题中的力学行为,介绍了基于应力和位移的求解方法,包括应力函数推导、位移场假设、艾里应力函数法等。通过具体示例,如椭圆截面杆的扭转和各向异性板的均匀拉伸,展示了求解过程,并讨论了各向异性材料在工程应用中的意义及未来研究方向。

7h6j5k4l3的博客 204

【实战圣经】YOLOv8-pose姿态估计模型从训练到RK3588部署:让边缘端骨骼识别速度突破60FPS

本教程从“模型训练-转换-边缘部署”全链路拆解了YOLOv8-pose姿态估计方案在RK3588上的落地过程,每一步都经过实战验证。无论是智能健身的动作实时纠正,还是工业设备的关键部件姿态检测,这套流程都能让你以最低成本实现高精度、高实时性的姿态估计应用。如果你在实践中遇到模型转换报错、部署性能不达标等问题,可聚焦某一环节深入优化——毕竟,让AI在边缘端“精准捕捉每一个关键点”,才是技术驱动场景创新的核心。

m0_71589036的博客 251

通过修改PE加载DLL

练习文件 直接修改TextView.exe文件,使其在运行时自动加载myhack3.dll文件。 TextView.exe是一个非常简单的文本查看程序,只要用鼠标将要查看的文本文件(myhack3.cpp)拖动到其中,即可通过它查看文本文件的内容。 使用PEView工具查看TextView.exe可执行文件的IDT(import Directory Table,导入目录表),TexeView.exe中直接导入的DLL文件为KERNEL32.dll、USER32.dll、GDI32.dll、SHELL32

qq_39249347的博客 1591

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...

智慧空间实验室 2622

PE Tools:Windows PE文件逆向工程工具包全面指南

在Windows系统安全研究和逆向工程领域,可执行文件(PE文件)的分析是每个安全研究员的必备技能。无论是恶意软件分析、漏洞挖掘还是软件调试,都需要深入了解PE文件的结构和特性。然而,手动解析PE文件头、节表、导入导出表等复杂结构既耗时又容易出错,这正是PE Tools工具包诞生的背景。 PE Tools是一款历史悠久的便携式可执行文件操作工具包,自2002年发布以来,已成为逆向工程领域的经典工

gitblog_00535的博客 367

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

peClean (清除PE头中的无用数据

以LordPE和OD成功加载为基础,清除PE头部中的“垃圾”数据实际情况可能没多大用处,昨天晚上想温习一下PE头的格式就写了这个使用时把PE文件拖进对话框即可xp sp2 + VC6附件:peclean.rar#include "PeClean.h"DWORD IsPE(HANDLE hFile){  char  ReadBuffer[4];  DWORD  dwRead;  DWORD  dwO

3256

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

pe文件对齐

内存对齐与文件对齐 一个pe文件无论在磁盘和内存中存放都会进行对齐,但他们的对齐值会不相同。 PE 文件头里边的FileAligment 定义了磁盘区块的对齐值。每一个区块从对齐值的倍数的偏移位置开始存放。而区块的实际代码或数据的大小不一定刚好是这么多,所以在多余的地方一般以00h 来填充,这就是区块间的间隙。 PE 文件头里边的SectionAligment 定义了内存中区块的对齐值。PE 文件被映射到内存中时,区块总是至少从一个页边界开始。 rva与fov的相互转换 RVA与FOV的相互转换 为.

goat_2003的博客 4441

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

去掉PE文件随机基址的方法

用010Editer打开点击下面箭头所指的NtHeader然后在上方变蓝的数据块内找到4081,然后修改为0081即可(懂得PE文件的朋友可以也可以一层一层自己找到这个字段,就是WORD IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE这个字段 ,把值1改为0即可。 未修改之前: OD加载的地址如图所示: IDA加载如图所示: 修改之后: OD加载的...

weixin_30448603的博客 1868

Windows PE变形练手3-把通用模板机器码直接覆盖目标PE

把通用模板机器码直覆盖目标PE 这个地方真是尝试了好久,遇到很多坑点,WinPE那本书上的东西有点不够,也就直接写书上的例子会发现很多地方不是说的那样,里面提供的信息太少了,就比如里面并没有提被注入的目标PE的随机基址问题,比如说中给了一套模板(模板里面有一些变量定义了没有使用,还有获取Kern...

墨鱼菜鸡 329
上一篇: PE文件结构及其加载机制
下一篇: Ollydbg手动脱壳得几点小结
vbsourcecode
博客等级 码龄17年 19粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值