首页
社区
课程
招聘
[原创]逆向分析:Win10 ObRegisterCallbacks的相关分析
发表于: 2025-4-4 22:11 4964

[原创]逆向分析:Win10 ObRegisterCallbacks的相关分析

2025-4-4 22:11
4964

写这篇帖子主要是为记录ObRegisterCallbacks函数的相关分析,如有错误,欢迎批评指正。
给出的为C伪代码,仅展示逻辑,不保证安全性。

C的伪代码如下

这是原始汇编代码

逆向ObUnRegisterCallbacks的思路
函数开头保存了一些寄存器的值,包括rbx、rbp、rsi、rdi,以及r12到r15,这说明函数会使用这些寄存器,并在结束时恢复它们。接着分配了0x20字节的栈空间,一般用于局部变量。
然后检查输入参数。这是内核函数的通用操作,可以看一下。
movzx eax, word ptr [rcx],这里rcx是第一个参数,可能是一个指向OB_CALLBACK_REGISTRATION结构的指针。接着用0xFF00进行按位与操作,判断是否设置了特定标志。如果不符合条件,跳转到错误处理部分,返回错误码0xC000000D(STATUS_INVALID_PARAMETER)。

接下来,函数读取r15+2处的字(可能是OperationCount),如果为零,同样跳转到错误处理。这里检查是否有有效的操作类型数量。

然后,函数计算需要分配的内存大小,使用ExAllocatePoolWithTag分配内存,标签是0x6C46624F,可能是'ObCf'的ASCII表示,ObjectCallbackFunction嘛。如果分配失败,返回0xC000009A(STATUS_INSUFFICIENT_RESOURCES)。

分配内存后,用memset清零,这里用RltZeroMemory替代,并设置结构体的各个字段。
然后,通过循环处理每个回调操作,验证每个回调的Altitude和回调函数是否有效,特别是调用MmVerifyCallbackFunctionCheckFlags来验证回调函数的标志位。

在处理每个回调项时,会为每个操作分配一个回调块,并将其插入到全局回调链表中,使用ObpInsertCallbackByAltitude确保按Altitude排序。如果插入失败,函数需要回滚已分配的资源,并返回相应的错误码。
KeEnterCriticalRegion这些就是APC相关函数

内核中也在用ExAllocatePoolWithTag嘛,WDK还非要用ExAllocatePool2:)
几个函数中最引人注目的应该是MmVerifyCallbackFunctionCheckFlags吧,负责对回调合法性的检验,下面有对其分析。

原始汇编代码

分析思路
首先看开头部分。代码开始保存寄存器和分配栈空间,接着初始化esi为0,把rcx(第一个参数)赋值给rbx。比较si和[rbx+2]的值,如果si大于等于的话,跳转到释放内存的部分。这可能是在检查回调项的数量是否处理完毕。

接下来,循环部分处理每个回调项。使用shl rax,6和add rdi,rax来计算每个回调项的位置,大概是每个项的大小为0x40(64字节)。然后调用ExWaitForRundownProtectionRelease,这可能是在等待引用计数归零。然后获取当前线程,减少资源计数,进入临界区,获取PushLock,操作链表来移除回调项,释放锁,离开临界区。循环直到所有项处理完,最后释放内存。

然后看ObpCallPostOperationCallbacks部分。这部分在遍历链表,调用每个回调的后期处理函数。通过比较链表是否为空来决定是否继续。取出链表中的每个节点,进行验证,调用guard_dispatch_icall执行回调函数,释放资源,并释放内存。最后释放对象引用,离开临界区。
这个逆向还原度可能没上一个高。

分析思路
开头是保存寄存器的指令,把rbx、rbp、rsi压入栈中,然后push rdi,接着调整rsp分配栈空间。这些操作通常在函数开头。
接下来,mov edi, edx 和 mov rsi, rcx,这里应该是将传入的参数保存到edi和rsi中,然后调MiGetSystemRegionType,结果保存在eax中。比较eax和1,如果相等就跳转到地址fffff800`23faf75e,将eax清零然后跳转到结尾返回。这说明如果MiGetSystemRegionType返回1,函数直接返回0。

如果比较结果不相等(即eax不等于1),则继续执行后面的代码。这里从地址fffff800`23faf6f3开始,读取gs:[188h],也就是当前线程的KTHREAD结构,保存到rbp。然后xor ebx, ebx,将ebx清零,用来作为返回值或者中间变量。接着对[rbp+1E4h]处的字减1,这可能是线程的某个计数器,比如资源计数或递归计数。然后mov dl,1,准备调用ExAcquireResourceSharedLite,传入rcx为PsLoadedModuleResource,dl为1(表示等待资源可用)。

接下来调用MiLookupDataTableEntry,参数是rsi(原rcx,即第一个参数)和edx(此时为0)。检查返回的rax是否为NULL,如果是,跳到后面释放资源的部分。否则,测试edi(原edx,第二个参数)是否为0,如果是,设置ebx为1。否则,检查rax+68h处的值与edi是否相交,如果相交则ebx保持0,否则设为1。之后释放资源,调用ExReleaseResourceLite,然后恢复线程状态,返回ebx的值。
MiLookupDataTableEntry
MiLookupDataTableEntry的原型返回一个指向数据表条目结构的指针,该结构包含Flags字段在偏移0x68处。
如何确定就是Flags呢?
Windbg里dt一下LDR_DATA_TABLE_ENTRY

只要Flags给一个非0值,就会检查,而ObRegisterCallbacks传的是硬编码0x20,这便是许多帖子都说要将DriverSection的Flag值设为0x20的原因。
因此绕过方法就是Flags值设为0x20。这个更改是通过修改LDR_DATA_TABLE_ENTRY的结构体实现的,后面有分析和示例代码

这个Altitude在微软的说明文档中也是模棱两可,测试开发填321000应该可以吧(怀疑),正式的应该要向微软申请。
Altitude的具体就没逆了

这几个的分析思路和ObRegisterCallbacks一致
以下的结构体完全依照Windbg的符号分析

这便是绕过MmVerifyCallbackFunctionCheckFlags的突破口,将Flags的值设为0x20,示例如下

效果

