小工具      在线工具  汉语词典  css  js  c++  java

PE文件静态注入

安全,科技 额外说明

收录于:40天前

DLL注入指的是向运行中的其他进程强制插入特定的DLL文件。

可以通过修改静态的PE文件,修改输入表结构,使得程序执行时载入特定的DLL文件。

通常可执行文件需要使用其他DLL文件中的代码或数据,这些DLL文件相关的信息会保存在输入表中,因此我们通过修改PE文件中输入表相应的信息,即可实现PE文件在运行时自动载入特定的DLL文件。

PE结构分析:手动构建段表——本实验阐明了Windows PE程序中段结构的作用,掌握了文件和内存中加载段的过程。请复制以下链接进行实际操作

https://www.hetianlab.com/expc.do?ce=d5bc0c11-a182-474b-8ac1-251194174436?pk_campaign=weixin-wemedia#stu

使用PEview工具可以清晰的看到程序输入表的信息

输入表格

由于需要修改输入表信息,这里简单介绍一下输入表的结构。

PE文件的可选头中存在这数据目录项, 里面记载了输出表、输入表等关键信息的偏移及大小。那么理所当然的PE文件在执行时也会通过数据目录项里的信息去找寻输入表。

输入表是由IMAGE_IMPORT_DESCRIPTOR结构的数组组成,简称IID,没有特定的成员指出IID项数,但是会由全为0的IID结构作为结束。

上图可以看出输入表的起始地址为0x1B1C4,这是RVA(相对偏移地址)地址,我们需要转化为文件的偏移地址才能够在文件中找到相应的内容。工具中提供了RVA与文件偏移地址的转换或者自行计算。

从上图可以看出IID结构确实是由全为0的IID结构作为结束。

输入表结构

IID结构的字段成员如下,其中OriginalFirstThunkName以及FirstThunk成员是我们添加DLL文件的关键。

IMAGE_IMPORT_DESCRIPTOR
 union
  characteristics DWORD
  OriginalFirstThunk DWORD //指向IMAGE_THUNK_DATA结构的数组
 ends
 TimeDateStamp DWORD //时间标志
 ForwarderChain DWORD //一般为0
 Name   DWORD //指向DLL名称的指针
 FirstThunk  DWORD//指向IMAGE_THUNK_DATA结构的数组
IMAGE_IMPORT_DESCRIPTOR

PE文件尚未执行过时,OriginalFirstThunkFirstThunk字段指向相同的结构,区别在于OriginalFirstThunk不可以重写,而FirstThunk可以被重写,当PE文件执行后FirstThunk指向的结构会用于存放输入函数的真实地址。因此我们修改时将OriginalFirstThunkFirstThunk字段指向同个地址即可。而Name字段存放的是指向DLL文件名称的指针。

原始第一重击 第一个重击 姓名
指向 IMAGE_THUNK_DATA 结构的数组 指向 IMAGE_THUNK_DATA 结构的数组 指向 DLL 名称的指针

IMAGE_THUNK_DATA

IMAGE_THUNK_DATA
 union u1
  ForwarderString DWORD //指向一个转向者字符串的RVA
  Function  DWORD //被输入的函数的内存地址
  Oridinal  DWORD //被输入的API的序数值
  AddressOfData DWORD //指向IMAGE_IMPORT_BY_NAME
IMAGE_THUNK_DATA

IMAGE_THUNK_DATA结构在不同情况下的成员不同,但是重点关注AddresOfData字段,该字段指向IMAGE_IMPORT_BY_NAME结构,该结构记录的输入函数的名称。当IMAGE_THUNK_DATA值的双字的最高位为0时,表示函数以字符串类型的函数名方式输入。因此构造时高两个字节为0,低两个字节为IMAGE_IMPORT_BY_NAME结构地址即可。

IMAGE_IMPORT_BY_NAME

IMAGE_IMPORT_BY_NAME STRUCT
 Hint WORD //忽略设置为0
 Name BYTE //输入函数名称
IMAGE_IMPORT_BY_NAME

IMAGE_IMPORT_BY_NAME结构的高两字节的值忽略,后门跟着的数据直接填入DLL文件中输出的函数名称,即PE文件运行时会使用到DLL文件中函数的名称。

修改PE文件

这里准备两个文件

  • 文件一:HelloWorld.exe,该文件仅仅是简单在屏幕输出HelloWorld!!!的字符

  • 文件二:待注入的DLL文件,show.dll,该DLL文件的功能可以根据实际情况而定,这里我准备的DLL文件可以简单的弹出一个对话框。

HelloWorld.exe文件拖入PEview工具中,查看输入表内容。可以看到并没有载入show.dll文件。

运行HelloWorld.exe文件

开始修改HelloWorld.exe文件的思路

  • 需要在输入表中添加额外的IID结构,该IID成员的信息为show.dll文件的信息

  • 由于需要添加IID成员,需要观察原始输入表是否由额外的空间可以容纳新的IID结构,若没有则可以选择

    • 文件中的空白

    • 在文件末尾添加新部分

