研究心得-恢复2k xp得win32k.sys得KeServiceDescriptorTableShadow

8.FindWindow(SSDT Shadow HOOK) 待更。。 阅读详情

/**
 * @file sdtreset.cpp
 *
 * @brief sdtreset.cpp, v 1.0.0 2005/10/25 11:48:42 sunwang
 *
 * details here.
 * 草稿代码,命名混乱,重构时候使用java风格,getKiServiceTableAddrMM
 * 其实找到了KeServiceDescriptorTable/Shadow的真实entry地址,直接调用就是了,没有必要去restore,
 * restore的好处是禁止这个hooker干坏事如cnnic禁止别人的hooker
 *
 * @author sunwang <sunwangme@hotmail.com>
 */
#include "oshack.h"      //common header
#include "krnlio.h"      //krnl file io 
#include "fsdreset.h"     //pe analysis and fsd restore routine

PBYTE getKiServiceTableAddrMM()
{
 return KeServiceDescriptorTable[0].ServiceTable;
}

//xp是KeServiceDescriptorTableShadow=KeServiceDescriptorTable-40h
//2k是KeServiceDescriptorTableShadow=KeServiceDescriptorTable+E0h
PBYTE getW32pServiceTableAddrMM()
{
 PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTableShadow;

 //for xp
 if(gKernelVersion==WINXP)
  KeServiceDescriptorTableShadow=(PCHAR)KeServiceDescriptorTable-0x40; 
 //for 2k
 else if(gKernelVersion==WIN2K)
  KeServiceDescriptorTableShadow=(PCHAR)KeServiceDescriptorTable+0xE0;
 //noway here now,maybe WIN2K3
 else
  return NULL;

 return KeServiceDescriptorTableShadow[1].ServiceTable;
}

PBYTE getW32kBaseAddrMM()
{
 return MyGetModuleBaseAddress("win32k.sys");
}

PBYTE getKernalBaseAddrMM()
{
 return MyGetModuleBaseAddress("ntoskrnl.exe");
}

//xp下win32k并不是长驻内存的,直接用它的内存镜像分析PE有问题
//ntoskrnl.exe是长驻内存的,直接用它的内存镜像分析PE没问题
//问题不是这个,见下面老长的注释,读文件也可以,读内存也可以
//只要不读win32k
/*
Bug Check 0x50: PAGE_FAULT_IN_NONPAGED_AREA
The PAGE_FAULT_IN_NONPAGED_AREA bug check has a value of 0x00000050.
This indicates that invalid system memory has been referenced.
*/
/*
 直接读硬盘文件算了,SizeOfHeaders<=0x380,我读个4k出来总可以了吧,4k=0x1000
 然后分析头
*/
PBYTE getW32kBaseAddrHD(PBYTE imageRawAddrMM)
{
 return GetDriverBaseAddrHD(imageRawAddrMM);
}

PBYTE getKernalBaseAddrHD(PBYTE imageRawAddrMM)
{
 return GetDriverBaseAddrHD(imageRawAddrMM);
}

