本帖最后由 BeaFeng 于 2023-2-7 20:22 编辑
开发环境
Win10 X64/Visual Studio 2019/WDK 10.0 SDK 10.0.19041.0/易语言5.9
前段时间太忙,开源大赛都没时间和大家见面,今天开源个非常简单的CallBack回调的使用
相信很多人都很熟悉这个回调,一般都是拿来做保护进程使用,但是大部分不知道这个回调还能这么利用,有提权操作当然也有降权,这些在微软文档也是公开的,只是有时候很难注意到。
先看一下函数解释
NTSTATUS ObRegisterCallbacks(
[in] POB_CALLBACK_REGISTRATION CallbackRegistration,
[out] PVOID *RegistrationHandle
);
参数
[in] CallbackRegistration
指向指定回调例程列表和其他注册信息的 [color=var(--theme-hyperlink)]OB_CALLBACK_REGISTRATION 结构的指针。
[out] RegistrationHandle
指向接收标识已注册回调例程集的值的变量的指针。 调用方将此值传递给 [color=var(--theme-hyperlink)]ObUnRegisterCallbacks 例程,以取消注册回调集
返回值
ObRegisterCallbacks 返回 NTSTATUS 值。 此例程可能返回以下值之一:
返回值
ObRegisterCallbacks 返回 NTSTATUS 值。 此例程可能返回以下值之一: 返回代码 | 说明 | STATUS_SUCCESS | 指定的回调例程注册到系统。 | STATUS_FLT_INSTANCE_ALTITUDE_COLLISION | 调用驱动程序或其他驱动程序已经为 CallBackRegistration->海拔高度 指定的高度注册了回调例程。 有关此高度的详细信息,请参阅[color=var(--theme-hyperlink)]OB_CALLBACK_REGISTRATION中海拔成员的说明。 | STATUS_INVALID_PARAMETER | 注册中指定的一个或多个参数无效。 ObRegisterCallbacks 可能会返回此错误,例如,如果指定 了 CallBackRegistration->版本的 无效值,或者尝试为不支持回调例程的对象类型注册。 | STATUS_ACCESS_DENIED | 回调例程不驻留在已签名的内核二进制映像中。 | STATUS_INSUFFICIENT_RESOURCES | 尝试分配内存失败。 |
省略大部分的废话,直接上代码
驱动入口非常简单,上一个帖子也讲过这些,通用的IO通讯,创建符号链接设备,再注册CallBack回调 值得注意的是由于ObRegisterCallbacks函数会校验驱动,所以我们用测试签名肯定是无法正常挂回调的,所以打一个补丁让他正常创建。 接下来用Ark看一下一般的回调是长啥样的。 这个页面大家应该也是熟悉的不能再熟悉了,稍微需要注意的另外一个地方就是原始函数地址0x383300,代表回调注册高度,如果我们想要降权破图标创建的回调高度必须小于被保护进程的回调,这里随便设置一个0x166666 接下来就是两种回调的对比,非常的明显 通俗的讲一个是特定进程的句柄被打开是开放全部权限,另外一个是关闭权限 直接进入实战,易语言调用也是简单易懂,没有一滴代码是浪费的 可以看得到回调成功的创建了,接下来把需要破图标的进程ID用DeviceIoControl传给驱动看一下实际效果。 大功告成,当然这仅限于对CallBack回调来保护的进程有效果(目前大部分应该都是用的这个吧~) 内核真的是无比奇妙,学无止境,我也仅仅是一个学生,大佬有好建议可以评论给我。 另外不要私信我说什么游戏,那个游戏,开源的都是学习研究仅此而已,我平时不玩游戏,也没时间玩,谢谢。 易密码:050273
|