免杀笔记 ---> PE

本来是想先把Shellcode Loader给更新了的,但是涉及到一些PE相关的知识,所以就先把PE给更了,后面再把Shellcode Loader 给补上。

声明:本文章内容来自于B站小甲鱼

1.PE的结构

首先我们要讲一个PE文件,就得知道它的结构,可以参考下面的这张照片

2.DOS头部

首先一个PE文件,就是它的DOS结构。 其中,需要我们去了解的,就是一开始的那个DOS标记以及我们执行的PE文件头

那么我们随便打开一个EXE来看一下。我门可以看见标志性的MZ

然后我们直接定位到3C这个位置,这里指向PE文件的头(写死的)  

可以看见在这个PE文件中,它的PE开始是在80这个位置

于是我们就去到80这个位置

3.IMAGE_NT_HEADERS

1.Signature

这个字段,是用来标志着这是一个真正的PE文件,从上面,我们跳到了这里,就能看见我们的Signature标识字段。

2.IMAGE_FILE_HEADER

这个结构如下

其中重要的,就是SizeOfOptionalHeader这个值,这个就决定了后面的IMAGE_OPTIONAL_HEADER32的大小

3.IMAGE_OPTIONAL_HEADER32

其中一些比较重要的结构

  • AddressOfEntryPoint 程序执行入口RVA  在偏移值为28的地方 

我们去那个偏移位置找一找(相对于PE头的偏移)DWORD类型 ,指向的是我们的14C

  • ImageBase

  • SectionAlignment和FileAlignment字段

其中FileAlignment默认是200,我们自己去PE文件找找是不是这么回事(它的偏移地址是3C)

而且他是DWORD类型,四个字节,我们在对应的地方确实是能看到是200!! 

  • DataDirectory(数组)

其实可以这样子理解  他定义了一个长度为16的数组,然后数组的每一个元素都是一个结构,这个结构里面都存储了两个元素,一个就是数据的起始RVA,另外一个就是数据块的长度

