/
//函数用途:修改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的代码相关推荐

  1. 9.3 挂钩API技术(HOOK API)

    HOOK API HOOK API是指截获特定进程或系统对某个API函数的调用,使得API的执行流程转向指定的代码.例如,在挂钩了系统对User32.dll模块中MessageBoxA函数的调用以后, ...

  2. WordPress百度快速收录 API 提交代码

    百度快速收录功能上线,全面继承百度移动专区天级收录功能,并且百度熊掌号天级提交收录将于 5 月 18 日(即日)暂停使用,当然需要第一时间来帮助大家利用搜索引擎工具来做好网站优化! 将以下代码添加至主 ...

  3. WordPress CMS百度快速收录 API 提交代码以及配置教程

    百度快速收录的提交代码,百度快速收录的功能上线,是全面继承百度移动专区天级收录功能,并且天级提交功能于 5 月 18 日已经暂停使用了. 污水流量计 使用方法 将下面代码添加到你的 WordPress ...

  4. 全国车辆违章查询API调用代码示例

    简介 聚合数据全国车辆违章数据接口,目前已经支持300个左右的城市违章查询,已连接上万个APP.方便有车一族随时了解自己是否有过交通违章,避免因遗忘或逾期处理违章罚单而造成的不必要损失. API参考文 ...

  5. 【审批工作流camunda教程】(四):不使用camunda-modeler,使用Fluent Builder API,代码编写流程定义并部署

    教程一: 创建camunda项目=>部署流程定义=>创建流程实例=>走完流程实例 教程二: camunda数据库中的48张表分别的大致含义,数据库表结构介绍 教程三: 下载camun ...

  6. 使用java的API编写代码

    使用java的API编写代码 JavaBean 在Java中,有很多class的定义都符合这样的规范: 若干private实例字段: 通过public方法来读写实例字段. public class P ...

  7. 接口大师v3.9,API低代码开发工具,即刻搭建你的接口服务平台

    接口大师简介 接口大师,是一套研发.管理和开放API接口的软件源代码和解决方案. 它提供了5合1的产品软件,并且提供了前端和PHP源代码,还有详细的开发文档和教程.它的最大特点是可以让大家通过零代码. ...

  8. 企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET

    企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET 原文:企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET 先看效果 1.本文演示的是 ...

  9. php 菜谱 源码,基于php的菜谱大全api调用代码实例

    代码描述:基于php的菜谱大全api调用代码实例 接口地址:http://www.juhe.cn/docs/api/id/46 PHP代码 // +-------------------------- ...

最新文章

  1. python制作统计图_刻意练习11:Python描述统计、简单统计图形
  2. 【Maven实战】之基础知识点
  3. mybatis 显示自定义多个统计_myBatis查询结果显示多表内的字段——通过resultMap映射自定义结果...
  4. [SCOI2008] 奖励关
  5. 2d fft matlab,证明2D-FFT能够拆分成两个1D-FFT
  6. 开源JVM Sampling Profiler
  7. Swift 3到5.1新特性整理
  8. mysql+web日志分析工具_用Python+MySQL实现2017年web日志分析报告
  9. php js 二级联动_PHP+ajax实现二级联动菜单功能示例
  10. CrateDB 3.2.4 发布,大规模可伸缩的数据存储系统
  11. tspline工具_Rhino 6 如何使用 T-spline?
  12. AndroidStdio换源
  13. Python nii文件转成tiff文件 以及遍历文件夹
  14. java 同比环比_数据相关概念同比,环比
  15. CharNet阅读笔记
  16. python123英文字符的鲁棒_Robust Locally Weighted Regression 鲁棒局部加权回归 -R实现
  17. QPBOC——数据认证
  18. 史上最全场景文字识别资源汇集(56篇重要论文 + 20 个开源代码 + 330 个实验结果 + 1882个统计信息)...
  19. 什么是XGBoost
  20. 正确优化主图,优化标题、优化价格,才不会导致流量下降

热门文章

  1. fpga4fun.com/Music box
  2. 接收雅虎邮件时如何设置“您有邮件”语音。
  3. 优惠券抢券系统设计_网上优惠券和交易的最佳网站
  4. b0xF 与 b是什么关系
  5. .net中利用代理实现AOP
  6. python基于tensorflow的人脸识别系统设计与实现.zip(论文+源码)
  7. sdjzu---人生三大幻觉
  8. html5实践教学总结,实践教学总结3篇
  9. Java-SE 入门
  10. Ubuntu快速删除大量小文件方法