获得进程的EPROCESS.docx
- 文档编号:7490469
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:11
- 大小:18.33KB
获得进程的EPROCESS.docx
《获得进程的EPROCESS.docx》由会员分享,可在线阅读,更多相关《获得进程的EPROCESS.docx(11页珍藏版)》请在冰豆网上搜索。
获得进程的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
*************************************************************************
*/
/*
*************************************************************************
*<
*/
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;}
/*
*************************************************************************
*<
*************************************************************************
*/
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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 获得 进程 EPROCESS