这个在一些其他函数中有引用,所以分析一下结构即可

这个在ObUnRegisterCallbacks有用到

以上的测试分析基于Win10 build19041进行,欢迎各位指正

NTSTATUS ObRegisterCallbacks(POB_CALLBACK_REGISTRATION CallbackRegistration, PVOID *RegistrationHandle) {
    POB_CALLBACK_ENTRY CallbackEntry;
    POB_CALLBACK_HEADER Header;
    ULONG TotalSize;
    NTSTATUS Status = STATUS_SUCCESS;
    ULONG i;
 
    //验证基本结构版本和标志位
    if ((CallbackRegistration->Version & 0xFF00) != OB_FLT_REGISTRATION_VERSION ||
        CallbackRegistration->OperationCount == 0)
    {
        return STATUS_INVALID_PARAMETER;
    }
 
    //计算需要分配的内存大小(Header + 回调项数组)
    TotalSize = sizeof(OB_CALLBACK_HEADER) +
                CallbackRegistration->OperationCount * sizeof(OB_CALLBACK_ENTRY);
 
    // 分配带标签的内存池
    Header = (POB_CALLBACK_HEADER)ExAllocatePoolWithTag(NonPagedPool, TotalSize, 'ObCf');
    if (!Header) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    RtlZeroMemory(Header, TotalSize);
 
    // 初始化Header结构
    Header->Version = CallbackRegistration->Version;
    Header->OperationCount = CallbackRegistration->OperationCount;
    Header->RegistrationContext = CallbackRegistration->RegistrationContext;
 
    // 处理每个回调项
    for (i = 0; i < CallbackRegistration->OperationCount; i++) {
        POB_OPERATION_REGISTRATION Operation = &CallbackRegistration->OperationRegistration[i];
        CallbackEntry = &Header->Entries[i];
 
        // 验证Altitude和回调函数
        if (Operation->Altitude == 0 ||
            !MmVerifyCallbackFunctionCheckFlags(Operation->PreOperation, 0x20) ||
            (Operation->PostOperation &&
             !MmVerifyCallbackFunctionCheckFlags(Operation->PostOperation, 0x20)))
        {
            Status = STATUS_INVALID_PARAMETER;
            break;
        }
 
        // 初始化回调项
        CallbackEntry->Altitude = Operation->Altitude;
        CallbackEntry->PreOperation = Operation->PreOperation;
        CallbackEntry->PostOperation = Operation->PostOperation;
        InitializeListHead(&CallbackEntry->Link);
 
        // 按Altitude插入全局链表
        Status = ObpInsertCallbackByAltitude(CallbackEntry);
        if (!NT_SUCCESS(Status)) {
            break;
        }
    }
 
    // 错误处理:回滚已注册项
    if (!NT_SUCCESS(Status)) {
        for (ULONG j = 0; j < i; j++) {
            ObpRemoveCallbackEntry(&Header->Entries[j]);
        }
        ExFreePoolWithTag(Header, 'ObCf');
        return Status;
    }
 
    //设置输出句柄
    *RegistrationHandle = Header;
    return STATUS_SUCCESS;
}
NTSTATUS ObRegisterCallbacks(POB_CALLBACK_REGISTRATION CallbackRegistration, PVOID *RegistrationHandle) {
    POB_CALLBACK_ENTRY CallbackEntry;
    POB_CALLBACK_HEADER Header;
    ULONG TotalSize;
    NTSTATUS Status = STATUS_SUCCESS;
    ULONG i;
 
    //验证基本结构版本和标志位
    if ((CallbackRegistration->Version & 0xFF00) != OB_FLT_REGISTRATION_VERSION ||
        CallbackRegistration->OperationCount == 0)
    {
        return STATUS_INVALID_PARAMETER;
    }
 
    //计算需要分配的内存大小(Header + 回调项数组)
    TotalSize = sizeof(OB_CALLBACK_HEADER) +
                CallbackRegistration->OperationCount * sizeof(OB_CALLBACK_ENTRY);
 
    // 分配带标签的内存池
    Header = (POB_CALLBACK_HEADER)ExAllocatePoolWithTag(NonPagedPool, TotalSize, 'ObCf');
    if (!Header) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }
    RtlZeroMemory(Header, TotalSize);
 
    // 初始化Header结构
    Header->Version = CallbackRegistration->Version;
    Header->OperationCount = CallbackRegistration->OperationCount;
    Header->RegistrationContext = CallbackRegistration->RegistrationContext;
 
    // 处理每个回调项
    for (i = 0; i < CallbackRegistration->OperationCount; i++) {
        POB_OPERATION_REGISTRATION Operation = &CallbackRegistration->OperationRegistration[i];
        CallbackEntry = &Header->Entries[i];
 
        // 验证Altitude和回调函数
        if (Operation->Altitude == 0 ||
            !MmVerifyCallbackFunctionCheckFlags(Operation->PreOperation, 0x20) ||
            (Operation->PostOperation &&
             !MmVerifyCallbackFunctionCheckFlags(Operation->PostOperation, 0x20)))
        {
            Status = STATUS_INVALID_PARAMETER;
            break;
        }
 
        // 初始化回调项
        CallbackEntry->Altitude = Operation->Altitude;
        CallbackEntry->PreOperation = Operation->PreOperation;
        CallbackEntry->PostOperation = Operation->PostOperation;
        InitializeListHead(&CallbackEntry->Link);
 
        // 按Altitude插入全局链表
        Status = ObpInsertCallbackByAltitude(CallbackEntry);
        if (!NT_SUCCESS(Status)) {
            break;
        }
    }
 
    // 错误处理:回滚已注册项
    if (!NT_SUCCESS(Status)) {
        for (ULONG j = 0; j < i; j++) {
            ObpRemoveCallbackEntry(&Header->Entries[j]);
        }
        ExFreePoolWithTag(Header, 'ObCf');
        return Status;
    }
 
    //设置输出句柄
    *RegistrationHandle = Header;
    return STATUS_SUCCESS;
}
nt!ObRegisterCallbacks:
fffff800`243ca320 48895c2408      mov     qword ptr [rsp+8],rbx
fffff800`243ca325 48896c2410      mov     qword ptr [rsp+10h],rbp
fffff800`243ca32a 4889742418      mov     qword ptr [rsp+18h],rsi
fffff800`243ca32f 57              push    rdi
fffff800`243ca330 4154            push    r12
fffff800`243ca332 4155            push    r13
fffff800`243ca334 4156            push    r14
fffff800`243ca336 4157            push    r15
fffff800`243ca338 4883ec20        sub     rsp,20h
fffff800`243ca33c 0fb701          movzx   eax,word ptr [rcx]
fffff800`243ca33f 4c8bf9          mov     r15,rcx
fffff800`243ca342 b900ff0000      mov     ecx,0FF00h
fffff800`243ca347 33ff            xor     edi,edi
fffff800`243ca349 6623c1          and     ax,cx
fffff800`243ca34c 4c8be2          mov     r12,rdx
fffff800`243ca34f b900010000      mov     ecx,100h
fffff800`243ca354 8bdf            mov     ebx,edi
fffff800`243ca356 663bc1          cmp     ax,cx
fffff800`243ca359 0f8532740900    jne     nt!ObRegisterCallbacks+0x97471 (fffff800`24461791)  Branch
 
