- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
 |
|
文摘内容:- w' K8 K$ Z1 g+ c0 w
--------------------------------------------------------------------------------: d2 n+ v- f3 a! ?5 J
文摘出处:http://www.xfocus.net/articles/200406/706.html( {* e) [6 q& i5 ~) b5 p' r
/ [+ [+ x! z* I# u& N* R3 H创建时间:2004-06-01: K2 l$ b4 p; k8 V( a
文章属性:原创
( {9 J9 x: z( L; }/ |9 _0 D V+ K文章提交:MustBE (zf35_at_citiz.net)2 B" B5 W( P6 K2 J6 Z4 `
1 s& i! q2 \; p( F5 D
By [I.T.S]SystEm32
2 ^& l. F7 }9 L* H) ^4 c4 p- S1 ]4 p/ X2 Y" X9 P3 O, i
Welcome to our web site http://itaq.ynpc.com/itsbbs/
( J# R( v5 d. x/ h' {7 A2 H5 J+ x# c- }) _1 H3 [
thanks to SobeIt : P
8 H3 @* y# u1 a0 f---------------------------------------------------------------------------------------------+ |+ H! A. [- D3 N. H* X' T
4 a% N* H9 r! Y) [' s# X" \
每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内." A1 h4 {- i Z
3 }5 g5 ]$ v2 @- c! o: Z; ~绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
) t" V+ j* c1 T2 n/ ?; ~* ^. T
) ]' I" O: O" U0 M+ e( U+ `9 YZwQuerySystemInformation函数原形如下
- }2 _2 I0 z v! E
" K( u. Z+ ?5 m; D. oNTSYSAPI: G( J2 E2 J# T* A1 S; l8 i: c
NTSTATUS* K* s. J/ l5 H" }7 T/ [7 w- R$ b
NTAPI" b, j) w* \$ a! K
ZwQuerySystemInformation
/ G* V m" D* v, l- t(
* e6 Z+ b& e! v$ Y4 ~4 w% T- i; rIN SYSTEM_INFORMATION_CLASS SystemInformationClass,
/ l+ B& i5 _0 U6 Z) ?IN OUT PVOID SystemInformation,
: L+ O$ `. s$ ^* yIN ULONG SystemInformationLength,
" ]3 { u4 B' l# J S) LOUT PULONG ReturnLength OPTIONAL : o4 U. g: X: p8 l) h
);
6 R4 z! M7 v3 R7 z, @! A
+ y/ L0 |: ^3 P2 @* d% ]参数意义如下2 U5 T, I+ T' I& r1 s- Y
9 s6 f: A2 n4 Z2 ?$ N" O8 Z3 h
SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一9 {2 ?& b- O6 R: a8 n! J+ m. d
0 F: Y3 d; q0 b! Y# {4 J7 O
SystemInformation:指向一个接受系统信息的缓冲区的指针 L/ k7 j4 V* h
* B5 y3 u8 \5 ], N" t5 |5 j6 j1 w/ r5 E
SystemInformationLength:缓冲区长度
, a7 M2 H8 o' m1 ]7 q: o; B' @
2 `+ q) N2 ~0 W# O0 _ReturnLength:指向一个接受实际返回字节数的变量,可以为08 ]: B+ h: {' \
2 c- }$ r" i* K( |( ]4 _2 S
5 y6 J0 P$ T2 _( B+ P2 b
为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation
* f' a+ s `* S0 v U( O8 z: C4 m3 p' {7 g7 D& c; w2 L
SYSTEM_INFORMATION_CLASS的结构如下. i2 u3 p& M$ o5 c4 m) k
, Q. W M" D2 l+ x
typedef struct _SYSTEM_HANDLE_INFORMATION
7 T) R& l+ S+ N+ P8 p, R{
; f- P) v+ O/ c9 K9 q+ PULONG ProcessId;
g) b$ P2 O2 K' ^6 d/ BUCHAR ObjectTypeNumber;! P# b$ y! r2 H9 {7 N, b
UCHAR Flags;7 G* |' O* ?0 O+ ~- K4 q ?5 Q
USHORT Handle;
& U4 \ r, b# r/ W4 i" J5 W5 XPVOID Object;# P* `2 t- q P9 O
ACCESS_MASK GrantedAccess;
+ R5 p* Y- M: n& E3 Y} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;' c2 U/ G- _! h% r
7 x2 h4 z6 p# Z0 F8 o; sProcessId:进程标识符 " t" {6 K0 U& l) u' H" V+ f* g: D
2 w9 G9 d C: o" q9 @, `
ObjectTypeNumber;打开的对象的类型; O! ]2 W+ I( k
6 a5 b% X* W* d& Z
Flags:句柄属性标志
, v3 }' G2 J: U& v, Q
: I( N) E! l2 N1 X" ?Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄
9 ]5 C5 k' s$ y8 F5 l/ j. k' Q! u9 y2 G5 [( [! f8 I. d. B2 |
Object:这个就是句柄对应的EPROCESS的地址: b( o- _7 I$ U8 o+ l q
; \- k, S7 p& P& g
GrantedAccess:句柄对象的访问权限, n1 |% g6 a+ o7 K3 ^
% o6 d' ?% A Q/ u5 h7 T. ~2 L% u _- [, V% C
下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )
! Y3 n1 X6 @: u' K8 M* o \+ d1 c L+ h1 f" x
比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄
- Q, s* x' X; ?) }5 {0 _9 K* f) u) R6 R! E+ j4 D* }! K. R3 P
怎么会这样?难道程序写错了?*_*
/ ~+ Z( a1 i# v# `# y
) I% Z3 i0 Y( O3 q! T现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出8 Q q# P$ Q' R7 z- x
9 T' `: n) e3 z* F
:proc -o QQ- Y. M7 s, D+ Y5 }
Process KPEB PID Threads Pri User Time Krnl Time Status9 W A7 u% i, n% d) i
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready: A! B9 r* i* K5 d7 |% y1 N
) y: I0 m! m8 A7 l& ?& |( u
---- Handle Table Information ----- D& ?# X% |# T- v4 i4 S k
# H: v2 c& M) B
Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
. s9 ~& ]2 Z5 O
* [+ }$ p: I# o: m1 [. RHandle Ob Hdr * Object * Type- A5 P2 f2 D3 Z. ~5 s4 `3 A
0000 00000000 00000018 ?3 V' u3 I: Q& C, W; {5 L& U
0004 E2DA5E58 E2DA5E70 Section) J9 ?0 B! C" N8 @- c9 j
0008 FFAB35C8 FFAB35E0 Event% ?" ?$ P+ P3 P! j& c
000C FFAB3B08 FFAB3B20 Event0 a6 F! F* _; m$ x& f
0010 85C70188 85C701A0 Event8 E1 F( M" G2 ?, _5 z3 V
0014 81515778 81515790 Directory0 a9 m. d/ P% | ?2 h6 y. [* z
0018 FFAB7BB2 FFAB7BCA ?
" n9 y' t1 G, |6 d) ]4 D7 g001C 814A1858 814A1870 Directory
3 {+ d! a* N* n7 L0020 80288C88 80288CA0 Event
/ I% I( Z$ Q% P0024 E2CFE7F9 E2CFE811 ? J4 b* O2 n& `% D! V
0028 842D7B08 842D7B20 Event' a* T/ j/ @- d( Z; t3 g
002C 80E9B989 80E9B9A1 ?
. g% ?9 R. C: T9 s# K0030 E1372198 E13721B0 Section% o6 |0 P$ Y& M* S( d1 O/ _8 n" {
0034 814602C0 814602D8 WindowStation2 ~) v& b: r. B8 T5 r9 v/ Z% T4 l! [
0038 81455CE0 81455CF8 Desktop# ~; R# d$ Z0 y$ r6 [7 c& R
003C 814602C0 814602D8 WindowStation
( E$ H* P4 B- P! K* K/ Z$ E0040 E2B3C1A8 E2B3C1C0 Key- x& N6 J/ F, p) {6 q0 {
0044 E286D6E8 E286D700 Key& l5 y3 K5 f/ r6 n7 x0 c
0048 E2B3C0E8 E2B3C100 Key) S) X3 k. t5 h! z/ q
004C E2B3C068 E2B3C080 Key1 R% p& \& U$ g! q7 V
0050 E2BEE688 E2BEE6A0 Key m! Y; N( p6 F% s
0054 8147C998 8147C9B0 Directory
6 f P9 B2 a6 t3 z/ K) \5 ^8 B6 b0058 829D1128 829D1140 Event8 `) b! N! ~! L# U- d
005C 83F991E8 83F99200 Event
' l/ z. w! w% [- T# A0060 E2BEE608 E2BEE620 Key6 O7 ~' _& A1 o8 P
0064 FFB07568 FFB07580 Event
0 {, P& |# O, s, u. Q& W! M. g% I0068 801747E8 80174800 Event7 K* j- |9 g9 E7 O
006C 80174828 80174840 Event0 `: M; G" S0 x9 y- R. _2 x
0070 845E8808 845E8820 Event6 @. @' t) _$ P, P5 G
0074 81448798 814487B0 Event
! P% v6 H/ F* O! L0078 E2B9A888 E2B9A8A0 Key0 Q9 W* V8 H: F$ Z
007C 845E8648 845E8660 Event
9 p u) {& F U' r! ]0080 FF9E2DB8 FF9E2DD0 Mutant$ f7 b0 R9 }( \6 N. ]
0084 FF9E2D58 FF9E2D70 Mutant- [) i+ j6 Y% L
0088 83CFC378 83CFC390 Mutant
' e5 K- D e. k0 ?6 g6 H008C 801749B0 801749C8 File6 P! T: J; |2 _5 n0 G: R! r
0090 E2C48668 E2C48680 Section4 k. |- N8 ]: F8 y# V- U" E
0094 FF965168 FF965180 Event
9 y- [) } i1 q* R4 `9 c& \* B0098 FF9E7D88 FF9E7DA0 Event3 L$ p% @6 |0 k; A' b5 Q1 q
009C FFAD3DE8 FFAD3E00 Event
3 h8 B7 S" [# d( ]$ B00A0 80AD63C8 80AD63E0 Event
$ C4 ^. J* t S( `, P2 f00A4 E28073A8 E28073C0 Key
a9 D: @+ c+ w0 X# r/ j/ G00A8 FF955588 FF9555A0 Thread5 ~* @5 D* s0 k9 o z8 l
00AC E2770728 E2770740 Key
% O" t, p2 |3 k9 x, M$ O' K- g/ ~00B0 FF923438 FF923450 Mutant- P; k) G e* b. }, `; s2 Y) N
00B4 FFAE3B38 FFAE3B50 Mutant8 G- |+ }/ ^' X; N
00B8 83B80728 83B80740 Event' i& N: Z3 d2 [# s- e0 ?( k
00BC 83B80668 83B80680 Event
0 f( C9 c1 j# k1 P$ N$ Y00C0 E2E3C448 E2E3C460 Section% H( I/ u# C* ~' R+ K
00C4 83776A08 83776A20 Thread
B+ _0 K7 F$ H: |1 a( g00C8 81489E48 81489E60 Event
; L3 U. r% F+ i( s) f00CC 83776CC8 83776CE0 Event7 y" ]7 T" j7 U) \8 x: u" ]7 [
00D0 83776C88 83776CA0 Event+ x( v1 l0 u7 N, j- b
00D4 83776768 83776780 Event; R. h( Z# t( x2 d) m- X1 g1 Y" d J
00D8 E2837D88 E2837DA0 Key
9 ^9 i+ w+ O0 M) g2 I f' Q00DC 8146B3A8 8146B3C0 Event M1 B- Q8 ?2 k
00E0 FF908308 FF908320 Event
6 s5 C) S" n6 y00E4 81494868 81494880 Event
& B( \: ~' |* J7 X" [00E8 FF9064C8 FF9064E0 Event' J9 g5 ?7 L) s' [' D
00EC FF908FC8 FF908FE0 Event( _& f9 f5 L; f# f4 |6 A! [1 l
00F0 FF908F88 FF908FA0 Event
$ C1 a- }* a6 @8 ~4 O- ?00F4 FF955588 FF9555A0 Thread
q7 a- b4 J) k$ {) ]$ O2 s. C00F8 FF908F48 FF908F60 Event' Z4 u2 N# d) a% i+ C
00FC E2CB1558 E2CB1570 Port t# C: v0 g2 d8 o$ K) l
0100 FF90A2C8 FF90A2E0 IoCompletion
9 g$ B k9 o# N: S5 ~- ?, e2 I0 c0104 E2CFE708 E2CFE720 Port7 i2 x ~- Z* `/ \7 Z/ G
0108 FF90A2C8 FF90A2E0 IoCompletion8 t# I8 L# {- B
010C 837762A8 837762C0 Thread" K6 a6 }1 w9 f" ~- f% E7 ^
0110 8103BBC8 8103BBE0 Event! w6 |, ]( T8 G# |
0114 813DBDB8 813DBDD0 Event
5 O6 l9 E2 J [: q( `0118 FF814788 FF8147A0 Event
6 x3 i$ ^5 _: H9 `" m3 i" h011C E1358DA8 E1358DC0 Key
: t& d2 |/ n: J% c m0120 E2CFC428 E2CFC440 Key9 L. v/ z4 F, F9 O% ?7 r
0124 8103B9C8 8103B9E0 Event
2 q' ^* J. H: I7 J3 y# F8 d: M. C4 f0128 E2C9A968 E2C9A980 Key
" t; p% l+ Z' g9 `$ A* \012C 83B34E88 83B34EA0 Event" D( I) f; n' s! j* ]1 N( a
0130 E2CFD948 E2CFD960 Key" i" R0 o" m4 z& m( {
0134 83B34E08 83B34E20 Event
' U5 ]6 `' a0 I4 a$ P, @% }) d....: q( c3 | ^1 F0 z
.....................省略 }0 t$ O* M$ K9 K+ A2 E
. R8 D. V, b3 D% Y0 {9 [9 }看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?
9 u& B! h, K# J+ l1 y& u' F' i* W$ G3 M
想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此9 `! c- u2 m4 |5 r. D
% c9 p* a7 C$ Y0 o5 m# l5 d
可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路
4 h& S5 X7 S$ z# J: \8 W7 i. w; \1 a& y
后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.. Q+ b% p5 `! A
A' j) R. W5 r6 A2 g, f: `" @6 h
果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS
/ y2 Q: X! ^- N6 |' M
0 B* y0 ^# p) R- N$ j+ w* h& q5 p修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程
. `8 `/ H& O5 j5 G2 K0 Z2 y: L8 K3 ]" C# v, Y3 F' U0 ]
#include
! J- t9 \0 c! H) t i#include ; v5 l' B, ^5 `% E7 @
#include - |2 s5 L$ r S% j& Z6 {: i, }
#include
+ o; }5 b/ a) r+ `' @
' H( n3 M% `$ G/ Z+ T+ W( e/*
$ X& k8 _: g% L7 C M* you''ll find a list of NTSTATUS status codes in the DDK header! |) f$ }, H% `
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)
; C( ~3 Y' h4 c9 d5 B*/
3 y/ ~$ l& Q4 Z( o6 A6 f/ V#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0); A/ i6 t7 R& L" F& q; }+ C
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)9 h; j. n8 B6 Y4 M5 |& b9 l" B4 i0 U
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
0 p ?7 n9 P7 v# w( _; B6 t7 i& F4 b! I- h+ t& h
/*
" N7 m ~2 l, ~8 x3 \*************************************************************************& T2 u- Z7 g6 W K8 }% q Q: m
* ntddk.h
1 [) H+ G# g1 T8 U. z*/
- k0 m$ Y+ T) t/ Itypedef LONG NTSTATUS;: U& t2 c2 u+ H4 [0 I
typedef ULONG ACCESS_MASK;
9 {" Q# v+ P8 X5 Y/ I; A/*) K1 h! T2 u" f) ` X
* ntdef.h; @# \0 s3 {- b( i$ T
*************************************************************************' c! v3 @5 e6 ~1 l0 a) |9 }
*/, F6 g/ B( Y1 r* Q
/ V% F7 \# l7 G9 G& W4 c
/*( }: ~5 ^$ y' E
*************************************************************************
! h( M- `" y# N* u T. @; ]* <> - Gary Nebbett; a# g' m* p/ r9 p) |' X, j
*/5 o2 o3 x. d# [" ~8 J
+ Z" ^9 Q4 [ P0 x: P- Mtypedef enum _SYSTEM_INFORMATION_CLASS6 Z7 ]8 v) P3 D. d% a4 t; \
{( B5 p& }1 H% u% [+ F4 P/ R+ ^
SystemHandleInformation = 16
, p+ V. u$ |- @} SYSTEM_INFORMATION_CLASS;
+ g; ^4 b" m- w( S/ E2 q, F
% z# q7 A$ x ]/*
4 p% J$ A4 Z9 \+ y* T& q*Information Class 16
6 w, G) ~; G/ ]5 [- B* Q7 I! g( D*/) H( }0 ~0 h' q3 n9 ]# x
typedef struct _SYSTEM_HANDLE_INFORMATION4 h3 ?. E' x- v: Y. S
{* k* ?! z/ Y- _# K
ULONG ProcessId;
! e c9 }. J. k* \. e' a0 ?1 kUCHAR ObjectTypeNumber;
- ?( |: d- R1 L. |! E; @, l5 P; E& YUCHAR Flags;$ c8 _$ d8 l) p" X3 z1 O0 O- x
USHORT Handle;
) `+ E8 g& \" M) p+ K" w+ r- j; L$ dPVOID Object;: Z, |# F. t2 n u O
ACCESS_MASK GrantedAccess;* @5 A7 ~% N# f: ^# A
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
1 T" z) \, O' @/ k
e, ?+ u8 Z- d- v$ V! \#define InitializeObjectAttributes( 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; }
# v- v4 q5 w- P9 u/*( w9 D) T- f5 ]0 r8 u }
*************************************************************************9 W: C' H. `2 r6 `
* <> - Gary Nebbett
* s3 i) @7 q `*************************************************************************$ n# ]& \; K4 z$ x V% L4 X- B
*/
( E6 \$ |; {& z: L9 d( ^% g4 k0 Mtypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );: b e5 N1 R3 g+ l
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );
* L! u; m( B4 G. i/************************************************************************, R: C8 @* E H) X2 i
* *) A& P* j2 o2 D; Q7 N! O' L
* Function Prototype *
0 M! h7 ]: u" p4 w5 o5 M* *! m- H/ d/ ?! k* Y2 ^: V5 k
************************************************************************/" g d% E1 \8 R" r
6 h, }/ s4 I$ O) S& u" r9 e. g% ]+ ^/ Q' S8 c
static DWORD GetEprocessFromPid ( ULONG PID );" i4 H1 i$ }' N- P
static BOOL LocateNtdllEntry ( void );7 _4 x9 `5 Z; O3 n
c- S3 E9 z! D/ {. w1 Q
4 z; b+ E" U- e: F- [' _/************************************************************************
& r6 D* M/ A _1 U8 v3 O* *
0 K" R8 V* X% A% B* Static Global Var */ U- U) W0 ]: [# Y/ u
* *
4 [& [4 ]) |. D7 C( n+ {************************************************************************/2 M* b+ ?" o9 h. K
+ z/ |+ d6 A2 X
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;, |% k7 F; @: A6 M3 A8 w; I
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;" X$ X+ u$ Z) G0 D# _' g6 E7 r0 c
1 Q* H0 S) g4 Q2 ]! T' i
static HMODULE hModule = NULL;, T. r+ [3 M/ @2 p% \
/************************************************************************/2 j+ B5 c& w# y. ?& |! M* c
4 X: J$ [& l6 C6 d L' K6 w2 {3 @$ x" m9 c! A* P
static DWORD GetEprocessFromPid ( ULONG PID )) _6 q" A- ?2 r* {" I
{& K+ b) @( W% ~2 A0 j" S
NTSTATUS status;
8 f9 `( C1 x' o0 XPVOID buf = NULL;
/ ^7 k+ ?% e1 G. Z; s W( D4 AULONG size = 1;% {8 P* P" {5 w" b" P' w2 b6 c
ULONG NumOfHandle = 0;4 m" u& N/ N+ R( G1 c) e2 t
ULONG i;
7 `( G- t! u3 u! g, H. KPSYSTEM_HANDLE_INFORMATION h_info = NULL;4 U/ u) ^- F$ f, i1 q3 F' }1 ~; m0 G
0 D- I, K& t6 L, n# O
for ( size = 1; ; size *= 2 ); A% N# p3 a/ h( E, p* K" z4 p
{
! D. ~7 }; {' y: mif ( NULL == ( buf = calloc( size, 1 ) ) )3 q9 U# g$ f3 k* M( `" ?
{
9 ?0 Q% r7 V- ^7 N: D. gfprintf( stderr, "calloc( %u, 1 ) failed\n", size );
: ?5 d7 [, i! o& l. jgoto GetEprocessFromPid_exit;. Z$ [6 [! V1 w- X+ X
}9 q" z2 G/ b+ ]5 o/ V3 [/ ~
status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
. z7 N. b; M; z9 |2 |2 p. iif ( !NT_SUCCESS( status ) )8 R- M" `2 w6 T5 [' D9 b4 C4 n" ]
{
3 w; C* V' f3 |% Y0 q. Z# A3 |- R7 qif ( STATUS_INFO_LENGTH_MISMATCH == status )8 `, m1 E& |" e3 f) m! ] D& K' L
{! W' e( n* E, R5 U# k( E1 Z3 d
free( buf );, h) U9 g" @1 v6 e& _
buf = NULL;
. k2 q; `" l+ U3 n& _}
" b6 K; D4 y0 g- melse
* x! A- i& e/ s{
4 T, y9 w% \. b1 \7 C0 Dprintf( "ZwQuerySystemInformation() failed");5 r# G! k' B. g; y
goto GetEprocessFromPid_exit;2 A: l+ A3 y4 Q7 U, r2 q
}, q6 s3 P% Y! n* Y7 ]7 n8 R
}6 H+ ?, H3 `. Q( g0 s
else+ D# O V$ i1 y: H0 h# g+ h
{1 x: A9 _% ]4 r W& w# a
break;
2 I& _( G3 L2 {7 S' c2 W& r3 J}! | h5 X# g& n8 y
} /* end of for */
* D: s7 @5 K7 ^8 e9 _! L
' j5 q" }, F" ]# B# @5 u& p9 z//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组6 f3 v- G9 r5 q8 C" ^1 v2 m* n
NumOfHandle = (ULONG)buf;9 | q# |/ U+ F' m( E9 m. Y
; }0 m5 Z2 M# _5 Eh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);, Y; t! \' Z! y! v {& L4 |
7 g& x6 C0 \4 u r6 q# hfor(i = 0; i {
( {( j3 Z8 }, N, V9 V, j4 @if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )5 w, n/ \# [. W) Q8 k& ^/ n! B* E
{, U: H$ x4 O; a# Z, U
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);1 f% }7 D! \8 a# Z: m1 T
return((DWORD)(h_info.Object));5 A |, g8 f8 v F1 {
}
8 \. w" K2 q6 b5 K" R3 r. p}- {6 [0 ]8 s& j, P8 D; ^, C8 a! D
GetEprocessFromPid_exit:
5 ?" G/ U6 }; P- I/ ~0 G& Mif ( buf != NULL )
. e4 U ]1 v5 _- [. s+ N. L$ I{" U$ @, b* v/ v5 J# |
free( buf );
" U+ p) |/ O* P+ a s) Ubuf = NULL;
* Y* X- W% M% V6 ]3 G# I}
5 ~! r% z6 L$ }& @" E+ wreturn(FALSE);7 t+ H% o8 I% H) `. W
}
- h3 w+ Y1 [( {9 ?
% K T( _. \( I Z2 v7 |! N6 A! v4 K& N4 p% |; M1 ^; Q/ m
/*' o) c- S+ M& ?, Y
* ntdll.dll7 a5 E1 H( U+ I, V
*/
/ k) U' N$ ^6 z: Zstatic BOOL LocateNtdllEntry ( void )1 p/ d; q* O$ c9 r
{- w9 c* s; v) X* S# S3 b
BOOL ret = FALSE;. Q. D3 m1 }$ E8 B
char NTDLL_DLL[] = "ntdll.dll";' J+ Y4 W9 |" y
HMODULE ntdll_dll = NULL;
+ j. ~! x4 B3 H( w1 H: M* P% ~8 l3 {! f; c. \1 ]% R
% A: C: m% k% b# ~4 d
if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
9 t9 X4 G$ |2 c7 w9 V. \6 c{
# u8 r: S& |: I* k! @) kprintf( "GetModuleHandle() failed");
$ N2 D, ?! p; |. {5 q* Jreturn( FALSE );
' z' c' b2 c* ]0 q7 f}
7 `/ U- ^+ k! |: ~) N/ V8 N$ Qif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )4 ?3 Y( I( S* M- u$ F, h8 M4 |
{% L$ B! C# W0 K' Z/ T# N6 x# U6 A g2 N
goto LocateNtdllEntry_exit;
* N' Y8 s5 R e/ t' ` Y9 [1 ?}& u4 B; T$ a' P
ret = TRUE;
+ u( }3 K4 P& h2 S G8 l1 S* A) g$ j! ~# @) b/ i+ B
LocateNtdllEntry_exit:& O2 O3 P, G5 E. |8 I( L" j
7 [! }6 Q4 q0 {
if ( FALSE == ret )
7 T4 @$ S V3 {2 {! a4 j" J{2 x6 f4 j4 q! I) e) |; }8 U2 _
printf( "GetProcAddress() failed");2 p4 f2 I: r( b' O& b& w- I
}
% `6 q' a/ `: i; E6 B9 x, C4 lntdll_dll = NULL;
4 e9 _3 h. ^: g! rreturn( ret );- C4 W: B; H3 k1 u" ?5 ?
} /* end of LocateNtdllEntry */
$ _+ p6 w8 w3 w9 g, y# D- u0 M7 g
" R4 X2 \3 y6 F E1 g3 ]- d/ c8 e
! N/ Z: a6 m* H3 q2 [* tint main(int argc,char **argv)% R% a, L5 y2 u8 o" {# I
{7 H7 u4 g0 i& {: ^5 X8 r6 j
5 l7 s4 l- @: f0 X& P Q* u
LocateNtdllEntry( );& K; _2 i- ^9 K
/ W' ^! z2 v" y7 B
//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为57 x R/ a4 z% m( c2 }& m1 _
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );
$ q- a a3 l9 ?# J2 d/ G; x" p( i0 E/ z$ A" {' l8 a: _$ C3 C
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );) p' e; ~6 w0 U
# m' g- a' \5 M& Y9 Fprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);0 i' s8 T/ G* h: F% K
- l2 Y6 `% B4 h$ S7 G4 J5 R% xreturn TRUE;
% k0 A8 @" ^( V) a+ C} |
zan
|