SSDT HOOK,通过hook NtOpenProcess达到保护制定进程效果

  SSDT hook技术是一种很老的技术了,但是作为新手还是有必要知道和学习的。首先说一下 KeServiceDescriptorTable ,通过WRK可以找到该函数的原型

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

 

该函数为导出,首先要到处该函数,才能使用

废话不多说了,贴出自己写的代码 (vs2010+WDK)

//SSDT.h

typedef struct _KSERVICE_TABLE_DESCRIPTOR {
PULONG_PTR Base;
PULONG Count;
ULONG Limit;
PUCHAR Number;
} KSERVICE_TABLE_DESCRIPTOR, *PKSERVICE_TABLE_DESCRIPTOR; //申明KeServiceDescriptorTable结构,通过wrk查找
extern PKSERVICE_TABLE_DESCRIPTOR KeServiceDescriptorTable;//导出该函数

//获取SSDT的基地址
ULONG GetSSDTAddr(int _index)
{
return KeServiceDescriptorTable->Base[_index];
}

//暴力去除页面保护,如果不去除无法修改
void off()
{
__asm 

cli 
mov     eax, cr0 
and     eax, not 10000h 
mov     cr0, eax 

};

//恢复页面保护,否则会蓝屏
void on()
{
__asm 

mov     eax, cr0 
or     eax, 10000h 
mov     cr0, eax 
sti 

};


typedef NTSTATUS (__stdcall *NewNtOpenProcess)
(
__out PHANDLE ProcessHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__in_opt PCLIENT_ID ClientId
);
extern "C" NTSTATUS
PsLookupProcessByProcessId(
__in HANDLE ProcessId,
__deref_out PEPROCESS *Process
);
extern "C" UCHAR *
PsGetProcessImageFileName(
__in PEPROCESS Process
);

//全局变量,用于存放原始地址
ULONG oldaddr;
NewNtOpenProcess _NewNtOpenProcess;
 //自己的HOOK函数
NTSTATUS MyNtOpenProcess(
__out PHANDLE ProcessHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__in_opt PCLIENT_ID ClientId

{
NTSTATUS _ntstatus;
PEPROCESS _eprocess;
_ntstatus=_NewNtOpenProcess(ProcessHandle,DesiredAccess,ObjectAttributes,ClientId);
if (NT_SUCCESS(_ntstatus))
{

                       //通过PsLookupProcessByProcessId遍历出所有进程ID,并存放在_eprocess
_ntstatus=PsLookupProcessByProcessId(ClientId->UniqueProcess,&_eprocess);
if (NT_SUCCESS(_ntstatus))
{

                              //获取所有的进程名称
CHAR *ProcessN=(CHAR*)PsGetProcessImageFileName(_eprocess);

                                //判断所有进程名称内存地址是否有效
if (MmIsAddressValid(ProcessN)==TRUE)
{
/*DbgPrint("%s",ProcessN)*/;

                                  //通过与字符串比较获取进程中是否有相同的进程名称
if (strcmp(ProcessN,"calc.exe")==0)
{
               //如果存在就返回无权操作
_ntstatus=STATUS_ACCESS_DENIED;

}
}
}

                     
ObDereferenceObject(_eprocess);
}
return _ntstatus;
}



//hook方法
void SSDTHOOKNtOpenProcess()
{

       //保存旧的地址
oldaddr=GetSSDTAddr(122);
_NewNtOpenProcess=(NewNtOpenProcess)oldaddr;
off();

KeServiceDescriptorTable->Base[122]=(ULONG)MyNtOpenProcess;//
on();


}
void UnHook()
{
off();
KeServiceDescriptorTable->Base[122]=oldaddr;
on();
}

到这里基本完成了,测试也是通过的,如果想要源代码,请加QQ:361121687 有不对的地方请指正

下次说说保护文件吧,然后通过不同测试写一下内核的各种hook方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vt hook ssdt是一种技术,用于在操作系统内核中拦截和修改系统服务调用。通过Vt(Virtualization Technology)技术,可以在操作系统运行时对系统服务进行动态修改,从而实现对系统行为的控制和修改。 以下是一个Vt hook ssdt的示例代码: ```c #include <ntddk.h> ULONG_PTR OriginalServiceAddress = 0; NTSTATUS HookServiceCall(IN PUNICODE_STRING ServiceName, IN ULONG_PTR NewServiceAddress) { NTSTATUS status = STATUS_SUCCESS; ULONG_PTR serviceAddress = 0; // 获取系统服务地址 status = ZwQuerySystemInformation(SystemModuleInformation, NULL, 0, &serviceAddress); if (status != STATUS_INFO_LENGTH_MISMATCH) { return status; } // 遍历系统服务表 PSYSTEM_MODULE_INFORMATION pModuleInfo = (PSYSTEM_MODULE_INFORMATION)ExAllocatePoolWithTag(NonPagedPool, serviceAddress, 'hook'); if (pModuleInfo == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } status = ZwQuerySystemInformation(SystemModuleInformation, pModuleInfo, serviceAddress, NULL); if (!NT_SUCCESS(status)) { ExFreePoolWithTag(pModuleInfo, 'hook'); return status; } for (ULONG i = 0; i < pModuleInfo->NumberOfModules; i++) { PRTL_PROCESS_MODULES pModule = &pModuleInfo->Modules[i]; // 找到ntoskrnl.exe模块 if (wcsstr(pModule->FullPathName, L"ntoskrnl.exe") != NULL) { // 计算SSDT地址 ULONG_PTR ssdtAddress = (ULONG_PTR)pModule->ImageBase + pModule->OffsetToFileName; // 保存原始的系统服务地址 OriginalServiceAddress = *(ULONG_PTR*)ssdtAddress; // 修改系统服务地址为新的地址 *(ULONG_PTR*)ssdtAddress = NewServiceAddress; break; } } ExFreePoolWithTag(pModuleInfo, 'hook'); return status; } NTSTATUS UnhookServiceCall() { if (OriginalServiceAddress != 0) { // 恢复原始的系统服务地址 *(ULONG_PTR*)ssdtAddress = OriginalServiceAddress; OriginalServiceAddress = 0; } return STATUS_SUCCESS; } ``` 以上代码是一个简单的Vt hook ssdt的示例,通过调用`HookServiceCall`函数可以将指定的系统服务地址替换为新的地址,通过调用`UnhookServiceCall`函数可以恢复原始的系统服务地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值