zoukankan      html  css  js  c++  java
  • 郁金香驱动笔记

    配置好双机调试  
    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:WINDDKsymbols*http://msdl.microsoft.com/download/symbols
    
    如何向内核地址写入自己代码
       mov [xxx],xx //
       1、如何向SSDT表写入内容呢,这个表是被保护的 正常情况不能被写入
      方法有三
    (1) 更改注册表 -最简单的做法
    HKLMSYSTEMCurrentControlsetControlSessionMangerMemoryManagement
    EnforceWriteProtection=0
    与
    HKLMSYSTEMCurrentControlsetControlSessionMangerMemoryManagement
    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类型的指针,指向需要删除的设备对象
    无返回值
    
    
    
    
    
  • 相关阅读:
    APP调用微信支付
    怎么在腾讯云上部署项目
    Jfinal中使用redis
    Jfinal框架中使用WebSocket
    一道sql面试题
    git本地仓库上传到git远程仓库的指令
    怎么启动postsqlgres
    SpringMVC用List接收请求参数
    转发 电商面试题100问
    转--MyBatis-Plus代码自动生成工具
  • 原文地址:https://www.cnblogs.com/zcc1414/p/3982530.html
Copyright © 2011-2022 走看看