天马阁

 找回密码
 立即注册
                                        →→→→→→→→→→→→ 1点击查看所有VIP教程目录长列表(总教程数269个) 2办理VIP详情进入 ←←←←←←←←←←←←
1 x64CE与x64dbg入门基础教程 7课 已完结 2 x64汇编语言基础教程 16课 已完结 3 x64辅助入门基础教程 9课 已完结 4 C++x64内存辅助实战技术教程 149课 已完结
5 C++x64内存检测与过检测技术教程 10课 已完结 6 C+x64二叉树分析遍历与LUA自动登陆教程 19课已完结 7 C++BT功能原理与x64实战教程 29课 已完结 8 C+FPS框透视与自瞄x64实现原理及防护思路 30课完结
64驱?封? 9 64反驱? 10 64位V? 11 绝? 12 ???课?
13 64透 ? 14 64U ? 15 64Q ? 16 64功 ?
17 64U ? 18 64模 ? 19 64多 ? 20 64网 ?
21 64注 ? 22 64火 ? 23 64棋 ? 24 64自二链L?
25 64破 ? VIP会员办理QQ: 89986068   
【请先加好友,然后到好友列表双击联系客服办理,不然可能无法接受到信息。】
27 加入2000人交流群637034024 3 28 免责声明?
查看: 1203|回复: 0

c++枚举系统句柄

[复制链接]

10

主题

0

回帖

12

积分

编程入门

Rank: 1

天马币
20
发表于 2024-3-3 09:23:31 | 显示全部楼层 |阅读模式
1、利用ToolHelp API
首先创建一个系统快照,然后通过对系统快照的访问完成进程的枚举获取系统快照使用CreateToolhelp32Snapshot 函数
函数原型声明如下:

HANDLE WINAPI CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
将dwFlags设置为TH32CS_SNAPPROCESS用于获取进程快照。函数调用成功后会返回一个快照的句柄,便可以使用Process32First、Process32Next进行枚举了

函数原型声明如下:

