郁金香驱动笔记

配置好双机调试  
DriverEntry设置断点 __asm int 3;  
加载驱动 断下  
u 查看 汇编  
F8  步入  
F10 步过  
shift+F11  跳出函数 返回到上层call  
F5 运行  
bp  下CC断点 bp 模块名!函数名  
bl 显示断点  
bd 禁用断点  
bc 清除断点  
a 地址  之后 输入指令 之后回车  
  
WINGDBG  
SSDT的全称是System Services Descriptor Table,系统服务描述符表 在ntoskrnl.exe导出KeServiceDescriptorTable 这个表  
dd poi[KeServiceDescriptorTable]+索引号*4 显示  
Kernel Detective v1.4.1工具 查看 索引号  
索引号 计算 :  
找到什么名称的函数  在WINDBG中 u zw函数 EG: u zwOpenFile  
看到mov eax,74h  
  
对指定源代码处下断:  
bp `123!main.cpp:23`  
  
最关键的一点,使用"`"而不是"'"   

typedef struct ServiceDescriptorTable {
   PVOID ServiceTableBase; //System Service Dispatch Table 的基地址
   PVOID ServiceCounterTable(0);
 //包含着 SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter 更新。
   unsigned int NumberOfServices;//由 ServiceTableBase 描述的服务的数目。
   PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表
   }  
  用windbg 了解SSDT结构:
  windbg符号路径设置: srv*D:\WINDDK\symbols*http://msdl.microsoft.com/download/symbols

如何向内核地址写入自己代码
   mov [xxx],xx //
   1、如何向SSDT表写入内容呢,这个表是被保护的 正常情况不能被写入
  方法有三
(1) 更改注册表 -最简单的做法
HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\
EnforceWriteProtection=0
与
HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\
DisablePagingExecutive=1

(2)改变CR0寄存器的第1位wp位 置0-常用   网上流传的
(3)通过Memory Descriptor List(MDL) 内存描述符表-正规做法
MmCreateMdl   函数   描述某块内存的情况 运用在后面讲解;


这里显示:


下面为编程:    先是函数解释

  VOID  RtlInitUnicodeString
 (  
  IN OUT PUNICODE_STRING  DestinationString,   
  IN     PCWSTR            SourceString   
  );

DestinationString
 需要初始化的指针PUNICODE_STRING
SourceString
指向一个以空结尾的Unicode字符串常量,用这个字符串来初始化DestinationString。
 

例子
PUNICODE_STRING  s;
RtlInitUnicodeString(s, L"宽字符");//s=L"宽字符";
 IoCreateDevice 为驱动创建一个设备对象 格式如下:
NTSTATUS   IoCreateDevice(  
  IN  PDRIVER_OBJECT  DriverObject,  
  IN  ULONG  DeviceExtensionSize,  
  IN  PUNICODE_STRING  DeviceName  OPTIONAL,   
  IN  DEVICE_TYPE  DeviceType,    
  IN  ULONG  DeviceCharacteristics,   
  IN  BOOLEAN  Exclusive,   
  OUT PDEVICE_OBJECT  *DeviceObject    );
参数:
DriverObject
为指针调用驱动程序对象。每个驱动程序接收一个参数的指针,并将司机反对其DriverEntry例程。波分复用功能和筛选器驱动程序也可领取的AddDevice例程的驱动程序对象的指针。
DeviceExtensionSize  //0
给_DEVICE_OBJECT.DeviceExtension指定内存空间大小,具体看自己定义结构的大小
DeviceName
设备名字
DeviceType
设备类型 这里我们用FILE_DEVICE_UNKNOWN
DeviceCharacteristics
设备特征信息 一般为0
Exclusive
是否指定设备为独占 是为TRUE,否为FALSE
DeviceObject
指针变量接收一个指向新创建的DEVICE_OBJECT结构。用来回传数据
返回值
调用成功会返回 STATUS_SUCCESS   如果出错会返回下列值
STATUS_INSUFFICIENT_RESOURCES//资源不足
STATUS_OBJECT_NAME_EXISTS    //指定对象名存在
STATUS_OBJECT_NAME_COLLISION//对象名有冲突
IoCreateSymbolicLink
创建一个设备链接。驱动程序虽然有了设备名称,但是这种设备名筄只能在内核 态可见,而对于应用程序是不可见的,因此,驱动需要要暴露一个符号链接,该链接指向真正的设备名称

