zoukankan      html  css  js  c++  java
  • Rootkit之SSDT hook(通过CR0)

    SSDT即System Service Dispath Table,它是一个表,这个表中有内核调用的函数地址。
    KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导出的一个表,这个表是访问SSDT的关键,具体结构是
    typedef struct ServiceDescriptorTable {
    PVOID ServiceTableBase;
    PVOID ServiceCounterTable(0);
    unsigned int NumberOfServices;
    PVOID ParamTableBase;
    }

    其中,
    ServiceTableBase System Service Dispatch Table 的基地址。
    NumberOfServices 由 ServiceTableBase 描述的服务的数目。
    ServiceCounterTable 此域用于操作系统的 checked builds,包含着 SSDT 中每个服务被调用次数的计数器。这个计数器由 INT 2Eh 处理程序 (KiSystemService)更新。
    ParamTableBase 包含每个系统服务参数字节数表的基地址。

    CR0当中有一个写保护位,是保护内存不可写属性的,为了能够写入内核,只能把它的保护给咔嚓掉了,不过……如果做完了手脚但不还原写保护属性的话,极有可能会BOSD.

    代码实例如下:

    #include <NTDDK.h>

    #pragma pack(1)
    typedef struct ServiceDescriptorEntry {
    unsigned int *ServiceTableBase;
    unsigned int *ServiceCounterTableBase; //Used only in checked build
    unsigned int NumberOfServices;
    unsigned char *ParamTableBase;
    } ServiceDescriptorTableEntry, *PServiceDescriptorTableEntry;
    #pragma pack()

    _declspec(dllimport) ServiceDescriptorTableEntry 

    KeServiceDescriptorTable;

    NTSYSAPI NTSTATUS ZwOpenProcess(OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId);

    typedef NTSTATUS (*ZWOPENPROCESS)(OUT PHANDLE ProcessHandle,
    IN ACCESS_MASK DesiredAccess,
    IN POBJECT_ATTRIBUTES ObjectAttributes,
    IN PCLIENT_ID ClientId);

    #define SYSTEMSERVICE(_function) 

    KeServiceDescriptorTable.ServiceTableBase[*(PULONG)((PUCHAR)_function + 1)]

    ZWOPENPROCESS OldZwOpenProcess;

    NTSTATUS MyZwOpenProcess(PHANDLE ProcessHandle,
    ACCESS_MASK DesiredAccess,
    POBJECT_ATTRIBUTES ObjectAttributes,
    PCLIENT_ID ClientId)
    {
    NTSTATUS ntStatus = STATUS_SUCCESS;

    KdPrint(("MyZwOpenProcess "));

    //调用原来的NtOpenProcess;
    ntStatus = OldZwOpenProcess(ProcessHandle, DesiredAccess, ObjectAttributes, ClientId);

    return ntStatus;
    }

    VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    {
    __asm{//去掉内存保护
    cli
    mov  eax,cr0
    and  eax,not 10000h
    mov  cr0,eax
    }

    (ZWOPENPROCESS)SYSTEMSERVICE(ZwOpenProcess) = OldZwOpenProcess;//恢复HOOK SSDT

    __asm{//恢复内存保护 
    mov  eax,cr0
    or   eax,10000h
    mov  cr0,eax
    sti
    }

    KdPrint(("驱动卸载完毕! "));
    }

    NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING pRegistryPath)
    {
    NTSTATUS status = STATUS_SUCCESS;
    KdPrint(("The driver begin loading. "));
    DriverObject->DriverUnload = DriverUnload;
    OldZwOpenProcess = (ZWOPENPROCESS)SYSTEMSERVICE(ZwOpenProcess);

    __asm{//去掉内存保护
    cli
    mov  eax,cr0
    and  eax,not 10000h
    mov  cr0,eax
    }

    (ZWOPENPROCESS)SYSTEMSERVICE(ZwOpenProcess) = MyZwOpenProcess;    

    //HOOK SSDT

    __asm{//恢复内存保护 
    mov  eax,cr0
    or   eax,10000h
    mov  cr0,eax
    sti
    }
    KdPrint(("The driver ends loading "));
    return status;
    }
  • 相关阅读:
    [转载]ExtJs4 笔记(7) Ext.tip.ToolTip 提示
    [转载]ExtJs4 笔记(9) Ext.Panel 面板控件、 Ext.window.Window 窗口控件、 Ext.container.Viewport 布局控件
    [转载]ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件
    [转载]ExtJs4 笔记(6) Ext.MessageBox 消息对话框
    [转载]ExtJs4 笔记(5) Ext.Button 按钮
    vue 弹窗时 监听手机返回键关闭弹窗(页面不跳转)
    git打tag
    vue,element列表大数据卡顿问题,vue列表渲染慢,element表格渲染慢,表格渲染慢(卡),表格全选卡,使用umy-ui
    使用Git,从码云上clone项目到本地,修改完之后提交
    wpf 中 Ellipse 对象对动画性能的影响
  • 原文地址:https://www.cnblogs.com/vcerror/p/4289219.html
Copyright © 2011-2022 走看看