免杀笔记 ---> PE

news2024/11/19 20:19:59

本来是想先把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.coloradmin.cn/o/1896310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Appium+python自动化(四十二)- 寿终正寝完结篇 - 结尾有惊喜,过时不候(超详解)

1.简介 按照上一篇的计划,今天给小伙伴们分享执行测试用例,生成测试报告,以及自动化平台。今天这篇分享讲解完。Appium自动化测试框架就要告一段落了。 2.执行测试用例&报告生成 测试报告,宏哥已经讲解了testng、HTMLTestRun…

springboot整合Camunda实现业务

1.bean实现 业务 1.画流程图 系统任务,实现方式 2.定义bean package com.jmj.camunda7test.process.config;import lombok.extern.slf4j.Slf4j; import org.camunda.bpm.engine.TaskService; import org.camunda.bpm.engine.delegate.JavaDelegate; import org.…

开源大模型和闭源大模型,打法有何区别?

现阶段,各个公司都有自己的大模型产品,有的甚至不止一个。除了小部分开源外,大部分都选择了闭源。那么,头部开源模型厂商选择开源是出于怎样的初衷和考虑?未来大模型将如何发展?我们来看看本文的分享。 在对…

Hi3861 OpenHarmony嵌入式应用入门--SNTP

sntp(Simple Network Time Protocol)是一种网络时间协议,它是NTP(Network Time Protocol)的一个简化版本。 本项目是从LwIP中抽取的SNTP代码; Hi3861 SDK中已经包含了一份预编译的lwip,但没有…

基于布雷格曼偏差校正技术的全变分一维时间序列信号降噪方法(MATLAB R2018A)

信号降噪是信号处理的重要步骤之一,目的是提高所获得信号数据的质量,以达到更高的定性和定量分析精度。信号降噪能提升信号处理其他环节的性能和人们对信息识别的准确率,给信号处理工作提供更可靠的保证。信号降噪的难点是降低噪声的同时也会…

如何压缩视频大小,怎么压缩视频

随着科技的进步,我们拍摄的视频质量越来越高。然而,视频带来的一个问题是文件体积巨大,这不仅占用大量存储空间,而且在传输和分享时也造成了不小的困扰。别担心,本文将为你详细介绍几种实用的视频压缩方法,…

xmind2testcase工具将测试用例从Xmind转为CSV导入禅道

使用xmind编写测试用例,使用xmind2testcase工具将测试用例从Xmind转为CSV导入禅道,便于管理。 1.工具准备 第一步:安装python 第二步:安装xmind2testcase工具 运行-cmd-打开命令提示符弹窗,输入安装命令 安装命令&…

粉丝问:教育机构首页UI,安排

教育机构的首页UI应该展现以下内容: 机构简介:在首页上展示教育机构的简介和核心价值观,包括机构的使命、愿景和教育理念。这有助于让访问者了解机构的背景和宗旨。课程和项目:展示机构提供的课程和项目,包括学科课程…

AGI|Transformer自注意力机制超全扫盲攻略,建议收藏!

一、前言 2017年,谷歌团队推出一篇神经网络的论文,首次提出将“自注意力”机制引入深度学习中,这一机制可以根据输入数据各部分重要性的不同而分配不同的权重。当ChatGPT震惊世人时,Transformer也随之进入大众视野。一夜之间&…

PMP--知识卡片--波士顿矩阵

文章目录 记忆黑话概念作用图示 记忆 一说到波士顿就联想到波士顿龙虾,所以波士顿矩阵跟动物有关,狗,牛。 黑话 你公司的现金牛业务,正在逐渐变成瘦狗,应尽快采取收割策略;问题业务的储备太少&#xff0…

测量和检测二合一的劳易测解决方案

劳易测ODT3CL系列是一款基于TOF原理的具有测量功能的传感器。它具有很好的检测性能,能够非常可靠的检测亮色、深色以及高反光的物体。ODT 3CL系列的检测距离可达2000毫米,在量程范围内对目标物体的颜色检测不敏感,检测距离稳定输出。 针对工业…

浅析基于量子成像的下一代甚高灵敏度图像传感器技术

高灵敏度探测成像是空间遥感应用中的一个重要技术领域,如全天时对地观测、空间暗弱目标跟踪识别等应用,对于甚高灵敏度图像传感器的需求日益强烈。随着固态图像传感器技术水平的不断提高,尤其背照式及埋沟道等工艺的突破,使得固态…

相机光学(二十四)——CRA角度

CRA角度 0.参考资料1.什么是CRA角度2.为什么 CRA 会导致luma shading3.为什么 CRA 会导致color shading4.CRA相差过大的具体表现5.CRA Matching6.怎样选择sensor的CRA 0.参考资料 1.芯片CRA角度与镜头的匹配关系(一)   2.芯片CRA角度与镜头选型的匹配关…

谷粒商城学习-07-虚拟机网络设置

文章目录 一,找到配置文件Vagrantfile二,查询虚拟机网卡地址1,查看虚拟机网络配置2,查看宿主机网络配置 三,修改配置文件下的IP配置四,重新启动虚拟机即可生效五,Vagrantfile 的作用1&#xff0…

护眼落地灯哪个牌子好?盘点五款必入不踩雷的护眼大路灯

护眼落地灯哪个牌子好?在这个快节奏的时代,护眼落地灯已经从一种高端选择转变为日常用眼生活中的必须品。不论是提升普通照明,还是针对孩子学习是改善光线质量环境,一款优秀的护眼落地灯都能成为我们生活中的照明神器。怎么选择一…

QT+OpenCV在Android上实现人脸实时检测与目标检测

一、功能介绍 在当今的移动应用领域,随着技术的飞速发展和智能设备的普及,将先进的计算机视觉技术集成到移动平台,特别是Android系统中,已成为提升用户体验、拓展应用功能的关键。其中,目标检测与人脸识别作为计算机视…

固相提取铕和铀

固相萃取(Solid Phase Extraction,SPE)是一种常用的化学分离技术,它利用固体吸附剂(固定相)与样品中的目标化合物(流动相)之间的相互作用力,将目标化合物从样品中分离出来…

【数据结构】(C语言):堆(二叉树的应用)

堆: 此处堆为二叉树的应用,不是计算机中用于管理动态内存的堆。形状是完全二叉树。堆分两种:最大堆,最小堆。最大堆:每个节点比子树所有节点的数值都大,根节点为最大值。最小堆:每个节点比子树…

推动高效能:东芝TB67H301FTG全桥直流电机驱动IC

在如今高度自动化的时代,电子产品的性能和效率成为了工程师们关注的焦点。东芝的TB67H301FTG全桥直流电机驱动IC应运而生,以其卓越的技术和可靠性,成为众多应用的理想选择。无论是在机器人、家用电器、工业自动化,还是在其他需要精…

面试篇-系统设计题总结

这里记录一些有趣的系统设计类的题目,一般大家比较喜欢出的设计类面试题目会和高可用系统相关比如秒杀和抢红包等。欢迎大家在评论中评论自己遇到的题目,本篇文章会持续更新。 1、设计一个抢红包系统 抢红包系统其实也是秒杀类中的一个场景&#xff0…