//id = *(导出函数的地址+1)
//内部函数的话,就只能手动填了,如NtUserSetWindowsHookEx,2k:1212,xp:1225
ULONG getServiceEntryAddrReal(ULONG id)
{
 char imagePath[256];
 int handle;
 ULONG rawoffset,value,rva;
 PBYTE imageBaseAddrMM,imageBaseAddrHD,serviceTableAddrMM,imageRawAddrMM;

 //init
 value=0;
 RtlZeroMemory(imagePath,256);

 //win32k
 if((id&0x3fff)>>12 == 1)
 {
  DebugPrint(("getAPIAddrReal of win32k/n"));

  //reloc后的baseAddr
  imageBaseAddrMM=getW32kBaseAddrMM();
  DebugPrint(("imageBaseAddrMM:0x%08x/n",imageBaseAddrMM));

  //reloc后的W32pServiceTable
  serviceTableAddrMM=getW32pServiceTableAddrMM(); //va,should change to raw-addr
  DebugPrint(("serviceTableAddrMM:0x%08x/n",serviceTableAddrMM));

  //reloc后的entry的rva,注意不是函数本身的rva
  rva=serviceTableAddrMM+(id&0xfff)*4-imageBaseAddrMM;//rva
  DebugPrint(("rva:0x%08x/n",rva));

  //读取文件头
  //MyGetModuleImageName("win32k.sys",imagePath);
  strcpy(imagePath,gSystemRoot);
  strcat(imagePath,"//system32//win32k.sys");
  DebugPrint(("imagePath:%s/n",imagePath));
  imageRawAddrMM=ExAllocatePool(NonPagedPool,0x1000);
  handle = krnl_open(imagePath,0,KernelMode);
  if(handle)
  {
   DebugPrint(("krnl_open ok/n"));
   krnl_read_offset(handle,imageRawAddrMM,0x1000,0);//va (related to imageBaseAddrHD)
   krnl_close(handle);
  }
  DebugPrint(("imageRawAddrMM:0x%08x/n",imageRawAddrMM));

  //下面遍历所有的section,看rva在哪个section,然后根据section的RVA-VirtualAddress(RVA)+PointerToRawData就
  //得到了rawoffset
  rawoffset=RVA2RawOffset(imageRawAddrMM,rva);
  DebugPrint(("rawoffset:0x%08x/n",rawoffset));

  //读取value,这是reloc前的va
  handle = krnl_open(imagePath,0,KernelMode);
  if(handle)
  {
   DebugPrint(("krnl_open ok/n"));
   krnl_read_offset(handle,&value,4,rawoffset);//va (related to imageBaseAddrHD)
   krnl_close(handle);
  }
  DebugPrint(("value va (related to imageBaseAddrHD):0x%08x/n",value));

  //reloc前的baseAddr
  imageBaseAddrHD=getW32kBaseAddrHD(imageRawAddrMM);
  DebugPrint(("imageBaseAddrHD:0x%08x/n",imageBaseAddrHD));

  //reloc后的地址
  value=value-(ULONG)imageBaseAddrHD;//rva
  DebugPrint(("value rva:0x%08x/n",value));
  value=value+(ULONG)imageBaseAddrMM;//va (relate to iamgeBaseAddrMM)
  DebugPrint(("value va (related to iamgeBaseAddrMM real):0x%08x/n",value));

  //下面这句有问题,直接读了serviceTableAddrMM的entry地址,真他妈妈的要命,why???
  //其实不用读什么硬盘文件,直接使用内存的文件头就是了
  //就是不能引用KeServiceDescriptorTableShadow中win32k的地址,我日
  
  /*
  Hello:

  I have a problem related to the theme you have been speaking of. I hook
  both KeServiceDescriptorTable and KeServiceDescriptorTableShadow because I
  need to monitorize some ntoskrnl and user/gdi services. The driver works
  fine until I tested it in WXP. The problem es that the second entry in
  KeServiceDescriptorTableShadow (that for NtUserxxx services for example)
  has an address (some similar to B79Fxxxx) and when I try to access this
  for patching the shadow service table, I get a Bug Check 0x50:
  PAGE_FAULT_IN_NONPAGED_AREA.

  I have disassembled Mark Russinovich's RegMon and I have tried to map that
  memory through and MDL and then MmBuildMdlForNonPagedPool and
  MmMapLockedPages as he does but I get the same bug check in
  MmBuildMdlForNonPagedPool. Does anybody how to acomplish this task? I have
  not the same problem when I map the index 0 table (NtXxxx services)... it
  works fine.

  Thanks in advance,
  Jose Vicente.
  */

  /*
  Try not mapping it in System process context, or any process context which does
  not use GDI/user interface. I believe the address is part of the session space.
  If you try mapping it in the process context of an app or service which uses
  user32 or gdi calls it works fine. Hope this helps you.
  */

  /*
  Thank you very much, Srin

  The only problem is that I don't know how to do that inside a driver. How
  can I ensure that I'm running within the context of a given application?

  Best regards,
  Jose Vicente.
  */

  /*
  Jose,
  I believe you have a service or app along with the driver in your
  product. When either of these is starting send an IOCTL to your driver and in
  the dispatch routine of this IOCTL do the required. As you are sending the
  IOCTL directly to your driver/device object, in the driver's dispatch routine
  you can be sure that you are executing in the process context which sent you
  the IOCTL.
  
  Have fun,
  Srin.
  */

  /*
  Srin,

  Thank you very much for your answer but I have found an alternative
  solution (in any case actually I haven't a helper application since my
  driver reads the configuration from system registry and that information is
  updated through domain policies). I have exploited the fact that I'm
  monitorizing the process creation/destruction and image loading to hook the
  loading of CSRSS process and thus touching the system services table at that
  moment.

  Best regards,
  Jose Vicente.
  */
  //PsSetCreateProcessNotifyRoutine / PsSetCreateThreadNotifyRoutine / PsSetLoadImageNotifyRoutine
  //并不需要映射,只要在上下文就可以了,奶奶的。
  {
   PCHAR tempEntry=serviceTableAddrMM+(id&0xfff)*4;
   if(MmIsAddressValid(tempEntry))
   {
    DebugPrint(("value va (related to iamgeBaseAddrMM now):0x%08x/n",*(ULONG*)tempEntry));
   }
   //并不需要映射,只要在上下文就可以了,奶奶的。
   else
   {
//    ULONG attachedGDIProcessID=1144;
//    EPROCESS attachedGDIProcess;
    PMDL mdl;
    PCHAR kernelVA;

    DebugPrint(("fuck,a page fault will occur for a read or write operation at a given virtual address"
     ":0x%08x/n",tempEntry));

    //AttachProcess这个方法可以,但是在DriverEntry里面不好测试,faint
/*
    if(NT_SUCCESS(PsLookupProcessByProcessId((PVOID)attachedGDIProcessID,&attachedGDIProcess)))
    {
     KeAttachProcess(&attachedGDIProcess);
     //
     // map
     //

     mdl=IoAllocateMdl(tempEntry,4,0,0,0);
     if(mdl)
     {
      DebugPrint(("IoAllocateMdl ok/n"));
      MmBuildMdlForNonPagedPool(mdl);
      kernelVA=MmMapLockedPages(mdl,KernelMode);
      if(kernelVA)
      {
       if(MmIsAddressValid(kernelVA))
       {
        DebugPrint(("value va (related to iamgeBaseAddrMM now):0x%08x/n",*(ULONG*)kernelVA));
       }
       else
       {
        DebugPrint(("fuck,a page fault will occur for a read or write operation at a given virtual address"
        ":0x%08x/n",kernelVA));
       }
       MmUnmapLockedPages(kernelVA,mdl);
      }
     }

     KeDetachProcess();
    }
*/
    //procmon,希望能成,测试成功.
    mdl=IoAllocateMdl(tempEntry,4,0,0,0);
    if(mdl)
    {
     DebugPrint(("IoAllocateMdl ok/n"));
     //如果不是gdi进程空间,一样死,fuck
     MmBuildMdlForNonPagedPool(mdl);
     kernelVA=MmMapLockedPages(mdl,KernelMode);
     if(kernelVA)
     {
      if(MmIsAddressValid(kernelVA))
      {
       DebugPrint(("value va (related to iamgeBaseAddrMM now):0x%08x/n",*(ULONG*)kernelVA));
      }
      else
      {
       DebugPrint(("fuck,a page fault will occur for a read or write operation at a given virtual address"
        ":0x%08x/n",kernelVA));
      }
      MmUnmapLockedPages(kernelVA,mdl);
     }
    }
   }
  }
 
  ExFreePool(imageRawAddrMM);
 }
 //ntoskrnl
 else if((id&0x3fff)>>12 == 0)
 {
  DebugPrint(("getAPIAddrReal of ntoskrnl/n"));

  //reloc后的baseAddr
  imageBaseAddrMM=getKernalBaseAddrMM();
  DebugPrint(("imageBaseAddrMM:0x%08x/n",imageBaseAddrMM));

  //reloc后的W32pServiceTable
  serviceTableAddrMM=getKiServiceTableAddrMM(); //va,should change to raw-addr
  DebugPrint(("serviceTableAddrMM:0x%08x/n",serviceTableAddrMM));

  //reloc后的entry的rva,注意不是函数本身的rva
  rva=serviceTableAddrMM+(id&0xfff)*4-imageBaseAddrMM;//rva
  DebugPrint(("rva:0x%08x/n",rva));

  //读取文件头
  strcpy(imagePath,gSystemRoot);
  strcat(imagePath,"//system32//ntoskrnl.exe");
  DebugPrint(("imagePath:%s/n",imagePath));
  imageRawAddrMM=ExAllocatePool(NonPagedPool,0x1000);
  handle = krnl_open(imagePath,0,KernelMode);
  if(handle)
  {
   DebugPrint(("krnl_open ok/n"));
   krnl_read_offset(handle,imageRawAddrMM,0x1000,0);//va (related to imageBaseAddrHD)
   krnl_close(handle);
  }
  DebugPrint(("imageRawAddrMM:0x%08x/n",imageRawAddrMM));

  //下面遍历所有的section,看rva在哪个section,然后根据section的RVA-VirtualAddress(RVA)+PointerToRawData就
  //得到了rawoffset
  rawoffset=RVA2RawOffset(imageRawAddrMM,rva);
  DebugPrint(("rawoffset:0x%08x/n",rawoffset));

  //读取value,这是reloc前的va
  handle = krnl_open(imagePath,0,KernelMode);
  if(handle)
  {
   DebugPrint(("krnl_open ok/n"));
   krnl_read_offset(handle,&value,4,rawoffset);//va (related to imageBaseAddrHD)
   krnl_close(handle);
  }
  DebugPrint(("value va (related to imageBaseAddrHD):0x%08x/n",value));

  //reloc前的baseAddr
  imageBaseAddrHD=getKernalBaseAddrHD(imageRawAddrMM);
  DebugPrint(("imageBaseAddrHD:0x%08x/n",imageBaseAddrHD));

  //reloc后的地址
  value=value-(ULONG)imageBaseAddrHD;//rva
  DebugPrint(("value rva:0x%08x/n",value));
  value=value+(ULONG)imageBaseAddrMM;//va (relate to iamgeBaseAddrMM)
  DebugPrint(("value va (related to iamgeBaseAddrMM real):0x%08x/n",value));
  //下面这句有问题,直接读了serviceTableAddrMM的entry地址,真他妈妈的要命,why???
  //其实不用读什么硬盘文件,直接使用内存的文件头就是了
  //就是不能引用KeServiceDescriptorTableShadow中win32k的地址,我日
  {
   PCHAR tempEntry=serviceTableAddrMM+(id&0xfff)*4;
   if(MmIsAddressValid(tempEntry))
   {
    DebugPrint(("value va (related to iamgeBaseAddrMM now):0x%08x/n",*(ULONG*)tempEntry));
   }
   else
   {
    DebugPrint(("fuck,a page fault will occur for a read or write operation at a given virtual address"
     ":%0x%08x/n",tempEntry));
   }
  }

  ExFreePool(imageRawAddrMM);
 }

 return value;
} 