现在观察HelloWorld.exe文件的输入表,可以看见在输入表的结尾处紧跟着的是一串数据,并且大概率不是无用的数据,若我们直接在输入表结尾处添加新的IID结构必定会破坏原文件的结构,导致程序无法正常运行。

因此选择在找空白处,因为PE文件需要对齐,因此会使用大量的空字符进行填充。空白区域可以任取,但是需要记住选取的地址因为后续需要用到。并且我们需要观察该空白区域是否会被载入到内存中去。我们这里选择的是idata段末尾位置,因此需要去查询idata段信息。

如下图所示,文件中idata段的大小比映射到内存中的大小更大,因此我们可以利用这段差值填充伪造输入表。这里选择文件偏移0x8960作为输入表的起始地址。不能将0x8950作为其实地址,这样KERNEL32.DLL字符串会缺失截断符,运行时会提示找不到该DLL文件。

首先将原输入表的数据复制下来,写入文件偏移0x8960处,新增一个IID结构,Name字段填入DLL文件的名字,即show.dll,而OriginalFirstThunkFirstThunk字段填入填入IMAGE_IMPORT_BY_NAME结构体的地址,IMAGE_IMPORT_BY_NAME的内容填入输入函数的名称,并且高两个字节需要为0。这里所有填入的地址都为RVA地址,因此需要将文件地址转化为RVA地址填入。

接着需要改写idata的权限,前面说到FirstThunk在PE文件运行后是会被改写的,因此输入表所在的区段需要具有写权限。可以看到idata不具备写权限,因此需要将写权限加上。

0x80000000为写权限的标志位,因此将原来的数据或上0x80000000即可

修改后为0xC0000000


最后由于修改了输入表结构以及所在地址并且新增了一个IID结构因此需要去数据目录项的位置修改输入表的地址及大小。

使用PEView工具查看修改后的文件,能够发现修改后的文件使用工具依然能够识别出来,证明没有把文件修坏。

最后执行程序,发现show.dll文件成功注入

参考文章

  • 加密与解密

  • 逆向工程的核心原理

. . .

相关推荐

额外说明

面试简历的最后一道坎,实战项目经验详解(附web实战项目)

日常猫猫缓解气氛 说起面试,实战项目经验一定是面试官问的重中之重,原因无外乎以下几点 一、面试官问项目经验的目的 通过你做的项目来判断你的专业技能、资历段位、成绩表现与简历或自我介绍中描述的是否一致; 通过你对项目细节的描述,看看你是否能够独当一面,是否

额外说明

公司测试用例不够规范,直到新任测试总监的这份《软件测试规范》

测试用例(Test Case)是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。 测试用例入用例库前一般都要检查一下规范性,之前因为测试任务重

额外说明

css样式常用知识整理

CSS 速查 font CSS 外边距 —— 围绕在元素边框的空白区域 # linear-gradient() ——创建一个线性渐变的 "图像" # transform ——旋转 元素![在这里插入图片描述](https://img-blog.csdni

额外说明

Ansible安装zabbix-agent2;Zabbix6监控docker。

背景 使用ansible最终目标都是形成ansible-playbook和playbook脚本便于批量配置管理目标服务器群。 但在写脚本之前通常需要快速验证各个steps的是否正常可用,每次在ide工具中修改playbook经过上传、执行等几个步骤都比较

额外说明

node对上传表单的密码进行加密

1.导入生成Token的包 npm i [email protected] 2.导入jsonwebtoken // bcryptjs是一种密码哈希函数,它使用加密算法生成哈希值 const bcrypt = require("bcryptjs"); 3.使用方

额外说明

VC++获取Widnows操作系统版本(附源码)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新.

额外说明

C++数据类型本质

参考: https://blog.csdn.net/shulianghan/article/details/121412325 数据类型本质 ( 数据类型 | 数据类型本质 | 数组地址 | 数组首元素地址 )

额外说明

CSDN是怎么实现用户签到,统计签到次数,连续签到天数等功能微服务的

文章目录 需求分析 设计思路 用户签到和统计连续签到的次数 签到控制层 SignController 签到业务逻辑层 SignService 测试 按月统计用户签到的次数 签到控制层 SignController 签到业务逻辑层 SignService

额外说明

js json转字符串

js中JSON数据转换成字符串,可以使用JSON.stringify()方法。 var obj = {name: "张三", age: 18, gender: "男"}; var jsonString = JSON.stringify(obj); con

额外说明

【MySQL优化】慢SQL优化快速入门

MySQL 学习视频:https://www.bilibili.com/video/BV1es411u7we 本笔记基于视频中的MySQL5.5版本,已经完整总结。 B+树结构(二叉排序树) 编写、解析过程 索引 SQL优化,主要优化索引 索引:相当于一

ads via 小工具