数组中的有些元素十分的重要(导入表,导出表,资源,重定位表,IAT表

当我们需要寻找特定的资源的时候,我们就可以去找到这个数组的第三个元素,获取到对应的RVA以及长度,当我们要查看PE文件导入了哪些DLL的API的时候,我们就可以去导入表里面获取RVA(Relative Virtual Address)和长度!!!!  

4.区块

接下来就是块表,首先他是这么一个结构

然后,我们来看name,像这种以.开头的(当然这个.不是必须的)

接下来就是相应的一些结构,比较重要一点的就是PointerToRawData 和 SizeOfRawData ,通过这两个,我们就能找到下一个块表的位置

除此,还有一个比较重要,这个标定了该区块的属性!!!

最后的判断,是通过存在的属性进行OR的操作判断的,比如我们看到它的characteristic是6000000的话,我们就知道是通过20(Code) OR 20000000(Execute) OR 40000000(Read) == (60000020)  这样就能判断这个对应的属性

对于区块,一般都有以下的类型

然后就是区块的对对齐

RVA

相对虚拟地址

目标RVA和文件偏移的计算

在处理PE文件的时候,任何的RVA必须经过文件的偏移的换算,才能用来定位并访问文件中的数据。

  1. 首先,我们要循环扫描每个区块在内存中的起始RVA,并且根据区块的大小,算出区块的结束RVA,判断目标的RVA是否落在该区块内
  2. 然后通过获取到了目标区块之后,用目标RVA减去起始的RVA,这样就得到了目标RVA相对于起始地址的偏移量RVA2
  3. 最后,根据该区块表在文件中所处的偏移地址,将这个值加上RV2,就得到了文件的偏移地址!!!

假设我们有一个虚拟地址666666,那么我们就要去区块中查找

通过定位,我们可以发现他在.reloc这个区块中

那么RVA2 = 666666 - 66000 = 666,然后我们看到这个区块在文件中的偏移地址在60E00

所以我们这个虚拟地址在物理内存中的地址就是60E00 + 666 = 61466 

5.导入表

说到导入表,我们肯定不会陌生,我们在一开始的PE头中,就讲过一个IMAGE_OPTIONAL_HEADER里面有一个特别重要的DataDirectory这个地方,里面放着我们的导入表!!!!

其中的第二个成员就是导入表,如果我们跳转到它的RVA之后,我们就能看见一个以IMAGE_IMPORT_DESCRIPTOR(简称IID)的数组开始的,每一个被加载进来的DLL文件都分别对应一个IID数组结构,当我们看到一个IID全为0的时候,就代表结束!!!!


对于每一个IID,它的结构如下:

它的长度为5个DWORD,其中重要的两个就是我们的FirstTrunk 和 OriginalFirstTrunk

6.IAT &&  IMAGE_IMPORT_BY_NAME

终于,我们学免杀要学的IAT表终于要出现了!!!!  不过在此之前,我们先来看一张图片

其中能看见IID的第一个DWORD OriginalFirstTrunk指向了INT表的IMAGE_THUNK_DATA

然后DWORD FirstThunk 指向了IAT表中的IMAGE_THUNK_DATA ,并且这两个都指向了IMAGE_IMPORT_BY_NAME这个表

其中,对于我们的IMAGE_THUNK_DATA

然后就是IMAGE_IMPORT_BY_NAME

IAT(Import Address Table)导入地址表

那么下面,我们就来举个栗子演示一下:

首先我们来找一个程序,直接看他的DataDirectory中的导入表的地址

然后定位到块中的 .idata中

我们可以追踪到之后发现它存在两个IID,即调用了两个动态连接库

并且我们去查看第一个IID的Original_First_Thunk,指向的是INT表中的IMAGE_THUNK_DATA,并且这个值是2A15C,但是这是一个RVA,所以我们要找到它的实际偏移我们用这个RVA减去.idata块的RVA 得到的RVA2再加上Raw Data offs 就是我们的实际偏移地址,2815C

然后又找到一个02A2DC ,我们在上面说过,如果开头是0的话,它的值是RVA,指向一个IMAGE_IMPORT_BY_NAME,所以,我们就还要去找282DC这个地方

这样,我们就找到了我们的真正的函数的地址(在此期间指针指向了两次),来看这么一个图(第一个盒子里面是ORIGINAL_FIRST_THUNK一开始写错了)

那么刚才我们讲了通过OriginalFirstThunk找,那么现在我们通过FirstThunk查找

首先还是找到iid中的FirstThunk,然后转换为实际偏移地址就是282AC

然后我们就去282AC,找到指向的实际偏移地址是282DC

然后再去282DC处找,发现282dc处也能找到我们的这个函数的真实位置

过程如下

然后我们去让这个程序运行起来,并且将他的内存dump出来,然后再去跟踪它的导入表

这时候我们再去跟踪IAT表,282AC这个部分。终于,我们就找到了这个函数的真正的地址

这时候,我们的IAT表就是这样的了(在内存中,IAT表不在需要通过名字索引,而是通过地址了)

然后本次的PE文件就到这了,当然了PE文件远不止这些,导入表,重定位表,资源等等,当日后在免杀中用到的时候,我们再相应进行更新。

下一篇Blog,我们就会更新对应的Shellcode Loader了!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/771821.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之备份与恢复(四)

备份与恢复 存储引擎和一致性 3.复制 从备库中备份最大的好处是可以不干扰主库,避免在主库上增加额外的负载。这是一个建立备库的好理由,即使不需要用它做负载均衡或高可用。如果钱是个问题,也可以把备份用的备库用于其他用户,…

​香橙派AIpro测评:usb鱼眼摄像头的Camera图像获取

一、前言 近期收到了一块受到业界人士关注的开发板"香橙派AIpro",因为这块板子具有极高的性价比,同时还可以兼容ubuntu、安卓等多种操作系统,今天博主便要在一块832g的香橙派AI香橙派AIpro进行YoloV5s算法的部署并使用一个外接的鱼眼USB摄像头…

小龙虾优化24种机器学习多输入单输出回归|时序预测模型

小龙虾优化24种机器学习多输入单输出回归|时序预测模型 文章目录 小龙虾优化24种机器学习多输入单输出回归|时序预测模型前言一、小龙虾优化基本原理二、优化机器学习模型1.COA-CNN-BiGRU-Attention回归模型2.基于小龙虾优化支持向量机的数据回归预测Matlab程序COA-SVM 多特征输…

Android EditText的属性与用法

EditText 是编辑框控件,可以接收用户输入,并在程序中对用户输入进行处理。EditText在App里随处可见,在进行搜索、聊天、拨号等需要输入信息的场合,都可以使用 EditText。 图1 编辑框示意图 EditText 是TextView的子类&#xff0c…

sql语句练习注意点

1、时间可以进行排序,也可以用聚合函数对时间求最大值max(时间) 例如下面的例子:取最晚入职的人,那就是将入职时间倒序排序,然后limit 1 表: 场景:查找最晚入职员工的所有信息 se…

【unity实战】使用Unity实现动作游戏的攻击 连击 轻重攻击和打击感

最终效果 文章目录 最终效果前言素材下载:玩家移动跳跃控制攻击动画配置轻攻击重攻击 攻击时禁止移动和攻击移动补偿敌人击退和播放受击动画受击特效攻击停顿和屏幕震动局部顿帧(补充)参考源码完结 前言 注意本文为自己的学习记录笔记&#…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 (Windows 系统日志) 七牛Logkit (Windows&Linux&Mac 等) -…

WCCI 2024第三弹:忍者表演惊艳全场,盛大晚宴不容错过

WCCI 2024第三弹:忍者表演惊艳全场,盛大晚宴不容错过! 会议之眼 快讯 会议介绍 IEEE WCCI(World Congress on Computational Intelligence)2024,即2024年IEEE世界计算智能大会,于6月30日至7月…

React@16.x(47)路由v5.x(12)源码(4)- 实现 Route

目录 1&#xff0c;原生 Route 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Route 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route } from "react-router-dom"; function News() {return <div>News</div>; }func…

使用SSE实现echarts数据实时更新

区别 SSE 和 WebSocket 原理和实现方式的区别 SSE( Server-Sent Events) SSE 是基于传统的 HTTP 协议实现的&#xff0c;采用了长轮询&#xff08;long-polling&#xff09;机制。客户端通过向服务器发送一个 HTTP 请求&#xff0c;服务器保持连接打开并周期性地向客户端发送…

NoSQL之Redis高可用与优化

一、Redis高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证…

Android adb logcat日志过滤输出

Android adb logcat日志过滤输出 adb logcat 输出所有Android设备上的日志。 adb logcat *:Error 过滤输出日志级别只为Error的日志。 过滤某些标签或tag&#xff0c;依次执行: adb shell logcat grep | "你的标签或tag" Android Studio level过滤查看各个等级的日志…

Oracle连接mysql

oracle使用的11g&#xff0c;在一台windows服务器&#xff1b;mysql使用的是5.7版本&#xff0c;在另一台windows服务器&#xff0c;这两个服务器之间的网络是互通的。做BI时&#xff0c;要获取不同数据源的数据&#xff0c;这些数据源可能是Oracle&#xff0c;也可能是sqlserv…

股票分析-20240628

今日关注&#xff1a; 20240626 六日涨幅最大: ------1--------300386--------- 飞天诚信 五日涨幅最大: ------1--------300386--------- 飞天诚信 四日涨幅最大: ------1--------300386--------- 飞天诚信 三日涨幅最大: ------1--------300386--------- 飞天诚信 二日涨幅最…

【pytorch14】感知机

单层感知机模型 对于单层的感知机&#xff0c;它的激活函数是一个sigmoid 对于符号的定义做一个规范化&#xff0c;输入层每一层进行一个编号 输入是第0层&#xff0c;上标0表示属于输入层&#xff0c;下标0到n表示一共有n个节点(这里严格来说应该是0~n-1&#xff0c;为了书写…

Zoom使用的基本步骤和注意事项

Zoom是一款功能强大的视频会议软件&#xff0c;广泛应用于远程办公、在线教育、团队协作等多个场景。以下是Zoom使用的基本步骤和注意事项&#xff1a; 一、注册与登录 注册Zoom账户&#xff1a; 访问Zoom官方网站&#xff08;如zoom.us&#xff09;&#xff0c;点击“注册”…

Games101学习笔记 Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing)

