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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:2 X; |) r' ]" M- }0 }1 ^
--------------------------------------------------------------------------------
/ n+ j$ A% {4 ^& E0 b/ u! q. H1 Z4 _文摘出处:http://www.xfocus.net/articles/200406/706.html! d6 A$ ]3 R G% D6 q
+ O" h A$ A$ M) t# f创建时间:2004-06-01! D) u, W9 m; D- ?& \( b) `8 F
文章属性:原创3 A3 F" L) g# u; b
文章提交:MustBE (zf35_at_citiz.net)
1 ~+ p- h5 W4 ^9 P2 Q8 T3 I: H* J
By [I.T.S]SystEm32; d% S$ i9 }( ~6 }9 H' ^
( b$ I9 u& E) R9 \
Welcome to our web site http://itaq.ynpc.com/itsbbs/
4 F/ q% y# K5 I+ y
; `3 w% k- H6 w" ithanks to SobeIt : P- k% l5 R" `9 O' l) C0 u
---------------------------------------------------------------------------------------------. Z, x0 f* V7 M7 y
1 `3 @& X8 g0 ?( p5 [+ g& `+ @, i每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.
% ^) S) T6 V; }5 S
& L7 C% k* F8 U! B绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
5 F6 d: T. G. i4 E9 l; t ~2 H; u5 U8 {) T( k, [/ w$ v
ZwQuerySystemInformation函数原形如下
4 d: i- `. ^# v3 }* Q
. e4 I c( z7 U9 jNTSYSAPI
2 |; Q4 B* [' U' a" {% z7 C, B: o% ^NTSTATUS% P( W6 H g. {- d9 d9 j5 h+ u
NTAPI# n0 D0 n" f4 S. i: E4 u" n4 o4 X, _
ZwQuerySystemInformation* W+ T; J( _0 J5 j
(
, P% P) K2 \; N; n. k8 WIN SYSTEM_INFORMATION_CLASS SystemInformationClass,
$ q5 F- ~3 j& K NIN OUT PVOID SystemInformation,
7 Z) e7 {7 Y% j9 E0 X5 ZIN ULONG SystemInformationLength,
, }2 x* e' I. g0 JOUT PULONG ReturnLength OPTIONAL
2 T8 @9 O2 S" L2 W! V$ X);
3 m" ^2 s; {- ?$ U f# O- Q" }/ c
参数意义如下
1 h' o) E! n. G' ^$ `
& T8 c" D7 q% v7 o$ h1 x, A! P& K5 RSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一) I0 L% a4 k6 h, u" w) K8 I* r
3 f. Y1 }! [1 ?
SystemInformation:指向一个接受系统信息的缓冲区的指针! N% r' [( R. k
& X3 y3 Q/ @" D- r$ M( _
SystemInformationLength:缓冲区长度
: N% i# B7 y* I: G0 B' j
) E8 ^+ T7 n6 a; F$ A. g* z% e5 \ReturnLength:指向一个接受实际返回字节数的变量,可以为0( a1 V/ C/ `6 I4 Y/ i7 f
9 S8 D+ I4 r: ~% V
! b6 r* \: @- e; \' v L* B; p为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation- q/ U# B0 n; \
$ q0 m3 u! w* bSYSTEM_INFORMATION_CLASS的结构如下: M9 g( N" K: m7 ^) o
6 A: e6 w9 Q6 R
typedef struct _SYSTEM_HANDLE_INFORMATION+ Z: |% k, h( ^; S
{
" T9 ^" V Q* V [' r) N yULONG ProcessId;
, S0 U j- t* r8 ]1 @UCHAR ObjectTypeNumber;+ X; j4 R9 X$ g B2 y
UCHAR Flags;
1 m; N7 h( \/ |; h! ^$ @" ]USHORT Handle;( r2 L5 _: B" O2 t# f/ h, Q
PVOID Object;5 `8 L+ b3 ?( G3 T5 y+ h1 J
ACCESS_MASK GrantedAccess;
& Q; \9 e' l8 n: _% Y} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
! F, T' E. w0 \0 A. y
6 B A" L6 h( |+ i1 x& p+ x" {! nProcessId:进程标识符 9 I9 U2 M! O7 J; T& z
7 M" e) I" h( \5 p+ E
ObjectTypeNumber;打开的对象的类型
8 t# _ w. r; Y* G1 I% w
7 f1 k( J& X4 J: T2 Y7 c F; B! mFlags:句柄属性标志
]! _ w; _3 ?
: `" _5 b: v/ O, Y. ^! lHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄
9 h' P/ t% Q0 {6 u4 x3 a5 D1 x* M2 N9 c/ {8 I9 l
Object:这个就是句柄对应的EPROCESS的地址
! I1 `0 C/ B6 V8 k, N. t& Q
9 x& U2 f* p* z0 A- eGrantedAccess:句柄对象的访问权限
/ I: O2 C: W+ L# I- U/ o; B# I6 v# O3 ^9 `
7 \2 U/ _/ H; w# e下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )
7 _- E6 h D) k9 R2 C) \! `5 L
( J. h+ \7 O! X6 Q5 @8 h' e" |比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄: f3 R, i6 s D, ?8 d- H
4 ]7 c0 d8 J z; r
怎么会这样?难道程序写错了?*_*
% j) ?2 b" ~! K2 g1 q" {$ l2 Z4 p* j. J1 U& d2 \6 L
现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出+ f/ @6 H2 W& G/ ], K
6 ~3 ]- J8 N8 ^:proc -o QQ
4 p9 q8 v; [( c( j! F& M# yProcess KPEB PID Threads Pri User Time Krnl Time Status9 u$ v0 @8 S% h) E; X5 w7 U. f
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready
; Y0 G! G& M; H# a# e! d$ \' [; C& W, ]" c% h; g$ ?+ p4 J
---- Handle Table Information ----: h: z- Q+ B1 ?' n& C5 j- K
" e6 }7 F9 [! [# |% Y. ?: f3 W1 s) p2 x
Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 5908 G' a, {! t, o2 ^ w5 H
5 R7 U, o! v9 a' N2 [0 @Handle Ob Hdr * Object * Type0 }% _! O8 w* g2 Q9 ]) o
0000 00000000 00000018 ?
4 H7 r( }& d& m5 [; |0004 E2DA5E58 E2DA5E70 Section
2 y6 v+ @& x5 P% z4 z0008 FFAB35C8 FFAB35E0 Event% K, q2 B7 }( Z% `! S2 o* H1 P0 X
000C FFAB3B08 FFAB3B20 Event& j' S n* e$ L1 {0 e2 b- _( D
0010 85C70188 85C701A0 Event0 q9 u4 ?7 p) e
0014 81515778 81515790 Directory
7 p8 ?6 q- I3 z+ E. H" w# i9 s+ e0018 FFAB7BB2 FFAB7BCA ?! Q& ]! ?0 ~( c: {& l& D
001C 814A1858 814A1870 Directory
' O- z- x: X% y7 m! E# L+ h e) S! [/ u0020 80288C88 80288CA0 Event( ^0 Q- P( b7 Y/ H# |$ T5 s2 {
0024 E2CFE7F9 E2CFE811 ?
8 K2 Z4 ^6 @6 x% w0028 842D7B08 842D7B20 Event
' o8 t! ]5 ?7 |, N, L3 J002C 80E9B989 80E9B9A1 ?, s C3 j( W+ N: y, I. e' C2 h" ^6 ^
0030 E1372198 E13721B0 Section4 D2 l3 h0 \/ z3 j3 F# |
0034 814602C0 814602D8 WindowStation& I; F5 r2 o& c( h ]5 @ B
0038 81455CE0 81455CF8 Desktop
9 L5 l$ l' H; l9 Y; n" c1 J+ y B003C 814602C0 814602D8 WindowStation8 P* P4 F' i2 |
0040 E2B3C1A8 E2B3C1C0 Key7 J7 z+ I Q9 j* \" L5 C2 y
0044 E286D6E8 E286D700 Key
9 H) b% R4 l2 b% b) ^* s) d0048 E2B3C0E8 E2B3C100 Key
/ n/ e! K) E% X004C E2B3C068 E2B3C080 Key0 P: I3 y( m/ ?: ]
0050 E2BEE688 E2BEE6A0 Key
* S) G0 P) ~/ ^# y0054 8147C998 8147C9B0 Directory
5 M8 E( T, O5 m9 F0058 829D1128 829D1140 Event
1 F6 @* P: G' p/ [$ k f005C 83F991E8 83F99200 Event
- W$ e& N/ A/ V$ _, T4 t0060 E2BEE608 E2BEE620 Key) f+ E; D& U- B0 u9 Z r: S" k
0064 FFB07568 FFB07580 Event
' L, c2 L% _1 d' A0068 801747E8 80174800 Event
8 f3 T( Q1 c: J$ [2 E p! B' h006C 80174828 80174840 Event
! P9 v9 N4 R8 O4 L% S. R0070 845E8808 845E8820 Event
F' u! O' T- Q- y2 T9 A7 e+ C0074 81448798 814487B0 Event
3 R# ~. I) B' V, A+ [# [0078 E2B9A888 E2B9A8A0 Key
$ J- |2 ?; V$ Z% e5 W007C 845E8648 845E8660 Event
- f" C8 R8 `! C, G0 k7 J0 u$ j0080 FF9E2DB8 FF9E2DD0 Mutant5 P7 W) x1 b. w
0084 FF9E2D58 FF9E2D70 Mutant
& n) f( i# i* A8 m( n- B3 I" f0088 83CFC378 83CFC390 Mutant" y) ]9 I7 L" `7 n/ P% _$ W" u6 L
008C 801749B0 801749C8 File
0 I) |' P9 V1 j. P5 ]0090 E2C48668 E2C48680 Section
" E4 f6 K2 L" O1 H2 j0094 FF965168 FF965180 Event5 Q3 _4 `9 B* b; ^- k! \7 P
0098 FF9E7D88 FF9E7DA0 Event
" H4 o0 u9 m6 F& I2 |009C FFAD3DE8 FFAD3E00 Event& ^& f7 R* Y! K* u* N
00A0 80AD63C8 80AD63E0 Event$ g0 Z/ x* K/ D4 i. o5 z8 i
00A4 E28073A8 E28073C0 Key! b/ e( m# n, S
00A8 FF955588 FF9555A0 Thread# ` w2 ~9 \6 M
00AC E2770728 E2770740 Key
" p% h( l# d- T" i& q2 @% V3 A00B0 FF923438 FF923450 Mutant4 P: f. D- E a4 j9 R. \4 u0 ^
00B4 FFAE3B38 FFAE3B50 Mutant- \! x9 {/ x( Q. f$ ?3 p" |
00B8 83B80728 83B80740 Event! m- C& }* Q+ ~! v+ t' p$ A3 D
00BC 83B80668 83B80680 Event/ c0 ~& G- w/ l5 [2 Z/ \
00C0 E2E3C448 E2E3C460 Section! k. d% [. z1 y! f) e; i
00C4 83776A08 83776A20 Thread
: a/ b, O7 E' l+ A5 \00C8 81489E48 81489E60 Event
2 ]& b; h, F0 f8 Z$ W5 L# N00CC 83776CC8 83776CE0 Event
, ^# J' o6 l# f# D: q00D0 83776C88 83776CA0 Event
. x5 I4 g# o1 ?+ ~: D00D4 83776768 83776780 Event7 R) M* U/ S* J3 n
00D8 E2837D88 E2837DA0 Key
9 a( N& f' @! L2 Q7 i, x8 y7 t8 e00DC 8146B3A8 8146B3C0 Event
2 ]3 x1 Z, l3 i; [7 P00E0 FF908308 FF908320 Event- l4 v8 y& c1 `8 f3 c9 j
00E4 81494868 81494880 Event6 J# B# F5 _8 w! y* |# z) `* V
00E8 FF9064C8 FF9064E0 Event/ i' t @* M& j8 Z; T3 ] b# ~
00EC FF908FC8 FF908FE0 Event
6 h" X: }4 X, p$ n. ]00F0 FF908F88 FF908FA0 Event5 H G+ p* _' ]+ v5 B( ^* j5 `
00F4 FF955588 FF9555A0 Thread
2 G0 R+ L5 [/ C; V, G00F8 FF908F48 FF908F60 Event
" u7 B; C- c s4 ^00FC E2CB1558 E2CB1570 Port
2 [% | m7 U) F$ S, u! o; x0100 FF90A2C8 FF90A2E0 IoCompletion. }- [) C5 m/ r+ d! L
0104 E2CFE708 E2CFE720 Port
* Q% R8 d; d5 E0108 FF90A2C8 FF90A2E0 IoCompletion3 s) g2 I8 O8 c+ F" L' m
010C 837762A8 837762C0 Thread
% L1 u$ R5 G! X9 l0 P% z8 z6 }2 M' b0110 8103BBC8 8103BBE0 Event) x8 x( P3 m8 }! C* ^5 j: X
0114 813DBDB8 813DBDD0 Event
) g8 \3 V% Y0 E4 p5 {# l# |! S. h0118 FF814788 FF8147A0 Event6 D' W! |$ Q& u! P3 r
011C E1358DA8 E1358DC0 Key+ ?- z: w6 j8 g- M0 ?
0120 E2CFC428 E2CFC440 Key
W, A' z( M; B- t5 O( b0124 8103B9C8 8103B9E0 Event
5 g" f! _9 l# m& O) Q0128 E2C9A968 E2C9A980 Key2 v4 P9 n6 S; C! m
012C 83B34E88 83B34EA0 Event" q1 H( S) w4 ?$ V7 ]6 t' H( \
0130 E2CFD948 E2CFD960 Key
- Q5 a( v+ J" O0 i0134 83B34E08 83B34E20 Event
4 T2 q5 t" b$ A7 g8 t" ?1 B....0 y t3 d# _$ c! l7 G
.....................省略5 t* o% P6 K, z/ v
4 F' d0 f8 ]# l: G
看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?% m: U: f1 W- u6 l
) j8 b# e0 w7 U ~% z
想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此1 m, B3 J8 ]) n) p+ _/ V& x% Y
+ s2 L6 l2 w6 `" G, o( S可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路5 z! N ~1 }5 y$ r# b( R; c
' |2 _* z4 S. N2 L( y5 v后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.
- m, o( ?5 ~3 H! R
9 [; |. S4 G, q% H7 Z果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS' l; a! E- S. d% ]; W( b7 F
7 ^* Y! Y' o A! \修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程5 y# T3 W. v0 G/ K1 s
. P+ k2 j5 b, f7 `4 |0 f, l#include ; h) I0 o$ t2 @) A
#include
8 W& i' g3 _( |$ _) ?3 _0 x( j#include
( k0 S/ e" X6 s, Y8 H#include 9 C3 i& u. F6 c/ |! M6 L
) w+ a' Q) g3 S! E2 ^# U# i& v9 }+ o
/*5 ^+ M; w! u5 U: p
* you''ll find a list of NTSTATUS status codes in the DDK header
4 |2 K8 M% K) C* \2 G* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)
! Y0 J" P) w* @7 u4 t2 d*/
. ]- E/ y" r. _: d; H#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) y* q& q0 K" I0 n ~! f
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)- ^$ u5 W6 c6 s6 N, n
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L); @2 Q% h6 ~. x2 N( y) f! J* E) l
$ q! \8 v2 ]" H3 L x- e# m! W+ }) V
/* v0 X2 f. D6 f
*************************************************************************! Z+ f$ k5 ~1 E6 s. X
* ntddk.h
- D) _9 _# h# t$ Z' i1 ?*/
) U! m( K. E! jtypedef LONG NTSTATUS;
( m6 G, D! z: E% x: E$ Gtypedef ULONG ACCESS_MASK;
0 s4 s+ I/ n* }& h# J/*
$ ]6 j U8 m. r4 i1 ?* X* ntdef.h
" _. g u& V* {6 \*************************************************************************0 O9 f! R2 }0 a0 G+ E! N: O! W! y
*/2 u; i* A: M; {9 [
& l: @5 D C7 c& x/*% V) b2 L. q/ E* P( n# K
*************************************************************************
( l' M) A+ v6 z9 A1 U6 y2 i" g* <> - Gary Nebbett
- R1 |2 ?) x7 e$ [( Y" s9 d*/
4 T3 `6 a2 |5 A( P! v8 w
5 O8 h2 H8 t3 ]" |typedef enum _SYSTEM_INFORMATION_CLASS& s% {% E3 S9 A. V, v! o0 j
{
1 D! [3 V7 B$ m9 U: ~, N* ~. W3 XSystemHandleInformation = 16
( \( |9 l- Z& Q: o} SYSTEM_INFORMATION_CLASS;
$ G; B( T! i5 W( P+ y" a% H+ e, q2 |0 M# H1 Q- S0 l. z t
/*
9 d1 j- y2 ^) R, a: C*Information Class 16
; r2 Q d# E4 [: H: M+ x% t2 @+ h+ }*/, D; K' T+ _' Z# _( I. U, H8 C
typedef struct _SYSTEM_HANDLE_INFORMATION! f9 i% I7 M" h$ S4 G' g9 A5 P
{
3 o) E1 U" ?1 R& b( B" M q4 S4 YULONG ProcessId;
2 ], c5 C {! M6 {6 _6 t+ K# rUCHAR ObjectTypeNumber;& @( t9 ?1 h4 p1 _9 X
UCHAR Flags;7 s# Q$ ]7 s8 c' T& z d1 @
USHORT Handle;
9 M& {. x$ z" h ?' u- _# bPVOID Object;
) A- t0 u7 s5 ] z6 tACCESS_MASK GrantedAccess;
+ I6 [$ `3 k# }1 ]} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
, g8 x# F8 x& U! @6 J( O- Q2 q6 v3 X( o
#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; }8 J4 Q- @5 [' S. R' U9 N
/*
. @ i5 }2 T# e/ C*************************************************************************" Z% j, O0 C1 k6 \4 h+ R( L! s& `5 R- N
* <> - Gary Nebbett
% e( N. I7 u E, n6 T2 n*************************************************************************& H' S- X Z0 _, k+ {, C/ ^" {' e% a; o
*/
1 {, S3 B0 w; K; X! s( s; `typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );- H; p( B4 x1 N1 p8 Q. K6 [' r5 b& k
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );5 n- y% O9 z( `8 n0 \2 K. g
/************************************************************************
( m3 {' G- `+ ]0 L# ~7 y6 T! j0 Z* *
n4 b" A& F% Q9 L* @* Function Prototype *
% y6 J) S' J# W! e+ G* *
" h5 W7 j0 z! I6 X' a************************************************************************/. u6 m! p! o( K2 H
. n5 B# b* g# j, o! Pstatic DWORD GetEprocessFromPid ( ULONG PID );& y$ w2 R1 O/ v( \9 R: I- V
static BOOL LocateNtdllEntry ( void );
+ I, G0 D( l, G& q6 Y" r- ?% k- o$ M
, ^. }6 \! {6 e' m3 x, v/************************************************************************) V3 d$ C* W/ m
* *2 t8 G# Q5 A& R8 D# s
* Static Global Var *
" _3 B- U1 N" |4 ?! ?6 `: w% D' k* *' Y) H2 v) s1 O
************************************************************************/
! j. m7 a O V* \1 d; z4 H% y# o$ ~! d0 C3 r5 G
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;
6 n. U# W) w" x" }9 {" u6 ]1 t3 Astatic ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
, v& Z# z4 ]6 H4 _2 I# h) c! r4 O+ S# O5 e+ B
static HMODULE hModule = NULL;
/ M: c& i4 {" `- }/ ?% P, H0 Z/************************************************************************/. a K# ]/ X4 h! T$ Z1 X
U$ c% a+ _# ]# i8 U' S$ H F' E2 Z. P6 }1 k
static DWORD GetEprocessFromPid ( ULONG PID )
/ p: @. c; ~$ B* `/ ~5 J% a{
/ N5 l0 c( K& N1 V/ s$ A: w# MNTSTATUS status;+ c) M8 t- c7 ], y# }+ c
PVOID buf = NULL;* b5 U4 L( e Z) ]+ ~& \
ULONG size = 1;
% k* X* z4 l. ]& aULONG NumOfHandle = 0;, e, k+ E$ p$ s9 b$ F
ULONG i;
6 s# r; [' m6 k% i1 \PSYSTEM_HANDLE_INFORMATION h_info = NULL;
! @" I9 C1 c( |9 Z/ f9 l8 U# W4 k- t) ?* m: w' Y+ c% v( x
for ( size = 1; ; size *= 2 )
/ Q4 o) I" R5 D+ ]3 R2 }{
. c" j& t) Z. U! g. L. N: pif ( NULL == ( buf = calloc( size, 1 ) ) )8 Y- s" @* e1 X9 C* \+ U
{% M5 L& ?9 R7 v+ \. N* W! V7 x8 K
fprintf( stderr, "calloc( %u, 1 ) failed\n", size );$ P( [- S: t! k2 i
goto GetEprocessFromPid_exit;2 {- n: e- c1 N# F
}
) H3 @! B; ?' h6 n2 E! `status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );3 H& N* _6 g9 X& t& D) h
if ( !NT_SUCCESS( status ) ); [6 O3 @7 B$ E Z) O
{6 q* P3 q& q- J$ m
if ( STATUS_INFO_LENGTH_MISMATCH == status )
6 E& w8 ~ p& ` `{% Z7 q& I7 Z% c! O* T. {% {
free( buf );
/ g7 p; B) F5 Z7 f+ N& F8 Z& Bbuf = NULL;
2 ~; I) \* Y5 C& E}$ z8 O7 @3 T" U" h
else! O, s2 n4 b, s( L$ [- N( E
{( V$ L- g! N) A2 p% Y) n6 ~5 ~
printf( "ZwQuerySystemInformation() failed");
D7 e) X5 x u+ @, l0 U+ qgoto GetEprocessFromPid_exit;- q/ Q" H8 t- P% U
}
0 p; _/ X4 K$ _/ e" w}! z. f) _, I: B' y I+ f6 B+ T+ N
else
! v1 \5 m9 k. ~9 z5 X8 N, c; F/ Y{
$ n6 a6 i" R( o: u) gbreak;% ^" l Z) L2 v i8 ]+ b. d
}
. ^5 y1 u5 O% [6 Z& G} /* end of for */
7 |. K/ C! G# _& g# u
3 T* s/ Q" W8 B9 P5 Z! A" p//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组
7 {' k) s6 z; V" f, TNumOfHandle = (ULONG)buf;
# X8 _- F: @7 g: z
; f1 H- y: z& ~0 s3 Dh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);
" Q7 Y- U- R ]/ s( L D, T. n# t$ H0 h7 X
for(i = 0; i {+ r% o6 \6 N5 J9 U/ [+ p6 h
if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )
, o- B/ ]- {) m0 b. K D2 ^, X{1 t6 ?( f: j# h; }
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);
0 |5 [5 B0 p- ?2 Mreturn((DWORD)(h_info.Object));
% @$ u( r" J! u" g1 o}- K6 k) t; c9 d$ o8 M3 f Y1 Q
}/ u2 N5 k* ^: s( m3 `
GetEprocessFromPid_exit:6 }* W8 [. g1 Q; o) g: c& Y
if ( buf != NULL )
- h* E7 u5 Z/ F, y& T" @) R{2 n9 k& M; Q3 R) \$ r2 x
free( buf );
, c9 z6 U3 L& ^; ?8 n& S1 Ubuf = NULL;
$ E ?: b& D' y5 E4 X}
) N3 T& H8 x: Z! t% |* @return(FALSE);
& ]$ N; O$ b9 n- ~; ? B$ ^2 i- o- X}
6 \$ M) G6 O9 V( ^% f! R. V! a6 m) [3 P
9 s3 b) I, ~7 h) D; ~! t4 E9 X0 {
/* o) B7 z- H7 x# S1 D0 z4 a, D' K
* ntdll.dll4 L' D: z- S# ^% M
*/& L; V2 e5 ^8 J. _8 N6 [
static BOOL LocateNtdllEntry ( void )
: F0 p+ ~" i! H% ?9 f0 R6 l5 M* ` m{# @' e4 b. Y/ P: v9 G
BOOL ret = FALSE;% ]) v" l9 ]" ~- D( k
char NTDLL_DLL[] = "ntdll.dll";
: `' U2 z b) S/ U2 f; w9 m% pHMODULE ntdll_dll = NULL;
5 B s* L' V, A/ {' \2 Z
) b A, m& B% C& M; W1 E- k
* i2 X; T) ^7 W* ?" J* cif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )! O: J; x: I3 Q! J7 w+ i' }
{
; k8 v& t/ h# Pprintf( "GetModuleHandle() failed");
! u" n' ~. u% E, P- c7 Hreturn( FALSE );
4 T" d, e* g$ d# B9 T}9 d: f; { E8 x1 z3 _- \
if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )
4 c7 a, O6 w% m, X{
0 ]( H4 U1 i# n1 q/ v9 V1 ogoto LocateNtdllEntry_exit;$ X6 M7 |' f: R" ~/ f# O- x, J# ~
}4 A) k! p0 d% g5 X
ret = TRUE;2 C$ d: e' A( ?/ s
1 r* t1 @8 ~$ j( B9 H; u" ^0 M
LocateNtdllEntry_exit:
4 [5 @+ e8 L' [2 Z# b1 K! U; [0 J% ~ A- S1 o! R( s
if ( FALSE == ret )
+ O) e* G; M Q{
7 t8 H- X( G: z% T6 h9 Kprintf( "GetProcAddress() failed");
5 ]( q' K5 |: D2 y7 V( g0 U; Y}0 a5 e- l/ M+ ^* c
ntdll_dll = NULL;
" Z3 y( {0 {# y- Q0 q( o8 Ireturn( ret );. _, A$ P% M$ o M) n- d
} /* end of LocateNtdllEntry */9 n5 F- F+ ~, L( K9 m- k
3 ~/ i1 }1 C% I S% l
1 R) b: @& r" h1 Q2 F! pint main(int argc,char **argv)/ u. }9 ~5 s% z( @& R3 q) S
{6 L, h) n6 H2 @2 j
M+ D; p9 t! |" A
LocateNtdllEntry( );
$ ?4 `6 ?/ e) E8 `1 @+ {; @
1 |. ], ? c7 Q9 g; E. m' N$ e: B//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为53 N5 R1 {' h7 T$ F* v
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() ); b a8 ?, V" H: m2 \8 b) D: ^, E
_4 ]$ A* R1 J: |: u2 c* g' ]
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );, [+ E- m @# Y* ^
) D. T1 @- q: L! I3 P/ s, V
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);
1 d% F$ O. k9 j. N* p: j7 \7 U A7 f4 m3 W" G; N, l) H" C, J3 E1 N/ h
return TRUE;# n) k) q- R4 Z: D
} |
zan
|