IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 8.内核模块(驱动模块) -> 正文阅读

[大数据]8.内核模块(驱动模块)

目录

0.内核模块

1.DRIVER_OBJECT

<1>.代码示例

2.遍历内核模块

<1>.手动查看

<2>.代码遍历


0.内核模块

1).在应用层中,每一个.exe/.dll都称之为模块,也就是PE文件.一个进程中除了自身主模块可以包含多个模块(dll).

2).驱动程序每一个都是一个模块,称为"内核模块",都可以加载到内核中,都遵守PE结构.但本质上讲,任意一个.sys文件与内核文件没有区别.

1.DRIVER_OBJECT

通过Windbg输入指令 dt _DRIVER_OBJECT

每个内核模块都有一个对应的结构体,来描述这个模块在内核中的:位置,大小,名称等等.

nt!_DRIVER_OBJECT
  +0x000 Type             : Int2B//类型
  +0x002 Size             : Int2B//大小
  +0x004 DeviceObject     : Ptr32 _DEVICE_OBJECT//设备对象结构   
  +0x008 Flags            : Uint4B
  +0x00c DriverStart      : Ptr32 Void//模块基址
  +0x010 DriverSize       : Uint4B//模块大小
  +0x014 DriverSection    : Ptr32 Void//指向_LDR_DATA_TABLE_ENTRY结构体
  +0x018 DriverExtension  : Ptr32 _DRIVER_EXTENSION//驱动扩展   
  +0x01c DriverName       : _UNICODE_STRING//模块名称
  +0x024 HardwareDatabase : Ptr32 _UNICODE_STRING
  +0x028 FastIoDispatch   : Ptr32 _FAST_IO_DISPATCH
  +0x02c DriverInit       : Ptr32     long//驱动真正入口点函数 
  +0x030 DriverStartIo    : Ptr32     void 
  +0x034 DriverUnload     : Ptr32     void//卸载函数 
  +0x038 MajorFunction    : [28] Ptr32     long//派遣函数 

<1>.代码示例

#include <ntifs.h>

NTSTATUS DriverUnload(PDRIVER_OBJECT pDriver)
{
    DbgPrint("Driver Exit \r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
    DbgPrint("Driver Load \r\n"); 
    pDriver->DriverUnload = DriverUnload;

    DbgPrint("PDRIVER_OBJECT -> [0x%08x] \r\n", pDriver);

    return STATUS_SUCCESS;
}

1).输出驱动对象地址?

2).通过Windbg查看结构属性

DRIVER_EXTENSION -> ServiceKeyName 为服务名

CMD中可输入

net start ServiceKeyName启动一个服务

net stop ServiceKeyName停止一个服务

2.遍历内核模块

DRIVER_OBJECT?->?DriverSection指向结构体_KLDR_DATA_TABLE_ENTRY(未导出结构)

WRK中的定义如下:   
typedef struct _KLDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderLinks;//双向链表指向其他内核模块 通过链表可遍历当前系统所有内核模块
    ULONG __Undefined1;
    ULONG __Undefined2;
    ULONG __Undefined3;
    ULONG NonPagedDebugInfo;
    ULONG DllBase;//模块基址
    ULONG EntryPoint;//模块入口点
    ULONG SizeOfImage;//模块大小
    UNICODE_STRING FullDllName;//模块路径
    UNICODE_STRING BaseDllName;//模块名称
    ULONG Flags;
    USHORT LoadCount;
    USHORT __Undefined5;
    ULONG  __Undefined6;
    ULONG  CheckSum;
    ULONG  TimeDateStamp;

} KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;       

<1>.手动查看

DRIVER_OBJECT->DriverSection指向当前内核模块

通过第一个成员双向链表可以遍历整个未隐藏内核模块

<2>.代码遍历

#include <ntifs.h>

typedef struct _KLDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderLinks;
    ULONG __Undefined1;
    ULONG __Undefined2;
    ULONG __Undefined3;
    ULONG NonPagedDebugInfo;
    ULONG DllBase;
    ULONG EntryPoint;
    ULONG SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    ULONG Flags;
    USHORT LoadCount;
    USHORT __Undefined5;
    ULONG  __Undefined6;
    ULONG  CheckSum;
    ULONG  TimeDateStamp;

} KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;

NTSTATUS DriverUnload(PDRIVER_OBJECT pDriver)
{
    DbgPrint("Driver Unload\r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
    PKLDR_DATA_TABLE_ENTRY pCur = (PKLDR_DATA_TABLE_ENTRY)pDriver->DriverSection;
    PKLDR_DATA_TABLE_ENTRY pTem = pCur;

    do
    {
        DbgPrint("IMAGEBASE [0x%08x]  NAME [%ws] \r\n", pCur->DllBase, pCur->FullDllName.Buffer);
        pCur = (PKLDR_DATA_TABLE_ENTRY)(pCur->InLoadOrderLinks.Blink);
    } while (pCur != pTem);


    //IRP
    pDriver->DriverUnload = DriverUnload;

    return STATUS_SUCCESS;
}

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-03 17:09:36  更:2021-10-03 17:11:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:58:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码