Win10遍历句柄表+修改权限过Callback保护

2023-05-16

本帖转载于http://www.m5home.com/bbs/thread-8847-1-1.html
本想发到看雪,但自己太菜,看雪“牛人”又太多,想想还是发到紫水晶吧。
感谢 TA 的 WIN64 教程带我走上驱动之路,想想除了个 VIP 账号就没教过学费,以后多在论坛发帖来回报一下吧。

正篇:
XP 和 Win7 上关于句柄表的文章不少,一点不懂的朋友请自行百度谷歌搜索,方法没变,依旧使用 ExpLookupHandleTableEntry 。

主要说说 Win10 的变化,相较于 Win7 这两个结构体有所改变: HANDLE_TABLE 和 HANDLE_TABLE_ENTRY ,另外多了一个 HANDLE_TABLE_FREE_LIST 。

根据 WinDBG 逆向出的结构定义如下:
1: kd> dt nt!_HANDLE_TABLE

  • 0x000 NextHandleNeedingPool : Uint4B
  • 0x004 ExtraInfoPages : Int4B
  • 0x008 TableCode : Uint8B
  • 0x010 QuotaProcess : Ptr64 _EPROCESS
  • 0x018 HandleTableList : _LIST_ENTRY
  • 0x028 UniqueProcessId : Uint4B
  • 0x02c Flags : Uint4B
  • 0x02c StrictFIFO : Pos 0, 1 Bit
  • 0x02c EnableHandleExceptions : Pos 1, 1 Bit
  • 0x02c Rundown : Pos 2, 1 Bit
  • 0x02c Duplicated : Pos 3, 1 Bit
  • 0x02c RaiseUMExceptionOnInvalidHandleClose : Pos 4, 1 Bit
  • 0x030 HandleContentionEvent : _EX_PUSH_LOCK
  • 0x038 HandleTableLock : _EX_PUSH_LOCK
  • 0x040 FreeLists : [1] _HANDLE_TABLE_FREE_LIST
  • 0x040 ActualEntry : [32] UChar
  • 0x060 DebugInfo : Ptr64 _HANDLE_TRACE_DEBUG_INFO

typedef struct _HANDLE_TABLE
{
ULONG32 NextHandleNeedingPool;
LONG32 ExtraInfoPages;
ULONG_PTR TableCode;
PEPROCESS QuotaProcess;
LIST_ENTRY HandleTableList;
ULONG32 UniqueProcessId;
union
{
ULONG32 Flags;
struct
{
BOOLEAN StrictFIFO : 1;
BOOLEAN EnableHandleExceptions : 1;
BOOLEAN Rundown : 1;
BOOLEAN Duplicated : 1;
BOOLEAN RaiseUMExceptionOnInvalidHandleClose : 1;
};
};
ULONG_PTR HandleContentionEvent;
ULONG_PTR HandleTableLock;
union
{
HANDLE_TABLE_FREE_LIST FreeLists[1];
BOOLEAN ActualEntry[32];
};
PVOID DebugInfo;
} HANDLE_TABLE, *PHANDLE_TABLE;
复制代码
1: kd> dt nt!_HANDLE_TABLE_ENTRY

  • 0x000 VolatileLowValue : Int8B
  • 0x000 LowValue : Int8B
  • 0x000 InfoTable : Ptr64 _HANDLE_TABLE_ENTRY_INFO
  • 0x008 HighValue : Int8B
  • 0x008 NextFreeHandleEntry : Ptr64 _HANDLE_TABLE_ENTRY
  • 0x008 LeafHandleValue : _EXHANDLE
  • 0x000 RefCountField : Int8B
  • 0x000 Unlocked : Pos 0, 1 Bit
  • 0x000 RefCnt : Pos 1, 16 Bits
  • 0x000 Attributes : Pos 17, 3 Bits
  • 0x000 ObjectPointerBits : Pos 20, 44 Bits
  • 0x008 GrantedAccessBits : Pos 0, 25 Bits
  • 0x008 NoRightsUpgrade : Pos 25, 1 Bit
  • 0x008 Spare1 : Pos 26, 6 Bits
  • 0x00c Spare2 : Uint4B

