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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:/ a0 E0 h; ]+ m- ` K
--------------------------------------------------------------------------------
' P0 p0 L8 J4 T/ L/ y- W% C' \' [( j文摘出处:http://www.xfocus.net/articles/200406/706.html! `, [, ]3 A. \6 U, p
7 P2 v0 b5 u0 \+ v% X; M( i创建时间:2004-06-01# {- X) O7 z! r1 O/ W3 |6 H# f( P
文章属性:原创6 k1 D- F8 j5 [( y( `$ T
文章提交:MustBE (zf35_at_citiz.net)6 Z. @+ i+ H7 a- g
N# l5 c1 F) b: c+ f7 T9 ~
By [I.T.S]SystEm32
- s( k& ~# |5 E. O4 M1 I& |8 X0 P
) T6 H7 h; H! U8 m' C0 CWelcome to our web site http://itaq.ynpc.com/itsbbs/
' P( N/ c' A/ y! u1 A3 V1 J5 `# a [; A) b
thanks to SobeIt : P
: _1 n) ?* S& c& B---------------------------------------------------------------------------------------------
9 N" @2 k. `6 a- W2 u# e h0 f# R4 k4 r/ B/ T; q: p2 ]
每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.2 ^9 T9 E. v1 @
" O: b1 k6 H P4 o& ]5 Y( ]绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。4 }& r- ]: _1 X: h: F5 J) X$ S
; q$ I; i5 E5 ?+ Q3 X, U$ NZwQuerySystemInformation函数原形如下! [7 V, I$ _, h# u$ }% x$ s5 A
. H @* \" C" @1 [3 t2 i
NTSYSAPI+ }- {& ]1 }: X5 R _
NTSTATUS
8 Q9 \( E, b6 z% ^' KNTAPI" l. u. U. b+ H5 ~" x2 x
ZwQuerySystemInformation! t8 c- f; E: v6 E
(
! L$ D* o* u7 i) x, t# z6 f& ]1 SIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 4 B) k9 z9 Y/ M
IN OUT PVOID SystemInformation, & L6 L! R6 g. a! y2 O I2 Z
IN ULONG SystemInformationLength, 0 |; b1 X6 p2 n5 g5 m& H% v
OUT PULONG ReturnLength OPTIONAL % _: L8 I5 d' U3 \! @
);; b! ^# d* ^* T9 Z) i$ E
% ~4 d7 B2 P- h3 [+ G! I" i
参数意义如下
& ^, f( y( T7 B. w9 W$ n7 `: l$ ^: k8 [1 D( P- i
SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
+ U2 J R! D9 t' l: a; W
; O8 ~/ m t( hSystemInformation:指向一个接受系统信息的缓冲区的指针
5 t8 Z4 b6 n4 N+ K- d6 i5 k8 G% V5 G% k- Q% V' Y, Z
SystemInformationLength:缓冲区长度
' l4 n( a( M! e2 x, J( Q) n. u$ o) u" J' n3 p e1 ^
ReturnLength:指向一个接受实际返回字节数的变量,可以为0
, l/ ]6 d/ H, \9 t, s2 S
6 N# S- C& x4 N; V% `/ ^) ?. t
1 J" _, r( e" x9 ]. e为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation- f/ I9 X( h' P5 O. V
5 C) v- N9 v5 U
SYSTEM_INFORMATION_CLASS的结构如下$ c" K/ {- k+ y' w# {7 n; m4 v5 u3 p
# f3 J2 g5 o4 g6 ]* c* a2 z
typedef struct _SYSTEM_HANDLE_INFORMATION" U2 c+ x: m: j2 S3 ~4 ^
{
: F6 M9 T$ ^0 W$ N6 [ULONG ProcessId;* }- T) \' Y) {$ k9 b5 }4 e4 J6 |
UCHAR ObjectTypeNumber;
7 \2 U: h. ?: U. XUCHAR Flags;
* q1 F' Y3 [8 a/ z& VUSHORT Handle;
- I/ b# O4 c3 _PVOID Object;
; s$ f+ G3 V. k" V' B+ G. UACCESS_MASK GrantedAccess;6 w! l) x. K$ C' } B' z7 E# G' N1 e
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
' _) F1 U1 N/ D# V/ M/ _" ?
: I2 S4 N8 w9 @, {: PProcessId:进程标识符
& m: B% }! a5 s% d& W" B5 C+ _
, E( @4 D4 F/ SObjectTypeNumber;打开的对象的类型
. ^! }9 z5 _8 [* L$ G6 w- q, D5 I$ V9 V7 N3 s
Flags:句柄属性标志
# F% m' o; u* N1 Z6 `/ r! v. L6 {
Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄
3 u* {% H1 R+ V7 I. A7 A" s; U4 O% Z$ G5 A7 k6 ?+ e
Object:这个就是句柄对应的EPROCESS的地址
0 }6 ~/ J) g& i* u6 O; A6 E
- h& y' \) k6 ?! k- E, U4 ZGrantedAccess:句柄对象的访问权限
" D+ N4 X( ^3 I$ _/ i7 o
; l. V( f/ P4 j& N; h! l5 l, r6 e0 t- m1 t
下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )$ f/ t. O6 `: b
" W8 Z8 i* F6 Q9 f) c7 K# V3 D1 N
比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄
' d i; Q! c* b. f9 G
8 b" Y' o+ {* h0 s0 z+ a' {怎么会这样?难道程序写错了?*_*3 i% I2 D) B0 z* d
# m& n2 B, x K, P. n( v; a现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出
* Z! a5 K$ A+ ]* e$ U- u( Y" O: Z% |
:proc -o QQ
' ?- e8 B, u6 t2 u! FProcess KPEB PID Threads Pri User Time Krnl Time Status
9 E8 u i! ^& \QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready
& m& G8 ?8 _& C6 N7 o1 O$ K% x* g
/ H) g3 m. x, g, Z---- Handle Table Information ----% Y. |) _, o! F; \' T& H
% z2 Z' R0 V0 z3 o$ W
Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
5 y0 L4 L% Q/ B$ @/ U2 C9 l' p& O5 u: @5 v- c- B
Handle Ob Hdr * Object * Type' a- A: N: |0 t6 [, h% _# y
0000 00000000 00000018 ?5 w" q; C7 t" J2 m- h! V* ^" ?/ V
0004 E2DA5E58 E2DA5E70 Section R7 P; @0 M8 G v/ e- Q5 ? j
0008 FFAB35C8 FFAB35E0 Event6 a: n+ b9 [9 s
000C FFAB3B08 FFAB3B20 Event& E2 r9 t9 J# |8 M# H6 B9 x8 R. {4 f
0010 85C70188 85C701A0 Event
+ S( P) l. u- N( P$ o7 O0014 81515778 81515790 Directory
9 {! c) |7 [- M( Q t) a0018 FFAB7BB2 FFAB7BCA ?8 ?# r; V: P, i) T4 r/ D2 [
001C 814A1858 814A1870 Directory+ W% L' ?; u) M' e# [9 h; f% e
0020 80288C88 80288CA0 Event3 F2 O: c/ d# R
0024 E2CFE7F9 E2CFE811 ?
6 M) W3 |# q" K: F& W0028 842D7B08 842D7B20 Event
, g) X% z1 H7 d7 _! w' Q* e002C 80E9B989 80E9B9A1 ?
7 M* J$ e& v4 A( u% r0030 E1372198 E13721B0 Section
( Y. v+ o X" j0034 814602C0 814602D8 WindowStation
2 r' b! Y* Q* [$ u: m& Q0038 81455CE0 81455CF8 Desktop, J4 f; l1 p3 n9 x+ [! _) I
003C 814602C0 814602D8 WindowStation
/ z/ d! f# @/ d1 \0040 E2B3C1A8 E2B3C1C0 Key
. _. _8 m* W- y4 ]$ U' E* k5 F0044 E286D6E8 E286D700 Key
' x" Q) D, c) P' J* e3 y" Z! \# u0048 E2B3C0E8 E2B3C100 Key/ t8 f# Y/ Q k- t5 G
004C E2B3C068 E2B3C080 Key
& F( D N' C/ N. |* ]0050 E2BEE688 E2BEE6A0 Key, c" v+ s7 p4 y$ |. q& u8 o
0054 8147C998 8147C9B0 Directory$ G, f9 @# W* D' c' l
0058 829D1128 829D1140 Event* h& H! C' d( J
005C 83F991E8 83F99200 Event2 r2 O2 l: k2 ?2 ]4 b5 a
0060 E2BEE608 E2BEE620 Key
2 C2 ~7 G# c. Z' B0064 FFB07568 FFB07580 Event
5 C" {) V! U! n" N0068 801747E8 80174800 Event
+ w. Q4 b2 k V* v# k8 V006C 80174828 80174840 Event
' u5 y: ]" }2 x) W# M8 E A. p0070 845E8808 845E8820 Event. r, d' A; t, Z$ G' l& U4 I" c* ~; [4 M3 T
0074 81448798 814487B0 Event
( c3 r/ e" O, s. l+ H& q9 Y0078 E2B9A888 E2B9A8A0 Key
% t z* m3 F' [+ p! X' Q% R, B007C 845E8648 845E8660 Event- h8 P6 b% G8 T: ?; u7 M7 S
0080 FF9E2DB8 FF9E2DD0 Mutant+ B" y6 W1 y7 d' O
0084 FF9E2D58 FF9E2D70 Mutant8 |: \1 x! W0 x- p$ [* j
0088 83CFC378 83CFC390 Mutant
* _0 Q* h% ]0 E; E008C 801749B0 801749C8 File
, G% W+ x m5 a7 r, x; X! x0090 E2C48668 E2C48680 Section- ?9 T3 f1 ]; E0 q
0094 FF965168 FF965180 Event9 w! E* O( r+ K6 m" b
0098 FF9E7D88 FF9E7DA0 Event# U, H5 t2 X: G* r# b$ ?+ t
009C FFAD3DE8 FFAD3E00 Event
9 U! ^+ ?) N0 j6 f00A0 80AD63C8 80AD63E0 Event7 g! d$ ]5 A+ V
00A4 E28073A8 E28073C0 Key; A9 @( k5 W$ t2 r; |1 v
00A8 FF955588 FF9555A0 Thread
3 g2 N2 G, V d& e' O00AC E2770728 E2770740 Key
5 }, z7 E9 z" Q- [ i& V00B0 FF923438 FF923450 Mutant L3 D& O. o' j2 f
00B4 FFAE3B38 FFAE3B50 Mutant
" n$ |( c' T7 \, m00B8 83B80728 83B80740 Event
2 O! A' C' D+ c3 S00BC 83B80668 83B80680 Event
" }; r' X+ X1 X3 @) a6 @% _0 `- h0 D7 ~00C0 E2E3C448 E2E3C460 Section
% V9 I- \4 d# E' E00C4 83776A08 83776A20 Thread
( }# C" N8 I* o5 @00C8 81489E48 81489E60 Event
+ x) x, V) r+ K% e! d4 w5 }: N5 c00CC 83776CC8 83776CE0 Event2 r# D$ k0 p% h! o
00D0 83776C88 83776CA0 Event
V1 Q0 o% v; R- Z- {' X00D4 83776768 83776780 Event. i; O7 B' u* t8 F. Q! w l
00D8 E2837D88 E2837DA0 Key
3 ?, ?/ ^0 U- E00DC 8146B3A8 8146B3C0 Event
' b9 o& k, I n3 O: c# F: N00E0 FF908308 FF908320 Event- c& y* g- N2 t( ^6 U0 w+ i: B, Z' m
00E4 81494868 81494880 Event: k+ y1 R" G: D0 D1 n. v
00E8 FF9064C8 FF9064E0 Event
' b' Y7 F; i# \9 T3 f {# U00EC FF908FC8 FF908FE0 Event
" T' a, _+ m$ r* k00F0 FF908F88 FF908FA0 Event; x" s- J2 r z6 Y1 h& f5 G! ?
00F4 FF955588 FF9555A0 Thread
- \9 v: \" O9 l; P# F7 O00F8 FF908F48 FF908F60 Event1 h/ c3 L" {- O0 ` N& x9 q
00FC E2CB1558 E2CB1570 Port; H6 m. q6 n5 M9 l6 \
0100 FF90A2C8 FF90A2E0 IoCompletion
$ S9 A' [: ^* ]3 ]- G0104 E2CFE708 E2CFE720 Port
" M% C9 s$ f% O# Z0108 FF90A2C8 FF90A2E0 IoCompletion
; @& i7 H8 \$ H010C 837762A8 837762C0 Thread2 g0 f% P( N o6 ?* C: f# g; j3 Y
0110 8103BBC8 8103BBE0 Event$ k4 U9 b, U# r
0114 813DBDB8 813DBDD0 Event: s$ ?* V4 p! r0 e4 ?7 w) t
0118 FF814788 FF8147A0 Event- X+ m& D- i- f( n0 w4 f4 J$ B- T
011C E1358DA8 E1358DC0 Key
4 N" v% [8 `1 v8 q0120 E2CFC428 E2CFC440 Key
/ P1 \1 i7 T( q; F3 n0124 8103B9C8 8103B9E0 Event9 {% {! \2 H# e/ Z2 I# V: L
0128 E2C9A968 E2C9A980 Key
$ v. u9 x! o$ T- p3 x0 y" f012C 83B34E88 83B34EA0 Event
4 a4 D4 N: n+ P0130 E2CFD948 E2CFD960 Key
3 m, @3 D; n% p1 z0 P0134 83B34E08 83B34E20 Event
( X, \+ W# Q0 b6 [7 a4 J, n4 P....
+ M9 T3 n5 I9 Q9 L/ b.....................省略) m6 t/ p% ^/ P
7 T, E% F% |* n, p/ |看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?
- E" |7 r. K3 r o7 m) `) `" k5 ~
/ O4 e7 j/ L3 Z$ H" `2 R8 w. Z) z+ P6 g想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此4 D7 \) \0 L4 m$ Q; @3 q& @" E
4 ]8 ?/ \7 t6 u: W. L
可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路& ]' p# m7 y, `
. h' B1 C8 }' X0 g后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.5 A& y3 _ N+ ^, o5 z% F
. H5 Z) b2 ^! ?9 f. m5 B: s果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS8 c/ D; d4 v7 L: N* o) A
' R/ ]- }% D/ Y1 U# U8 V
修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程' ]' s# q* s: F m2 z# k, P7 n
# n @1 {- R x# L# L
#include - X- D0 x; k, _6 A* i" h e2 s
#include 5 Q) ]5 {' d9 m2 J6 c
#include
6 v# T! W& u9 o6 z3 b- n7 H/ O#include # V& I! a% ]( a+ _% b5 T5 {" ^3 Q
/ T6 m! l% F9 P) s6 ~/** D2 G" j2 u, o7 ]% T, p. \
* you''ll find a list of NTSTATUS status codes in the DDK header
: M9 {( y9 h+ F) T# m8 |* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)
2 J. I! ?7 ~$ [*/) D9 z! ?9 ^ w% l) n# I' |, u
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)
2 K4 X3 Y3 B6 s# w; K#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
0 m2 u3 m- i% K/ l3 c3 m#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
( r8 D7 u N0 O7 V
3 R8 \+ R. Y5 T6 ^* ~+ _1 b' _/*& ^* H: }! O! s, @
*************************************************************************
4 t6 L- O# }9 k. v+ Y: a* ntddk.h
" d/ x" g+ }. _( n; c*/7 H e/ [( ]( ?9 U; Z
typedef LONG NTSTATUS;
, B, y5 X n: S. {, r$ mtypedef ULONG ACCESS_MASK;6 W3 p; i W* c
/*
# f! X6 v1 h% X$ k, x B- W5 l* ntdef.h V+ i5 [3 a! Y
*************************************************************************' y4 @+ y; c' S5 q* g2 o: B
*/+ w4 V2 U! `2 W* v! p: o2 y l W7 W
# f1 ], R2 F' R/ n0 Z/*
7 }) b: }: F0 @; u' ]$ F1 D*************************************************************************
' R& t! g0 ]; g- @4 h* w* <> - Gary Nebbett! E, Q0 K' P4 Y% [. Y! K6 o/ S
*/
2 f' j7 A# C7 |! u8 B: V2 z Q+ d+ N/ i' V; w- F. E, R
typedef enum _SYSTEM_INFORMATION_CLASS! [4 r7 _; A3 z2 \
{5 S& N, A, H! H r7 z: j6 m
SystemHandleInformation = 16% w0 y6 I- n% R+ W+ h
} SYSTEM_INFORMATION_CLASS;
' R$ i+ J/ J% K5 k3 l$ a8 K* b+ o, Z5 V9 m& O6 \7 n8 d9 f
/*" C# j' X- z. x d- X3 |5 V8 c
*Information Class 16
/ v: I4 V! }( b% Z* ^*/8 ]. t7 ]# A" x6 ]
typedef struct _SYSTEM_HANDLE_INFORMATION
. k1 u: U- k9 u# j' i8 Y/ {2 @{
. q7 j' ~$ F9 MULONG ProcessId;
. N( R! ]+ @1 N GUCHAR ObjectTypeNumber; ~. }/ M. D4 n
UCHAR Flags;) k# v6 R3 o& G- ^" O& |
USHORT Handle;
: C4 Z0 Q' k% F. D5 IPVOID Object;: x. L M7 L2 p0 l8 z" s+ s
ACCESS_MASK GrantedAccess;
+ {+ I. S4 `) Q2 ]) w/ ~1 L} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;! Q! e+ F. O8 t' q
1 Q, t0 Z% a$ R' @) `( @7 d6 R#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; }, ]7 X' R/ {$ B. M
/*
" K$ z! R5 L; U! M' P*************************************************************************8 ?, ^6 D1 s# y
* <> - Gary Nebbett# C f9 W# v2 V# [8 z" I1 ]; _. }( M
*************************************************************************
* ?# [) D7 M9 S, i: N9 d7 I*/
1 C. Y4 R$ @+ _" N2 @3 ?6 Ttypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );
& d) g% Y0 I$ a/ Ztypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );1 j" S- H7 t3 ^4 m2 w3 s- G X
/************************************************************************/ x( s# C8 M- Q1 z" f, Y
* *- L: c K' [ u9 m& M3 T0 R4 z
* Function Prototype *
: C) Q8 H* Y0 L% H; b( [7 M2 f, k* *
( `+ @5 E4 q$ y3 {************************************************************************/4 L1 N0 b& u% ]1 ~$ i
/ |0 o5 F) s* M1 `3 c
static DWORD GetEprocessFromPid ( ULONG PID );4 `- S& c3 ~1 R- S
static BOOL LocateNtdllEntry ( void );: ~: m7 _* t6 I8 w$ W- ~! ]
% `# n3 o' I; d& P- b* J3 ^0 @# Z( F! y, Q* k5 d+ ?0 y
/************************************************************************
, _- y# _' U) [* S# x* *0 s: j. U3 g2 U
* Static Global Var *
/ ^ h; W5 B. C3 N B1 H* *
, t3 m5 v" A. y4 A* y9 q************************************************************************/7 }$ F5 y: m7 T6 P
7 G- w0 r1 u/ \+ S( e
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;
! h2 |; _6 I7 b7 E- D9 Y6 ?1 d7 Dstatic ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;4 j5 }$ a% s1 [1 e7 w. u3 L) d' S! W
+ [) L9 C2 @1 @" astatic HMODULE hModule = NULL;: c- N, C M" U. n/ {$ y. Z+ u) Q1 x
/************************************************************************/
0 v" E% [0 U3 q+ i3 |, [1 s. ^ D1 ^- `( w" `" n. T# N8 ~$ `
, z7 ~. m4 Y: V7 L/ A' }. f
static DWORD GetEprocessFromPid ( ULONG PID )4 Q3 b* d. Q# F* a1 S) @
{: _ U* u! b& n9 G7 E @' E& @+ X
NTSTATUS status;
; ~& E4 C" z. l: EPVOID buf = NULL; L% M0 j& T8 P* b' {0 B# G) A: y# C
ULONG size = 1;
) x& T7 g% J7 I" J/ j# ~ULONG NumOfHandle = 0;
3 B3 G' L6 O9 U2 \; I% I4 BULONG i;
9 C" ]* ?# n8 w. ?9 y3 LPSYSTEM_HANDLE_INFORMATION h_info = NULL;7 d( M, |2 L. A8 {
. y: ^, T5 ^# Y ]( F I( Z3 X; Z2 [- ufor ( size = 1; ; size *= 2 )
3 f9 L( G3 z9 V. g; _8 ~; @{
0 F! e, f9 Q5 O2 |3 Qif ( NULL == ( buf = calloc( size, 1 ) ) )
7 B4 w+ A& {9 N {{1 N1 S8 e) p Q `: ^
fprintf( stderr, "calloc( %u, 1 ) failed\n", size );
# J4 C7 M! K2 n$ X1 pgoto GetEprocessFromPid_exit;+ [ d( F: [, |
}
( r$ a& X. Y' w6 ]% K6 _status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
8 D. `7 I" w! h3 A( v& Vif ( !NT_SUCCESS( status ) )2 \) m+ \1 U4 Q9 {
{
, r6 w/ ?) q9 }% Q7 a. Fif ( STATUS_INFO_LENGTH_MISMATCH == status ). k* ~9 p {6 C2 Q# N1 E
{
6 _; n2 l6 s1 g4 Ufree( buf );
. {: |* I D7 |; I% r* }- D" a; Xbuf = NULL;) T9 Y/ m; I# C$ \" [9 \
}& b$ b$ [8 [9 x
else
# R% B w A6 w8 s3 v. s- h{
8 E- N3 T/ r7 E7 r b$ Qprintf( "ZwQuerySystemInformation() failed");
& l% X T& M( G% Q" Kgoto GetEprocessFromPid_exit;% ]' M; y; r- Y9 u+ h1 R. K
}( a$ y+ ]$ E. y* S3 r; E7 n
}
* _! |8 C% J! lelse/ L- x$ f' L7 L, P5 |
{
4 s4 y- \ B1 r' t6 G/ ^break;( n* n+ |& A% }! }
}7 K& j8 z3 X: o3 m8 F- F& L
} /* end of for */, F0 C! f) X, A$ [6 C1 A/ U
0 u0 w5 X k* I7 r! m: x5 \//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组* w% o. ]0 J8 j6 s0 z! W1 W
NumOfHandle = (ULONG)buf;
# Y2 P2 P% z* U2 ^3 v: Q* r. `- Q3 O: `
h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);
0 ~( `: `" O; @# o; y2 |+ `$ \- W5 U3 u+ R# K6 I4 j
for(i = 0; i {& y M$ s; {$ s" D, {
if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )
3 }: _" E* D- X& W) m{3 H; b0 b5 K9 e
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); H" A2 M4 z7 v4 D# z, ? n1 ~" E# f
return((DWORD)(h_info.Object));
4 Q- t, x* C r3 L}
* m4 `8 Y/ Y9 Q$ S. M}4 S& j6 u' B; N) m' V
GetEprocessFromPid_exit:. B8 J7 e4 G, L2 N# o: g7 x% W: R$ s
if ( buf != NULL )
8 v8 i8 I' k1 d. `; }; B{4 W$ g# N$ G# t# u7 q" D
free( buf );
5 U; @7 e D2 D! j' }8 Dbuf = NULL;
\6 n9 m6 d- z9 C4 u1 \& S}9 E0 _- b2 E" t4 r- b* J
return(FALSE);( H5 m& b4 q8 b4 d" I \- d
}% S! g3 [9 s3 |! c, [) m$ W
3 ~5 d% Z% K2 U* N# F+ d% w
0 c/ p0 M# R/ Z* t- s
/*8 o8 U. K% i/ c
* ntdll.dll- w! Y0 j1 i, S
*/ E- p. |+ ]; @( D5 P& G3 A' p
static BOOL LocateNtdllEntry ( void )
5 `( V" `: D! J2 @( i1 Q{
+ S: M# D, w) f7 x1 g' p% ABOOL ret = FALSE;
6 i8 E$ k z+ {5 y$ z" O+ Bchar NTDLL_DLL[] = "ntdll.dll";$ H" u/ U/ {7 G( W# w& U
HMODULE ntdll_dll = NULL;9 P' k5 @1 } Y9 P! `* T- [! E
0 f1 J. l! ?3 u; y: ]
# A# {- n& a; N; o6 |6 Q% Nif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
* g; @: H1 Q7 ?5 }, |6 ]& z{' ?, V0 o8 ?3 G ^; S
printf( "GetModuleHandle() failed");
6 w! O2 Q9 [6 c1 h2 Oreturn( FALSE );( C/ T% X7 \# j5 u |# ^3 N+ N- s
}
3 S. \+ y) j5 }' u4 i' t4 Yif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )
8 I; t% ]5 R# K% ^{
6 j- z5 L7 P' k# {goto LocateNtdllEntry_exit;" S# m8 `3 s( f3 Y) v* v
}5 f$ H; r: ] y* X+ O9 y) H
ret = TRUE;
/ y* D" R, q4 b0 } `
# ?' w# Q# ]+ Q/ \3 [6 \! }LocateNtdllEntry_exit:
; q* c' U' x# W M# I% C* E! K' J
& E% i; `) S! ]- oif ( FALSE == ret ). \7 S) t& {) B" M' A$ R5 l" l4 P
{4 y8 M- ~- J" V* x' y/ w
printf( "GetProcAddress() failed");) g& Q% |. S8 D! b' R
}
8 D; ^$ O8 u( x1 Y4 Yntdll_dll = NULL;
4 r0 Y" q* f# I! X+ u" `% l. t0 B# rreturn( ret );
8 x6 y' B8 |( d6 |7 m- V} /* end of LocateNtdllEntry */+ C! I$ }$ u0 c! T2 Q6 j' l f* a, i
! |& ]& N+ g& _# R& _) n# N9 m( X+ W$ }# B( C: x6 G) [
int main(int argc,char **argv)2 s: z- t7 H7 @2 L8 |! o
{
1 ?( s/ ?1 G/ B, y3 ^1 ~
7 Y8 v" [1 I; X0 N7 ZLocateNtdllEntry( );' S K# Q. i7 B* G
6 s0 B- e9 V3 Z
//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5/ K0 b9 `& `6 F4 H
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );
3 Q* I. ^4 J$ [* [8 r) m& I$ B6 M, ^# F) r. V
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );. _0 o9 s8 F" h* u+ d* u- {: |1 H
$ d2 e+ H3 L$ r* m+ S- ~- n% u
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);; d, k2 n) Y' }: ~0 R
8 l f+ j2 ~. y9 v
return TRUE;
2 N, K$ E6 b: R; d: t} |
zan
|