Win64 驱动内核编程-22.SHADOW SSDT HOOK(宋孖健) SHADOWSSDTHOOK HOOK和UNHOOKSHADOWSSDT跟之前的HOOK/UNHOOKSSDT类似,区别是查找SSSDT的特征码,以及根据索引计算函数地址的公式,还有一个就是吧跳转函数写在什么位置,SSDT的时候是写在蓝屏函数里了。 一、获得wKeServiceDescriptorTableShadow的地址 这个跟获得KeServi... 阅读详情

相关推荐

普及X64 ssdtshadow inline HOOK

序: 我只想说~~再不发帖老大就 不搭理我了~~~ 原因:玩保护玩到了 XINGCODE3 就他的各种检测就让我不得不重视这个问题了:o: 各种窗口 各种X 我的工具 让我忍无可忍,就决定先HOOK了在说其他 最开始我用TA 的代码里面的 HOOK 方法 在 挂钩 NT 内核中的函数算是无往不利 在SHADOWSSDT中就蛋疼菊花紧了~~ 于是 开始自己搞:mad::mad:

落笔飞花笑百生的博客 3241

【原创】shadow ssdt学习笔记(一)

标 题: 【原创】shadow ssdt学习笔记(一) 作 者: zhuwg 时 间: 2007-12-22,22:01:29 链 接: http://bbs.pediy.com/showthread.php?t=56955 1。取得shadow ssdt真实地址 系统只提供了KeServiceDescriptorTable导出 KeServiceDescriptorTableSh

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1162

