YJX_Driver_019_读出原函数地址

1、

第19课、读出原函数地址-
  A、集成上一课代码至GetNt_CurAddr函数
  B、MmGetSystemRoutineAddress
  C、书写GetNt_OldAddr函数
  D、测试结果

【120】第18课的代码

【215】集成上一课代码至GetNt_CurAddr函数

ULONG GetNt_CurAddr() //获取当前SSDT_NtOpenProcess的当前地址
{

  LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr; 
  KdPrint(("驱动成功被加载中.............................\n"));
  //读取SSDT表中索引值为0x7A的函数
  //poi(poi(KeServiceDescriptorTable)+0x7a*4)
  t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;
  KdPrint(("当前ServiceTableBase地址为%x \n",t_addr));
  SSDT_Adr=(PLONG)(t_addr+0x7A*4);
  KdPrint(("当前t_addr+0x7A*4=%x \n",SSDT_Adr)); 
  SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr;
  KdPrint(("当前SSDT_NtOpenProcess_Cur_Addr地址为%x \n",SSDT_NtOpenProcess_Cur_Addr));
  return SSDT_NtOpenProcess_Cur_Addr;
}

【520】本节课 需要另外构建一个函数

  ULONG GetNt_OldAddr();

【590】先看 函数MmGetSystemRoutineAddress

PVOID MmGetSystemRoutineAddress
(
  __in PUNICODE_STRING SystemRoutineName
);

ZC: 应该就是 根据 内核函数名 得到 内核函数的地址

 

【855】

ULONG GetNt_OldAddr()
{
  UNICODE_STRING Old_NtOpenProcess;
  ULONG Old_Addr;
  RtlInitUnicodeString(&Old_NtOpenProcess,L"NtOpenProcess");  //【1005】这里"NtOpenProcess"填入的是导出函数的名字
  Old_Addr=(ULONG)MmGetSystemRoutineAddress(&Old_NtOpenProcess);  // 取得NtOpenProcess的地址
  KdPrint(("取得原函数NtOpenProcess的值为 %x",Old_Addr));
  return Old_Addr;
}

  【920】这里就 不使用PUNICODE_STRING了  直接使用UNICODE_STRING,这样就不用动态分配内存了。(ZC: 忘了内核中如何动态分配内存了...本教程会讲到吗?看了下标题,可能第33讲会讲到)

  【1005】这里"NtOpenProcess"填入的是导出函数的名字。若传入的 函数名,不是一个导出函数 的话,MmGetSystemRoutineAddress就返回NULL了(ZC: 记得以前看过代码,有人使用 未公开的API函数,这应该也是 导出函数,只是 ms没有公开 文档上查不到而已吧?)

    ZC: 这里的一直讲到的"导出函数",指的是 内核导出给应用层使用的函数?还是指 DLL的导出函数?

  【1220】ZC: MmGetSystemRoutineAddress 本来返回的是void*,他却强转为 ULONG。我的思考是 Windows下,void* 能兼容x86/x64,而ULONG就不一定了...(参看:"http://blog.chinaunix.net/uid-25513153-id-182196.html")

 

【1730】

NTSTATUS DriverEntry(PDRIVER_OBJECT _pDrvierObject, PUNICODE_STRING B)
{

  ULONG cur, old;

  cur = GetNt_CurAddr() ;

  old = GetNt_OldAddr();

  if (cur != old)

  {

    // 【2830】写入 我们的 JMP指令

    KdPrint(("NtOpenProcess被Hook了"));

  }

  else

    KdPrint(("NtOpenProcess没有被Hook"));

  _pDrvierObject->DriverUnload = DDK_Unload;
  return 1;
}

【2015】编译测试

【2195】打开KernelDetective看一下,∵他的机器 已经加载过 hook NtOpenProcess的驱动 了,∴ KernelDetective显示的信息是 NtOpenProcess 已经是被hook的状态了

  【2300】加载一下我们的驱动

  【2450】对比一下 KernelDetective 和 DebugView 中的信息 是一致的

 

 【2605】ZC: 看到,hook NtOpenProcess 的 那个驱动 还是 sx.sys

  【2648】如果 sx.sys 对 hook NtOpenProcess 的那个函数 做了一些措施的话(如 循环的监测/修复 或者 检测到函数被改动就直接蓝屏),那么 我们修改首指令为JMP的方案将会行不通(如被 修复/还原 或者 机子蓝屏),那我们采取的措施是:

    (1)、避开 sx.sys 监测的指令,就是 在下面一点的指令中 选择一条指令改为 我们的JMP,但是 要注意堆栈平衡

    (2)、或者 如果 sx.sys搜索的字串是0xE8(也就是JMP指令),那我们就不使用JMP指令 改用 jne之类的指令、je(0x74)之类的指令

      ZC: 改为 jne/je 值了IDE指令的话,还要注意 那几个寄存器的状态(zero寄存器 等)

    ZC: 个人感觉 还有一种修改方案 : ∵ hook NtOpenProcess 的那个函数,肯定最后还是要调用 NtOpenProcess的,于是分析 hook NtOpenProcess 的那个函数 修改其中的指令 使之直接跳转到 执行NtOpenProcess 的地方。

    后面再详细的讲解

2、

 

转载于:https://www.cnblogs.com/debugskill/p/5346491.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值