NTSTATUS   IoCreateSymbolicLink(  
  IN PUNICODE_STRING  SymbolicLinkName, 
  IN PUNICODE_STRING  DeviceName    );
参数:
SymbolicLinkName
Unicode字符串指针,是一个用户态可见的名称。

DeviceName
Unicode字符串指针,是驱动程序创建的设备对象名称。

Return Value
如果符号链接创建成功 返回STATUS_SUCCESS 
删除符号链接
IoDeleteSymbolicLink(symLinkName); 

 
 
 
 
VOID   IoDeleteDevice(   
 IN PDEVICE_OBJECT  DeviceObject 
   );

参数
DeviceObject
PDEVICE_OBJECT类型的指针,指向需要删除的设备对象
无返回值
 
 
 

转载于:https://www.cnblogs.com/zcc1414/p/3982530.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
免key版,511U盘资源,速度很快!经测试全部可下 课程分四个大章节 初级篇,中级篇,进阶篇,高级篇 初级篇内容:编写一个完整的,简单的外挂 C++的数据类型:Byte,Word,DWORD,int,float API函数的调mouse_event,GetWindowRect,SetCursorPos,FindWindow,SendMessage) CE5.4工具的使用方法 中级篇内容:调试工具的使用技巧,功能CALL的概念 调试工具OD1.1的使用技巧(如硬件断点,条件断点,内存断点。 常用汇编指令与对应高级语言的转换。 游戏功能CALL概念 找第一个功能CALL 外挂框架的构建(通用) 进阶篇内容:分析游戏内部数据,分析常用功能CALL 游戏数据实践找各种功能CALL(如打怪,选怪,物品使用,技能栏之类)及相应的代码编写 高级篇内容:编写完整外挂 完成一个相对完整的外挂,实现 自动挂机,打怪,存放物品之类的功能 1 入门篇.以《QQ连连看为例》 1.1、一个最简单的外挂 1.1.1、游戏窗口数据分析(SPY++) a、取得窗口相对坐标 b、读出游戏窗口信息GetWindowRect c、移动鼠标指针SetCursorPos 1.1.2 用VC++写个最简单的外挂(实现游戏开局) a、鼠拟鼠标单击mouse_event b、鼠标指针移动还原 c、集成到startgame函数里 1.2、用CE查找棋盘数据 1.2.1、CE中的数据类型 a、数据类型:Bit,Byte,Word,Dword,float,double b、用CE查找出坐位号; c、保存分析数据 1.2.2、编程读出坐位号; a、远程读取进程数据 b、打开远程进程 c、读取远程进程数据 1.2.3、用CE查出棋盘基址; a、找棋盘数据基址 b、分析棋盘数据结构 1.2.4、读出当前棋盘数据 a、编程读出棋盘数据 b、棋盘数据显示出来 1.3、用模拟技术编制外挂 1.3.1 分析棋子与棋盘坐标关系 a、鼠标软件模拟,函数SendMessage b、分析窗口内棋子相对坐标X,Y c、软件模拟点击棋盘坐标x,y处的棋子 1.3.2 消掉一对棋子的算法框架 a、遍历棋盘同类型棋子配对 b、构建算法框架 1.3.3 (Check2p)大致框架(算法核心) a、在这一对棋子间找相通路径的原理 b、(Check2p函数)框架代码 c、(CheckLine函数)检测2点是否有连通. 1.3.4 CheckLine实现 a、CheckLine函数实现 b、Check2p核心代码架构 1.3.5 Check2p完整代码实现 1.3.6 编写完整外挂,界面美化 1.4、游戏加速.去掉对动画效果.非HOOK 1.4.1:用OD找出 动画延时代码 1.4.2:写代码去掉延时,实现游戏加速 2 中级篇 以热血江湖为例 2.1、分析前的准备..CALL简介: 2.1.1、CALL调用示例分析.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值