修改SSDT来挂钩API的代码
/
//函数用途:修改SSDT表 //
/
//输入:服务ID, 新地址 //
//返回值:原始地址 //
/ULONG SetSSDTAddress(ULONG ulServiceID, ULONG procNewAddress)
QUOTE:
// SSDT_Hook.c: SSDT Hook API.
//
//
/*
代码最初来源于网络,原作者未知,表示歉意,代码经由at.Least(炉子)
*/
#include <ntddk.h>
typedef struct _SERVICE_DEscrīptOR_TABLE
{
PVOID ServiceTableBase;
PULONG ServiceCounterTableBase;
ULONG NumberOfService;
ULONG ParamTableBase;
}SERVICE_DEscrīptOR_TABLE,*PSERVICE_DEscrīptOR_TABLE; //由于KeServiceDescrīptorTable只有一项,这里就简单点了
extern PSERVICE_DEscrīptOR_TABLE KeServiceDescrīptorTable;//KeServiceDescrīptorTable为导出函数
static ULONG JmpAddress;//跳转到的地址
static ULONG OldServiceAddress;//原来的服务地址
//
// Construction/Destruction
//
/
//函数用途:修改SSDT表 //
/
//输入:服务ID, 新地址 //
//返回值:原始地址 //
/
ULONG SetSSDTAddress(ULONG ulServiceID, ULONG procNewAddress)
{
ULONG Address;
Address = (ULONG)KeServiceDescrīptorTable->ServiceTableBase + ulServiceID * 4;//服务ID
/*
炉子(at_Least) 注解 1(Address变量):
其实这个 Address 并不是真正的原始地址,从下文的
“OldServiceAddress = *(ULONG*)Address;”就可看
出其实这个 Address 是指向地址变量的指针(可能我
说的很复杂或者是很难懂,你可以把这个Address理解
为一个 *Address 变量 (ULONG *Address),并且被
赋值为:
Address = &服务函数地址(就是0x8XXXXXXX那东西)
*/
///
/*
炉子(at_Least) 注解 2(如何获得Address的值):
SSDT 中数据的存放方式实际是:
------------------理论譬如说------------------>
lkd> dd KeServiceDescrīptorTable
8055ab80 804e3d20 00000000 0000011c 804d9f48
8055ab90 00000000 00000000 00000000 00000000
8055aba0 00000000 00000000 00000000 00000000
8055abb0 00000000 00000000 00000000 00000000
在windbg.exe中我们就看得比较清楚,KeServiceD-
escrīptorTable中就只有第一项有数据,其他都是0
。其中804e3d20就是KeServiceDescrīptorTable.n-
toskrnel.ServiceTableBase,服务函数个数为0x1-
1c个。我们再看看804e3d20地址里是什么东西:
lkd> dd 804e3d20
804e3d20 80587691 805716ef 8057ab71 80581b5c
804e3d30 80599ff7 80637b80 80639d05 80639d4e
804e3d40 8057741c 8064855b 80637347 80599539
804e3d50 8062f4ec 8057a98c 8059155e 8062661f
如上,80587691 805716ef 8057ab71 80581b5c 这些
就是系统服务函数的地址了。
<------------------理论譬如说------------------
(【理论譬如说】中的内容为引用——懒得打字- -)
相信大家也看明白了,每个地址占用4个字节( 1个字
节可以表示两位数字 ——不明白的自己换算。)所以
当我们获取地址的指针时,需要用服务 ID * 4(地址
是连续存放的, 不存在两个地址之间的间隔符之类的
情况)来获取相对于起始地址(在引用部分是【804e-
3d20】)的差值,然后再加上起始地址(就是Servic-
eTableBase)
*/
DbgPrint("Address:0x%08X",Address);
OldServiceAddress = *(ULONG*)Address;//保存原来的地址
DbgPrint("OldServiceAddress:0x%08X",OldServiceAddress);
DbgPrint("procNewFunAddress:0x%08X",procNewAddress);
JmpAddress = (ULONG)NtOpenProcess + 10; //跳转到函数头+10的地方,这样在其前面写的JMP都失效了
DbgPrint("JmpAddress:0x%08X",JmpAddress);
__asm{//去掉内存保护
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
*((ULONG*)Address) = (ULONG)procNewAddress;//HOOK SSDT
__asm{//恢复内存保护
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
return OldServiceAddress;
}
修改SSDT来挂钩API的代码相关推荐
- 9.3 挂钩API技术(HOOK API)
HOOK API HOOK API是指截获特定进程或系统对某个API函数的调用,使得API的执行流程转向指定的代码.例如,在挂钩了系统对User32.dll模块中MessageBoxA函数的调用以后, ...
- WordPress百度快速收录 API 提交代码
百度快速收录功能上线,全面继承百度移动专区天级收录功能,并且百度熊掌号天级提交收录将于 5 月 18 日(即日)暂停使用,当然需要第一时间来帮助大家利用搜索引擎工具来做好网站优化! 将以下代码添加至主 ...
- WordPress CMS百度快速收录 API 提交代码以及配置教程
百度快速收录的提交代码,百度快速收录的功能上线,是全面继承百度移动专区天级收录功能,并且天级提交功能于 5 月 18 日已经暂停使用了. 污水流量计 使用方法 将下面代码添加到你的 WordPress ...
- 全国车辆违章查询API调用代码示例
简介 聚合数据全国车辆违章数据接口,目前已经支持300个左右的城市违章查询,已连接上万个APP.方便有车一族随时了解自己是否有过交通违章,避免因遗忘或逾期处理违章罚单而造成的不必要损失. API参考文 ...
- 【审批工作流camunda教程】(四):不使用camunda-modeler,使用Fluent Builder API,代码编写流程定义并部署
教程一: 创建camunda项目=>部署流程定义=>创建流程实例=>走完流程实例 教程二: camunda数据库中的48张表分别的大致含义,数据库表结构介绍 教程三: 下载camun ...
- 使用java的API编写代码
使用java的API编写代码 JavaBean 在Java中,有很多class的定义都符合这样的规范: 若干private实例字段: 通过public方法来读写实例字段. public class P ...
- 接口大师v3.9,API低代码开发工具,即刻搭建你的接口服务平台
接口大师简介 接口大师,是一套研发.管理和开放API接口的软件源代码和解决方案. 它提供了5合1的产品软件,并且提供了前端和PHP源代码,还有详细的开发文档和教程.它的最大特点是可以让大家通过零代码. ...
- 企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET
企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET 原文:企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET 先看效果 1.本文演示的是 ...
- php 菜谱 源码,基于php的菜谱大全api调用代码实例
代码描述:基于php的菜谱大全api调用代码实例 接口地址:http://www.juhe.cn/docs/api/id/46 PHP代码 // +-------------------------- ...
最新文章
- python制作统计图_刻意练习11:Python描述统计、简单统计图形
- 【Maven实战】之基础知识点
- mybatis 显示自定义多个统计_myBatis查询结果显示多表内的字段——通过resultMap映射自定义结果...
- [SCOI2008] 奖励关
- 2d fft matlab,证明2D-FFT能够拆分成两个1D-FFT
- 开源JVM Sampling Profiler
- Swift 3到5.1新特性整理
- mysql+web日志分析工具_用Python+MySQL实现2017年web日志分析报告
- php js 二级联动_PHP+ajax实现二级联动菜单功能示例
- CrateDB 3.2.4 发布,大规模可伸缩的数据存储系统
- tspline工具_Rhino 6 如何使用 T-spline?
- AndroidStdio换源
- Python nii文件转成tiff文件 以及遍历文件夹
- java 同比环比_数据相关概念同比,环比
- CharNet阅读笔记
- python123英文字符的鲁棒_Robust Locally Weighted Regression 鲁棒局部加权回归 -R实现
- QPBOC——数据认证
- 史上最全场景文字识别资源汇集(56篇重要论文 + 20 个开源代码 + 330 个实验结果 + 1882个统计信息)...
- 什么是XGBoost
- 正确优化主图,优化标题、优化价格,才不会导致流量下降