Lecture16 Ray Tracing 4 (Monte Carlo Path Tracing 一、蒙特卡洛积分 Monte Carlo Integration二、路径追踪 Path tracing1.Whitted-Style Ray Tracings Problems2.只考虑直接光照时3.考虑全局光照①考虑物体的反射光②俄罗斯轮盘赌 RR &#xff08;得到正确shade函数&#x…

精准畜牧业:多维传感监测及分析动物采食行为

全球畜牧业呈现出一个动态且复杂的挑战。近几十年来&#xff0c;它根据对动物产品需求的演变进行了适应&#xff0c;动物生产系统需要提高其效率和环境可持续性。在不同的畜牧系统中有效行动取决于科学技术的进步&#xff0c;这允许增加照顾动物健康和福祉的数量。精准畜牧业技…

JavaScript-WebAPI

文章目录 JS组成什么是 webApis 和APIDOM 简介document 对象 获取 DOM 对象利用css选择器来获取DOM元素选择指定css选择器的所有元素其他获取DOM元素方法&#xff08;了解&#xff09; 操作元素内容对象.innerText对象.innerHTML 操作元素属性操作元素常用属性操作元素样式属性…

pytorch中的contiguous()

官方文档&#xff1a;https://pytorch.org/docs/stable/generated/torch.Tensor.contiguous.html 其描述contiguous为&#xff1a; Returns a contiguous in memory tensor containing the same data as self tensor. If self tensor is already in the specified memory forma…