当前位置:主页 > 365bet体育在线下载 >

使用WIN 64恢复SSDT挂钩

使用WIN 64恢复SSDT挂钩
时间:2012-04-3015:28来源:已完成待定:只需点击一下网络:时间
在上一篇文章中,我解释了如何在Win64系统上实现SSDTHOOK。当然有SSDTHOOK
让我们解释如何使用UNHOOKSSDT方法实现UNHOOKSSDT。
要恢复SSDT,首先要获取SSDT的每个功能的原始地址和SSDT的每个功能的原始地址。
当然它存储在内核文件中。
所以,有以下想法:
1
在内核中获取KiServiceTable地址(变量名:KiServiceTable)
2
在内核中获取内核文件的上传地址(变量名:BaseNtos)
3
获取PE32 +结构的内核文件映像的基址(变量名称:NtosImageBase)
4
在您自己的进程中加载??内核文件并获取分配的地址(变量名称:NtosInProcess)

计算KiServiceTable和NtosBase之间的距离(变量名:RVA)
6
获取指定INDEX函数的地址(计算公式:*(PULONG LONG)(NtosInProcess + RVA + 8 * index)
-NtosImageBase + NtosBase)
在WIN32和原始方向下获得的SSDT功能的想法并没有那么不同。接下来,将描述第六步骤的计算公式。
你是怎么得到的
首先看一下IDA的截图。
从文件中的KiServiceTable地址,可以理解该函数每8个字节存储一次。
地址(这是一个理想的地址的原因是因为这个地址是基于内核文件映像NtosImageBase的基地址)
而不是依赖于“NtosBase内核文件的基本加载地址”。
因此,请获取8 *索引。
已经
已获得KiServiceTable与NtosBase之间的距离(RVA = KiServiceTable-NtosBase)。
内核文件分配地址在其自己的进程(NtosInProcess)中也是已知的,因此可以在文件上计算。
KiServiceTable地址(NtosInProcess + RVA)。
因此,存储包含每个函数的原始地址的文件的位置。
地址是NtosInProcess + RVA + 8 *索引。
取该地址的值(长度为8)。
*(PULONG LONG)(NtosInProcess + RVA + 8 * Index)。
我之前说过这个功能。
该地址是理想的地址,因为它假定加载基地址是结构的PE32 + ImageBase成员(基于图像)。

实际上,内核文件loadbase不应该具有此值,因此我们从内核文件中减去映像库。
地址(NtosImageBase)和基于内核文件的加载实地址(NtosBase)。
接下来,采取每个步骤。
实现该过程的代码
1
获取KiServiceTable地址
毫无疑问,这需要在控制器中实现。
首先看一下结构。
typedefstruct_System_Service_Table{
PVOIDServiceTableBase;
PVOIDServiceCounterTableBase;
ULONG64NumberOfServices;
PVOIDParamTableBase;
SYSTEM_SERVICE_TABLE,* PSYSTEM_SERVICE_TABLE;
除了这个结构的厚度为16字节,厚度是WIN64的两倍之外,这种结构对每个人都是众所周知的。
32个字节
但是,在获取KeServiceDescriptorTable的地址后,许多属性不会更改。
KeServiceDescriptorTable的地址将是此结构的结构指针,然后是此结构的第一个指针。
ServiceTableBase元素是KiServiceTable地址。
实际上,编写代码比编写代码更容易。只有两个。
上面的GetKeServiceDescriptorTable 64代码不再存在。
它说:
ULONGLONGGetKeServiceDescriptorTable 64()
charKiSystemServiceStart_pattern[13]=
x 8 B x F 8 x C 1 x EF x 07 x 83 x 7 x 20 x 25 x FF x 0 F x 00 x 00
ULONGLONGCodeScanStart =(ULONGLONG)_strnicmp;
ULONG LONG Code Scan End =(ULONG LONG)KdDebuggerNotPresent;
UNICODE_STRINGSymbol;
ULONG LONGi,tbl_address,b;
(I = 0; iCodeScanEnd-CodeScanStart; i ++)
是的(!
Memcmp((char *)(ULONGLONG)CodeScanStart + i,
(Char *)KiSystemServiceStart_pattern,13))
在(b = 0; b50; b ++)的情况下
Tbl_address =((ULONGLONG)CodeScanStart + i + b);
是(*(USHORT *)((ULONGLONG)tbl_address)= =(USHORT)0x8d4c)
((LONGLONG)tbl_address + 7)+ *(LONG *)(tbl_address)被返回。
+3)
返回0;
ULONG64ssdt_base_aadress = GetKeServiceDescriptorTable 64();
KiServiceTable = *(PULLONGLONG)ssdt_base_aadress;
2
获取内核中的内核文件的加载地址


点击次数:  更新时间2019-07-29  【打印此页】  【关闭
上一篇:什么时候怀孕最准确?
下一篇:没有了