• 遍历注册表回调函数(仿PCHunter CmpBack)


    遍历注册表回调函数(仿PCHunter CmpBack)

    typedef struct _CAPTURE_REGISTRY_MANAGER

    {

    PDEVICE_OBJECT deviceObject;

    BOOLEAN bReady;

    LARGE_INTEGER  registryCallbackCookie;

    LIST_ENTRY lQueuedRegistryEvents;

    KTIMER connectionCheckerTimer;

    KDPC connectionCheckerFunction;

    KSPIN_LOCK lQueuedRegistryEventsSpinLock;

    ULONG lastContactTime;

    } CAPTURE_REGISTRY_MANAGER, *PCAPTURE_REGISTRY_MANAGER;

    系统注册表回调函数注册流程

    调用CmRegisterCallback 

    第一个参数就是 回调函数地址

    第二个参数是 PCAPTURE_REGISTRY_MANAGER 指针

    CmRegisterCallback内部会操作两个全局变量

       CmpCallBackCount 注册表回调函数数组总数

       CallbackListHead 注册表回调函数数组头部(每个元素是 LIST_ENTRY 对象 ->Blink 指向ExAllocatePoolWithTag申请的一个地址 为了方便这里简称Ha)

       Ha+0x18 = 上面说的 CmRegisterCallback 函数的第二个参数

       Ha+0x1C = 上面说的 CmRegisterCallback 函数的第一个参数

       这样就可以依靠 上面的两个全局变量 遍历出来 注册表回调函数

     代码(只放出重要部分)

     vntoskrnlBaseAddr  内核模块基地址(ntoskn...模块)

    //回调函数数组

    ULONG vCmpCallBackCount = *vPCmpCallBackCount;

    PLIST_ENTRY vPCallbackListHead = (PLIST_ENTRY)(vntoskrnlBaseAddr + 0x167F70);

    while (vCmpCallBackCount)

    {

    KdPrint(("vPCallbackListHead->Flink = 0x%08X ", vPCallbackListHead->Flink));

    ULONG vExAllocateAddr = (ULONG)vPCallbackListHead->Flink;

    KdPrint(("CaptrueRegisterManager = 0x%08X ", *(PULONG)(vExAllocateAddr + 0x18)));

    KdPrint(("RegistryCallbackFunction = 0x%08X ", *(PULONG)(vExAllocateAddr + 0x1C)));

    KdPrint((" -------------------------------------------------------------- "));

    vPCallbackListHead++;

    vCmpCallBackCount--;

    }

    jpg 改 rar

  • 相关阅读:
    一些前端面试题
    CSS高度塌陷问题解决方案
    闭包
    作用域
    JS的预编译过程
    小技巧集合
    序选择器
    HTML初始结构
    剖析Vue原理&实现双向绑定MVVM
    Safari 3D transform变换z-index层级渲染异常
  • 原文地址:https://www.cnblogs.com/kuangke/p/5916191.html
Copyright © 2020-2023  润新知