驱动开发:内核枚举进程与线程ObCall回调

打印 上一主题 下一主题

主题 674|帖子 674|积分 2022

在笔者上一篇文章《驱动开发:内核枚举Registry注册表回调》中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调以及ThreadObCall线程回调,之所以放在一起来讲解是因为这两中回调在枚举是都需要使用通用结构体_OB_CALLBACK以及_OBJECT_TYPE所以放在一起来讲解最好不过。
我们来看一款闭源ARK工具是如何实现的:

首先我们需要定义好结构体,结构体是微软公开的,如果有其它需要请自行去微软官方去查。
  1. typedef struct _OBJECT_TYPE_INITIALIZER
  2. {
  3.         USHORT Length;                // Uint2B
  4.         UCHAR ObjectTypeFlags;            // UChar
  5.         ULONG ObjectTypeCode;             // Uint4B
  6.         ULONG InvalidAttributes;          // Uint4B
  7.         GENERIC_MAPPING GenericMapping;   // _GENERIC_MAPPING
  8.         ULONG ValidAccessMask;       // Uint4B
  9.         ULONG RetainAccess;         // Uint4B
  10.         POOL_TYPE PoolType;        // _POOL_TYPE
  11.         ULONG DefaultPagedPoolCharge;  // Uint4B
  12.         ULONG DefaultNonPagedPoolCharge; // Uint4B
  13.         PVOID DumpProcedure;       // Ptr64     void
  14.         PVOID OpenProcedure;      // Ptr64     long
  15.         PVOID CloseProcedure;     // Ptr64     void
  16.         PVOID DeleteProcedure;        // Ptr64     void
  17.         PVOID ParseProcedure;     // Ptr64     long
  18.         PVOID SecurityProcedure;      // Ptr64     long
  19.         PVOID QueryNameProcedure;     // Ptr64     long
  20.         PVOID OkayToCloseProcedure;     // Ptr64     unsigned char
  21.         ULONG WaitObjectFlagMask;     // Uint4B
  22.         USHORT WaitObjectFlagOffset;    // Uint2B
  23.         USHORT WaitObjectPointerOffset;   // Uint2B
  24. }OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
  25. typedef struct _OBJECT_TYPE
  26. {
  27.         LIST_ENTRY TypeList;           // _LIST_ENTRY
  28.         UNICODE_STRING Name;         // _UNICODE_STRING
  29.         PVOID DefaultObject;         // Ptr64 Void
  30.         UCHAR Index;             // UChar
  31.         ULONG TotalNumberOfObjects;      // Uint4B
  32.         ULONG TotalNumberOfHandles;      // Uint4B
  33.         ULONG HighWaterNumberOfObjects;    // Uint4B
  34.         ULONG HighWaterNumberOfHandles;    // Uint4B
  35.         OBJECT_TYPE_INITIALIZER TypeInfo;  // _OBJECT_TYPE_INITIALIZER
  36.         EX_PUSH_LOCK TypeLock;         // _EX_PUSH_LOCK
  37.         ULONG Key;                 // Uint4B
  38.         LIST_ENTRY CallbackList;       // _LIST_ENTRY
  39. }OBJECT_TYPE, *POBJECT_TYPE;
  40. #pragma pack(1)
  41. typedef struct _OB_CALLBACK
  42. {
  43.         LIST_ENTRY ListEntry;
  44.         ULONGLONG Unknown;
  45.         HANDLE ObHandle;
  46.         PVOID ObTypeAddr;
  47.         PVOID PreCall;
  48.         PVOID PostCall;
  49. }OB_CALLBACK, *POB_CALLBACK;
  50. #pragma pack()