SpeedyBee F405 V3 50A飞塔装机全攻略:从开箱到首飞避坑指南

本文提供SpeedyBee F405 V3 50A飞塔的详细装机指南,涵盖从开箱检查、硬件焊接、软件配置到安全首飞的全流程。重点剖析了电源连接、固件刷写等高频故障点,帮助FPV新手避开常见陷阱,确保一次成功组装并安全起飞。

weixin_29179311的博客 416

Win10 x64 KeServiceDescriptorTable SSDT 偏移计算理解

Win10 x64 KeServiceDescriptorTable SSDT 偏移计算理解引言站在巨人的肩膀上实现代码通用的偏移计算方法 引言 很久没写博客了,水个博客,KeServiceDescriptorTable 和 KeServiceDescriptorTableShadow的原理我就不写了,百度很多,主要这篇写如何定位x64下未导出的KeServiceDescriptorTable。 站在巨人的肩膀上 前辈们在之前已经找到了一个计算公式,通过读取msr寄存器的0xC0000082读取到

Doub1's Blog 2279

Ubuntu终端接入Codex:一行脚本搞定AI编程助手安装与配置

在开发者日常工作中,命令行终端是最高频的操作环境,而AI编程助手的出现正在改变传统的编码方式。通过将大模型能力与终端工具链结合,开发者无需切换窗口即可完成命令查询、代码生成、项目理解和自动执行等任务。Ubuntu作为服务器和开发机的主流系统,搭配Node.js生态和API Key认证,即可在本地闭环运行AI助手。本文从环境准备、密钥配置、权限管理到自动化脚本封装,系统拆解在终端中接入Codex的完整流程,并分享高频用法与实测排障经验,帮助开发者安全、高效地让AI融入命令行工作流。

