之前的笔记搬运
可以通过bcdedit增加双机调试
在页目录指针表前增加了PML, CR3指向PML
R3->R0 变成了syscall
增加的保护机制:
1
2DES: 驱动强制签名
KPP: kernel patch内核补丁保护, 重要代码被改动就蓝屏, 调试模式KPP不启动x64的ssdt表中存放的是偏移, 首地址+偏移的方式确定函数地址, 偏移大小4字节, 而用户加载的驱动代码的基址与系统模块的基址查了很大, 所以用4字节表示不了偏移的大小, 利用这个来防止用户驱动对ssdt的修改
所以在x64中hook ssdt的不是直接修改ssdt表了, 内联hook系统不用的函数地址, 使之跳转到我们函数, 但是会遇到kpp保护的问题;
开机F8选择禁用驱动签名可以关闭DES
EPROCESS里的ActiveProcessLinks双向链表, 断链可隐藏进程, 但是EPROCESS并没有删除, 从0开始遍历线程ID, 通过API从线程ID取EPROCESS, 取出EPROCESS查看是否在ActiveProcessLinks链表内, 可以判断该进程是否被隐藏的
PsSetCreateProcessNotifyRoutine: 设置监控进程回调函数, Ex版有更多功能要支持设置回调函数需要加入编译选项LINKER_FLAGS = /INTEGRITYCHECK注意需要放在最后面
ZwDuplicateObject: ntdll的导出函数, 把一个进程的句柄表拷贝到另一个进程
ObReferenceObjectByHandle: 通过句柄获得对象
ObQueryNameString : 对象获取名字
进程和线程ID是用于查询EPROCESS和ETHREAD的特殊下标,而这个表在内核中是PspCidTable, 未导出, 在WRK的PsLookupThreadByThreadId函数可以看到, 在函数中会把句柄赋值给一个EXHANDLE类型变量中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
typedef union _EXHANDLE
{
struct
{
ULONG_PTR TagBits:2;
ULONG_PTR Index:29;
};
struct
{
ULONG_PTR TagBits2:2;
ULONG_PTR LowIndex:HANDLE_LOW_BITS; //8
ULONG_PTR MidIndex:HANDLE_HIGH_BITS;//9
ULONG_PTR HighIndex:HANDLE_HIGH_BITS;//9
ULONG_PTR KernelFlag:KERNEL_FLAG_BITS;
};
HANDLE GenericHandleOverlay;
ULONG_PTR Value;
} EXHANDLE, *PEXHANDLE;
所以一个句柄被分成了以上几个部分