找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 7105|回复: 0

关于PsCreateSystemThread函数

[复制链接]
发表于 2015-5-30 01:00:17 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

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

×
研究了1天这个。。。MSDN说的不是很清楚
NTSTATUS PsCreateSystemThread(
  _Out_      PHANDLE ThreadHandle,
  _In_       ULONG DesiredAccess,
  _In_opt_   POBJECT_ATTRIBUTES ObjectAttributes,
  _In_opt_   HANDLE ProcessHandle,
  _Out_opt_  PCLIENT_ID ClientId,
  _In_       PKSTART_ROUTINE StartRoutine,
  _In_opt_   PVOID StartContext
);

该函数用于创建系统线程,ProcessHandle参数接收NULL,     NtCurrentProcess() (-1)   ,或指定进程句柄 三种情况  都可以用PsTerminateSystemThread结束掉
示例:

  1. VOID MyThread(PVOID StartContext)
  2. {
  3.         PEPROCESS pp=IoGetCurrentProcess();
  4.         NTSTATUS status=PsTerminateSystemThread(0);
  5. //以下实际上已经不执行了
  6.         if(status == STATUS_INVALID_PARAMETER)
  7.         {
  8.                 KdPrint(("not systemthread"));
  9.         }
  10. }

  11. HANDLE OpenProcess(HANDLE  Processid)
  12. {
  13.         NTSTATUS status;
  14.         PEPROCESS Process = NULL;
  15.         HANDLE hProcess = NULL;
  16.         UNICODE_STRING Unicode;
  17.         status = PsLookupProcessByProcessId(Processid, &Process);
  18.         if (NT_SUCCESS(status))//判断进程号是否存在
  19.         {
  20.                 RtlInitUnicodeString(&Unicode, L"PsProcessType");
  21.                 //得到系统导出函数的地址和用户态的GetProcessAddress雷同
  22.                 PsProcessType = (POBJECT_TYPE*)MmGetSystemRoutineAddress(&Unicode);
  23.                 if (PsProcessType)
  24.                 {
  25.                         status = ObOpenObjectByPointer(Process,0,NULL,PROCESS_ALL_ACCESS,(POBJECT_TYPE) * PsProcessType,
  26.                                 KernelMode,&hProcess);
  27.                         if (NT_SUCCESS(status))
  28.                         {
  29.                                 //减少指针计数
  30.                                 ObfDereferenceObject(Process);
  31.                                 return hProcess;
  32.                         }
  33.                 }
  34.                 ObfDereferenceObject(Process);
  35.         }
  36.         return 0;
  37. }

  38. HANDLE outthread1,,outthread2,outthread3,outthread4,hproc;

  39. PsCreateSystemThread(&outthread1,THREAD_ALL_ACCESS,NULL,NULL,NULL,MyThread,NULL);
  40. PsCreateSystemThread(&outthread2,THREAD_ALL_ACCESS,NULL,NtCurrentProcess(),NULL,MyThread,NULL);

  41. OBJECT_ATTRIBUTES oa;
  42. CLIENT_ID ci={(HANDLE)1472,0};//注意是进程ID!
  43. RtlZeroMemory(&oa,sizeof(oa));
  44. oa.Length=sizeof(oa);
  45. ZwOpenProcess(&hproc,PROCESS_ALL_ACCESS,&oa,&ci);
  46. PsCreateSystemThread(&outthread3,THREAD_ALL_ACCESS,NULL,hproc,NULL,MyThread,NULL);

  47. hproc=OpenProcess((HANDLE)1472);//注意是进程ID!
  48. PsCreateSystemThread(&outthread4,THREAD_ALL_ACCESS,NULL,hproc,NULL,MyThread,NULL);
复制代码




该函数创建的线程,其PETHRAD属性的CrossThreadFlags有PS_CROSS_THREAD_FLAGS_SYSTEM属性,不允许以挂起模式创建线程,,其他和普通的NtCreateThread差别不大!
然而在微软官方源码中,PS_CROSS_THREAD_FLAGS_SYSTEM属性即为SystemThread,尽管其所属进程可能是explorer.exe  



回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-25 08:18 , Processed in 0.029337 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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