nt!ObRegisterCallbacks+0x3f:
fffff800`243ca35f 410fb74702      movzx   eax,word ptr [r15+2]
fffff800`243ca364 6685c0          test    ax,ax
fffff800`243ca367 0f8424740900    je      nt!ObRegisterCallbacks+0x97471 (fffff800`24461791)  Branch
 
nt!ObRegisterCallbacks+0x4d:
fffff800`243ca36d 410fb76f08      movzx   ebp,word ptr [r15+8]
fffff800`243ca372 448d6f01        lea     r13d,[rdi+1]
fffff800`243ca376 8bc8            mov     ecx,eax
fffff800`243ca378 83c520          add     ebp,20h
fffff800`243ca37b c1e106          shl     ecx,6
fffff800`243ca37e 41b84f62466c    mov     r8d,6C46624Fh
fffff800`243ca384 03e9            add     ebp,ecx
fffff800`243ca386 418bcd          mov     ecx,r13d
fffff800`243ca389 8bd5            mov     edx,ebp
fffff800`243ca38b 448bf5          mov     r14d,ebp
fffff800`243ca38e e87dcc1e00      call    nt!ExAllocatePoolWithTag (fffff800`245b7010)
fffff800`243ca393 488bf0          mov     rsi,rax
fffff800`243ca396 4885c0          test    rax,rax
fffff800`243ca399 0f841f730900    je      nt!ObRegisterCallbacks+0x9739e (fffff800`244616be)  Branch
 
