前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >X86 下的SSDT HOOK

X86 下的SSDT HOOK

作者头像
IBinary
修改2019-08-06 16:37:45
1.1K0
修改2019-08-06 16:37:45
举报
文章被收录于专栏:逆向技术逆向技术

目录

  • SSDTHOOK
    • 1.SSDTHOOK 原理.
    • 1.x32下的SSDT HOOK
    • 2.SSDT HOOK代码
    • 3.结果
    • 4.总结

SSDTHOOK

1.SSDTHOOK 原理.

x32下,直接获取系统描述符表.以及调用号.就可以进行HOOK了.

x64下可以设置回调来进行过滤我们想要的功能.当然如果你简单的过一下PatchGuard也可以设置SSDT HOOK.

1.x32下的SSDT HOOK

首先SSDT 我们是可以在windbg下看到的

SSDT表的结构如下:

代码语言:javascript
复制
typedef struct _KSERVICE_TABLE_DESCRIPTOR {
    PULONG_PTR Base;
    PULONG Count;
    ULONG Limit;
    PUCHAR Number;
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;

在WRK中的 ke.h中可以看到.

查看定义

在wrk中也可以看到定义的地方. 所以我们只需要在我们的函数中引用这个全局变量即可.

其中这个结构第一项是表的首地址 第二项是表的个数. *表 + n = 第某个函数的地址 也就是 base[10]就是第十项的地址.

KeServiceDescriptorTable

对应PCHunter查看.

所以我们想要HOOK就很简单了.

  1. 导入全局变量. 则获得SSDT表的地址
  2. 获取你想HOOK函数的位置
  3. 进行HOOK
  4. HOOK之前关闭一下CR0得写保护

代码如下:

2.SSDT HOOK代码

代码语言:javascript
复制
#include "Driver.h"

NTKERNELAPI UCHAR* PsGetProcessImageFileName(IN PEPROCESS Process);

void UnHook();
void DriverUnLoad(PDRIVER_OBJECT pDriverObj)
{
    UnHook();
    KdPrint(("驱动卸载成功"));
}

typedef struct _KSERVICE_TABLE_DESCRIPTOR {
    PULONG_PTR Base;
    PULONG Count;
    ULONG Limit;
    PUCHAR Number;
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR;

__declspec(dllimport) KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable; //导入全局变量

// sizeof(base) + 370 * 4 = NtTerMinateProcess

//extern KSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable
typedef NTSTATUS(*PfnZwTerminateProcess)(
    IN HANDLE              ProcessHandle OPTIONAL,
    IN NTSTATUS            ExitStatus);

PfnZwTerminateProcess OldZwTerminateProcess;
NTSTATUS Hook_ZwTerminateProcess(
    IN HANDLE              ProcessHandle OPTIONAL,
    IN NTSTATUS            ExitStatus)
{
    NTSTATUS rc;
    PEPROCESS pRocess;
    UCHAR *pszProcessName;
    //UCHAR *pszProcessName = PsGetProcessImageFileName();
    rc = ObReferenceObjectByHandle(ProcessHandle, GENERIC_ALL, *PsProcessType, KernelMode, &pRocess, NULL);
    if (!NT_SUCCESS(rc))
    {
        
        return OldZwTerminateProcess(ProcessHandle, ExitStatus);
    }
    pszProcessName = PsGetProcessImageFileName(pRocess);
    if (strstr(pszProcessName, "calc"))
    {
        return STATUS_ACCESS_DENIED;
        ObDereferenceObject(pRocess);
    }
    ObDereferenceObject(pRocess);
    rc = OldZwTerminateProcess(ProcessHandle, ExitStatus);
    return rc;
}
//关闭写保护 1111 1111 1111 1110 1111 1111 1111 1111 
VOID _CloseWriteProtected()
{
    __asm
    {
        push eax
        mov eax, cr0
        and eax, 0xFFFEFFFF
        mov cr0,eax
        pop eax
    }
    return;
}
VOID _OpenTheWriteProtected()
{
    __asm
    {
        push    eax
        mov        eax, cr0
        or eax, NOT 0xFFFEFFFF
        mov        cr0, eax
        pop        eax
    }
    return;
}
void HOOK()
{
    //370是ntTerminateProcess 也可以写成 base + sizeof(type) *n = *(KeServiceDescriptorTable.Base) + 4 * 370 = NtTinminateProcess的地址
    /*
    OldZwTerminateProcess = (PfnZwTerminateProcess)(*(KeServiceDescriptorTable.Base) + 370 * 4);
    */
    OldZwTerminateProcess = (PfnZwTerminateProcess)KeServiceDescriptorTable.Base[370];
    _CloseWriteProtected();
    //
    KeServiceDescriptorTable.Base[370] = (int)Hook_ZwTerminateProcess;

    _OpenTheWriteProtected();
}
void UnHook()
{
    _CloseWriteProtected();
    //
    KeServiceDescriptorTable.Base[370] = (int)OldZwTerminateProcess;

    _OpenTheWriteProtected();
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegPath)
{
    
    pDriverObj->DriverUnload = DriverUnLoad;
    
    HOOK();
    return STATUS_SUCCESS;
}

3.结果

4.总结

总的来说如果按照服务号来HOOK是很简单的.如果没有服务号你怎么HOOK? 其实在32位下.你调用的函数.里面就有调用号.内核也跟应用层的调用号是息息相关的.我们可以取得函数调用号进行HOOK也可以.

如:

代码语言:javascript
复制
未测试.
KeServiceDescriptorTable.Base[*(PULONG)((PUCHAR)_FUNCTION +1)];

其中_FUNCTION用名字修改即可.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SSDTHOOK
    • 1.SSDTHOOK 原理.
      • 1.x32下的SSDT HOOK
        • 2.SSDT HOOK代码
          • 3.结果
            • 4.总结
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档