xuehaipiaoxiang
驱动牛犊
驱动牛犊
  • 注册日期2006-10-11
  • 最后登录2013-02-01
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望273点
  • 贡献值0点
  • 好评度22点
  • 原创分4分
  • 专家分0分
阅读:2858回复:2

Regmon(5)

楼主#
更多 发布于:2007-06-10 19:46
挂钩注册表
替换系统服务表中的入口点,替换成自定义的入口点。当然,要保存原始的入口点。

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;
    }
}
lovehunterboy
驱动小牛
驱动小牛
  • 注册日期2008-05-29
  • 最后登录2010-04-16
  • 粉丝2
  • 关注0
  • 积分67分
  • 威望463点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-08-08 14:49
就到五啊,没后面的了?
xuehaipiaoxiang
驱动牛犊
驱动牛犊
  • 注册日期2006-10-11
  • 最后登录2013-02-01
  • 粉丝0
  • 关注0
  • 积分250分
  • 威望273点
  • 贡献值0点
  • 好评度22点
  • 原创分4分
  • 专家分0分
板凳#
发布于:2010-01-04 16:40
后面发现有问题了,就不继续更新了。
游客

返回顶部