获得进程的EPROCESS.docx

上传人:b****6 文档编号:7490469 上传时间:2023-01-24 格式:DOCX 页数:11 大小:18.33KB
下载 相关 举报
获得进程的EPROCESS.docx_第1页
第1页 / 共11页
获得进程的EPROCESS.docx_第2页
第2页 / 共11页
获得进程的EPROCESS.docx_第3页
第3页 / 共11页
获得进程的EPROCESS.docx_第4页
第4页 / 共11页
获得进程的EPROCESS.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

获得进程的EPROCESS.docx

《获得进程的EPROCESS.docx》由会员分享,可在线阅读,更多相关《获得进程的EPROCESS.docx(11页珍藏版)》请在冰豆网上搜索。

获得进程的EPROCESS.docx

获得进程的EPROCESS

获得进程的EPROCESS

获得进程的EPROCESS

获得进程的EPROCESS

创建时间:

2004-06-01

文章属性:

原创

文章提交:

MustBE(zf35_at_)

By[I.T.S]SystEm32

Welcometoourwebsite

thankstoSobeIt:

P

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

每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.

绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。

ZwQuerySystemInformation函数原形如下

NTSYSAPI

NTSTATUS

NTAPI

ZwQuerySystemInformation

INSYSTEM_INFORMATION_CLASSSystemInformationClass,

INOUTPVOIDSystemInformation,

INULONGSystemInformationLength,

OUTPULONGReturnLengthOPTIONAL

);

参数意义如下

SystemInformationClass:

被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一

SystemInformation:

指向一个接受系统信息的缓冲区的指针

SystemInformationLength:

缓冲区长度

ReturnLength:

指向一个接受实际返回字节数的变量,可以为0

 

为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用

ZwQuerySystemInformation

SYSTEM_INFORMATION_CLASS的结构如下

typedefstruct_SYSTEM_HANDLE_INFORMATION

{

ULONGProcessId;

UCHARObjectTypeNumber;

UCHARFlags;

USHORTHandle;

PVOIDObject;

ACCESS_MASKGrantedAccess;

}SYSTEM_HANDLE_INFORMATION,*PSYSTEM_HANDLE_INFORMATION;

ProcessId:

进程标识符

ObjectTypeNumber;打开的对象的类型

Flags:

句柄属性标志

Handle:

句柄数值,在进程打开的句柄中唯一标识某个句柄

Object:

这个就是句柄对应的EPROCESS的地址

GrantedAccess:

句柄对象的访问权限

 

下面我写了一个小程序来获得EPROCESS(GetKTEB.cpp)

比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄

怎么会这样?

难道程序写错了?

*_*

现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出

:

proc-oQQ

ProcessKPEBPIDThreadsPriUserTimeKrnlTimeStatus

QQ827CD52011C2A800000B90000008D4Ready

----HandleTableInformation----

HandleTable:

FFAD93C8HandleArray:

E2BEB000Entries:

590

HandleObHdr*Object*Type

00000000000000000018?

0004E2DA5E58E2DA5E70Section

0008FFAB35C8FFAB35E0Event

000CFFAB3B08FFAB3B20Event

001085C7018885C701A0Event

00148151577881515790Directory

0018FFAB7BB2FFAB7BCA?

001C814A1858814A1870Directory

002080288C8880288CA0Event

0024E2CFE7F9E2CFE811?

0028842D7B08842D7B20Event

002C80E9B98980E9B9A1?

0030E1372198E13721B0Section

0034814602C0814602D8WindowStation

003881455CE081455CF8Desktop

003C814602C0814602D8WindowStation

0040E2B3C1A8E2B3C1C0Key

0044E286D6E8E286D700Key

0048E2B3C0E8E2B3C100Key

004CE2B3C068E2B3C080Key

0050E2BEE688E2BEE6A0Key

00548147C9988147C9B0Directory

0058829D1128829D1140Event