nt!ObRegisterCallbacks+0x7f:
fffff800`243ca39f 458bc6          mov     r8d,r14d
fffff800`243ca3a2 33d2            xor     edx,edx
fffff800`243ca3a4 488bc8          mov     rcx,rax
fffff800`243ca3a7 e8d48cc4ff      call    nt!memset (fffff800`24013080)
fffff800`243ca3ac b800010000      mov     eax,100h
fffff800`243ca3b1 668906          mov     word ptr [rsi],ax
fffff800`243ca3b4 498b4718        mov     rax,qword ptr [r15+18h]
fffff800`243ca3b8 48894608        mov     qword ptr [rsi+8],rax
fffff800`243ca3bc 450fb74708      movzx   r8d,word ptr [r15+8]
fffff800`243ca3c1 412be8          sub     ebp,r8d
fffff800`243ca3c4 6644894612      mov     word ptr [rsi+12h],r8w
fffff800`243ca3c9 6644894610      mov     word ptr [rsi+10h],r8w
fffff800`243ca3ce 8bcd            mov     ecx,ebp
fffff800`243ca3d0 4803ce          add     rcx,rsi
fffff800`243ca3d3 48894e18        mov     qword ptr [rsi+18h],rcx
fffff800`243ca3d7 498b5710        mov     rdx,qword ptr [r15+10h]
fffff800`243ca3db e8e089c4ff      call    nt!memcpy (fffff800`24012dc0)
fffff800`243ca3e0 8bef            mov     ebp,edi
fffff800`243ca3e2 66413b7f02      cmp     di,word ptr [r15+2]
fffff800`243ca3e7 0f83b6000000    jae     nt!ObRegisterCallbacks+0x183 (fffff800`243ca4a3)  Branch
 
nt!ObRegisterCallbacks+0xcd:
fffff800`243ca3ed 448bf5          mov     r14d,ebp
fffff800`243ca3f0 49c1e605        shl     r14,5
fffff800`243ca3f4 4d037720        add     r14,qword ptr [r15+20h]
fffff800`243ca3f8 8bdd            mov     ebx,ebp
fffff800`243ca3fa 41397e08        cmp     dword ptr [r14+8],edi
fffff800`243ca3fe 0f847c730900    je      nt!ObRegisterCallbacks+0x97460 (fffff800`24461780)  Branch
 
nt!ObRegisterCallbacks+0xe4:
fffff800`243ca404 498b06          mov     rax,qword ptr [r14]
fffff800`243ca407 488b08          mov     rcx,qword ptr [rax]
fffff800`243ca40a f6414240        test    byte ptr [rcx+42h],40h
fffff800`243ca40e 0f846c730900    je      nt!ObRegisterCallbacks+0x97460 (fffff800`24461780)  Branch
 
nt!ObRegisterCallbacks+0xf4:
fffff800`243ca414 498b4e10        mov     rcx,qword ptr [r14+10h]
fffff800`243ca418 4885c9          test    rcx,rcx
fffff800`243ca41b 0f84a7720900    je      nt!ObRegisterCallbacks+0x973a8 (fffff800`244616c8)  Branch
 
nt!ObRegisterCallbacks+0x101:
fffff800`243ca421 ba20000000      mov     edx,20h
fffff800`243ca426 e8a552beff      call    nt!MmVerifyCallbackFunctionCheckFlags (fffff800`23faf6d0)
fffff800`243ca42b 85c0            test    eax,eax
fffff800`243ca42d 0f84bf720900    je      nt!ObRegisterCallbacks+0x973d2 (fffff800`244616f2)  Branch
 
nt!ObRegisterCallbacks+0x113:
fffff800`243ca433 498b4e18        mov     rcx,qword ptr [r14+18h]
fffff800`243ca437 4885c9          test    rcx,rcx
fffff800`243ca43a 0f85a0720900    jne     nt!ObRegisterCallbacks+0x973c0 (fffff800`244616e0)  Branch
 
nt!ObRegisterCallbacks+0x120:
fffff800`243ca440 48c1e306        shl     rbx,6
fffff800`243ca444 4883c320        add     rbx,20h
fffff800`243ca448 4803de          add     rbx,rsi
fffff800`243ca44b 488d4b38        lea     rcx,[rbx+38h]
fffff800`243ca44f 48895b08        mov     qword ptr [rbx+8],rbx
fffff800`243ca453 48891b          mov     qword ptr [rbx],rbx
fffff800`243ca456 e8f5d4aeff      call    nt!ExInitializePushLock (fffff800`23eb7950)
fffff800`243ca45b 418b4608        mov     eax,dword ptr [r14+8]
fffff800`243ca45f 488bd3          mov     rdx,rbx
fffff800`243ca462 894310          mov     dword ptr [rbx+10h],eax
fffff800`243ca465 48897318        mov     qword ptr [rbx+18h],rsi
fffff800`243ca469 498b06          mov     rax,qword ptr [r14]
fffff800`243ca46c 488b08          mov     rcx,qword ptr [rax]
fffff800`243ca46f 48894b20        mov     qword ptr [rbx+20h],rcx
fffff800`243ca473 498b4610        mov     rax,qword ptr [r14+10h]
fffff800`243ca477 48894328        mov     qword ptr [rbx+28h],rax
fffff800`243ca47b 498b4618        mov     rax,qword ptr [r14+18h]
fffff800`243ca47f 48894330        mov     qword ptr [rbx+30h],rax
fffff800`243ca483 e86c000000      call    nt!ObpInsertCallbackByAltitude (fffff800`243ca4f4)
fffff800`243ca488 8bd8            mov     ebx,eax
fffff800`243ca48a 85c0            test    eax,eax
fffff800`243ca48c 7815            js      nt!ObRegisterCallbacks+0x183 (fffff800`243ca4a3)  Branch
 
nt!ObRegisterCallbacks+0x16e:
fffff800`243ca48e 6644016e02      add     word ptr [rsi+2],r13w
fffff800`243ca493 4103ed          add     ebp,r13d
fffff800`243ca496 410fb74f02      movzx   ecx,word ptr [r15+2]
fffff800`243ca49b 3be9            cmp     ebp,ecx
fffff800`243ca49d 0f824affffff    jb      nt!ObRegisterCallbacks+0xcd (fffff800`243ca3ed)  Branch
 
nt!ObRegisterCallbacks+0x183:
fffff800`243ca4a3 85db            test    ebx,ebx
fffff800`243ca4a5 0f884c720900    js      nt!ObRegisterCallbacks+0x973d7 (fffff800`244616f7)  Branch
 
nt!ObRegisterCallbacks+0x18b:
fffff800`243ca4ab 663b7e02        cmp     di,word ptr [rsi+2]
fffff800`243ca4af 7316            jae     nt!ObRegisterCallbacks+0x1a7 (fffff800`243ca4c7)  Branch
 
nt!ObRegisterCallbacks+0x191:
fffff800`243ca4b1 8bc7            mov     eax,edi
fffff800`243ca4b3 4103fd          add     edi,r13d
fffff800`243ca4b6 48c1e006        shl     rax,6
fffff800`243ca4ba 44096c3034      or      dword ptr [rax+rsi+34h],r13d
fffff800`243ca4bf 0fb74602        movzx   eax,word ptr [rsi+2]
fffff800`243ca4c3 3bf8            cmp     edi,eax
fffff800`243ca4c5 72ea            jb      nt!ObRegisterCallbacks+0x191 (fffff800`243ca4b1)  Branch
 
nt!ObRegisterCallbacks+0x1a7:
fffff800`243ca4c7 49893424        mov     qword ptr [r12],rsi
 
nt!ObRegisterCallbacks+0x1ab:
fffff800`243ca4cb 8bc3            mov     eax,ebx
 
nt!ObRegisterCallbacks+0x1ad:
fffff800`243ca4cd 488b5c2450      mov     rbx,qword ptr [rsp+50h]
fffff800`243ca4d2 488b6c2458      mov     rbp,qword ptr [rsp+58h]
fffff800`243ca4d7 488b742460      mov     rsi,qword ptr [rsp+60h]
fffff800`243ca4dc 4883c420        add     rsp,20h
fffff800`243ca4e0 415f            pop     r15
fffff800`243ca4e2 415e            pop     r14
fffff800`243ca4e4 415d            pop     r13
fffff800`243ca4e6 415c            pop     r12
fffff800`243ca4e8 5f              pop     rdi
fffff800`243ca4e9 c3              ret
 
nt!ObRegisterCallbacks+0x9739e:
fffff800`244616be b89a0000c0      mov     eax,0C000009Ah
fffff800`244616c3 e9058ef6ff      jmp     nt!ObRegisterCallbacks+0x1ad (fffff800`243ca4cd)  Branch
 
nt!ObRegisterCallbacks+0x973a8:
fffff800`244616c8 49397e18        cmp     qword ptr [r14+18h],rdi
fffff800`244616cc 0f84ae000000    je      nt!ObRegisterCallbacks+0x97460 (fffff800`24461780)  Branch
 
nt!ObRegisterCallbacks+0x973b2:
fffff800`244616d2 4885c9          test    rcx,rcx
fffff800`244616d5 0f84588df6ff    je      nt!ObRegisterCallbacks+0x113 (fffff800`243ca433)  Branch
 
nt!ObRegisterCallbacks+0x973bb:
fffff800`244616db e9418df6ff      jmp     nt!ObRegisterCallbacks+0x101 (fffff800`243ca421)  Branch
 
nt!ObRegisterCallbacks+0x973c0:
fffff800`244616e0 ba20000000      mov     edx,20h
fffff800`244616e5 e8e6dfb4ff      call    nt!MmVerifyCallbackFunctionCheckFlags (fffff800`23faf6d0)
fffff800`244616ea 85c0            test    eax,eax
fffff800`244616ec 0f854e8df6ff    jne     nt!ObRegisterCallbacks+0x120 (fffff800`243ca440)  Branch
 
nt!ObRegisterCallbacks+0x973d2:
fffff800`244616f2 bb220000c0      mov     ebx,0C0000022h
 
nt!ObRegisterCallbacks+0x973d7:
fffff800`244616f7 663b7e02        cmp     di,word ptr [rsi+2]
fffff800`244616fb 7370            jae     nt!ObRegisterCallbacks+0x9744d (fffff800`2446176d)  Branch
 
nt!ObRegisterCallbacks+0x973dd:
fffff800`244616fd bdb8000000      mov     ebp,0B8h
 
nt!ObRegisterCallbacks+0x973e2:
fffff800`24461702 8bc7            mov     eax,edi
fffff800`24461704 4c8d7620        lea     r14,[rsi+20h]
fffff800`24461708 48c1e006        shl     rax,6
fffff800`2446170c 4c03f0          add     r14,rax
fffff800`2446170f 65488b042588010000 mov   rax,qword ptr gs:[188h]
fffff800`24461718 66ff88e6010000  dec     word ptr [rax+1E6h]
fffff800`2446171f 498b4e20        mov     rcx,qword ptr [r14+20h]
fffff800`24461723 33d2            xor     edx,edx
fffff800`24461725 4803cd          add     rcx,rbp
fffff800`24461728 e8433c9eff      call    nt!ExAcquirePushLockExclusiveEx (fffff800`23e45370)
fffff800`2446172d 498b0e          mov     rcx,qword ptr [r14]
fffff800`24461730 4c397108        cmp     qword ptr [rcx+8],r14
fffff800`24461734 7554            jne     nt!ObRegisterCallbacks+0x9746a (fffff800`2446178a)  Branch
 
nt!ObRegisterCallbacks+0x97416:
fffff800`24461736 498b4608        mov     rax,qword ptr [r14+8]
fffff800`2446173a 4c3930          cmp     qword ptr [rax],r14
fffff800`2446173d 754b            jne     nt!ObRegisterCallbacks+0x9746a (fffff800`2446178a)  Branch
 
nt!ObRegisterCallbacks+0x9741f:
fffff800`2446173f 488908          mov     qword ptr [rax],rcx
fffff800`24461742 33d2            xor     edx,edx
fffff800`24461744 48894108        mov     qword ptr [rcx+8],rax
fffff800`24461748 498b4e20        mov     rcx,qword ptr [r14+20h]
fffff800`2446174c 4803cd          add     rcx,rbp
fffff800`2446174f e81c419eff      call    nt!ExReleasePushLockEx (fffff800`23e45870)
fffff800`24461754 65488b0c2588010000 mov   rcx,qword ptr gs:[188h]
fffff800`2446175d e80e409eff      call    nt!KiLeaveGuardedRegionUnsafe (fffff800`23e45770)
fffff800`24461762 0fb74602        movzx   eax,word ptr [rsi+2]
fffff800`24461766 4103fd          add     edi,r13d
fffff800`24461769 3bf8            cmp     edi,eax
fffff800`2446176b 7295            jb      nt!ObRegisterCallbacks+0x973e2 (fffff800`24461702)  Branch
 
nt!ObRegisterCallbacks+0x9744d:
fffff800`2446176d ba4f62466c      mov     edx,6C46624Fh
fffff800`24461772 488bce          mov     rcx,rsi
fffff800`24461775 e836591500      call    nt!ExFreePool (fffff800`245b70b0)
fffff800`2446177a 90              nop
fffff800`2446177b e94b8df6ff      jmp     nt!ObRegisterCallbacks+0x1ab (fffff800`243ca4cb)  Branch
 
nt!ObRegisterCallbacks+0x97460:
fffff800`24461780 bb0d0000c0      mov     ebx,0C000000Dh
fffff800`24461785 e9198df6ff      jmp     nt!ObRegisterCallbacks+0x183 (fffff800`243ca4a3)  Branch
 
nt!ObRegisterCallbacks+0x9746a:
fffff800`2446178a b903000000      mov     ecx,3
fffff800`2446178f cd29            int     29h
 
nt!ObRegisterCallbacks+0x97471:
fffff800`24461791 b80d0000c0      mov     eax,0C000000Dh
fffff800`24461796 e9328df6ff      jmp     nt!ObRegisterCallbacks+0x1ad (fffff800`243ca4cd)  Branch
nt!ObRegisterCallbacks:
fffff800`243ca320 48895c2408      mov     qword ptr [rsp+8],rbx
fffff800`243ca325 48896c2410      mov     qword ptr [rsp+10h],rbp
fffff800`243ca32a 4889742418      mov     qword ptr [rsp+18h],rsi
fffff800`243ca32f 57              push    rdi
fffff800`243ca330 4154            push    r12
fffff800`243ca332 4155            push    r13
fffff800`243ca334 4156            push    r14
fffff800`243ca336 4157            push    r15
fffff800`243ca338 4883ec20        sub     rsp,20h
fffff800`243ca33c 0fb701          movzx   eax,word ptr [rcx]
fffff800`243ca33f 4c8bf9          mov     r15,rcx
fffff800`243ca342 b900ff0000      mov     ecx,0FF00h
fffff800`243ca347 33ff            xor     edi,edi
fffff800`243ca349 6623c1          and     ax,cx
fffff800`243ca34c 4c8be2          mov     r12,rdx
fffff800`243ca34f b900010000      mov     ecx,100h
fffff800`243ca354 8bdf            mov     ebx,edi
fffff800`243ca356 663bc1          cmp     ax,cx
fffff800`243ca359 0f8532740900    jne     nt!ObRegisterCallbacks+0x97471 (fffff800`24461791)  Branch
 
nt!ObRegisterCallbacks+0x3f:
fffff800`243ca35f 410fb74702      movzx   eax,word ptr [r15+2]
fffff800`243ca364 6685c0          test    ax,ax
fffff800`243ca367 0f8424740900    je      nt!ObRegisterCallbacks+0x97471 (fffff800`24461791)  Branch
 
nt!ObRegisterCallbacks+0x4d:
fffff800`243ca36d 410fb76f08      movzx   ebp,word ptr [r15+8]
fffff800`243ca372 448d6f01        lea     r13d,[rdi+1]
fffff800`243ca376 8bc8            mov     ecx,eax
fffff800`243ca378 83c520          add     ebp,20h
fffff800`243ca37b c1e106          shl     ecx,6
fffff800`243ca37e 41b84f62466c    mov     r8d,6C46624Fh
fffff800`243ca384 03e9            add     ebp,ecx
fffff800`243ca386 418bcd          mov     ecx,r13d
fffff800`243ca389 8bd5            mov     edx,ebp
fffff800`243ca38b 448bf5          mov     r14d,ebp
fffff800`243ca38e e87dcc1e00      call    nt!ExAllocatePoolWithTag (fffff800`245b7010)
fffff800`243ca393 488bf0          mov     rsi,rax
fffff800`243ca396 4885c0          test    rax,rax
fffff800`243ca399 0f841f730900    je      nt!ObRegisterCallbacks+0x9739e (fffff800`244616be)  Branch
 
nt!ObRegisterCallbacks+0x7f:
fffff800`243ca39f 458bc6          mov     r8d,r14d
fffff800`243ca3a2 33d2            xor     edx,edx
fffff800`243ca3a4 488bc8          mov     rcx,rax
fffff800`243ca3a7 e8d48cc4ff      call    nt!memset (fffff800`24013080)
fffff800`243ca3ac b800010000      mov     eax,100h
fffff800`243ca3b1 668906          mov     word ptr [rsi],ax
fffff800`243ca3b4 498b4718        mov     rax,qword ptr [r15+18h]
fffff800`243ca3b8 48894608        mov     qword ptr [rsi+8],rax
fffff800`243ca3bc 450fb74708      movzx   r8d,word ptr [r15+8]
fffff800`243ca3c1 412be8          sub     ebp,r8d
fffff800`243ca3c4 6644894612      mov     word ptr [rsi+12h],r8w
fffff800`243ca3c9 6644894610      mov     word ptr [rsi+10h],r8w
fffff800`243ca3ce 8bcd            mov     ecx,ebp
fffff800`243ca3d0 4803ce          add     rcx,rsi
fffff800`243ca3d3 48894e18        mov     qword ptr [rsi+18h],rcx
fffff800`243ca3d7 498b5710        mov     rdx,qword ptr [r15+10h]
fffff800`243ca3db e8e089c4ff      call    nt!memcpy (fffff800`24012dc0)
fffff800`243ca3e0 8bef            mov     ebp,edi
fffff800`243ca3e2 66413b7f02      cmp     di,word ptr [r15+2]
fffff800`243ca3e7 0f83b6000000    jae     nt!ObRegisterCallbacks+0x183 (fffff800`243ca4a3)  Branch
 
nt!ObRegisterCallbacks+0xcd:
fffff800`243ca3ed 448bf5          mov     r14d,ebp
fffff800`243ca3f0 49c1e605        shl     r14,5
fffff800`243ca3f4 4d037720        add     r14,qword ptr [r15+20h]
fffff800`243ca3f8 8bdd            mov     ebx,ebp
fffff800`243ca3fa 41397e08        cmp     dword ptr [r14+8],edi
fffff800`243ca3fe 0f847c730900    je      nt!ObRegisterCallbacks+0x97460 (fffff800`24461780)  Branch
 
nt!ObRegisterCallbacks+0xe4:
fffff800`243ca404 498b06          mov     rax,qword ptr [r14]
fffff800`243ca407 488b08          mov     rcx,qword ptr [rax]
fffff800`243ca40a f6414240        test    byte ptr [rcx+42h],40h
fffff800`243ca40e 0f846c730900    je      nt!ObRegisterCallbacks+0x97460 (fffff800`24461780)  Branch
 
nt!ObRegisterCallbacks+0xf4:
fffff800`243ca414 498b4e10        mov     rcx,qword ptr [r14+10h]
fffff800`243ca418 4885c9          test    rcx,rcx
fffff800`243ca41b 0f84a7720900    je      nt!ObRegisterCallbacks+0x973a8 (fffff800`244616c8)  Branch
 
nt!ObRegisterCallbacks+0x101:
fffff800`243ca421 ba20000000      mov     edx,20h
fffff800`243ca426 e8a552beff      call    nt!MmVerifyCallbackFunctionCheckFlags (fffff800`23faf6d0)
fffff800`243ca42b 85c0            test    eax,eax
fffff800`243ca42d 0f84bf720900    je      nt!ObRegisterCallbacks+0x973d2 (fffff800`244616f2)  Branch
 
nt!ObRegisterCallbacks+0x113:
fffff800`243ca433 498b4e18        mov     rcx,qword ptr [r14+18h]
fffff800`243ca437 4885c9          test    rcx,rcx
fffff800`243ca43a 0f85a0720900    jne     nt!ObRegisterCallbacks+0x973c0 (fffff800`244616e0)  Branch
 
nt!ObRegisterCallbacks+0x120:
fffff800`243ca440 48c1e306        shl     rbx,6
fffff800`243ca444 4883c320        add     rbx,20h
fffff800`243ca448 4803de          add     rbx,rsi
fffff800`243ca44b 488d4b38        lea     rcx,[rbx+38h]
fffff800`243ca44f 48895b08        mov     qword ptr [rbx+8],rbx
fffff800`243ca453 48891b          mov     qword ptr [rbx],rbx
fffff800`243ca456 e8f5d4aeff      call    nt!ExInitializePushLock (fffff800`23eb7950)
fffff800`243ca45b 418b4608        mov     eax,dword ptr [r14+8]
fffff800`243ca45f 488bd3          mov     rdx,rbx
fffff800`243ca462 894310          mov     dword ptr [rbx+10h],eax
fffff800`243ca465 48897318        mov     qword ptr [rbx+18h],rsi
fffff800`243ca469 498b06          mov     rax,qword ptr [r14]
fffff800`243ca46c 488b08          mov     rcx,qword ptr [rax]
fffff800`243ca46f 48894b20        mov     qword ptr [rbx+20h],rcx
fffff800`243ca473 498b4610        mov     rax,qword ptr [r14+10h]
fffff800`243ca477 48894328        mov     qword ptr [rbx+28h],rax
fffff800`243ca47b 498b4618        mov     rax,qword ptr [r14+18h]
fffff800`243ca47f 48894330        mov     qword ptr [rbx+30h],rax
fffff800`243ca483 e86c000000      call    nt!ObpInsertCallbackByAltitude (fffff800`243ca4f4)
fffff800`243ca488 8bd8            mov     ebx,eax
fffff800`243ca48a 85c0            test    eax,eax
fffff800`243ca48c 7815            js      nt!ObRegisterCallbacks+0x183 (fffff800`243ca4a3)  Branch
 
nt!ObRegisterCallbacks+0x16e:
fffff800`243ca48e 6644016e02      add     word ptr [rsi+2],r13w
fffff800`243ca493 4103ed          add     ebp,r13d
fffff800`243ca496 410fb74f02      movzx   ecx,word ptr [r15+2]
fffff800`243ca49b 3be9            cmp     ebp,ecx
fffff800`243ca49d 0f824affffff    jb      nt!ObRegisterCallbacks+0xcd (fffff800`243ca3ed)  Branch
 
nt!ObRegisterCallbacks+0x183:
fffff800`243ca4a3 85db            test    ebx,ebx
fffff800`243ca4a5 0f884c720900    js      nt!ObRegisterCallbacks+0x973d7 (fffff800`244616f7)  Branch
 
nt!ObRegisterCallbacks+0x18b:
fffff800`243ca4ab 663b7e02        cmp     di,word ptr [rsi+2]
fffff800`243ca4af 7316            jae     nt!ObRegisterCallbacks+0x1a7 (fffff800`243ca4c7)  Branch
 
nt!ObRegisterCallbacks+0x191:
fffff800`243ca4b1 8bc7            mov     eax,edi
fffff800`243ca4b3 4103fd          add     edi,r13d
fffff800`243ca4b6 48c1e006        shl     rax,6
fffff800`243ca4ba 44096c3034      or      dword ptr [rax+rsi+34h],r13d
fffff800`243ca4bf 0fb74602        movzx   eax,word ptr [rsi+2]
fffff800`243ca4c3 3bf8            cmp     edi,eax
fffff800`243ca4c5 72ea            jb      nt!ObRegisterCallbacks+0x191 (fffff800`243ca4b1)  Branch
 
nt!ObRegisterCallbacks+0x1a7:
fffff800`243ca4c7 49893424        mov     qword ptr [r12],rsi
 
nt!ObRegisterCallbacks+0x1ab:
fffff800`243ca4cb 8bc3            mov     eax,ebx
 
nt!ObRegisterCallbacks+0x1ad:
fffff800`243ca4cd 488b5c2450      mov     rbx,qword ptr [rsp+50h]
fffff800`243ca4d2 488b6c2458      mov     rbp,qword ptr [rsp+58h]
fffff800`243ca4d7 488b742460      mov     rsi,qword ptr [rsp+60h]
fffff800`243ca4dc 4883c420        add     rsp,20h
fffff800`243ca4e0 415f            pop     r15
fffff800`243ca4e2 415e            pop     r14
fffff800`243ca4e4 415d            pop     r13
fffff800`243ca4e6 415c            pop     r12
fffff800`243ca4e8 5f              pop     rdi
fffff800`243ca4e9 c3              ret
 
nt!ObRegisterCallbacks+0x9739e:
fffff800`244616be b89a0000c0      mov     eax,0C000009Ah
fffff800`244616c3 e9058ef6ff      jmp     nt!ObRegisterCallbacks+0x1ad (fffff800`243ca4cd)  Branch
 
nt!ObRegisterCallbacks+0x973a8:
fffff800`244616c8 49397e18        cmp     qword ptr [r14+18h],rdi
fffff800`244616cc 0f84ae000000    je      nt!ObRegisterCallbacks+0x97460 (fffff800`24461780)  Branch
 
nt!ObRegisterCallbacks+0x973b2:
fffff800`244616d2 4885c9          test    rcx,rcx
fffff800`244616d5 0f84588df6ff    je      nt!ObRegisterCallbacks+0x113 (fffff800`243ca433)  Branch
 
nt!ObRegisterCallbacks+0x973bb:
fffff800`244616db e9418df6ff      jmp     nt!ObRegisterCallbacks+0x101 (fffff800`243ca421)  Branch
 
nt!ObRegisterCallbacks+0x973c0:
fffff800`244616e0 ba20000000      mov     edx,20h
fffff800`244616e5 e8e6dfb4ff      call    nt!MmVerifyCallbackFunctionCheckFlags (fffff800`23faf6d0)
fffff800`244616ea 85c0            test    eax,eax
fffff800`244616ec 0f854e8df6ff    jne     nt!ObRegisterCallbacks+0x120 (fffff800`243ca440)  Branch
 
nt!ObRegisterCallbacks+0x973d2:
fffff800`244616f2 bb220000c0      mov     ebx,0C0000022h
 
nt!ObRegisterCallbacks+0x973d7:
fffff800`244616f7 663b7e02        cmp     di,word ptr [rsi+2]
fffff800`244616fb 7370            jae     nt!ObRegisterCallbacks+0x9744d (fffff800`2446176d)  Branch
 
nt!ObRegisterCallbacks+0x973dd:
fffff800`244616fd bdb8000000      mov     ebp,0B8h
 
nt!ObRegisterCallbacks+0x973e2:
fffff800`24461702 8bc7            mov     eax,edi
fffff800`24461704 4c8d7620        lea     r14,[rsi+20h]
fffff800`24461708 48c1e006        shl     rax,6
fffff800`2446170c 4c03f0          add     r14,rax
fffff800`2446170f 65488b042588010000 mov   rax,qword ptr gs:[188h]
fffff800`24461718 66ff88e6010000  dec     word ptr [rax+1E6h]
fffff800`2446171f 498b4e20        mov     rcx,qword ptr [r14+20h]
fffff800`24461723 33d2            xor     edx,edx
fffff800`24461725 4803cd          add     rcx,rbp
fffff800`24461728 e8433c9eff      call    nt!ExAcquirePushLockExclusiveEx (fffff800`23e45370)
fffff800`2446172d 498b0e          mov     rcx,qword ptr [r14]
fffff800`24461730 4c397108        cmp     qword ptr [rcx+8],r14
fffff800`24461734 7554            jne     nt!ObRegisterCallbacks+0x9746a (fffff800`2446178a)  Branch
 
nt!ObRegisterCallbacks+0x97416:
fffff800`24461736 498b4608        mov     rax,qword ptr [r14+8]
fffff800`2446173a 4c3930          cmp     qword ptr [rax],r14
fffff800`2446173d 754b            jne     nt!ObRegisterCallbacks+0x9746a (fffff800`2446178a)  Branch
 
nt!ObRegisterCallbacks+0x9741f:
fffff800`2446173f 488908          mov     qword ptr [rax],rcx
fffff800`24461742 33d2            xor     edx,edx
fffff800`24461744 48894108        mov     qword ptr [rcx+8],rax
fffff800`24461748 498b4e20        mov     rcx,qword ptr [r14+20h]
fffff800`2446174c 4803cd          add     rcx,rbp
fffff800`2446174f e81c419eff      call    nt!ExReleasePushLockEx (fffff800`23e45870)
fffff800`24461754 65488b0c2588010000 mov   rcx,qword ptr gs:[188h]
fffff800`2446175d e80e409eff      call    nt!KiLeaveGuardedRegionUnsafe (fffff800`23e45770)
fffff800`24461762 0fb74602        movzx   eax,word ptr [rsi+2]
fffff800`24461766 4103fd          add     edi,r13d
fffff800`24461769 3bf8            cmp     edi,eax
fffff800`2446176b 7295            jb      nt!ObRegisterCallbacks+0x973e2 (fffff800`24461702)  Branch
 
nt!ObRegisterCallbacks+0x9744d:
fffff800`2446176d ba4f62466c      mov     edx,6C46624Fh
fffff800`24461772 488bce          mov     rcx,rsi
fffff800`24461775 e836591500      call    nt!ExFreePool (fffff800`245b70b0)
fffff800`2446177a 90              nop
fffff800`2446177b e94b8df6ff      jmp     nt!ObRegisterCallbacks+0x1ab (fffff800`243ca4cb)  Branch
 
nt!ObRegisterCallbacks+0x97460:
fffff800`24461780 bb0d0000c0      mov     ebx,0C000000Dh
fffff800`24461785 e9198df6ff      jmp     nt!ObRegisterCallbacks+0x183 (fffff800`243ca4a3)  Branch
 
nt!ObRegisterCallbacks+0x9746a:
fffff800`2446178a b903000000      mov     ecx,3
fffff800`2446178f cd29            int     29h
 
nt!ObRegisterCallbacks+0x97471:
fffff800`24461791 b80d0000c0      mov     eax,0C000000Dh
fffff800`24461796 e9328df6ff      jmp     nt!ObRegisterCallbacks+0x1ad (fffff800`243ca4cd)  Branch
NTSTATUS ObUnRegisterCallbacks(PVOID RegistrationHandle) {
    POB_CALLBACK_HEADER Header = (POB_CALLBACK_HEADER)RegistrationHandle;
    USHORT i = 0;
 
    // 遍历所有回调项
    while (i < Header->OperationCount) {
        POB_CALLBACK_ENTRY Entry = (POB_CALLBACK_ENTRY*)((PUCHAR)Header->Entries + i * 0x40);
 
        // 等待运行保护完成
        ExWaitForRundownProtectionRelease(&Entry->RundownProtect);
 
        // 进入临界区并获取推锁
        KeEnterCriticalRegion();
        ExAcquirePushLockExclusiveEx(&Entry->Lock, 0);
 
        // 从全局链表安全移除
        if (ValidateLinkedList(Entry)) { // 链表完整性校验
            RemoveEntryList(&Entry->Link);
            InitializeListHead(&Entry->Link); // 防止野指针
        } else {
            KeBugCheckEx(LIST_ENTRY_CORRUPT, 3, 0, 0, 0);
        }
 
        // 释放锁并离开临界区
        ExReleasePushLockExclusiveEx(&Entry->Lock);
        KeLeaveCriticalRegion();
 
        i++;
    }
 
    // 释放整个回调结构内存
    ExFreePoolWithTag(Header, 'ObCf');
    return STATUS_SUCCESS;
}
NTSTATUS ObUnRegisterCallbacks(PVOID RegistrationHandle) {
    POB_CALLBACK_HEADER Header = (POB_CALLBACK_HEADER)RegistrationHandle;
    USHORT i = 0;
 
    // 遍历所有回调项
    while (i < Header->OperationCount) {
        POB_CALLBACK_ENTRY Entry = (POB_CALLBACK_ENTRY*)((PUCHAR)Header->Entries + i * 0x40);
 
        // 等待运行保护完成
        ExWaitForRundownProtectionRelease(&Entry->RundownProtect);
 
        // 进入临界区并获取推锁
        KeEnterCriticalRegion();
        ExAcquirePushLockExclusiveEx(&Entry->Lock, 0);
 
        // 从全局链表安全移除
        if (ValidateLinkedList(Entry)) { // 链表完整性校验
            RemoveEntryList(&Entry->Link);
            InitializeListHead(&Entry->Link); // 防止野指针
        } else {
            KeBugCheckEx(LIST_ENTRY_CORRUPT, 3, 0, 0, 0);
        }
 
        // 释放锁并离开临界区
        ExReleasePushLockExclusiveEx(&Entry->Lock);
        KeLeaveCriticalRegion();
 
        i++;
    }
 
    // 释放整个回调结构内存
    ExFreePoolWithTag(Header, 'ObCf');
    return STATUS_SUCCESS;
}

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

最后于 2025-4-5 16:29 被TurkeybraNC编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回