吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5269|回复: 26
收起左侧

[系统底层] HOOK-SSDT实现监控关闭notepad.exe

[复制链接]
aswcy815174418 发表于 2021-9-5 16:02
本帖最后由 aswcy815174418 于 2021-9-6 00:21 编辑

测试环境:Windows XP SP3 32位

效果看图片

代码如下:
[C] 纯文本查看 复制代码
#include "ntifs.h"
#define i 0x101
#define PROCESS_NAME "notepad.exe"
typedef struct _SERVICE_TABLE {
        ULONG* FunAddr;
        ULONG Count;
        ULONG ServiceLimit;
        UCHAR* ParaSize;
}SERVICE_TABLE,*PSERVICE_TABLE;

typedef struct _SERVICE_TABLE_ENTANCE {
        SERVICE_TABLE Blue_Table;
        SERVICE_TABLE Yellow_Table;
        SERVICE_TABLE Reserve1;
        SERVICE_TABLE Reserve2;
}SERVICE_TABLE_ENTANCE;

__declspec(dllimport) SERVICE_TABLE_ENTANCE KeServiceDescriptorTable;

typedef UCHAR* (*pGetName)(__in PEPROCESS Process);
typedef NTSTATUS(*pfun)(HANDLE   ProcessHandle, NTSTATUS ExitStatus);
ULONG HookAddr;


NTSTATUS HOOK(HANDLE   ProcessHandle, NTSTATUS ExitStatus,...) {
        pfun NtTerminateProcess = (pfun)HookAddr;
        NTSTATUS    status;
        PEPROCESS pEProcess;
        //有这两个条件就是自己关闭的,非任务管理器
        if (ProcessHandle == 0|| ProcessHandle==-1) {
                return NtTerminateProcess(ProcessHandle, ExitStatus);
        }

        try{
                //我去windbg获取的这个函数地址,直接贴了,没遍历获取
                pGetName PsGetProcessImageFileName = (pGetName)0x80528784;
                
                status = ObReferenceObjectByHandle(ProcessHandle, FILE_READ_DATA, NULL, KernelMode, &pEProcess, NULL);

                UCHAR* str = PsGetProcessImageFileName(pEProcess);
                
                if (!strcmp(str, PROCESS_NAME)) {
                        DbgPrint("拦截到%s", str);
                        return STATUS_ACCESS_DENIED;
                }
        }
        except (1){
                return NtTerminateProcess(ProcessHandle, ExitStatus);
        }
        return NtTerminateProcess(ProcessHandle, ExitStatus);
}

NTSTATUS CancelHOOK() {
        KeServiceDescriptorTable.Blue_Table.FunAddr[i] = HookAddr;
        return STATUS_SUCCESS;
}

NTSTATUS Unload(PDRIVER_OBJECT pDriver) {
        CancelHOOK();
        DbgPrint("已经卸载");
        return STATUS_SUCCESS;
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING ppath) {
        pDriver->DriverUnload = Unload;

        HookAddr = KeServiceDescriptorTable.Blue_Table.FunAddr[i];
        KeServiceDescriptorTable.Blue_Table.FunAddr[i] = HOOK;
        DbgPrint("%x %x", HookAddr,HOOK);
        
        return STATUS_SUCCESS;
}

异常关闭.png
正常关闭.png

免费评分

参与人数 5吾爱币 +10 热心值 +5 收起 理由
junjia215 + 1 + 1 用心讨论,共获提升!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
chenkeai深蓝 + 1 用心讨论,共获提升!
为之奈何? + 1 + 1 我很赞同!
努力加载中 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

IBinary 发表于 2021-9-6 10:27
aswcy815174418 发表于 2021-9-5 18:46
64位还得自己研究研究调用过程啊

64位  SSDT[index] >> 4 + SSDT.base  = 真实函数地址.
HOOK的话可以使用  mov rax,jmp rax 跨4GB空间跳转. 跳转到KeBugCheckEx
KebugCheckEx跳转到我们函数.

且64位 无法过PatchGuard 所以还是老老实实使用官方提供的过滤API来做吧.
iamasbgfi 发表于 2021-9-5 16:22
超级大碰碰 发表于 2021-9-5 16:22
 楼主| aswcy815174418 发表于 2021-9-5 16:23

忘记说了,我这个是XP下实现的
 楼主| aswcy815174418 发表于 2021-9-5 16:25

第一种就是发送,VM_CLOSE
第二种就是用NtTerminateProcess
鸭子咯咯哒~ 发表于 2021-9-5 17:59
这个不是64位的啊
 楼主| aswcy815174418 发表于 2021-9-5 18:46

64位还得自己研究研究调用过程啊
sdi 发表于 2021-9-5 20:51
再试试win7系统下怎么样
jiajunvs 发表于 2021-9-5 21:08
win10有效?
xcy521qlk 发表于 2021-9-5 22:16
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 19:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表