当前位置: 首页 > news >正文

4.25~~~~~

接着之前PE文件结构的预习

DOS 定位到NT 怎么操作的?

用的是e_lfanew,然后是相对于文件头的偏移量(也就是raw表示方法)

现在有个问题,为什么e_lfanew 这个变量不直接存储PE头 的绝对地址呢?

比如说,某样本,PE头偏移 是0x100,而且编译器在组合PE文件的时候也是可以知道PE头的绝对偏移的

换个问法,基址 + 偏移的方式的好处是什么?

基址 + 偏移的方式,最直接的好处就是不用管基址前面是什么东西
这种基址 + 偏移的方式,在Shellcode 的代码定位,包括汇编Opcode 中会大量的应用
在学习的汇编语言中,理解过段地址+偏移地址得到物理地址,这里的基址就是所谓的段地址吗,如果是的话,在8086CPU(16位架构中)只是因为
(1)运算器一次最多可以处理16位的数据;
(2)寄存器的最大宽度为16位;
(3)寄存器和运算器之间的通路为16位,8086除此之外8086CUP有20位地址总线,可以传送20位地址,达到1MB的寻址能力,所以用段地址和偏移地址
上面这个就是最典型的 基址 + 偏移的一个应用场景
这个地址计算方式,在操作系统的中很多地方,都存在,灵活性非常高
包括写攻击代码的时候,需要用到一些关联对象,或者关联内存的时候,整个 基址 + 偏移的表 就能完成寻址对象存取的工作

可以想象一下,PE文件,加载到内存后,绝对地址 也就是绝对偏移,是否还会有效?

我们可以看一条指令:.text:100035C2 E8 29 FF FF FF call sub_100034F0
该条指令的OPCODE E8 29 FF FF FF
E8为指令CALL的操作码, 后面的 FFFFFF29 就是这个代码地址距离该条指令的相对偏移
FFFFFF29 这个值是正数 还是 负数?
负数
E8 30 09 00 00 call sub_10003EC0 再看这条 CALL
后面的代码相对地址 偏移 00000930 就是正数
跳转到,该条地址 距离0x930个字节的位置

e_lfanew 的地址 到 PE 头地址 之间的内容是什么?

这块区域除了,提示语之外,还有一些其他的东西,而且在WIN32下,几乎就是一块真空地带
可以藏,代码,感染型病毒的感染标记,或者加密后的数据等等

第三个问题:X86 和 X64 PE 怎么区分?

比如我给你一个PE, 你把通过NT头大小判断PE X86 或者 X64的算法简单描述一下
1、读取PE到内存,使用DOS 头解析,得到NT头的位置
2、如何比较NT头第二部分的大小
通过代码的角度如何 完成 比较NT 头第二部分的大小
首先要明确一点,从文件中读出来的,只是一块数据内存
你使用32位NT头 ,或者64位NT头 去解析,都可以得到各个部分的值
在一个数据块,中只有明确知道数据边界才可能进行大小计算之类的操作
通过代码角度去实现,而不是人肉去看
目前的任务,我是给你一个PE文件
你怎么知道这个PE文件是32位,还是64位
是不是读到内存之后,需要用相关的结构去解析这块内存,从而拿到里面的值?
那你怎么知道是用32位的结构是对的,还是64位的结构是对的
只要不越界,所有的结构,套上去都有值
只不过这个值是否非法,有些是有校验难度的
其实通过 内存值,去判断差异是比较简单的,比如某个偏移 byte == xxx

所以最好的方式
NT头中的一个部分,如果值为0x014c就是 X86,值为0x8664就是X64
先从dos头读pe头,pe头读IMAGE_OPTIONAL_HEADER,再读Magic
IMAGE_FILE_HEADER结构体中的Machine

if (imageNtHeaders.FileHeader.Machine == IMAGE_FILE_MACHINE_I386){return 32;}if (imageNtHeaders.FileHeader.Machine == IMAGE_FILE_MACHINE_IA64 ||imageNtHeaders.FileHeader.Machine == IMAGE_FILE_MACHINE_AMD64){return 64;}

machine 是X86 Magic 必须也是X86 才能保证 这个PE ,能正常加载
而且,可选头里面包含 PE 加载器用到的很多参数
在这里插入图片描述
PE 加载器,会根据这些信息,去实际初始化进程中的可执行模块的内存布局

如果修改这些值之后,能不能大小,减少程序运行内存的目的?或者产生,程序运行异常等问题?

要记得,所有能影响加载器 的参数,都有可能被利用,至于干好事还是坏事,看你们的需求了
各种各样类型的文件:PDF,PE,ELF,DOC,XLS,JPG,BMP,ICO等等,都是有结构成员能影响该类文件的加载器的
攻击方,或者防守方,对于内存这块能怎么玩?
所有的程序或者系统,正常运行的前提是资源足够的情况下,那么在极端资源的情况下,不稳定的代码就会出现很多
比如,漏洞攻击中的,堆喷,就是通过不停的申请大量的内存,以求达到特定的内存布局,从而搞事情
除了内存申请,其实在文件加载的时候,也可以影响系统的内存资源
其实逻辑很简单,只要能影响系统资源的东西,就能作为备用的一个点

上面大部分内容在预习部分其实已经解决了
细看
https://blog.csdn.net/m0_72827793/article/details/130231662

下节课内从

通过代码,调试 RUNPE 源码,体会一下,PE 加载的过程
https://github.com/aaaddress1/RunPE-In-Memory

http://www.lryc.cn/news/62195.html

相关文章:

  • Android 9.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能
  • Python数据结构与算法-欧几里算法(p95)
  • 【故障诊断】用于轴承故障诊断的性能增强时变形态滤波方法及用于轴承断层特征提取的增强数学形态算子研究(Matlab代码实现)
  • 水羊转债,超达转债,晓鸣转债上市价格预测
  • 从数据管理到数据资产管理
  • RabbitMQ【#1】是什么,有什么用
  • RabbitMQ防止消息丢失
  • ImageJ用户手册——第二部分(ImageJ操作)
  • Java中Lambda表达式(面向初学者)
  • 2023年淮阴工学院五年一贯制专转本数字电子技术考试大纲
  • 使用 GO 编写 Web 应用:学习如何使用 GO 语言编写 Web 应用,包括使用 HTTP 路由、模板引擎等。
  • Leetcode-day4【88】【167】【125】【345】
  • 【IoT】如何使用软件加密(文件夹加密工具.exe),并破解工具
  • Spring Boot——优雅的参数校验
  • 【c语言】typedef的基本用法 | 定义格式
  • 深度学习论文分享(二)Data-driven Feature Tracking for Event Cameras
  • 蛇优化算法
  • 循环神经网络(RNN)简单介绍—包括TF和PyTorch源码,并给出详细注释
  • Struts2 快速入门
  • 关于PullToRefreshView下拉刷新失效问题
  • JAVA开发中的六大原则
  • Matplotlib 安装
  • CF - Li Hua and Pattern
  • 重磅!阿里云云原生合作伙伴计划全新升级:加码核心权益,与伙伴共赢新未来
  • OSCP-Escape(gif绕过)
  • iMazing2023最新免费版iOS设备管理软件
  • Git上传文件代码到GitHub
  • JavaScript概述二(Date+正则表达式+Math+函数+面向对象)
  • 一个朋友弄来的,太牛了,特别是后面内容,不看不知道,一看吓一跳,电话,热线
  • VGA协议实践