4.13~4.17(PE文件结构预习+hook+进程hellow)

news2025/1/23 17:48:56

常见PE文件结构

常见的PE文件:exe、dll、sys
Ag:
在这里插入图片描述
exe就不用多说,就是可执行文件
dll动态链接库
对于 Windows 操作系统,操作系统的大部分功能都由 DLL 提供
(https://learn.microsoft.com/zh-cn/troubleshoot/windows-client/deployment/dynamic-link-library#%E6%A6%82%E8%A7%88)
sys是system的缩写,就是系统的意思,sys是Windows的系统文件
如安装文件,日志文件,驱动文件,备份文件,操作如播放等文件,还有些垃圾文件等诸如此类

PE指纹

标志MZ、PE
用010编辑器我们观察一下
在这里插入图片描述

在这里插入图片描述
有什么用呢?
若果我改了文件扩展名(木马),但是其中的本质没有变
当然也可以用PEiD工具查看

PE文件结构

在这里插入图片描述
在这里插入图片描述从上面着两张图,我们对比上面010编辑区的图
从PE往下,就会看到块的部分
常见的区段
,text段。一般是代码段
.data段。一般是数据段
.bss段。未初始化数据段。比如static变量,有时在函数内才初始化。
.idata和.edata段。导入表、导出表信息
.rsrc段。资源段
.reloc段。重定位信息段。
理解成容器,从汇编语言角度可以理解,我们知道用编写的程序是可以直接在CPU上工作的,而一个程序是需要代码段,数据段,栈段,同样可以放在这里理解

winnt.h

https://learn.microsoft.com/zh-cn/windows/win32/api/winnt/

DOS部分
DOS MZ文件头(实际是一个64字节的IMAGE_DOS_HEADER结构体)
如何确定是64字节?
在这里插入图片描述PE文件头的起始地方由DOS MZ文件头中的内容确定

在这里插入图片描述
e_lfanew指向PE文件头的地址
看到010编辑器的图片,我们可以看到最后四个字节,就是地址
注意在汇编指令中,存储的方式是从高字节到低字节读取
DOS块链接器的信息(可以用来隐藏信息)

PE文件头

在这里插入图片描述
从代码层面看,方便我们就看32的

typedef struct _IMAGE_NT_HEADERS {
  DWORD                   Signature;标识
  IMAGE_FILE_HEADER       FileHeader;标准PE头20个字节
  IMAGE_OPTIONAL_HEADER32 OptionalHeader;扩展PE头224个字节
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

在这里插入图片描述
为什么扩展PE文件头这么大?
在这里插入图片描述
IMAGE FILE HEADER
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
TimeDateStamp:表示文件的创建时间。这个值是自 1970 年1月日以来用格林威治时间GMT厂计算的秒数]是一个比文件系统的日期/时间更精确的文件创建时间指示器。
PointerToSymbolTable:COFF 符号表的文件偏位置(参见 Microsof 规范的5.4节)。因为采用了较新的debug格式,所以COFF 符号表在 PE 文件中较为少见
Number0fSymhols:如果有 COFF 符号表,它代表其中的符号数目
Size0f0ptionalHeader:
紧跟IMAGE_FILE_HEADER,表示数据的大小。在 PE 文件中,这个数据结构叫作IMAGE OPTIONAL HEADER,其大小依赖于当前文件是32 位还是64位文件
Characterislics:文件属性,有选择地通过几个值的运算得到。这些标志的有效值是定义于winnth 内的IMAGE_FILE_xx 值,。警通 EXE 文的这个字的值一般是010fh.DLL 文件的这个字段的值一般是 2102h

在这里插入图片描述

把值转换位二进制对应到上面的表中

扩展PE文件头

typedef struct _IMAGE_OPTIONAL_HEADER {
  WORD                 Magic;/说明文件的类型 PE32 : 10BH PE32+(64): 20BH Rom映像文件:107H
  BYTE                 MajorLinkerVersion;/链接器主版本号
  BYTE                 MinorLinkerVersion;/链接器次版本号
  DWORD                SizeOfCode;/所有代码节的总和( 基于文件对齐 ) 译填的 没用
  DWORD                SizeOfInitializedData;/包含所有已经初始化数据的节的总大小 编译器填的 没用
  DWORD                SizeOfUninitializedData;/包含未初始化数据的节的总大小 编译器填的 没用
  DWORD                AddressOfEntryPoint;/程序入口RVA、在大多数可执行文件中,这个地址不直接指向Main、WinMain或DIMain函数,而指向运行时的库代码并由它来调用上述函数
  DWORD                BaseOfCode;/代码起始RVA,编译器填的 没用
  DWORD                BaseOfData;/数据段起始RVA,译器填的 没用
   NT additional fields.
  DWORD                ImageBase;/内存镜像基址,可链接时自己设置
  DWORD                SectionAlignment;/内存对齐,一般一页大小4k
  DWORD                FileAlignment;/文件对齐,一般一区大小512字节,现在也多4k
  WORD                 MajorOperatingSystemVersion;/标识操作系统版本号 主版本号
  WORD                 MinorOperatingSystemVersion;/标识操作系统版本号 次版本号
  WORD                 MajorImageVersion;/PE文件自身的主版本号
  WORD                 MinorImageVersion;/PE文件自身的次版本号
  WORD                 MajorSubsystemVersion;/运行所需子系统主版本号
  WORD                 MinorSubsystemVersion;/运行所需子系统次版本号
  DWORD                Win32VersionValue;/子系统版本的值,必须为0
  DWORD                SizeOfImage;/内存中整个PE文件的映射的尺寸,可以比实际的值大,必须是SectionAlignment的整数倍
  DWORD                SizeOfHeaders;/所有头+节表按照文件对齐后的大小,否则加载会出指
  DWORD                CheckSum;/校验和,一些系统文件有要求用来判断文件是否被修改
  WORD                 Subsystem;/子系统 驱动程序(1) 图形界面(2) 控制台、DUL(3)
  WORD                 DllCharacteristics;/文件特性 不是针对DLL文件的
  DWORD                SizeOfStackReserve;/初始化时保留的栈大小
  DWORD                SizeOfStackCommit;/初始化时实际提交的大小
  DWORD                SizeOfHeapReserve;/初始化时保留的堆大小
  DWORD                SizeOfHeapCommit;/切始化时保留的堆大小
  DWORD                LoaderFlags;
  DWORD                NumberOfRvaAndSizes;/数据目录项数目
  IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];/数据目录表
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

区块表

在这里插入图片描述
在这里插入图片描述
raw:未经加工的;生的;原始的;未制的;未的;自然状态的;未经处理的; 未经分析的; 未经训的;红肿疼的: 工作生的;冷的;真实的
raw offset : 物理地址 ( study pe工中为raw address )
file offset : 文件偏移地址 ( study pe工中为raw address )
当PE文件存储在磁盘中时,某个数据的位置,相对于文件头部的偏移量
文件偏移地址
文件存储在磁盘中时,某个数据的位置,相对于文件头部的偏移量称作文件偏移地址( File Offset )
物理地址( RAW Offset )

头部:模块基地址后面:相对虚拟地址010103虚拟地址 = 头部 + 后面= 模块基地址 + 相对虚拟地址
文件偏移地址
虚拟地址 = 模块基地址 + 对拟地址模块基地址exe常见为0x00400000模块基地址dll常见为0x10000000
模块 : PE文件运行后,内存中的版本称为模块,此时模块基地址也叫模块句柄

overlay的计算方法

overlay是一个pe文件末尾却不属于任何一个pe结构,相当于直接在pe尾部追加的内容,计算方法是用pe文件总大小减去pe文件内部记录的结构大小(另外pe结构总大小也就是overlay的起始点)
使用时,overlay因为不属于标准pe结构的任一部分,所以不会被系统加载,需要自行使用io操作或者文件映射进行读写

rva to raw的计算方法

rva是类似于偏移的存在,只需要用基址+rva就可以

IMAGE_DATA_DIRECTORY IMAGE_SECTION_HEADER

IMAGE_SECTION_HEADER是程序中不同段(如.text)的保存表,保存了段的va、磁盘位置、大小、重定向信息等

pe结构总大小,用pe结构的哪些字段可以算出来?

用IMAGE_SECTION_HEADER里面取pe结构里最后一个段的位置,再加上这个段的大小就可以获得pe结构的总大小

HOOK

钩子
就是拦截技术,在传递指令的信息前,做一个处理
进程hellow就用到了hook的技术
简单理解,就是通过hook,去拿到我们想要执行的函数而不被发现

进程hellow

https://zhuanlan.zhihu.com/p/113957202

上述主要学习于https://www.bilibili.com/video/BV1VT411g7ic/?spm_id_from=333.788&vd_source=c2c3c616b3ad1faf44a9f6f30a4dbb03

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

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

相关文章

三:slab分配器

目录 slab分配器 基本概念 slab分配内存 主要结构体 kmem_cache per cpu freelist slab分配器 基本概念 针对小粒度内存分配 伙伴系统以页4kb为最小分配单位,但对于一些时候,这太大了,会造成严重的内存浪费,产生大量内存碎…

【mac】iterm2通过rz命令往服务器上传文件

需要的资源文件在这里iterm2-zmodem,设置的0积分,如果csdn给调了,点这里下载bak 1、通过命令行打开bin文件夹 cd /usr/local/binopen . 2、把上面下载的俩文件复制进去 3、还是在/usr/local/bin下调整权限 cd /usr/local/binchmod 777 ite…

华为云上云实践:Windows环境下优化云硬盘EVS的创建、挂载和初始化

本文主要讲解华为云云硬盘 EVS 的在 Windows 服务器上创建、挂载及云硬盘初始化等基本操作,快速掌握华为云云硬盘 EVS 操作方法。 文章目录 一、前言二、前期准备:华为云 EVS 采购三、挂载非共享云硬盘 EVS五、初始化云硬盘 EVS 一、前言 华为云 EVS&am…

C嘎嘎~~【初识C++ 上篇】

初识C 上篇 🫅1. C关键字🫅 2.命名空间🤷‍♂️2.1命名空间的定义🤷‍♂️2.2命名空间的使用 🫅 3.C输入 & 输出 转眼间, 就进入C这个新的篇章啦! 我带着些许心悸 和 激动: 心悸…

Wing IDE 解决鼠标悬浮

Wing IDE 解决鼠标悬浮 通过修改文件配置,解决鼠标悬浮没有出现变量值和函数没有自动提示的问题。 配置文件路径查看: 打开该文件夹下的下图配置文件: 添加下图两行配置,然后重启wingide即可。 Wing IDE 常用快捷键 调节字…

【JS】Es6无法注销事件 | class构造函数里无法注销事件解决方法(亲测有效)

错误删除事件 class Goods {addEv() {// 添加mousemove事件// document.addEventListener(mousemove, this.changeEv.bind(document)) //错误一// document.addEventListener(mousemove, this.changeEv) //错误二document.addEventListener(mousemove, this.changeEv.bind(thi…

(数字图像处理MATLAB+Python)第五章图像增强-第一节:图像增强概述和基于灰度级变换的图像增强

文章目录 一:图像增强概述二:基于灰度级变换的图像增强(1)线性灰度级变换A:基本线性灰度级变换B:分段线性灰度级变换①:定义②:截取式灰度变换③:窗切片 (2&a…

【权限维持】LinuxOpenSSHPAM后门SSH软链接公私钥登录

文章目录 权限维持-Linux-替换版本-OpenSSH后门拓展玩法:OpenSSH后门的防范方法 权限维持-Linux-更改验证-SSH-PAM后门配置环境 权限维持-Linux-登录方式-软链接&公私钥&新帐号SSH软链接公私钥后门帐号 参考 权限维持-Linux-替换版本-OpenSSH后门 这里复现…

java 获取时间的方法

Java的时间是通过字节码指令来控制的,所以 java程序的运行时间是通过字节码指令来控制的。但是由于 Java程序在运行时, JVM会产生一些状态,所以在执行 JVM指令时, JVM也会产生一些状态。 我们在执行 java程序时,主要是…

JVM(面试问题简析)学习笔记

文章目录 1. JVM中有哪几块内存区域?Java 8 之后对内存分代做了什么改进?2. 你知道JVM是如何运行起来的吗?堆内存中对象的分配的基本策略?3. 说说 JVM 在哪些情况下会触发垃圾回收?JVM 的年轻代垃圾回收算法&#xff1…

【杂凑算法篇】密码杂凑算法的安全强度

【杂凑算法篇】密码杂凑算法的安全强度 杂凑(哈希)算法安全强度—【蘇小沐】 文章目录 【杂凑算法篇】密码杂凑算法的安全强度(一)安全强度(Security Strength)(二)杂凑算法的安全强度与对比总…

x86汇编

寄存器 常规 AX累加,算术运算或函数返回值存储 基址寄存器(BX),指向数据的指针 计数寄存器CX,移位,循环,一些量 数据寄存器DX,运算超过16位,高16位放在DX 堆栈指针寄存器SP,用于指向…

系统设计访谈-业内人事指南 《System Design Interview-An insider‘s guide》中文版

前言: We are delighted that you have decided to join us in learning the system design interviews. System design interview questions are the most difficult to tackle among all the technical interviews. The questions require the interviewees to de…

(Qt) 重定向内置日志

文章目录 前言代码.pri 独立的包log.priLOG_Config.hppLOG.hLOG.cpp examplelog_test.promain.cpp 使用效果debug模式release模式 分析Qt内部结构核心函数核心配置 END 前言 在软件开发过程中&#xff0c;避免不了日志的使用。 在Qt中&#xff0c;我们平常用的#include <Q…

Django | 解决admin增加新用户只有用户名密码和确认密码的问题

文章目录 如图所示&#xff0c;下面给出解决方案&#xff1a; 如果您使用 使用 Django 默认的后台管理界面添加用户时&#xff0c;只看到了三个字段&#xff08;通常是 username、password和 repassword&#xff09;&#xff0c;那么可以通过定义 add_fieldsets 属性来增加更多…

Jenkins关联GitLab

1、Jenkins、GitLab服务器上面生成公钥、私钥 ssh-keygen -t ecdsa # 回车 指到没有交互式2、GitLab WEB端添加 刚刚生成的公钥 cat ~/.ssh/id_ecdsa.pub # 查看密钥登入gitlab > 右上角头像 > 偏好设置 > SSH秘钥 使用相同方法 添加Jenkins秘钥 3、Jenkins创建一…

Graph push pull

图数据的存储结构 键值对存储因具有可扩展强、结构简单、查找迅速等特点被广泛应用于图查询系统中&#xff0c;如Wukong、Trinity.RDF。在Wukong系统中&#xff0c;图上的边会转换成键值对进行存储&#xff0c;将顶点编号、边的类型、边的方向、值的地址和大小等信息组合成键&…

Bitmap 实现当前在线用户数量

Bitmap是什么&#xff1f; Bitmap是Redis中的一种数据结构&#xff0c;它是一个类似于位数组的数据结构&#xff0c;用于处理位数据。在Redis中&#xff0c;Bitmap是使用字符串来存储的&#xff0c;一个Byte可以存储8个二进制位&#xff0c;一个字符串可以存储232个二进制位&a…

成功解决:NLTK包的安装错误

成功解决NLTK包的安装错误 创建环境NLP_Pre_train l环境 conda create -n NLP_Pre_train python3.8激活 conda activate NLP_Pre_train安装NLTK&#xff0c;套用以下命令 pip install NLTK之后是验证NLTK是否安装成功&#xff0c;采用的步骤如下所示&#xff1a; import n…

认识Java文件操作和IO流

文件操作&#xff08;一&#xff09; 文章目录 文件操作&#xff08;一&#xff09;文件的特性路径文件分类File类的使用文件的创建文件的删除文件创建加目录创建列出当前文件夹包含的文件文件重命名函数 文件的特性 我们所说的文件一般指的是硬盘文件&#xff0c;其实文件不止…