005C83F991E883F99200Event

0060E2BEE608E2BEE620Key

0064FFB07568FFB07580Event

0068801747E880174800Event

006C8017482880174840Event

0070845E8808845E8820Event

007481448798814487B0Event

0078E2B9A888E2B9A8A0Key

007C845E8648845E8660Event

0080FF9E2DB8FF9E2DD0Mutant

0084FF9E2D58FF9E2D70Mutant

008883CFC37883CFC390Mutant

008C801749B0801749C8File

0090E2C48668E2C48680Section

0094FF965168FF965180Event

0098FF9E7D88FF9E7DA0Event

009CFFAD3DE8FFAD3E00Event

00A080AD63C880AD63E0Event

00A4E28073A8E28073C0Key

00A8FF955588FF9555A0Thread

00ACE2770728E2770740Key

00B0FF923438FF923450Mutant

00B4FFAE3B38FFAE3B50Mutant

00B883B8072883B80740Event

00BC83B8066883B80680Event

00C0E2E3C448E2E3C460Section

00C483776A0883776A20Thread

00C881489E4881489E60Event

00CC83776CC883776CE0Event

00D083776C8883776CA0Event

00D48377676883776780Event

00D8E2837D88E2837DA0Key

00DC8146B3A88146B3C0Event

00E0FF908308FF908320Event

00E48149486881494880Event

00E8FF9064C8FF9064E0Event

00ECFF908FC8FF908FE0Event

00F0FF908F88FF908FA0Event

00F4FF955588FF9555A0Thread

00F8FF908F48FF908F60Event

00FCE2CB1558E2CB1570Port

0100FF90A2C8FF90A2E0IoCompletion

0104E2CFE708E2CFE720Port

0108FF90A2C8FF90A2E0IoCompletion

010C837762A8837762C0Thread

01108103BBC88103BBE0Event

0114813DBDB8813DBDD0Event

0118FF814788FF8147A0Event

011CE1358DA8E1358DC0Key

0120E2CFC428E2CFC440Key

01248103B9C88103B9E0Event

0128E2C9A968E2C9A980Key

012C83B34E8883B34EA0Event

0130E2CFD948E2CFD960Key

013483B34E0883B34E20Event

....

.....................省略

看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?

想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此

可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路

后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.

果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS

修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程

#include

#include

#include

#include

/*

*you'llfindalistofNTSTATUSstatuscodesintheDDKheader

*ntstatus.h(\WINDDK\2600.1106\inc\ddk\wxp\)

*/

#defineNT_SUCCESS(status)((NTSTATUS)(status)>=0)

#defineSTATUS_INFO_LENGTH_MISMATCH((NTSTATUS)0xC0000004L)

#defineSTATUS_ACCESS_DENIED((NTSTATUS)0xC0000022L)

/*

*************************************************************************

*ntddk.h

*/

typedefLONGNTSTATUS;

typedefULONGACCESS_MASK;

/*

*ntdef.h

*************************************************************************

*/

/*

*************************************************************************

*<>-GaryNebbett

*/

typedefenum_SYSTEM_INFORMATION_CLASS

{

SystemHandleInformation=16

}SYSTEM_INFORMATION_CLASS;

/*

*InformationClass16

*/

typedefstruct_SYSTEM_HANDLE_INFORMATION

{

ULONGProcessId;

UCHARObjectTypeNumber;

UCHARFlags;

USHORTHandle;

PVOIDObject;

ACCESS_MASKGrantedAccess;

}SYSTEM_HANDLE_INFORMATION,*PSYSTEM_HANDLE_INFORMATION;

#defineInitializeObjectAttributes(p,n,a,r,s){(p)->Length=

sizeof(OBJECT_ATTRIBUTES);(p)->RootDirectory=r;(p)->Attributes=a;

(p)->ObjectName=n;(p)->SecurityDescriptor=s;

(p)->SecurityQualityOfService=NULL;}

