吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3866|回复: 5
收起左侧

[系统底层] ObRegisterCallBacks的初始化与插入

  [复制链接]
aswcy815174418 发表于 2022-1-27 11:57
本帖最后由 aswcy815174418 于 2022-1-27 12:42 编辑

本机环境:Windows10 X64 IDA 7.6Pro 内核文件:Windows7 X64 Sp1(ntoskrnl.exe)

特别说明:本图调用了两次ObRegisterCallBacks
最左边的图插入了两个回调函数到PsProcessType->CallBackList和PsThreadType->CallBackList
最右边的图插入一个回调函数到PsThreadType->CallBackList

黄色块具体定义:
typedef struct _CALLBACK_ENTRY_ITEM {
        LIST_ENTRY EntryItemList;
        OB_OPERATION Operations;
        CALLBACK_ENTRY* CallbackEntry; // Points to the CALLBACK_ENTRY which we use for ObUnRegisterCallback
        POBJECT_TYPE ObjectType;
        POB_PRE_OPERATION_CALLBACK PreOperation;
        POB_POST_OPERATION_CALLBACK PostOperation;
        __int64 unk;
}CALLBACK_ENTRY_ITEM, *PCALLBACK_ENTRY_ITEM;

绿色或橙色块具体定义
typedef struct _CALLBACK_ENTRY{
         __int16 Version;
         char buffer1[6];
         POB_OPERATION_REGISTRATION RegistrationContext;
         __int16 AltitudeLength1;
         __int16 AltitudeLength2;
         char buffer2[4];
         WCHAR* AltitudeString;
         CALLBACK_ENTRY_ITEM Items; // Is actually an array of CALLBACK_ENTRY_ITEMs that are also in a doubly linked list
}CALLBACK_ENTRY, *PCALLBACK_ENTRY;

最左边的注册回调函数代码:
NTSTATUS ProtectProcess()
{
    OB_CALLBACK_REGISTRATION obReg;
    OB_OPERATION_REGISTRATION opReg[2];

    memset(&obReg, 0, sizeof(obReg));
    obReg.Version = ObGetFilterVersion();
    obReg.OperationRegistrationCount = 1;
    obReg.RegistrationContext = NULL;
    RtlInitUnicodeString(&obReg.Altitude, L"123321");
    DbgPrint("%S\n", obReg.Altitude.Buffer);
    memset(&opReg, 0, sizeof(opReg)); //初始化结构体变量

    opReg[0].ObjectType = PsProcessType;
    opReg[0].Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
    opReg[0].PreOperation = (POB_PRE_OPERATION_CALLBACK)(&MyCallback);  //注册回调函数指针
    opReg[1].ObjectType = PsProcessType;
    opReg[1].Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
    opReg[1].PreOperation = (POB_PRE_OPERATION_CALLBACK)(&MyCallback);  //注册回调函数指针
    obReg.OperationRegistration = opReg; 

    ObRegisterCallbacks(&obReg, &obHandle); 

    DbgPrint("%p\n", obHandle);
    return 0;
}

最右边的注册回调函数代码:
NTSTATUS ProtectProcess()
{
    OB_CALLBACK_REGISTRATION obReg;
    OB_OPERATION_REGISTRATION opReg[1];

    memset(&obReg, 0, sizeof(obReg));
    obReg.Version = ObGetFilterVersion();
    obReg.OperationRegistrationCount = 1;
    obReg.RegistrationContext = NULL;
    RtlInitUnicodeString(&obReg.Altitude, L"123321");
    DbgPrint("%S\n", obReg.Altitude.Buffer);
    memset(&opReg, 0, sizeof(opReg)); //初始化结构体变量

    opReg[0].ObjectType = PsProcessType;
    opReg[0].Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;
    opReg[0].PreOperation = (POB_PRE_OPERATION_CALLBACK)(&MyCallback);  //注册回调函数指针
    obReg.OperationRegistration = opReg; 

    ObRegisterCallbacks(&obReg, &obHandle); 

    DbgPrint("%p\n", obHandle);
    return 0;
}

资料参考:https://www.unknowncheats.me/forum/anti-cheat-bypass/148364-obregistercallbacks-countermeasures.html

注册回调函数逻辑图

注册回调函数逻辑图

免费评分

参与人数 5吾爱币 +11 热心值 +5 收起 理由
junjia215 + 1 + 1 用心讨论,共获提升!
Hmily + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
arryboom + 2 + 1 佩服这张图
rogxo + 1 + 1 用心讨论,共获提升!
muyu1314520 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

rogxo 发表于 2022-1-27 15:42
看了,没学会
l3587518 发表于 2022-1-27 16:00
0xfg 发表于 2022-1-27 22:38
paradinse 发表于 2022-8-3 16:29
说实话看了半天硬了是没看懂。。。我在去补习一下
cjlsj666 发表于 2022-8-9 12:14
非常好,学习学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 18:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表