从零开始Inline Hook

news2025/1/12 21:10:14

中断表进入0环

通过中断门进入0环,首先了解一下中断门的构成
请添加图片描述
构造一个中断号

Base:函数地址
DPL:3	//因为三环使用调用门的条件就是CPL(即cs段选择子的RPL)<=DPL
P:1		//P为1时,中断表才有效
Segment Selector: 0x0008 //中断成功后切换自己的CPL 

在ce中直接写入
请添加图片描述
或者在windbg中写入

eq 8003f500 0040ee00`00081040

使用Xuetr工具查看
请添加图片描述
成功构造好的中断号
通过int指令即可调用

关闭内核写保护

pushad
pushfd

mov eax,cr0			//关闭页保护
and eax,not 0x10000
mov cr0,eax


mov eax,cr0			//开启页保护
or eax,0x10000
mov cr0,eax


popad
popfd 

关于页保护机制
使用windbg查看0x8054252D的pte
在这里插入图片描述

正常地址有-KWEV权限
在这里插入图片描述

因此使用上述指令关闭页写入保护,防止有的地方无法写入jmp指令,导致无法hook

解决进入0环无法任务调度的问题

首先,浅聊一下fs的问题
逆向内核文件 ntkrnlpa.exe 原因是 单核处理器运行该程序
操作系统的内核模块根据处理器的个数和是否支持PAE(Physical Address Extension物理地址扩展)分为以下四种

ntoskrnl.exe ---Uniprocessor单处理器,不支持PAE
ntkrnlpa.exe ---Uniprocessor单处理器,支持PAE
ntkrnlmp.exe ---Multiprocessor多处理器,不支持PAE
ntkrpamp.exe ---Mulitiprocessor多处理器,支持PAE

ntkrnlpa.exe 查看windows内核的0环调用
在这里插入图片描述

push 0x30
pop fs

fsCPU的任务切换有一定关系
通过修改fs 切换线程 完成CPU的任务调度
在这里插入图片描述
Ring 3Ring 0的FS没有切换,所以CPU并没有进行任务调度
使用以下指令修改FS寄存器,使CPU进行任务调度

push 0x30 //写入fs
pop fs

push 0x3b	//恢复FS
pop fs  

在这里插入图片描述

尝试调用0环的API

尝试使用Windows的0环API ExAllocatePool(目前已弃用) 但是依然可以直接call该地址获取
从汇编指令看 传入了2个参数
使用函数指针的方式调用该函数
在这里插入图片描述

首先在Xuetr工具中寻找ntkrnlpa.exe的基地址
使用ida的rebase功能
在这里插入图片描述

将查找到的基地址放入 重新初始化地址

在这里插入图片描述

寻找ExAllocPool函数
在这里插入图片描述

编写如下代码

#include <windows.h>
typedef (__stdll *Ex_ALLOCPOOL)(DWORD PoolType,DWORD NumberOfBytes)
Ex_ALLOCPOOL ExALLOCPOOL = (Ex_ALLOCPOOL)0x80537FF8

在这里插入图片描述

得到了被分配的内存

Jmp/Call硬编码问题

接下来进行hook操作,使用jmp指令跳转到刚才的内存里面
jmp的硬编码是e9
那么后面的四位硬编码是什么呢?
可以看到在3环程序中,jmp之后的地址与真实跳转的地址是不一样的,以call举例子

在这里插入图片描述

可以看到真正call的地址不是0x000213CF
而是0xFFFFFA27(小端序问题)
那这步地址怎么算?

[Address] =真正要跳转的地址-[call指令的地址]+5(call指令的下一条指令的地址)

也就是说真正要call的地址是0x000213CF - 0x000219A8 = 0xFFFFFA27(溢出保留)

请添加图片描述

使用__emit来实现一下

请添加图片描述

程序正常执行了Call_func函数

Hook _kifastCall函数

首先看看_kifastCall函数原来的汇编
请添加图片描述

我们知道jmp [address]的长度是5个字节 一个jmp指令(1字节)+一个地址(4字节)
刚好此处第一行的mov ecx,23h也是5个字节,因此劫持该函数
使此处jmp到gdt表中(因为gdtr有相当一部分空间没用用到)[也可以用api来创建内存,不过比较麻烦],然后在gdt表中写入要hook的指令即可

要hook的指令
mov eax,ds:[0x8003f7f0] //写好hook代码
inc eax
mov ds:[0x8003f7f0],eax

就是系统每调用一次api都会经过_kifastCall因此在此处加一,即可得知,程序被调用了多少次
然后再执行接下来程序本来该执行的指令

mov ecx,23h	//执行程序接下来的动作 因为这几步需要用cx寄存器,因此先把用到cx寄存器的代码执行掉
push 30h
pop fs
mov ds,cx
mov es,cx

接下来再返回mov es,cx的下一步指令
请添加图片描述

也就是0x8054252D
完整代码如下

#include<stdio.h>
#include<stdlib.h>
void Hooked();
char* p;
int i;
void __declspec(naked) CpyMemory() {
	p = (char*)0x8003f120;
	for ( i = 0; i < 64; i++)
	{
		*p = ((char*)Hooked)[i];
		p++;
	}
	__asm {
		iretd
	}
}

void __declspec(naked) Hooked() {
	__asm {
		pushad		//保存当前堆栈
		pushfd 

		mov eax,ds:[0x8003f7f0] //写好hook代码
		inc eax
		mov ds:[0x8003f7f0],eax

		popfd		//恢复堆栈
		popad

		mov ecx,23h	//执行程序接下来的动作 因为这几步需要用cx寄存器,因此先把用到cx寄存器的代码执行掉
		push 30h
		pop fs
		mov ds,cx
		mov es,cx

		mov ecx,0x8054252D	//返回一个固定地址 否则需要计算地址(不固定)
		jmp ecx
	}
}

void __declspec(naked) Hookinline() {
	__asm {

		mov eax,cr0	//关闭页保护
		and eax,not 10000h
		mov cr0,eax 

		mov ax, 0xe9		//写入jmp指令
		mov ds:[0x80542520],al
		mov eax,0xFFAFCBFB
		mov ds:[0x80542521],eax	

		mov eax,cr0	//打开页保护
		or eax,10000h
		mov cr0,eax

		iretd
	}
}	

void intEntry() {
	__asm {
		int 0x21 //先写入gdtr表	调用CpyMemory函数
		int 0x20 //Hook __kifastCall 函数	调用Hookinline
	}
}

int main() {
	printf("CpyMemory Address:%p\n", CpyMemory);
	printf("Hookinline Address %p\n", Hookinline);
	intEntry();
	system("pause");
	return 0;
}

成功之后,使用ce观察0x8003f7f0发现该地址不断在加一
请添加图片描述

即为hook成功
流程如下
请添加图片描述

Call指令Hook

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

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

相关文章

生产制造中4种导致产品成本、库存核算差错的问题!(化工/化妆品/生物制剂/混凝土等行业ODOO)

在化工/化妆品/生物制剂/混凝土等行业&#xff0c;因为其生产物料及产成品大都以液体&#xff08;或散颗粒&#xff09;形态为主&#xff0c;多以重量为计数方式&#xff1b;且液体&#xff08;或散颗粒&#xff09;相较于固体的较大区别就是产品计数上变数较大&#xff0c;固体…

“掌握速卖通平台接口:电商开发的技术巅峰“

一、概述 速卖通平台接口是全球速卖通提供的一套API接口&#xff0c;旨在为开发者提供与速卖通平台进行数据交互的能力。通过使用速卖通平台接口&#xff0c;开发者可以快速构建自己的电商应用程序&#xff0c;并实现与速卖通平台的数据共享和交易流程。本文将详细介绍速卖通平…

List集合,遍历,数据结构

一.List常见的方法&#xff1a; 二. List集合的遍历方式 除了 迭代器遍历 增强for遍历 Lambda表达式遍历&#xff0c;还有自己独有的普通for遍历&#xff0c;列表迭代器遍历 1.迭代器遍历 2.增强for遍历 3.Lambda表达式遍历 4.普通for遍历 5.列表迭代器遍历 列表迭代器相对于…

云计算生成式 -给你不一样的音乐推荐新体验

目录 摘要&#xff1a; 正文&#xff1a; 一、亚马逊云与生成式 AI 结合的展望/总结 二、我用亚马逊云科技生成式 AI 产品打造了什么&#xff0c;解决了什么问题 三、未来云端技术发展趋势的见解 四、云端技术未来需要解决的问题 1、如何保护数据安全和隐私&#xff1f; …

SQL Sever 复习笔记【一】

SQL Sever 基础知识 一、查询数据第1节 基本 SQL Server 语句SELECT第2节 SELECT语句示例2.1 SELECT - 检索表示例的某些列2.2 SELECT - 检索表的所有列2.3 SELECT - 对结果集进行筛选2.4 SELECT - 对结果集进行排序2.5 SELECT - 对结果集进行分组2.5 SELECT - 对结果集进行筛选…

企业选择通配符SSL证书

通配符SSL数字证书是CA认证机构签发较多的一款SSL证书&#xff0c;它可以保护一个域名及其所有子域名&#xff0c;并且在证书有效期内可以免费添加子域名。对于子域名较多或者想要创建子域名站点的个人或者企事业单位&#xff0c;通配符SSL证书是性价比较高的一个选择。这种证书…

element ui el-date-picker日期时间选择器 设置只能选择不大于30天时间范围

需求&#xff1a;要求日期时间选择器只能选择最多32天&#xff0c;其他日期为不可点击状态。 日期组件type为daterange或者datetimerange都生效 实现&#xff08;vue2.x&#xff09;&#xff1a; 通过属性picker-options html <el-date-pickerv-model"dateTime&qu…

AUTOSAR OS任务调度的底层逻辑

先参考 FreeRTOS的任务触发底层逻辑 简述RTOS任务调度底层逻辑 AUTOSAR-OS的调度机制-调度表&#xff08;没理解透&#xff0c;继续更新&#xff09; OSEK与FreeRTOS在任务调度上最大的区别在于&#xff0c;FreeRTOS是基于全抢占任务调度和时间片轮转调度机制&#xff0c;具有…

Ubuntu 20.04 for NVIDIA V100 GPU安装手册

安装Ubuntu 20.04.3 LTS版本 image.png 安装Ubuntu 20.04按照安装提示&#xff0c;仔细选择每一项&#xff0c;基本默认即可。 系统中查看GPU信息 系统安装完成之后&#xff0c;进入系统&#xff0c;使用lspci 命令查询一下GPU是否存在、型号信息是什么。 bpangbobpang:\~$…

ROS URDF集成Rviz流程

实现流程&#xff1a; 一、新建功能包&#xff0c;导入依赖 二、编写 urdf 文件 三、在 launch 文件集成 URDF 与 Rviz 四、在 Rviz 中显示机器人模型 需求&#xff1a;在 Rviz 中显示一个盒状机器人 1、创建功能包&#xff0c;导入依赖 创建一个新的功能包&#xff0c;名…

数据爬取+数据可视化实战_哪里只得我共你(Dear Jane)_词云展示----网易云

一、前言 歌词上做文本分析&#xff0c;数据存储在网页上&#xff0c;需要爬取数据下来&#xff0c;词云展示在工作中也变得日益重要&#xff0c;接下来将数据爬虫与可视化结合起来&#xff0c;做个词云展示案例。 二、操作步骤 代码如下&#xff1a; # -*- coding:utf-8 -*-…

服饰行业的EDI应用

服饰行业备受关注的物流环节中最重要的一个问题即为库存管理&#xff0c;服饰行业的企业需要搞清楚如何加快周转率&#xff0c;解决供应链的库存挤压难题。强大需求背景之下的科技革命、互联网发展以及产业变革不断演进&#xff0c;使得企业认识到产业供应链安全可靠、自主可控…

快速了解ChatGPT(大语言模型)

目录 GPT原理&#xff1a;文字接龙&#xff0c;输入一个字&#xff0c;后面会接最有可能出现的文字。 GPT4 学会提问&#xff1a;发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记&#xff1a; Lee老师幽默的开场&#xff1a; GPT&#xff1a;chat Ge…

python执行shell

0x00:前言 正常一个网站分为服务端和客户端&#xff0c;因为是正向的&#xff0c;所以服务端是在目标机器上的&#xff0c;客户端则是攻击者机器上&#xff0c;在这里要感谢MiaGz大师傅&#xff0c;这里很多都是参考了MiaGz大师傅的文章写出来的&#xff0c;进行了一点个人修改…

2023年亚太杯数学建模A题——深度学习苹果图像识别(

Image Recognition for Fruit-Picking Robots 水果采摘机器人的图像识别功能 问题 1&#xff1a;计数苹果 根据附件 1 中提供的可收获苹果的图像数据集&#xff0c;提取图像特征&#xff0c;建立数学模型&#xff0c;计算每幅图像中的苹果数量&#xff0c;并绘制附件 1 中所有…

【localhost refused to connect】解决 linux服务器启动 jupyter notebook 后本地浏览器打不开

问题描述 在linux上输入&#xff1a; jupyter notebook 命令后&#xff0c;弹出的火狐浏览器可以打开笔记本&#xff0c;但是复制它给的加密 url 到 Google 或者 Edge 浏览器都出现如下情况&#xff1a; 解决办法 1. 生成 jupyter notebook 配置文件 在 linux 命令行输入如下…

会员权益有哪些?

品牌会员权益是品牌为了吸引和保留客户&#xff0c;提供给注册成为会员的客户一些特殊优惠和服务&#xff0c;这些权益包括了折扣优惠、会员服务等等。 这些权益可以帮助品牌建立长期的客户关系&#xff0c;提高客户的忠诚度和满意度。以下是一些常见的会员权益&#xff0c;并结…

Neo4j 程序开发 JavaAPI 嵌入式开发模式(头歌)

文章目录 第1关&#xff1a;JavaAPI 嵌入式开发模式任务描述相关知识创建 Neo4j 数据库启动 Neo4j 数据事务创建节点创建节点关系将创建的数据库设置为默认数据库 编程要求测试说明答案代码修改配置文件&#xff0c;更改默认 Neo4j 数据库代码文件 第1关&#xff1a;JavaAPI 嵌…

#zookeeper集群+kafka集群

kafka3.0之前是依赖于zookeeper的。 zookeeper是开源&#xff0c;分布式的架构。提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式涉及的分布式服务管理架构。 存储和管理数据。分布式节点上的服务接受观察者的注册。一旦分布式节点上的数据发生变化&#xf…

【EI会议征稿】第七届机械、电气与材料应用国际学术会议(MEMA 2024)

第七届机械、电气与材料应用国际学术会议&#xff08;MEMA 2024&#xff09; 2024年第七届机械、电气与材料应用国际学术会议 (MEMA 2024) 由沈阳理工大学主办&#xff0c;将于2024年2月23-25日在中国长沙举行。本会议将围绕“机械、电气与材料应用”的最新研究领域&#xff…