复制代码
代码部分的实现很容易,由于进程与线程句柄的枚举很容易,直接通过(POBJECT_TYPE)(*PsProcessType))->CallbackList就可以拿到链表头结构,得到后将其解析为POB_CALLBACK并循环输出即可。
  1. // 署名权// right to sign one's name on a piece of work// PowerBy: LyShark// Email: me@lyshark.com#include #include #include typedef struct _OBJECT_TYPE_INITIALIZER
  2. {
  3.         USHORT Length;                // Uint2B
  4.         UCHAR ObjectTypeFlags;            // UChar
  5.         ULONG ObjectTypeCode;             // Uint4B
  6.         ULONG InvalidAttributes;          // Uint4B
  7.         GENERIC_MAPPING GenericMapping;   // _GENERIC_MAPPING
  8.         ULONG ValidAccessMask;       // Uint4B
  9.         ULONG RetainAccess;         // Uint4B
  10.         POOL_TYPE PoolType;        // _POOL_TYPE
  11.         ULONG DefaultPagedPoolCharge;  // Uint4B
  12.         ULONG DefaultNonPagedPoolCharge; // Uint4B
  13.         PVOID DumpProcedure;       // Ptr64     void
  14.         PVOID OpenProcedure;      // Ptr64     long
  15.         PVOID CloseProcedure;     // Ptr64     void
  16.         PVOID DeleteProcedure;        // Ptr64     void
  17.         PVOID ParseProcedure;     // Ptr64     long
  18.         PVOID SecurityProcedure;      // Ptr64     long
  19.         PVOID QueryNameProcedure;     // Ptr64     long
  20.         PVOID OkayToCloseProcedure;     // Ptr64     unsigned char
  21.         ULONG WaitObjectFlagMask;     // Uint4B
  22.         USHORT WaitObjectFlagOffset;    // Uint2B
  23.         USHORT WaitObjectPointerOffset;   // Uint2B
  24. }OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
  25. typedef struct _OBJECT_TYPE
  26. {
  27.         LIST_ENTRY TypeList;           // _LIST_ENTRY
  28.         UNICODE_STRING Name;         // _UNICODE_STRING
  29.         PVOID DefaultObject;         // Ptr64 Void
  30.         UCHAR Index;             // UChar
  31.         ULONG TotalNumberOfObjects;      // Uint4B
  32.         ULONG TotalNumberOfHandles;      // Uint4B
  33.         ULONG HighWaterNumberOfObjects;    // Uint4B
  34.         ULONG HighWaterNumberOfHandles;    // Uint4B
  35.         OBJECT_TYPE_INITIALIZER TypeInfo;  // _OBJECT_TYPE_INITIALIZER
  36.         EX_PUSH_LOCK TypeLock;         // _EX_PUSH_LOCK
  37.         ULONG Key;                 // Uint4B
  38.         LIST_ENTRY CallbackList;       // _LIST_ENTRY
  39. }OBJECT_TYPE, *POBJECT_TYPE;
  40. #pragma pack(1)
  41. typedef struct _OB_CALLBACK
  42. {
  43.         LIST_ENTRY ListEntry;
  44.         ULONGLONG Unknown;
  45.         HANDLE ObHandle;
  46.         PVOID ObTypeAddr;
  47.         PVOID PreCall;
  48.         PVOID PostCall;
  49. }OB_CALLBACK, *POB_CALLBACK;
  50. #pragma pack()VOID DriverUnload(PDRIVER_OBJECT pDriverObject){}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath){        NTSTATUS status = STATUS_SUCCESS;        DbgPrint("hello lyshark.com \n");        POB_CALLBACK pObCallback = NULL;        // 直接获取 CallbackList 链表        LIST_ENTRY CallbackList = ((POBJECT_TYPE)(*PsProcessType))->CallbackList;        // 开始遍历        pObCallback = (POB_CALLBACK)CallbackList.Flink;        do        {                if (FALSE == MmIsAddressValid(pObCallback))                {                        break;                }                if (NULL != pObCallback->ObHandle)                {                        // 显示                        DbgPrint("[LyShark.com] ObHandle = %p | PreCall = %p | PostCall = %p \n", pObCallback->ObHandle, pObCallback->PreCall, pObCallback->PostCall);                }                // 获取下一链表信息                pObCallback = (POB_CALLBACK)pObCallback->ListEntry.Flink;        } while (CallbackList.Flink != (PLIST_ENTRY)pObCallback);        return status;}
复制代码
运行这段驱动程序,即可得到进程句柄回调:

当然了如上是进程句柄的枚举,如果是想要输出线程句柄,则只需要替换代码中的PsProcessType为((POBJECT_TYPE)(*PsThreadType))->CallbackList即可,修改后的代码如下。
  1. // 署名权// right to sign one's name on a piece of work// PowerBy: LyShark// Email: me@lyshark.com#include #include #include typedef struct _OBJECT_TYPE_INITIALIZER
  2. {
  3.         USHORT Length;                // Uint2B
  4.         UCHAR ObjectTypeFlags;            // UChar
  5.         ULONG ObjectTypeCode;             // Uint4B
  6.         ULONG InvalidAttributes;          // Uint4B
  7.         GENERIC_MAPPING GenericMapping;   // _GENERIC_MAPPING
  8.         ULONG ValidAccessMask;       // Uint4B
  9.         ULONG RetainAccess;         // Uint4B
  10.         POOL_TYPE PoolType;        // _POOL_TYPE
  11.         ULONG DefaultPagedPoolCharge;  // Uint4B
  12.         ULONG DefaultNonPagedPoolCharge; // Uint4B
  13.         PVOID DumpProcedure;       // Ptr64     void
  14.         PVOID OpenProcedure;      // Ptr64     long
  15.         PVOID CloseProcedure;     // Ptr64     void
  16.         PVOID DeleteProcedure;        // Ptr64     void
  17.         PVOID ParseProcedure;     // Ptr64     long
  18.         PVOID SecurityProcedure;      // Ptr64     long
  19.         PVOID QueryNameProcedure;     // Ptr64     long
  20.         PVOID OkayToCloseProcedure;     // Ptr64     unsigned char
  21.         ULONG WaitObjectFlagMask;     // Uint4B
  22.         USHORT WaitObjectFlagOffset;    // Uint2B
  23.         USHORT WaitObjectPointerOffset;   // Uint2B
  24. }OBJECT_TYPE_INITIALIZER, *POBJECT_TYPE_INITIALIZER;
  25. typedef struct _OBJECT_TYPE
  26. {
  27.         LIST_ENTRY TypeList;           // _LIST_ENTRY
  28.         UNICODE_STRING Name;         // _UNICODE_STRING
  29.         PVOID DefaultObject;         // Ptr64 Void
  30.         UCHAR Index;             // UChar
  31.         ULONG TotalNumberOfObjects;      // Uint4B
  32.         ULONG TotalNumberOfHandles;      // Uint4B
  33.         ULONG HighWaterNumberOfObjects;    // Uint4B
  34.         ULONG HighWaterNumberOfHandles;    // Uint4B
  35.         OBJECT_TYPE_INITIALIZER TypeInfo;  // _OBJECT_TYPE_INITIALIZER
  36.         EX_PUSH_LOCK TypeLock;         // _EX_PUSH_LOCK
  37.         ULONG Key;                 // Uint4B
  38.         LIST_ENTRY CallbackList;       // _LIST_ENTRY
  39. }OBJECT_TYPE, *POBJECT_TYPE;
  40. #pragma pack(1)
  41. typedef struct _OB_CALLBACK
  42. {
  43.         LIST_ENTRY ListEntry;
  44.         ULONGLONG Unknown;
  45.         HANDLE ObHandle;
  46.         PVOID ObTypeAddr;
  47.         PVOID PreCall;
  48.         PVOID PostCall;
  49. }OB_CALLBACK, *POB_CALLBACK;
  50. #pragma pack()VOID DriverUnload(PDRIVER_OBJECT pDriverObject){}NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath){        NTSTATUS status = STATUS_SUCCESS;        DbgPrint("hello lyshark.com \n");        POB_CALLBACK pObCallback = NULL;        // 直接获取 CallbackList 链表        LIST_ENTRY CallbackList = ((POBJECT_TYPE)(*PsThreadType))->CallbackList;        // 开始遍历        pObCallback = (POB_CALLBACK)CallbackList.Flink;        do        {                if (FALSE == MmIsAddressValid(pObCallback))                {                        break;                }                if (NULL != pObCallback->ObHandle)                {                        // 显示                        DbgPrint("[LyShark] ObHandle = %p | PreCall = %p | PostCall = %p \n", pObCallback->ObHandle, pObCallback->PreCall, pObCallback->PostCall);                }                // 获取下一链表信息                pObCallback = (POB_CALLBACK)pObCallback->ListEntry.Flink;        } while (CallbackList.Flink != (PLIST_ENTRY)pObCallback);        return status;}
复制代码
运行这段驱动程序,即可得到线程句柄回调:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表