以前自学了<<C++反汇编与逆向分析揭秘>>,书中讲得很不错,不过:里面全是x86的讲解。x64上,寄存器位数进行了扩充,C/C++函数传参也与x86有所不同, 但其中的分析思路基本上还是一致的。目前毕竟用64位操作系统的机器太多了,所以有必要从32位逆向过渡到64位。目前,我就以逆向内核API:nt! ObRegisterCallbacks分析其中的数据结构和实现逻辑,然后实现对 nt!ObRegisterCallbacks回调的检测与摘除, 对x64逆向进行一次热身练习。
一. 目标操作系统: Win7 X64 内核版本号:7600 (其它系统分析方法大同小异,这里仅仅是练习)
二. 对nt!ObRegisterCallbacks的逆向分析过程:
msdn中已给出函数原型:
2. 逆向分析过程,为了不断提高对汇编代码的阅读能力,我这里不用F5,而是IDA Pro静态反汇编分析,如果遇到疑问再动态调试。
(1)调试中相关的数据结构:
(2)对ObRegisterCallbacks的内部实现的静态分析过程
(3)通过细细阅读,可以逆推出RegistratioHandle所指向的缓冲区数据结构:
其中OBP_CALLBACK_ENTRY为回调项信息,数据结构如下:
整个RegistratioHandle所指向的缓冲区尾部的最后CallbackRegistration->Altitude->Length字节保存: pObpCallbackInfo->Altitude->Buffer所指向的UNICODE串缓冲区
(4)ObRegisterCallbacks等价的C实现:
这里:我产生了一个小小的疑问:
为什么是: pObpCallbackInfo->ObpCallbackEntries[i].pListObjectTypeEntry=CallbackRegistaion->OperationRegistration[i].OjbectType->TypeList.Flink?而不是: pObpCallbackInfo->ObpCallbackEntries[i].pListObjectTypeEntry=&CallbackRegistaion->OperationRegistration[i].OjbectType->TypeList?难道Flink还指向得有其它对象,或者就是指向ObjectType自身?通过对nt!ObRegisterCallbacks调试观察,找到了答案:


果然是第2种猜测: pObpCallbackInfo->ObpCallbackEntries[i].pListObjectTypeEntry=&CallbackRegistaion->OperationRegistration[i].OjbectType->TypeList,而TypeList是OBJECT_TYPE的第1个成员,所以: 实际上就是pObpCallbackInfo->ObpCallbackEntries[i].pListObjectTypeEntry就是指向OBJECT_TYPE自身
(5)要弄清楚回调项 pObpCallbackInfo->ObpCallbackEntries[i]是如何插入OBJECT_TYPE中的,需要对函数nt!ObpInsertCallbackByAltitude进行逆向分析:
可以看出: 内部会遍历ObjectType->CallbackList按Altitude降序排列的 链,比较Altitude,如果Altitude不重复:就把pObpCallbackEntry插入ObjectType->CallbackLis链,并且始终保持ObjectType->CallbackList链相关的回调的Altitude按降序排列,最终返回STATUS_SUCCESS,如果重复了,最终会返回: STATUS_FLT_INSTANCE_NAME_COLLISION. 整个原子操作过程是由:ObjectType->TypeLock锁来控制的,返回前会检查锁的状态,在必要时会释放锁,
然后,检查是否需要递送内核模式APC,在必要时会递送,最后返回。
(6)nt!ObpInsertCallbackByAltitude对应的C实现:
三. ObRegisterCallbacks回调的检测及摘除:
通过前面逆向分析,已经弄清楚了WIN7 X64 7600上ObRegisterCallbacks的ObjectType->CallbackList回调项数据结构及插入过程,现在来实现两个功能:
通过遍历*PsProcessType,*PsThreadType对象类型的CallbackList链,检测系统中ObRegisterCallbacks已注册的回调
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2020-11-28 11:25
被低调putchar编辑
,原因: