驱动牛犊
|
阅读:2972回复:2
Regmon(5)
挂钩注册表
替换系统服务表中的入口点,替换成自定义的入口点。当然,要保存原始的入口点。 VOID HookRegistry(void) { 挂钩所有的内容 RealRegOpenKey = SYSCALL(ZwOpenKey); 这句没什么好说的,无非是把原始ZwOpenKey备份到RealRegOpenKey指针里。比较神奇的是这个SYSCALL。 SYSCALL是一个宏,具体如下: 挂钩和脱钩宏。在x86处理器的Zw*函数中,跟随在第一个字节后面的双字是系统调用号,所以我们把每一个Zw*函数当作参数传递,并且可以把这些值取出来。因为这样仅当Zw*函数未被其他应用改变,才能使用这种系统挂钩。 } 这个SYSCALL的宏是这样定义的: #if defined(_ALPHA_) #define SYSCALL(_function) ServiceTable->ServiceTable[(*(PULONG)_function) & 0x0000ffff] #else #define SYSCALL(_function) ServiceTable->ServiceTable(*(PULONG)((PUCHAR)_function + 1)) 这里的_ALPHA_是CPU系列的类型,目前主要分X86和_ALPHA_,我们用的奔腾,奔4等均属于X86系列。 下面是HookRegistry函数的详细代码 VOID HookRegistry( void ) { RealRegOpenKey = SYSCALL(ZwOpenKey); SYSCALL(ZwOpenKey) = (PVOID)HookRegOpenKey; RealRegQueryKey = SYSCALL(ZwQueryKey); SYSCALL(ZwQueryKey) = (PVOID)HookRegQueryKey; RealRegQueryValueKey = SYSCALL(ZwQueryValueKey); SYSCALL(ZwQueryValueKey) = (PVOID)HookRegQueryValueKey; RealRegEnumerateValueKey = SYSCALL(ZwEnumerateValueKey); SYSCALL(ZwEnumerateValueKey) = (PVOID)HookRegEnumerateValueKey; RealRegEnumerateKey = SYSCALL(ZwEnumerateKey); SYSCALL(ZwEnumerateKey) = (PVOID)HookRegEnumerateKey; RealRegDeleteKey = SYSCALL(ZwRegDeleteKey); SYSCALL(ZwRegDeleteKey) = (PVOID)HookRegEnumerateKey; RealRegFlushKey = SYSCALL(ZwFlushKey); SYSCALL(ZwFlushKey) = (PVOID)HookRegFlushKey; RealRegSetValueKey = SYSCALL(ZwSetValueKey); SYSCALL(ZwSetValueKey) = (PVOID)HookRegFlushKey; RealRegCreateKey = SYSCALL(ZwCreateKey); #if defined(_ALPHA_) SYSCALL(ZwCreateKey) = (PVOID)((ULONG)HookRegCreateKey + ((ULONG)RealRegCreateKey & 0x00000003)); } #else SYSCALL(ZwCreateKey) = (PVOID)HookRegCreateKey; #endif RegRealDeleteValueKey = SYSCALL(ZwDeleteValueKey); SYSCALL(ZwDeleteValueKey) = (PVOID)HookRegDeleteValueKey; RealRegCloseKey = SYSCALL(ZwCloseKey); SYSCALL(ZwCloseKey) = (PVOID)HookRegCloseKey; RegHooked = true; } 下面是对应的UnhookRegistry函数,相对而言要简单的多: VOID UnhookRegistry() { if(RegHooked) { 脱钩 SYSCALL(ZwOpenKey) = (PVOID)RealRegOpenKey; SYSCALL(ZwQueryKey) = (PVOID)RealRegQueryKey; SYSCALL(ZwQueryValueKey) = (PVOID)RealRegQueryValueKey; SYSCALL(ZwEnumerateValueKey) = (POVID)RealRegEnumerateValueKey; SYSCALL(ZwEnumerateKey) = (PVOID)RealEnumerateKey; SYSCALL(ZwCloseKey) = (PVOID)RealRegCloseKey; SYSCALL(ZwFlushKey) = (PVOID)RealRegFlushKey; SYSCALL(ZwDeleteKey) = (PVOID)RealRegDeleteKey; SYSCALL(ZwSetValueKey) = (PVOID)RealRegSetValueKey; SYSCALL(ZwCreateKey) = (PVOID)RealRegCreateKey; SYSCALL(ZwDeleteValueKey) = (PVOID)RealRegDeleteValueKey; RegHooked = false; } } |
|
沙发#
发布于:2008-08-08 14:49
就到五啊,没后面的了?
|
|
驱动牛犊
|
板凳#
发布于:2010-01-04 16:40
后面发现有问题了,就不继续更新了。
|
|