从零开始Inline Hook

中断表进入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
pushfdmov eax,cr0			//关闭页保护
and eax,not 0x10000
mov cr0,eaxmov eax,cr0			//开启页保护
or eax,0x10000
mov cr0,eaxpopad
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 fspush 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 eaxmov ds:[0x8003f7f0],eaxpopfd		//恢复堆栈popadmov ecx,23h	//执行程序接下来的动作 因为这几步需要用cx寄存器,因此先把用到cx寄存器的代码执行掉push 30hpop fsmov ds,cxmov es,cxmov ecx,0x8054252D	//返回一个固定地址 否则需要计算地址(不固定)jmp ecx}
}void __declspec(naked) Hookinline() {__asm {mov eax,cr0	//关闭页保护and eax,not 10000hmov cr0,eax mov ax, 0xe9		//写入jmp指令mov ds:[0x80542520],almov eax,0xFFAFCBFBmov ds:[0x80542521],eax	mov eax,cr0	//打开页保护or eax,10000hmov cr0,eaxiretd}
}	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.mzph.cn/news/187779.shtml

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

相关文章

拥抱复杂性:大模型的发展与挑战

原创 | 文 BFT机器人 大模型代表着机器学习和人工智能领域的前沿技术&#xff0c;它们的发展和应用对于推动科技进步和解决复杂问题具有重要意义。 01 什么是大模型&#xff1f; 大模型是指在计算机科学和人工智能领域中&#xff0c;具有庞大规模和复杂性的模型。这些模型通常…

STM32---时钟树

写在前面&#xff1a;一个 MCU 越复杂&#xff0c;时钟系统也会相应地变得复杂&#xff0c;如 STM32F1 的时钟系统比较复杂&#xff0c;不像简单的 51 单片机一个系统时钟就 可以解决一切。对于 STM32F1 系列的芯片&#xff0c;其有多个时钟源&#xff0c;构成了一个庞大的是时…

docker-compose部署zabbix+grafana

1.引言 1.1目的 zabbixgrafana实现图形化监控 2.部署环境 服务器ip服务版本192.168.5.137zabbix-server6.0.21192.168.5.137grafana10.2.2192.168.5.152zabbix-client6.0.21 3.部署zabbix-server 3.1 创建zabbix目录 mkdir zabbix3.2 编写docker-compose文件 cd zabbix…

【Linux】快速上手自动化构建工具make/makefile

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.什么是make / makefile 2…

class-dump 混淆加固、保护与优化原理

​ 进行逆向时&#xff0c;经常需要dump可执行文件的头文件&#xff0c;用以确定类信息和方法信息&#xff0c;为hook相关方法提供更加详细的数据.class-dump的主要用于检查存储在Mach O文件的Objective-C中的运行时信息&#xff0c;为类&#xff0c;类别和协议生成声明信息&am…

leetcode-142-环形链表(C语言实现)

题目&#xff1a; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评…

2023年中外Top10快公司研究报告

引言 在市场竞争激烈的环境中&#xff0c;每年都有企业实现显著的高速增长&#xff0c;其利润增长率和销售增长率等关键财务指标在短期内急剧上升。本研究报告精选了一批在2015年至2022年间&#xff0c;其营业收入或营业利润年增长率超过10,000%的企业进行深入分析。这一现象反…

使用SLS日志服务采集Kong网关的日志

一、阿里云SLS 官方的接入文档已比较丰富了&#xff0c;本文不意重复说明此事。 站在使用的角度&#xff0c;以采集Kong的日志为示例&#xff0c;说明我们应该如何治理日志。 说白了&#xff0c;本文是想给你怎么省钱作一个建议&#xff0c;希望不会让你公司也“降本增笑”。…

ios-class-guard - iOS代码混淆与加固实践

​ 目录 ios-class-guard - iOS代码混淆与加固实践 摘要 引言 一、class-dump 二、ios-class-guard 混淆原理 三、ios-class-guard 混淆结果 四、ios-class-guar 的使用 ios-class-guard 不支持 Swift ios-class-guard 不支持 iPhoneOS SDK ios-class-guard --sdk-ro…

模型层——单表操作

单表操作 一 ORM简介 查询数据层次图解&#xff1a;如果操作mysql&#xff0c;ORM是在pymysq之上又进行了一层封装 MVC或者MTV框架中包括一个重要的部分&#xff0c;就是ORM&#xff0c;它实现了数据模型与数据库的解耦&#xff0c;即数据模型的设计不需要依赖于特定的数据库…

Java网络通信

什么是网络编程 网络结构三要素 IP地址 端口号 通信协议 UDP TCP

现货白银简单介绍

在贵金属投资领域&#xff0c;现货白银是当前国际上最为流行、交投最为活跃的白银投资方式&#xff0c;其交易市场遍布全球&#xff0c;包括伦敦、苏黎世、纽约、芝加哥及香港等主要市场&#xff0c;是一种以杠杆交易和做市商的形式进行的现货交易。 现货白银可以说是当下交易模…

FL Studio21.1.1.3750中文版是数字音频工作站 (DAW)

FL Studio水果音乐编曲软件中文版,一款强大的音乐制作软件,可以进行音乐编曲、剪辑、录音、混音。FL Studio21.1.1.3750中文版是数字音频工作站 (DAW) 之一&#xff0c;日新月异。它是一款录音机和编辑器&#xff0c;可让您不惜一切代价制作精美的音乐作品并保存精彩的活动画廊…

工程化使用React

安装 首先全局安装 npm install create-react-app -g创建项目 create-react-app proName最基本的一个react工程化创建完成 项目目录

办公软件PDF转换工具 - Bruce的PDF工具pdftool

Bruce的PDF工具 - 办公软件PDF转换工具 - pdftool&#xff0c;支持&#xff1a; 1、图片转PDF&#xff0c;支持图片自动压缩&#xff0c;可预览图片 2、合并PDF&#xff0c;支持多个PDF合并成一个PDF 3、PDF转图片&#xff0c;PDF的每页转成一张图片 4、OFD转PDF&#xff0c;O…

ubuntu0.22.04.1安装mysql8.0及root密码注意

先看一下你的安装包是什么版本 apt list |grep mysql基本都是默认的8.0版本&#xff0c;然后安装&#xff1a; apt-get install mysql-server-8.0安装以后 &#xff0c;mysql默认启动&#xff1b; 一般root 是没有密码的&#xff0c;在本地直接回车登录 我们看一下密码插件 …

5年经验之谈 —— 接口测试主要测哪些方面?

当今互联网时代&#xff0c;接口测试已经成为软件测试的一个重要组成部分。接口测试是指对系统各个接口进行验证&#xff0c;确保接口的正确性、稳定性和安全性。接口测试是软件开发过程中不可缺少的环节&#xff0c;它旨在确保接口能够正常工作&#xff0c;并且满足所需要的规…

mybatis项目中添加logback日志

1、pom.xml <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><!-- MySQL驱动 mybatis底层依赖jdbc驱动实现,本次不需要导入连接池,mybatis自带! --><dependency&g…

系统设计面试指南之分布式任务调度

1 简介 任务是需要资源(CPU 时间、内存、存储、网络带宽等)在指定时间内完成的一段计算工作。 通过智能地将资源分配给任务以满足任务级和系统级目标的系统称为任务调度程序。 任务调度程序&#xff1a; 及时决定和分配资源给任务的过程称为任务调度。 当我们在 Facebook 发…

虹科干货 | 适用于基于FPGA的网络设备的IEEE 1588透明时钟架构

导读&#xff1a;在基于FPGA的网络设备中&#xff0c;精确的时间同步至关重要。IEEE 1588标准定义的精确时间协议&#xff08;PTP&#xff09;为网络中的设备提供了纳秒级的时间同步。本文将介绍虹科提供的适用于基于FPGA的网络设备的IEEE 1588透明时钟&#xff08;TC&#xff…