BOOL WINAPI Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
BOOL WINAPI Process32Next( HANDLE hSnapshot, LPPROCESSENTRY32 lppe);



  1. 下面是相关代码:
  2. #include <windows.h>
  3. #include <tlhelp32.h>
  4. #include <stdio.h>
  5. void useToolHelp()
  6. {
  7.     HANDLE procSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
  8.     if ( procSnap == INVALID_HANDLE_VALUE )
  9.     {
  10.         printf( "CreateToolhelp32Snapshot failed, %d ", GetLastError() );
  11.         return;
  12.     }
  13. /*  */
  14.     PROCESSENTRY32 procEntry = { 0 };
  15.     procEntry.dwSize = sizeof(PROCESSENTRY32);
  16.     BOOL bRet = Process32First( procSnap, &procEntry );
  17.     while ( bRet )
  18.     {
  19.         wprintf( L"PID: %d (%s) ", procEntry.th32ProcessID, procEntry.szExeFile );
  20.         bRet = Process32Next( procSnap, &procEntry );
  21.     }
  22.     CloseHandle( procSnap );
  23. }


  24. void main()
  25. {
  26.     useToolHelp();
  27.     getchar();
  28. }


  29. 用此方法可以在进程ID和进程名称间进行转换,即通过进程名称获得进程ID,通过进程ID获取进程名称。

  30. 2、通过psapi.dll提供的函数

  31. 通过psapi.dll提供的EnumProcesses、EnumProcessModules实现

  32. 函数原型声明如下:
  33. BOOL EnumProcesses( DWORD* pProcessIds, DWORD cb, DWORD* pBytesReturned);BOOL EnumProcessModules( HANDLE hProcess, HMODULE* lphModule, DWORD cb, LPDWORD lpcbNeeded);

  34. #include <windows.h>
  35. #include <stdio.h>
  36. #include <tchar.h>
  37. #include "psapi.h"
  38. #pragma comment(lib,"psapi.lib")

  39. void PrintProcessNameAndID(DWORD processID)
  40. {
  41.      TCHAR szProcessName[MAX_PATH] = _T("<unknown>");
  42.    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,processID);     
  43.      //Process name.
  44.    if(NULL!=hProcess)
  45.    {
  46.          HMODULE hMod;
  47.      DWORD cbNeeded;
  48.      if(EnumProcessModules(hProcess,&hMod,sizeof(hMod), &cbNeeded))         
  49.      {
  50.              GetModuleBaseName(hProcess,hMod,szProcessName,sizeof(szProcessName)/sizeof(TCHAR));                        
  51.      }
  52.    }
  53.      wprintf(_T("PID: %d (%s) "),processID,szProcessName);
  54.    CloseHandle(hProcess);
  55. }
  56. void main( )
  57. {
  58.      DWORD aProcesses[1024], cbNeeded, cProcesses;
  59.    unsigned int i;
  60.    if(!EnumProcesses(aProcesses,sizeof(aProcesses),&cbNeeded))
  61.          return;
  62.    cProcesses = cbNeeded/sizeof(DWORD);
  63.    for(i=0;i<cProcesses;i++)
  64.          PrintProcessNameAndID(aProcesses);
  65.      getchar();
  66. }

  67. 此方法由于需要进行OpenProcess操作,所以需要一定的权限,当权限不够时,有些进程将不能被打开。

  68. 下面给出提升权限的相关代码:

  69. void RaisePrivilege()
  70. {
  71.     HANDLE            hToken;
  72.     TOKEN_PRIVILEGES    tp;
  73.     tp.PrivilegeCount        = 1;
  74.     tp.Privileges[0].Attributes    = SE_PRIVILEGE_ENABLED;
  75.     if ( OpenProcessToken( GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken ) )
  76.     {
  77.         if ( LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid ) )
  78.         {
  79.             AdjustTokenPrivileges( hToken, FALSE, &tp, NULL, NULL, 0 );
  80.         }
  81.     }
  82.     if ( hToken )
  83.         CloseHandle( hToken );
  84. }

  85. 3、通过ntdll.dll提供的Native API
  86. 使用Native API 中的ZwQuerySystemInformation的SystemProcessesAndThreadsInformation系统调用枚举进程由于该函数没有被导出,所以首先定义要使用到的结构和常量

  87. typedef DWORD (WINAPI *ZWQUERYSYSTEMINFORMATION)(DWORD, PVOID, DWORD, PDWORD);
  88. typedef struct _SYSTEM_PROCESS_INFORMATION
  89. {
  90. DWORD NextEntryDelta;
  91. DWORD ThreadCount;
  92. DWORD Reserved1[6];
  93. FILETIME ftCreateTime;
  94. FILETIME ftUserTime;
  95. FILETIME ftKernelTime;
  96. UNICODE_STRING ProcessName;
  97. DWORD BasePriority;
  98. DWORD ProcessId;
  99. DWORD InheritedFromProcessId;
  100. DWORD HandleCount;
  101. DWORD Reserved2[2];
  102. DWORD VmCounters;
  103. DWORD dCommitCharge;
  104. PVOID ThreadInfos[1];
  105. }SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
  106. #define SystemProcessesAndThreadsInformation 5
  107. 然后动态加载ntdll.dll,获得函数的地址。便可以进行进程的枚举

  108. #include <windows.h>
  109. #include <ntsecapi.h>
  110. #include <stdio.h>
  111. typedef DWORD (WINAPI * ZWQUERYSYSTEMINFORMATION)( DWORD, PVOID, DWORD, PDWORD );
  112. typedef struct _SYSTEM_PROCESS_INFORMATION
  113. {
  114.     DWORD        NextEntryDelta;
  115.     DWORD        ThreadCount;
  116.     DWORD        Reserved1[6];
  117.     FILETIME    ftCreateTime;
  118.     FILETIME    ftUserTime;
  119.     FILETIME    ftKernelTime;
  120.     UNICODE_STRING    ProcessName;
  121.     DWORD        BasePriority;
  122.     DWORD        ProcessId;
  123.     DWORD        InheritedFromProcessId;
  124.     DWORD        HandleCount;
  125.     DWORD        Reserved2[2];
  126.     DWORD        VmCounters;
  127.     DWORD        dCommitCharge;
  128.     PVOID        ThreadInfos[1];
  129. }SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
  130. #define SystemProcessesAndThreadsInformation 5
  131. void main()
  132. {
  133.     HMODULE hNtDll = GetModuleHandle( L"ntdll.dll" );
  134.     if ( !hNtDll )
  135.         return;
  136.     ZWQUERYSYSTEMINFORMATION    ZwQuerySystemInformation    = (ZWQUERYSYSTEMINFORMATION) GetProcAddress( hNtDll, "ZwQuerySystemInformation" );
  137.     ULONG                cbBuffer            = 0x10000;
  138.     LPVOID                pBuffer                = NULL;
  139.     pBuffer = malloc( cbBuffer );
  140.     if ( pBuffer == NULL )
  141.         return;
  142.     ZwQuerySystemInformation( SystemProcessesAndThreadsInformation, pBuffer, cbBuffer, NULL );
  143.     PSYSTEM_PROCESS_INFORMATION pInfo = (PSYSTEM_PROCESS_INFORMATION) pBuffer;
  144.     for (;; )
  145.     {
  146.         wprintf( L"PID: %d (%ls) ", pInfo->ProcessId, pInfo->ProcessName.Buffer );
  147.         if ( pInfo->NextEntryDelta == 0 )
  148.             break;
  149.         pInfo = (PSYSTEM_PROCESS_INFORMATION) ( ( (PUCHAR) pInfo) + pInfo->NextEntryDelta);
  150.     }
  151.     free( pBuffer );
  152.     getchar();
  153. }

  154. 4、通过进程打开的句柄来枚举进程

  155. #include <windows.h>
  156. #include <ntsecapi.h>
  157. #include <ntstatus.h>
  158. #include <stdio.h>
  159. typedef NTSTATUS (WINAPI * ZWQUERYSYSTEMINFORMATION)( DWORD, PVOID, DWORD, PDWORD );
  160. typedef struct _SYSTEM_HANDLE_INFORMATION
  161. {
  162.     ULONG        ProcessId;
  163.     UCHAR        ObjectTypeNumber;
  164.     UCHAR        Flags;
  165.     USHORT        Handle;
  166.     PVOID        Object;
  167.     ACCESS_MASK    GrantedAccess;
  168. }SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
  169. typedef struct _SYSTEM_HANDLE_INFORMATION_EX
  170. {
  171.     ULONG                NumberOfHandles;
  172.     SYSTEM_HANDLE_INFORMATION    Information[1];
  173. }SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;
  174. #define SystemHandleInformation 0x10 /* 16 */
  175. void main()
  176. {
  177.     HMODULE hNtDll = LoadLibrary( L"ntdll.dll" );
  178.     if ( !hNtDll )
  179.         return;
  180.     ZWQUERYSYSTEMINFORMATION    ZwQuerySystemInformation    = (ZWQUERYSYSTEMINFORMATION) GetProcAddress( hNtDll, "ZwQuerySystemInformation" );
  181.     ULONG                cbBuffer            = 0x4000;
  182.     LPVOID                pBuffer                = NULL;
  183.     NTSTATUS            s;
  184.     do
  185.     {
  186.         pBuffer = malloc( cbBuffer );
  187.         if ( pBuffer == NULL )
  188.             return;
  189.         memset( pBuffer, 0, cbBuffer );
  190.         s = ZwQuerySystemInformation( SystemHandleInformation, pBuffer, cbBuffer, NULL );
  191.         if ( s == STATUS_INFO_LENGTH_MISMATCH )
  192.         {
  193.             free( pBuffer );
  194.             cbBuffer = cbBuffer * 2;
  195.         }
  196.     }
  197.     while ( s == STATUS_INFO_LENGTH_MISMATCH );
  198.     PSYSTEM_HANDLE_INFORMATION_EX    pInfo    = (PSYSTEM_HANDLE_INFORMATION_EX) pBuffer;
  199.     ULONG                OldPID    = 0;
  200.     for ( DWORD i = 0; i < pInfo->NumberOfHandles; i++ )
  201.     {
  202.         if ( OldPID != pInfo->Information.ProcessId )
  203.         {
  204.             OldPID = pInfo->Information.ProcessId;
  205.             wprintf( L"PID: %d ", OldPID );
  206.         }
  207.     }
  208.     free( pBuffer );
  209.     FreeLibrary( hNtDll );
  210.     getchar();
  211. }
  212. 一直在使用一个小工具叫unlocker。知道它是用关闭句柄的方法来删除文件的,但是自己也没有怎么研究过这东西。传说中更厉害的方法是直接向磁盘写0 和Xcb大法,最近准备好好研究这些删除方法。那么就从句柄开始吧。这里我只做枚举句柄的工作,因为关闭句柄就是把ZwDuplicateObject 的Options 这个参数赋值为DUPLICATE_CLOSE_SOURCE 。这里还要感谢一下sudami和NetRoc同学。。。O(∩_∩)O哈哈~

  213. #include <ntddk.h>

  214. #define AYA_DEVICE    L"\\Device\\EnumHandle"
  215. #define AYA_LINK    L"\\DosDevices\\EnumHandle"

  216. #define SystemHandleInformation 16

  217. #define OB_TYPE_PROCESS 5

  218. typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO
  219. {
  220.     USHORT    UniqueProcessId;
  221.     USHORT    CreatorBackTraceIndex;
  222.     UCHAR    ObjectTypeIndex;
  223.     UCHAR    HandleAttributes;
  224.     USHORT    HandleValue;
  225.     PVOID    Object;
  226.     ULONG    GrantedAccess;
  227. } SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;

  228. typedef struct _SYSTEM_HANDLE_INFORMATION
  229. {
  230.     ULONG                NumberOfHandles;
  231.     SYSTEM_HANDLE_TABLE_ENTRY_INFO    Handles[];
  232. } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;

  233. typedef enum _OBJECT_INFORMATION_CLASS {
  234.     ObjectBasicInformation,
  235.     ObjectNameInformation,
  236.     ObjectTypeInformation,
  237.     ObjectAllInformation,
  238.     ObjectDataInformation
  239. } OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;

  240. typedef struct _OBJECT_BASIC_INFORMATION {
  241.     ULONG        Attributes;
  242.     ACCESS_MASK    DesiredAccess;
  243.     ULONG        HandleCount;
  244.     ULONG        ReferenceCount;
  245.     ULONG        PagedPoolUsage;
  246.     ULONG        NonPagedPoolUsage;
  247.     ULONG        Reserved[3];
  248.     ULONG        NameInformationLength;
  249.     ULONG        TypeInformationLength;
  250.     ULONG        SecurityDescriptorLength;
  251.     LARGE_INTEGER    CreationTime;
  252. } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;

  253. typedef struct _KOBJECT_NAME_INFORMATION {
  254.     UNICODE_STRING    Name;
  255.     WCHAR        NameBuffer[];
  256. } KOBJECT_NAME_INFORMATION, *PKOBJECT_NAME_INFORMATION;

  257. typedef struct _OBJECT_TYPE_INFORMATION {
  258.     UNICODE_STRING    TypeName;
  259.     ULONG        TotalNumberOfHandles;
  260.     ULONG        TotalNumberOfObjects;
  261.     WCHAR        Unused1[8];
  262.     ULONG        HighWaterNumberOfHandles;
  263.     ULONG        HighWaterNumberOfObjects;
  264.     WCHAR        Unused2[8];
  265.     ACCESS_MASK    InvalidAttributes;
  266.     GENERIC_MAPPING GenericMapping;
  267.     ACCESS_MASK    ValidAttributes;
  268.     BOOLEAN        SecurityRequired;
  269.     BOOLEAN        MaintainHandleCount;
  270.     USHORT        MaintainTypeList;
  271.     POOL_TYPE    PoolType;
  272.     ULONG        DefaultPagedPoolCharge;
  273.     ULONG        DefaultNonPagedPoolCharge;
  274. } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;

  275. NTSYSAPI
  276. NTSTATUS
  277. NTAPI
  278. ZwQueryObject(
  279.     IN HANDLE Handle,
  280.     IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
  281.     OUT PVOID ObjectInformation,
  282.     IN ULONG ObjectInformationLength,
  283.     OUT PULONG ReturnLength OPTIONAL
  284.     );


  285. NTSYSAPI
  286. NTSTATUS
  287. NTAPI
  288. ZwQuerySystemInformation(
  289.     ULONG SystemInformationClass,
  290.     PVOID SystemInformation,
  291.     ULONG SystemInformationLength,
  292.     PULONG ReturnLength
  293.     );


  294. NTSYSAPI
  295. NTSTATUS
  296. NTAPI
  297. ZwDuplicateObject(
  298.     IN HANDLE SourceProcessHandle,
  299.     IN HANDLE SourceHandle,
  300.     IN HANDLE TargetProcessHandle OPTIONAL,
  301.     OUT PHANDLE TargetHandle OPTIONAL,
  302.     IN ACCESS_MASK DesiredAccess,
  303.     IN ULONG HandleAttributes,
  304.     IN ULONG Options
  305.     );


  306. NTSYSAPI
  307. NTSTATUS
  308. NTAPI
  309. ZwOpenProcess(
  310.     OUT PHANDLE ProcessHandle,
  311.     IN ACCESS_MASK AccessMask,
  312.     IN POBJECT_ATTRIBUTES ObjectAttributes,
  313.     IN PCLIENT_ID ClientId
  314.     );


  315. NTSTATUS NTAPI AYA_EnumHandle();


  316. void AYA_Unload( IN PDRIVER_OBJECT pDriverObj )
  317. {
  318.     UNICODE_STRING Temp;
  319.     RtlInitUnicodeString( &Temp, AYA_LINK );
  320.     IoDeleteSymbolicLink( &Temp );
  321.     IoDeleteDevice( pDriverObj->DeviceObject );
  322. }


  323. NTSTATUS AYA_Dispatch( IN PDEVICE_OBJECT pDeviceObj, IN PIRP pIrp )
  324. {
  325.     NTSTATUS        ns = STATUS_SUCCESS;
  326.     PIO_STACK_LOCATION    stIrp;

  327.     stIrp = IoGetCurrentIrpStackLocation( pIrp );

  328.     switch ( stIrp->MajorFunction )
  329.     {
  330.     case IRP_MJ_CREATE:
  331.         break;
  332.     case IRP_MJ_CLOSE:
  333.         break;
  334.     case IRP_MJ_DEVICE_CONTROL:
  335.         break;
  336.     default:
  337.         pIrp->IoStatus.Status = STATUS_INVALID_PARAMETER;
  338.         break;
  339.     }

  340.     ns = pIrp->IoStatus.Status;
  341.     IoCompleteRequest( pIrp, IO_NO_INCREMENT );
  342.     return(ns);
  343. }


  344. NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObj, IN PUNICODE_STRING RegistryPath )
  345. {
  346.     NTSTATUS    ns = STATUS_SUCCESS;
  347.     UNICODE_STRING    AYA;
  348.     UNICODE_STRING    AYAL;
  349.     PDEVICE_OBJECT    pDevice;

  350.     ns = AYA_EnumHandle();
  351.     RtlInitUnicodeString( &AYA, AYA_DEVICE );
  352.     ns = IoCreateDevice( pDriverObj, 0, &AYA, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevice );

  353.     RtlInitUnicodeString( &AYAL, AYA_LINK );
  354.     ns = IoCreateSymbolicLink( &AYAL, &AYA );

  355.     pDriverObj->MajorFunction[IRP_MJ_CREATE]                =
  356.         pDriverObj->MajorFunction[IRP_MJ_CLOSE]                =
  357.             pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL]    = AYA_Dispatch;

  358.     pDriverObj->DriverUnload = AYA_Unload;


  359.     return(ns);
  360. }


  361. NTSTATUS AYA_EnumHandle()
  362. {
  363.     NTSTATUS            ns = STATUS_SUCCESS;
  364.     ULONG                ulSize;
  365.     PVOID                pSysBuffer;
  366.     PSYSTEM_HANDLE_INFORMATION    pSysHandleInfo;
  367.     SYSTEM_HANDLE_TABLE_ENTRY_INFO    pSysHandleTEI;
  368.     OBJECT_BASIC_INFORMATION    BasicInfo;
  369.     PKOBJECT_NAME_INFORMATION    pNameInfo;
  370.     POBJECT_TYPE_INFORMATION    pTypeInfo;
  371.     OBJECT_ATTRIBUTES        oa;
  372.     ULONG                ulProcessID;
  373.     HANDLE                hProcess;
  374.     HANDLE                hHandle;
  375.     HANDLE                hDupObj;
  376.     CLIENT_ID            cid;
  377.     ULONG                i;

  378.     ulSize = 100;
  379.     do
  380.     {
  381.         pSysBuffer    = ExAllocatePoolWithTag( PagedPool, ulSize, 'A0' );
  382.         ns        = ZwQuerySystemInformation( SystemHandleInformation, pSysBuffer, ulSize, NULL );
  383.         ulSize        *= 2;
  384.         if ( !NT_SUCCESS( ns ) )
  385.         {
  386.             ExFreePool( pSysBuffer );
  387.         }
  388.     }
  389.     while ( !NT_SUCCESS( ns ) );


  390.     pSysHandleInfo = (PSYSTEM_HANDLE_INFORMATION) pSysBuffer;
  391.     for ( i = 0; i < pSysHandleInfo->NumberOfHandles; i++ )
  392.     {
  393.         pSysHandleTEI = pSysHandleInfo->Handles;

  394.         if ( pSysHandleTEI.ObjectTypeIndex != OB_TYPE_PROCESS )
  395.         {
  396.             continue;
  397.         }

  398.         ulProcessID        = (ULONG) pSysHandleTEI.UniqueProcessId;
  399.         cid.UniqueProcess    = (HANDLE) ulProcessID;
  400.         cid.UniqueThread    = (HANDLE) 0;
  401.         hHandle            = (HANDLE) pSysHandleTEI.HandleValue;


  402.         InitializeObjectAttributes( &oa, NULL, 0, NULL, NULL );
  403.         ns = ZwOpenProcess( &hProcess, PROCESS_DUP_HANDLE, &oa, &cid );
  404.         if ( !NT_SUCCESS( ns ) )
  405.         {
  406.             KdPrint( ("ZwOpenProcess : Fail ") );
  407.             break;
  408.         }
  409.         ns = ZwDuplicateObject( hProcess, hHandle, NtCurrentProcess(), &hDupObj, \
  410.                     PROCESS_ALL_ACCESS, 0, DUPLICATE_SAME_ACCESS );

  411.         if ( !NT_SUCCESS( ns ) )
  412.         {
  413.             KdPrint( ("ZwDuplicateObject : Fail ") );
  414.             break;
  415.         }

  416.         ZwQueryObject( hDupObj, ObjectBasicInformation, &BasicInfo, \
  417.                    sizeof(OBJECT_BASIC_INFORMATION), NULL );

  418.         pNameInfo = ExAllocatePoolWithTag( PagedPool, BasicInfo.NameInformationLength, 'A1' );
  419.         RtlZeroMemory( pNameInfo, BasicInfo.NameInformationLength );

  420.         ZwQueryObject( hDupObj, ObjectNameInformation, pNameInfo, \
  421.                    BasicInfo.NameInformationLength, NULL );

  422.         pTypeInfo = ExAllocatePoolWithTag( PagedPool, BasicInfo.TypeInformationLength, 'A2' );
  423.         RtlZeroMemory( pTypeInfo, BasicInfo.TypeInformationLength );

  424.         ZwQueryObject( hDupObj, ObjectTypeInformation, pTypeInfo, \
  425.                    BasicInfo.TypeInformationLength, NULL );

  426.         KdPrint( ("NAME:%wZ\t\t\tTYPE:%wZ\n", &(pNameInfo->Name), &(pTypeInfo->TypeName) ) );

  427.         ExFreePool( pNameInfo );
  428.         ExFreePool( pTypeInfo );
  429.     }

  430.     ZwClose( hDupObj );
  431.     ZwClose( hProcess );
  432.     ZwClose( hHandle );
  433.     ExFreePool( pSysBuffer );

  434.     if ( !NT_SUCCESS( ns ) )
  435.     {
  436.         return(STATUS_UNSUCCESSFUL);
  437.     }

  438.     return(ns);
  439. }
复制代码


回复

使用道具 举报

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

本版积分规则

天马阁|C/C++辅助教程|安卓逆向安全| 论坛导航|免责申明|Archiver||网站地图
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表天马阁立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2010-2021 All Right Reserved.
快速回复 返回顶部 返回列表