/*

*************************************************************************

*<>-GaryNebbett

*************************************************************************

*/

typedefULONG(__stdcall*RTLNTSTATUSTODOSERROR)(INNTSTATUS

Status);

typedefNTSTATUS(__stdcall*ZWQUERYSYSTEMINFORMATION)(IN

SYSTEM_INFORMATION_CLASSSystemInformationClass,INOUTPVOID

SystemInformation,INULONGSystemInformationLength,OUTPULONG

ReturnLengthOPTIONAL);

/************************************************************************

**

*FunctionPrototype*

**

************************************************************************/

staticDWORDGetEprocessFromPid(ULONGPID);

staticBOOLLocateNtdllEntry(void);

 

/************************************************************************

**

*StaticGlobalVar*

**

************************************************************************/

staticRTLNTSTATUSTODOSERRORRtlNtStatusToDosError=NULL;

staticZWQUERYSYSTEMINFORMATIONZwQuerySystemInformation=NULL;

staticHMODULEhModule=NULL;

/************************************************************************/

 

staticDWORDGetEprocessFromPid(ULONGPID)

{

NTSTATUSstatus;

PVOIDbuf=NULL;

ULONGsize=1;

ULONGNumOfHandle=0;

ULONGi;

PSYSTEM_HANDLE_INFORMATIONh_info=NULL;

for(size=1;;size*=2)

{

if(NULL==(buf=calloc(size,1)))

{

fprintf(stderr,"calloc(%u,1)failed\n",size);

gotoGetEprocessFromPid_exit;

}

status=ZwQuerySystemInformation(SystemHandleInformation,buf,

size,NULL);

if(!

NT_SUCCESS(status))

{

if(STATUS_INFO_LENGTH_MISMATCH==status)

{

free(buf);

buf=NULL;

}

else

{

printf("ZwQuerySystemInformation()failed");

gotoGetEprocessFromPid_exit;

}

}

else

{

break;

}

}/*endoffor*/

//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组

NumOfHandle=(ULONG)buf;

h_info=(PSYSTEM_HANDLE_INFORMATION)((ULONG)buf+4);

for(i=0;i

{

if((h_info[i].ProcessId==PID)&&(h_info[i].ObjectTypeNumber

==5))//&&(h_info[i].Handle==0x3d8))

{

printf("Handle:

0x%x,OBJECT

0x%x\n\r",h_info[i].Handle,h_info[i].Object);

return((DWORD)(h_info[i].Object));

}

}

GetEprocessFromPid_exit:

if(buf!

=NULL)

{

free(buf);

buf=NULL;

}

return(FALSE);

}

 

/*

*ntdll.dll

*/

staticBOOLLocateNtdllEntry(void)

{

BOOLret=FALSE;

charNTDLL_DLL[]="ntdll.dll";

HMODULEntdll_dll=NULL;

 

if((ntdll_dll=GetModuleHandle(NTDLL_DLL))==NULL)

{

printf("GetModuleHandle()failed");

return(FALSE);

}

if(!

(ZwQuerySystemInformation=(ZWQUERYSYSTEMINFORMATION

)GetProcAddress(ntdll_dll,"ZwQuerySystemInformation")))

{

gotoLocateNtdllEntry_exit;

}

ret=TRUE;

LocateNtdllEntry_exit:

if(FALSE==ret)

{

printf("GetProcAddress()failed");

}

ntdll_dll=NULL;

return(ret);

}/*endofLocateNtdllEntry*/

 

intmain(intargc,char**argv)

{

LocateNtdllEntry();

//打开自身句柄,这样才能在handle列表中找到自己,PROCESS对应ObjectTypeNum为5

OpenProcess(PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId());

DWORDAddr=GetEprocessFromPid((DWORD)GetCurrentProcessId());

printf("result:

CurrentEPROCESS'sAddressis0x%x\n\r",Addr);

returnTRUE;

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1