typedef struct _HANDLE_TABLE_ENTRY
{
union
{
LONG_PTR VolatileLowValue;
LONG_PTR LowValue;
PVOID InfoTable;
LONG_PTR RefCountField;
struct
{
ULONG_PTR Unlocked : 1;
ULONG_PTR RefCnt : 16;
ULONG_PTR Attributes : 3;
ULONG_PTR ObjectPointerBits : 44;
};
};
union
{
LONG_PTR HighValue;
struct _HANDLE_TABLE_ENTRY *NextFreeHandleEntry;
EXHANDLE LeafHandleValue;
struct
{
ULONG32 GrantedAccessBits : 25;
ULONG32 NoRightsUpgrade : 1;
ULONG32 Spare1 : 6;
};
ULONG32 Spare2;
};
} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;
复制代码
1: kd> dt nt!_HANDLE_TABLE_FREE_LIST

  • 0x000 FreeListLock : _EX_PUSH_LOCK
  • 0x008 FirstFreeHandleEntry : Ptr64 _HANDLE_TABLE_ENTRY
  • 0x010 LastFreeHandleEntry : Ptr64 _HANDLE_TABLE_ENTRY
  • 0x018 HandleCount : Int4B
  • 0x01c HighWaterMark : Uint4B
  • 0x020 Reserved : [8] Uint4B

typedef struct _HANDLE_TABLE_FREE_LIST
{
ULONG_PTR FreeListLock;
PHANDLE_TABLE_ENTRY FirstFreeHandleEntry;
PHANDLE_TABLE_ENTRY lastFreeHandleEntry;
LONG32 HandleCount;
ULONG32 HighWaterMark;
ULONG32 Reserved[8];
} HANDLE_TABLE_FREE_LIST, *PHANDLE_TABLE_FREE_LIST;
复制代码

只是一部分成员的偏移变化了,要注意的是表示对象地址的成员移到了 ObjectPointerBits 上,长度为 44 位的数据。
Win10上内核对象的地址算法:
Object = Entry->ObjectPointerBits;
Object <<= 4;
Object |= 0xFFFF000000000000;
Object += 0x30;
复制代码

另外对象权限也变到了 GrantedAccessBits 成员中,长度为 25 位的数据。

关于 ExpLookupHandleTableEntry 的实现上,相较 Win7 的版本仅仅优化了下代码逻辑,可以说没有变化。
直接抄 WRK 的代码,建议多看几遍代码,配合网上的其他帖子理解一下句柄表结构,我就不废话了(懒)。

本来想写一大堆,但感觉都是废话删掉了,结果就变成这么一篇偷懒贴,干脆直接上核心代码吧:
NTSTATUS ViewHandle(ULONG32 ProcessId, POBJECT_INFO Buffer)
{
PEPROCESS EProcess = NULL;
ULONG_PTR Handle = 0;
PHANDLE_TABLE_ENTRY Entry = NULL;
PVOID Object = NULL;
POBJECT_TYPE ObjectType = NULL;

    if (!NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)ProcessId, &EProcess)))
    {
            return STATUS_UNSUCCESSFUL;
    }

    for (Handle = 0;; Handle += HANDLE_VALUE_INC)
    {
            Entry = ExpLookupHandleTableEntry(*(PHANDLE_TABLE*)((PUCHAR)EProcess + g_HandleTableOffset), *(PEXHANDLE)&Handle);
            if (Entry == NULL)
            {
                    break;
            }

            *(ULONG_PTR*)&Object = Entry->ObjectPointerBits;
            *(ULONG_PTR*)&Object <<= 4;
            if (Object == NULL)
            {
                    continue;
            }

            *(ULONG_PTR*)&Object |= 0xFFFF000000000000;
            *(ULONG_PTR*)&Object += 0x30;
            ObjectType = ObGetObjectType(Object);
            if (ObjectType == NULL)
            {
                    continue;
            }

            wcscpy(Buffer->szTypeName, *(PCWSTR*)((PUCHAR)ObjectType + 0x18));
            Buffer->Handle = (HANDLE)Handle;
            Buffer->AccessMask = Entry->GrantedAccessBits;
            Buffer->Address = Object;

            Buffer++;
    }

    ObDereferenceObject(EProcess);

    return STATUS_SUCCESS;

}
复制代码

