菜鸟,这段时间内在学rootkit..学完SSDT HOOK(当然是最基本的..做一个总结);说错了,请大牛指出,别鄙视
SSDT:称为系统服务调度表,用于内核和用户层面的桥梁..
定义为:
#pragma pack(1)
typedef struct _ServiceDescriptorEntry{
unsigned int *ServiceTableBase; //SSDT的基址
unsigned int *ServiceCounterTableBase;
unsigned int NumberOfServices; //SSDT的项数
unsigned char *ParamTableBase;
}ServiceDescriptorEntry,*PServiceDescriptorEntry;
#pragma pack()
该结构内核导出的标量名字为:KeServiceDescriptorTable..
SSDT HOOK:最基本的就是,原对指向SSDT指向的函数的地址,指向自己的函数..进行过滤
但由于SSDT是只读的,任何合法的程序不能修改这个表:
有两个方案,可以解决(我是菜鸟,目标只了解到两个)..- -.
可以通过MDL,或者修改cr0..
1.MDL其实就是一个内存区域.包含了该内存区域的起始地址,拥有进程,字节数量;
typedef struct _MDL{
struct _MDL *Next;
CSHORT Size;
CSHORT MdlFlags; ;在用SSDT hook,只要主意这里,加上 (|=)MDL_MAPPED_TO_SYSTEM_VA;这个标志
struct _ERPROCESS *Process;
PVOID MappedSystemVa;
PVOID StartVa;
ULONG ByteCount;
ULONG ByteOffset;
}MDL,*PMDL;
用MDL,具体过程代码里有详细的解释..是网上的一些源代码改写的..我用的是VC2008,编译器..
2.cr0.
__asm{//去掉内存保护
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
}
//HOOK SSDT or 恢复...
__asm{//恢复内存保护
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
学驱动,这方面最大的感触..不是编出来,是蓝出来的..和正在学驱动这方面,一起努力..- -
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!