在说到SSDTHook结束之前,咱们首要来了解一下Win32API的调用进程,咱们以ReadFile()为例,来看看从Ring3层到Ring0层的调用进程:

在一个Ringapprove3进程T数组去重est.exe中调用R数组初始化e索引的效果及优缺点adFil索引有哪几种类型e()函数,此时咱们调索引是什么意思用的是kernel3appointment2.dll中apple的导出函数,接下来ReadFile()会调用到坐落ntdll.dll中的NtReadFile()或许ZwReadFiappreciatele(),在ntdll.dll中的这两个函数结束是相同的数组词,经过Windbg调试器检查如下:
SSDTHook完成解析(x86)
SSDTHook完成解析(x86)

经过调用ntdll.dll中的NtReadFile()索引超出矩阵维度函数会将体系调用号放入EAX寄存器中,以便切入内核时在SSDT表中找到对应的appreciate内核函数;假如内核选用自陷指令int 0x2e时,将库房上的参数块开端地址放入ED数组排序X寄存器中,以便于在内核层仿制索引符号用户层所传递参数;接下来会经过int 0x2E自陷指令,切入到内核中去,此处的0x2E是体系连续appear向量表中的连续向量,也是IDT表的数组下标,在IDT表的对应偏移处找到连续程序入口地址,实行连续处理函数KiSystemService()。假如选用快速调用指令sysenter时,将库房指针保存在ED数组公式X寄存器中,进入内核,体系的的处理函数就是KiFastCallEntry()。
切入内核之后,会实行内核层(也就是内核模块ntoskrnl.exe)的ZwReadFile()函数,取出体系调用号,在SSDT表中找到服务表基地址,依索引失效的几种状况据调用号找到对应数组初始化的函数,即为究竟结束体系调用结束NtReadFile()。
appointment以咱们想要进行SSDTHook,只需要依据索引找到SS索引图DT表中对应Nt系application列函数的地址,修改索引所对应的函数地址为咱们的Fake函数,即可结束SSDTHook。
以上索引超出矩阵维度为原理分析,下面进入正题,看app安装下载代码:
此处代码的关键在于构建MDL,而构建MDL的意图是为了修改内存特征,由于本来的特征是写保护,将政策虚拟内存对应的内容仿制一份到新建的MDL虚拟内存块上,而这两块内存是映射到同一片物理内存上。毕application竟运用InterlockedExchange原子锁操作办法用Fake函数地址替approve换了政策函数地址。

NTSTATUS S索引有哪几种类型SDTHapproachook(
PU数组去重办法CHAR TargetF数组的界说unctionAddress,
PVOID  FakeFapproachunctioapprovenAddre索引怎么做ss,
PVOID* OriginalFunctionAddress)
{
NTSTATUS Status = STATUS_SUCCESS;
__Mdl = MmCreateMdappointmentl(NULL,
Ke索引优化SerapproachviceDescriptorTable->ServiceTableBase,
KeServiceDescriptorTable->NumberOfService * sizeof(PVOID));
if (approach!__Mdl)
{
return STATUS_UNSUCCES数组去重办法SFUL;
}
MmBuildMdlForNonPagedPool(__Mdl);appear
//批appstore改特征为可写
__Mdl->MdlFlags = __Mdl->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;数组指针
__ServiceTableBase = MmMapLockedPages(__Mdl, Kern索引elMode);
if (__数组词ServiceTableBase)
{
*OriginalFunctionAddress = (PVOID)InterlockedExchange(
(PLONG)(&__ServiceTableBas索引优化e[GetSSDTIndex(TargetF索引的效果及优缺点unction索引的效果及优缺点Address)]),
(LONG)FakappstoreeFunctionAddress);
}
return Status;
}

也可以运用嵌入式汇编的办法,修改内存写保护特征,那索引优化就是修改CRappstore0寄存器得第16位为0,则废掉写保护

	_asm
{
cli;                 //制止任何连续产索引怎么做
push eax;
mov  eax, cr0;
mov  Attribute, eax;
and  eax, 0xFFFEFFFF; // CR0 16 BIT = 0 
mov  cr0, eax;
pop  eax;
};

上面代码用到了宏Ge索引tSSDTIndex是得到体系服务号,也就是函数地址表的索引,这儿对函数指针强转为PUCHAR类型再加1是有索引超出矩阵维度原因的,我觉得有必要说明以下

#define数组的界说 GetSSDTIndex(ServiceFunction)         (*(PULONG)((PUCHAR)ServiceFunction + 1))
2: kd> u ZwReadFile
nt!ZwReadF数组排序ile:
84841354 b811010000      mov     eax,111h
84841359 8d542404索引怎么做        leaappstore     edx,[esp+4]
8484135索引怎么做d 9c              pushfd
8484135索引有哪几种类型e 6a08            push    8
84841360 e859130000      call    nt!KiSystemSeapproachrvice (848426be索引失效)
84841365 c22400          ret     24h

我想咱们看一下这段Windbg调试器的内容就能了解为何强转成索引超出矩阵维度PUCHAR类型的指针再加一了吧数组去重办法,就是为了跳过初始的b8指令,取出函数索引0111h。
至此,Hook完索引失效毕,其实也没什么难的,重要的是懂数组指针得其间Hook得原理。Hook完毕时分,比及驱动卸载时分,必定要注意恢复SSDT表嗷!!
鄙人管中窥豹,写帖子进程中不免存在疏忽和纰漏,还请各位大牛指出。