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保护 的相关文章

  • android在picasso加载后获取Drawable图像

    我正在使用 Picasso 库从 url 加载图像 我使用的代码如下 Picasso with getContext load url placeholder R drawable placeholder error R drawable
  • 如何手动调用(查找)ReCaptcha Callback函数?

    我目前正在尝试验证码解决 并决定使用流行的 2captcha 服务来实现此目的 他们的方法是向他们发送验证码值 谷歌验证码密钥和站点线程 然后他们解决它并向我发回应该发送给谷歌的完成值 以检查验证码是否已解决 我被困在最后一步 使用返回的解
  • 读取 URL 查询参数值 (Vue.js)

    在 vuejs 回调 URL 中 我有一些参数值 我需要读取这个参数值 例如返回url是 http localhost 8080 sucesspage encryteddata abdeshfkkilkalidfel 9a 我努力了this
  • 点击时反应获取id值

    我有以下内容 var SingleEditableModule React createClass show overlay function e console log e target attr id render function v
  • 多个函数完成后运行回调

    我有多个耗时的函数 我想在它们全部完成后运行一个函数 例如 data x thisTakes2Seconds data y thisTakes5Seconds http post data 我熟悉 Javascript 中回调的概念 但如果
  • 哪种编写回调的方法更好?

    只要看看我现在写的东西 我就可以看到一个小得多 所以就代码高尔夫 http en wikipedia org wiki Code golf Option 2是更好的选择 但就哪个更干净而言 我更喜欢Option 1 我真的很喜欢社区对此的意
  • C++:如何将存储在局部变量中的函数指针作为模板参数传递

    using namespace std float test1 float i return i i int test2 int i return i 9 struct Wrapper typedef void wrapper type i
  • 如何在 Objective-C 中创建委托?

    我知道代表如何工作 也知道如何使用它们 但我该如何创建它们呢 Objective C 委托是一个已分配给delegate属性另一个对象 要创建一个 您需要定义一个实现您感兴趣的委托方法的类 并将该类标记为实现委托协议 例如 假设您有一个UI
  • Node.js npm mssql 函数返回未定义

    我使用 mssql 和 node js 连接到 sql server 数据库 我试图通过将连接代码包装在具有一个查询参数的函数中来减少代码 当我从 router get 函数中的 with 调用该函数时 它返回未定义 任何帮助将非常感激 f
  • 回形针回调还是简单的处理器?

    我想运行回调after post process但它似乎无法在使用 Paperclip 2 3 8 的 Rails 3 0 1 中工作 它给出了一个错误 undefined method post process callbacks for
  • Eventbus onMessageEvent 没有被调用

    我已经在我的项目中实现了 EventBus 但我没有获得所有事件 public class MainActivity extends AppCompatActivity Override protected void onCreate Bu
  • 如何将现有回调 API 转换为 Promise?

    我想使用 Promise 但我有一个回调 API 其格式如下 1 DOM加载或其他一次性事件 window onload set to callback window onload function 2 普通回调 function requ
  • 从 jQuery 事件访问函数中的参数*和*事件

    这是我不久前问的另一个问题的后续问题 通常 您可以从 jQuery 事件的函数调用中访问事件 如下所示 item live click functionToCall 并在函数中 function functionToCall ev do s
  • 使用模板返回值。如何处理无效退货?

    我有这样的存储回调函数的结构 template
  • 如何正确删除动画集中引用的 Raphael SVG 元素?

    我有一组动画 Raphael SVG 元素 我正在通过用户发起的 ajax 调用添加新元素并删除旧元素 我 set push 新元素 但因为我需要删除的元素通常不是集合中的最后一个元素 所以我使用 element remove 而不是 se
  • C++ 装饰器模式,模板的静态多态性和注册回调方法

    我正在尝试使用静态多态性来创建装饰器模式 至于为什么我不使用动态多态 请看这个QA https stackoverflow com questions 39312070 c dynamic cast over decorator insta
  • Twitter 的推文按钮有回调吗?

    有没有办法在 Twitter 的推文按钮上注册回调 我希望能够跟踪我网站上的哪些特定用户在 Twitter 上发布了链接 我无法添加 onClick 事件 因为它是跨域 iFrame 还有其他想法吗 我见过一种方法 https stacko
  • Application.onLowMemory() 未调用

    我创建了自己的应用程序类 我尝试调试它 代码在 Application onCreate 处停止 但不会在 onLowMemory 处停止 为了测试该场景 我打开了许多其他高内存应用程序 我看到的是调试会话终止 在 Eclipse 中 并且
  • 多处理中的动态池大小?

    有没有办法动态调整multiprocessing Pool尺寸 我正在编写一个简单的服务器进程 它会产生工作人员来处理新任务 使用multiprocessing Process对于这种情况可能更适合 因为工作人员的数量不应该是固定的 但我需
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map

随机推荐

  • 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 教程带我