效果是这样的,对照WIN64AST:

这点破东西貌似不够看,再加个然并卵的玩意。

修改进程句柄权限过 Callback 保护:
if (wcscmp((PCWSTR)((PUCHAR)ObjectType + 0x18), L"Process") == 0)
{
if (*(PULONG32)((PUCHAR)Object + 0x2E8) == PassiveId)
{
Entry->GrantedAccessBits = 0x1FFFFF;
Status = STATUS_SUCCESS;
}
}
复制代码

拿 TP 举例,通常情况下,在 Ring3 调用 OpenProcess 传递 PROCESS_ALL_ACCESS 参数,该句柄对应的进程对象权限是 0x1FFFFF ,但对 TP 保护的游戏进行同样做法后会发现权限变成了 0x1FFD85,它的 Callback 中抹掉了进程对象的这些权限:
#define PROCESS_CREATE_THREAD (0x0002)
#define PROCESS_VM_OPERATION (0x0008)
#define PROCESS_VM_READ (0x0010)
#define PROCESS_VM_WRITE (0x0020)
#define PROCESS_DUP_HANDLE (0x0040)
#define PROCESS_SET_INFORMATION (0x0200)
复制代码

直接在 TP 的 Callback 中写 ret 游戏会封号,而且 TP 卸载时会蓝屏,内部通信肯定是有的,尝试过逆向,一堆 jmp 把我弄晕了,干脆就换种办法。

如上代码,我的做法是,遍历句柄表,判断对象类型为 “PROCESS” ,然后根据 EPROCESS 对象获得对应进程进程的 PID ,如果是被保护的进程就把权限写成 0x1FFFFF ,测试过 DXF 有效。

效果是这样的,恢复权限之前和之后分别为:

听说这是一种比较二逼的解决方法,没办法谁让我菜呢。如果有更好的办法还望不吝赐教。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win10遍历句柄表+修改权限过Callback保护 的相关文章

随机推荐

  • Windows下编程需要看哪些书

    Windows 下编程需要看哪些书 本人是自学计算机的 xff0c 所有计算机方面的知识都看 xff0c 研究过一段时间网络 xff0c 对计算机网络方面有一定的基础 xff0c 对程序设计尤感兴趣 xff0c 个人认为学习 Windows
  • 找工作经验贴----转自cc98 (作者ID:qzz88 ) 仅为收藏,感谢原作者的经验分享

    原帖地址 xff1a http www cc98 org dispbbs asp BoardID 61 248 amp id 61 3813130 amp page 61 amp replyID 61 3813130 amp star 61
  • QGC、PX4和AirSim的安装

    本教程视频地址 xff1a https www bilibili com video BV1dv411K71E 本教程将讲解QGC地面站的安装 PX4控制系统 xff08 包括jMAVSim ROS和Gazebo xff09 的安装 Air
  • Ominibus F4V3 Pro飞控原理图和接线图

    Ominibus F4V3 Pro飞控接线图如下图所示 部分实物接线图如下 注意上图中 xff0c 电流计入口 描述是错误的 xff0c 最形象的是第一个接线图 xff0c 那里表的很清楚 电源这块接线为电池接线到飞控板上的电池 43 和电
  • Mini Crossbow AAT自动跟踪云台设置(配合TeleFlyTiny模块)

    飞行器在空中 xff0c 位置和方位时刻变化 xff0c 而我们使用的图传接收机 xff0c 需要时刻保持跟随飞行器材能捕获较好的图像 xff0c 靠人去调整地面天线角度是不太合适的 xff0c 所以我们可以使用AAT自动跟踪云台来完成调整
  • Mission Planner安卓安装包

    可以在安卓手机上安装并使用的安装包 下载地址 xff1a https download csdn net download xjhappyarrow 22864716 spm 61 1001 2014 3001 5503
  • Docker 相关配置文件路径

    配置文件参数 xff1a 1 优先解析在config file命令行参数 2 在root模式下 Docker Daemon 默认配置文件路径 etc docker daemon json 3 在rootless模式下 默认配置文件路径在 d
  • 1. 【gRPC系列学习】 gRPC起源、优缺点

    gRPC是一项进程间通信技术 xff0c 可以用来连接 调用 操作 调试分布式异构应用程序 xff0c 就像调用本地函数一样 gRPC主要采用同步的请求 响应进行通信 xff0c 但建立连接后 xff0c 它可以完全以异步模式进行操作 1
  • stlink灯一直闪

    灯闪说明stlink工作不正常 原因可能是 xff1a 1 stlink供电不足 试着用外部电源和stlink同时给板子供电 2 电脑的USB口硬件 xff08 USB口烧了 xff0c 但可能性比较少 xff09 或USB相关驱动有问题
  • stlink使用笔记

    1 stlink灯一直闪 2 当用外部电源 xff08 外部 就是不直接使用stlink为板子供电 xff09 为板子供电时 xff0c 如果要用stlink xff08 SWD模式 xff09 xff0c 那么不能只插SWCLK和SWDI
  • 先电OpenStack创建云主机报错500

    现象 xff1a 从报错中可定位到问题出在nova的conductor组件中 日志 xff1a 查看 var log nova nova conductor log 从日志中可以观察到是因为找不到cpu特性 解决方法 xff1a 进入 us
  • MAVROS + APM + pixhawk 填坑日记(一)

    64 TOC MAVROS 43 APM 43 pixhawk 填坑日记 一 树莓派和pixhawk通过usb串口连接 xff0c 想通过mavros读取飞控上关于GPS的位置信息 rostopic list可以看到mavros发布的话题消
  • ubuntu搭建APT源简单方法

    一 为什么需要搭建APT源 原因如下 xff1a 1 在公司内网离线情况下 xff0c ubuntu无法通过apt原生源进行下载 2 有些源国内无法正常访问 xff0c 需要翻墙 基于以上原因 xff0c 需要自建APT源 二 准备条件 需
  • 加速度计参数讲解

    测量范围 FS也称量程 xff0c 单位为g 地球重力 xff0c 是指加速度计能测量到的正反方向最大加速度的额定值范围 常见有 xff08 2g 4g 8g 16g up to 400g 灵敏度 分辨率Sensitivity Resolu
  • vim 编辑器---批量注释和批量取消注释/去除黄色阴影

    添加注释 ctrl 43 v 进入块选泽模式 上下键选中需要注释的行 按大写 I 进入插入模式 xff0c 输入注释符 按两次 ESC 退出 xff0c 即完成添加注释 取消注释 ctrl 43 v 进入块选泽模式 上下键选中需要注释的行
  • 作业—FreeRTOS入门

    FreeRTOS入门 零 需求软件 xff08 自行下载 xff09 一 任务要求二 FreeRTOS的使用1 原理2 多任务程序3 烧录代码4 结果 三 注意事项四 参考资料 零 需求软件 xff08 自行下载 xff09 1 keil5
  • Flask 案例

    创建news xff0c 根目录下创建settings文件 config py文件 xff0c 编写配置项 xff0c 配置项必须大写 class DeFaultConfig SECRET KEY 61 39 39 SQLALCHEMY D
  • 三 Gazebo学习总结之制作一个模型及导入网格

    Models从简单的形状到复杂的机器人都有 它指的是 lt model gt SDF标签 xff0c 从本质上来说是links joints collision objects visuals和plugins的集合 xff0c 生成一个模型
  • STM32F103V跑NuttX之一——下载nuttX及编译烧录

    下载nuttX及编译 1 NuttX官方链接2 NuttX及App工程下载3 编译NuttX中STM32F103V nsh测试例程4 在ubuntu下使用串口来烧录目标文件至STM32F103V4 1 ubuntu下stm32flash工具
  • Win10遍历句柄表+修改权限过Callback保护

    本帖转载于http www m5home com bbs thread 8847 1 1 html 本想发到看雪 xff0c 但自己太菜 xff0c 看雪 牛人 又太多 xff0c 想想还是发到紫水晶吧 感谢 TA 的 WIN64 教程带我