weixin_29061041的博客 322

ROS智能车定位导航仿真+功能包自带的地图实现+自己建立的地图实现

ROS智能车定位导航仿真一、前言二、效果图三、准备工作[1.在Ubuntu上安装ROS Kinetic](https://blog.csdn.net/qq_42585108/article/details/104327661)2.创建ROS工作区间①1创建racecar_ws和src文件夹②初始化工作空间③下载racecar源代码包,并编译工程四、启动仿真1.设置环境变量2.启动地图五、建图1.启动slam和rviz2 控制车辆(左侧有个控制窗口),WASD控制前左后右的运动就可以建图了:3.新建终端保存地

qq_42585108的博客 1万+

Shadow SSDT

 A、Shadow SSDT表基址定位    B、Shadow SSDT表结构    C、Shadow SSDT HOOK KeServiceDescriptorTable //系统描述符表 extern KeServiceDescriptorTableShadow //影子系统描述符表  win32k.sys bp win32k!NtUserPostMessage bp win32k...

crkres9527 595

深入解析MOS管电容特性:从基础理论到高频应用

本文深入解析了MOS管的电容特性,从基础物理结构出发,详细拆解了栅氧电容、重叠电容和结电容的成因与影响。文章重点探讨了电容值随工作状态变化的非线性特性,并分析了其在CMOS高频开关电源、射频电路等应用中的关键作用,包括开关损耗、米勒效应、信号完整性挑战以及如何将电容特性转化为可控元件(如MOS变容管)的机遇。最后提供了从选型、仿真到PCB布局的实战设计指南。

weixin_29278805的博客 382

windbg符号链接的问题.还有KeServiceDescriptorTableShadow内存块查找时问号的情况

最近配置windbg比较郁闷,搞了几天才搞定,自己的经验希望能帮助大家.也方便自己以后查阅 首先介绍几个命令: lm 列出加载模块信息 如下 0: kd> lm start    end        module name 80800000 80a28000   nt         (export symbols)       ntkrnlmp.exe Unloaded m

yandaoming的专栏 1187

2024年电气工程师最新面试题及答案

1. **基本电气工程原理**:包括电流、电压、电阻、功率等基本概念。2. **欧姆定律**:V = IR,描述电压、电流和电阻之间的关系。42. **风力发电系统组成**:包括风力涡轮机、发电机、控制系统等。44. **智能电网技术**:包括自动化控制、通信技术、数据分析等。10. **减少EMI**:使用屏蔽、滤波、合理布线等方法。40. **光伏系统组成**:包括光伏板、逆变器、控制器等。48. **能量存储技术**:包括电池、超级电容器、飞轮等。

guo162308的博客 6563

【Flutter 问题系列第 85 篇】Xcode 运行 Flutter 提示 The Dart VM Service was not discovered after 60 seconds.

在 Xcode 上运行 Flutter 时提示 `The Dart VM Service was not discovered after 60 seconds. This is taking much longer than expected...`,意思是 `60秒后未发现Dart虚拟机服务。这比预期的要长得多`

“Allen Su”的博客 2236

简单说说SSDT

论技术,我还差得远,而且网上关于SSDT的文章也多不胜数。但是还是想自己写一下,因为我想试试我能不能用最简单的语言来描述SSDT——这个对一般来人来说比较神秘的属于内核的地带。引用EVA说的一句话,“以为写个驱动就是内核,还远着了”——大概是这么个意思,记得不是很清楚。 关于SSDT,描述得最清楚的应该算《SSDT Hook的妙用-对抗ring0 inline hook》一文了,作者是堕落天才。这

camin920的专栏 791

一张微服务地图的十年演进:Spring Cloud 核心、扩展与工具组件的定位、原理与选型

本文把 Spring Cloud 当作一张微服务地图来读:先说明它是由 Commons 抽象层、实现层和 Boot 装配层构成的发行版,再沿一次请求梳理注册发现、负载均衡、声明式调用、容错限流、网关、配置、追踪与总线七类核心组件的原理与换代,并扩展到云平台、服务网格、消息流、批处理、安全与周边生态。仿真实测:默认参数下实例宕机平均 242 秒才被感知,优雅下线降到 47 秒;一个慢实例让轮询的 P99 达 49 秒,P2C 仅 203 毫秒。最后给出退场替代表、技术栈组合、升级路线和决策树。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 169万+

KeServiceDescriptorTableShadow和KeAddSystemServiceTable函数的关系

KeServiceDescriptorTableShadow和KeAddSystemServiceTable函数的关系

linux-0.11调试教程 997

YOLOv12改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例

本文记录的是。SimAM注意力模块通过优化能量函数来获得每个神经元的三维权重,而或增加计算复杂度。若是有轻量化需求的小伙伴,无参的注意力模块也许是一个不错的选择。

Limiiiing的博客 2907

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

用symbol来获得ShadowSSDT的原始地址和函数名

在网上看了下,获得ShadowSSDT的函数名和原始地址的方法和文章不是很多。比较简单的应该算是设计张函数名表和用symbol的方法。 个人觉得用symbol来获得ShadowSSDT还是比较方便的,而且自己也不用去创建一张表,何乐而不为。^_^ 这办法简单的原因是我只需要一个win32.sys,win32.pdb,以及调用不到10个的API就能完成工作。 ...

weixin_34005042的博客 420

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Windows下如何获得KeServiceDescriptorTableShadow地址

Windows下如何获得KeServiceDescriptorTableShadow地址 总结网上文章的观点,主要有下面几种:1.根据操作系统分类。在WIN2K下KeServiceDescriptorTableShadow接跟着keServiceDescriptorTable;而在XP下,顺序正好相反,KeServiceDescriptorTable紧跟着KeServiceDescri

misterliwei的专栏 3164

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

shadow ssdt学习笔记

1。取得shadow ssdt真实地址系统只提供了KeServiceDescriptorTable导出KeServiceDescriptorTableShadow是个未导出结构定义Copy code    typedef struct _SYSTEM_SERVICE_TABLE    {          PNTPROC  ServiceTable;  // array of entry

sea 2336

系统服务描述符表

   大家都知道在WINNT 的内核中存在着两个变量,KeServiceDescriptorTable,KeServiceDescriptorTableShadow,我们可以使用KD 看到。kd> dd nt!KeServiceDescriptorTable8046e0c0  804746e8 00000000 000000f8 80474acc8046e0d0  00000000 0000000

CPPLOVER_78的专栏 6051

Window Hook 技术详解

Hook简介 微软的MSDN中,对Hook的解释为: A hook is a point in the system message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain

cx1990820的专栏 8691

关于windbg不能正确显示KeServiceDescriptorTableShadow的问题

参考了一下网上的文档,其实就是符号的问题 可以在symbol path里加入 srv*E:\WinDDK*http://msdl.microsoft.com/download/symbols E:\\WinDDK 是你的符号表要保存的硬盘路径 在windbg命令行下输入: kd>  !sym noisy          //命令希望WinDBG在获得符号的时候取得更多的信息 kd> 

u011019337的专栏 1062

Couldn't resolve error 的问题

1. 若符号存在D:\pathSymbols,输入命令: .sympath SRV*d:\pathSymbols*http://msdl.microsoft.com/download/symbols 2 .[使用!sym noisy命令希望WinDBG在获得符号的时候取得更多的信息,接着使用!lmi命令让WinDBG查看Windows的ntoskrnl模块。然后使用.reload /f

静故了群动 4977

获取SSDT,SSSDT原始函数地址

SSDT 当前函数地址 = KiSeviceTable + *(KiServiceTalbe + index * 4); TableRVA = KiSeviceTable - 内核真实加载地址 ; ImageBase = 0x140000000;(理想加载地址) ImageKiSeviceTable = ImageBase + TableRVA; LoadDLLBase = LoadLi

zhuhuibeishadiao 4884
上一篇: Vc dll中导出类的方法
下一篇: xp下sysenter hook-RDMSR-WRMSR
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值