-
-
[分享]OB_PREOP回调保护
-
发表于: 2026-3-7 00:51 712
-
前言
OB_PREOP回调保护为微软提供的官方回调接口, 可用于拦截 进程\线程\桌面\句柄创建\句柄复制 等操作, 并且可以选择拦截类型如: 创建句柄\句柄复制等, 常预留于安全软件或反作弊软件, 其特点是微软官方支持所以非常稳定, 但缺点是人尽皆知, 所有人都可以用...
第一步: 初始化进程保护
第一步为注册回调注册信息, 其中Altitude为注册号, 数字越小优先级越高第二步为设置具体拦截操作, ObjectType可选: *PsProcessType;*PsThreadType;*PsJobType;*PsSiloContextPagedType;*PsSiloContextNonPagedType, Operations可选: OB_OPERATION_HANDLE_CREATE;OB_OPERATION_HANDLE_DUPLICATE, 其次PostOperation为是否注册 Post回调, Post回调:在操作 完成后执行, PreOperation为注册 Pre回调: 操作执行前
void InitCallBackProtect()
{
//如已注册则返回 防止重复调用
if (CallbackHandle != NULL) return;
OB_CALLBACK_REGISTRATION ObCallback = { 0 };
OB_OPERATION_REGISTRATION ObOperation = { 0 };
//回调注册信息
RtlInitUnicodeString(&ObCallback.Altitude, L"321000");//数字越小越先执行
ObCallback.RegistrationContext = NULL;//注册上下文 可以存自定义数据
ObCallback.Version = OB_FLT_REGISTRATION_VERSION;//回调接口版本 官方固定要求
ObCallback.OperationRegistrationCount = 1;//注册多少个操作回调
ObCallback.OperationRegistration = &ObOperation;//指向OB_OPERATION_REGISTRATION,如果多个指向数组
//设置具体拦截哪种对象操作, 例如:进程\线程\桌面\句柄创建\句柄复制
ObOperation.ObjectType = PsProcessType;//拦截进程
ObOperation.Operations = OB_OPERATION_HANDLE_CREATE;//拦截操作类型:创建句柄
ObOperation.PostOperation = NULL;//是否注册 Post回调, Post回调:在操作 完成后执行
ObOperation.PreOperation = CallBack;//注册 Pre回调: 操作执行前
//注册回调, 参数二为以后注销需要
ObRegisterCallbacks(&ObCallback, &CallbackHandle);
PZY_PRINT("安装进程保护 CallbackHandle=%p", CallbackHandle);
}
第二步: 卸载保护方法
void UninstallCallBackProtect()
{
if (CallbackHandle) {
ObUnRegisterCallbacks(CallbackHandle);
CallbackHandle = NULL;
PZY_PRINT(L"卸载进程保护");
}
}
第三步: 回调实现
这里简单判断是否为保护pid, 如果是则修改权限并写回
OB_PREOP_CALLBACK_STATUS CallBack( PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION OperationInformation)
{
HANDLE pid = GetPidByEprocess((PEPROCESS)OperationInformation->Object);
//判断是否为保护pid
if (IsProtectPid(pid)) {
ACCESS_MASK CurrentAccess = OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess;
//修改权限
CurrentAccess &= ~PROCESS_VM_READ;
CurrentAccess &= ~PROCESS_VM_WRITE;
CurrentAccess &= ~PROCESS_TERMINATE;
//写回权限
OperationInformation->Parameters->CreateHandleInformation.DesiredAccess = CurrentAccess;
}
return OB_PREOP_SUCCESS;
}
测试
测试依旧是选择CheatEngine, 在进程保护后可以看到已经获取不到图标了
自然也搜索不到任何数据
但是若是在保护前就已经创建了句柄, CheatEngine是能够正常访问的, 原因是回调处理发生在创建句柄时, 若是句柄已经创建成功后就不归回调管了
总结
OB_PREOP回调难度简单, 但只能保护某个事件发生的节点, 通常配合循环句柄降权使用效果最佳...
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 4天前
被mb_binusgki编辑
,原因: 补充内容
赞赏
他的文章
- [分享]混淆、加密、反沙箱概念介绍 594
- [分享]手动映射sys到内核 681
- [分享]Minifilter简易文件访问监控 569
- [分享]内核逆向开发阶段评测方法 598
- [分享]游戏网络封包解析可行性分析 774
赞赏
雪币:
留言: