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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:8 D. ^" u! H6 O8 _, w
--------------------------------------------------------------------------------
6 y% i# S* K8 G# k文摘出处:http://www.xfocus.net/articles/200406/706.html% E* M8 d9 C# ^2 h( E4 {! \
3 k9 B+ T4 F B1 ]' S& Z创建时间:2004-06-01
3 [- D% f( e( n$ n( q文章属性:原创
& @ J) Q( _) z$ H* k& P文章提交:MustBE (zf35_at_citiz.net)
; O& r0 B( C8 Q& c* @7 s/ O: n `& Y7 U
By [I.T.S]SystEm32
( L/ U' x k! B9 m8 w: f6 N, i8 ~6 \
. v8 }/ P; z6 @8 J O$ ]Welcome to our web site http://itaq.ynpc.com/itsbbs/0 R/ t5 J0 L" N$ j. q
: O$ r. @3 A1 n8 e7 E
thanks to SobeIt : P
/ o1 d/ H: [( Y---------------------------------------------------------------------------------------------8 p9 A9 p& B# S6 ^1 x
; A! G5 |5 j: E每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.1 M' z- j5 r+ M3 K
# G& k0 S4 a/ d) K7 E绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
# e+ X" `. u$ J) X$ }9 Q
; g' q' j, B# K8 w- t. ^ZwQuerySystemInformation函数原形如下
+ B" G& ^. l7 D) M, i' \& Q3 Z. G
NTSYSAPI2 c m x( I5 r% u" c, d! M/ H5 ?
NTSTATUS
8 J) x# h, g0 `& T' T) { cNTAPI. W, Z5 a# m# W s8 B ~
ZwQuerySystemInformation/ i) d$ V" q# U! T! a# z8 Q& K6 S
(
5 j: g C, _3 [: SIN SYSTEM_INFORMATION_CLASS SystemInformationClass, ' ~! d4 @) Z" l7 {
IN OUT PVOID SystemInformation, 4 S( ?/ a" A" O, _+ b5 F1 d
IN ULONG SystemInformationLength,
2 x1 I% U, f5 JOUT PULONG ReturnLength OPTIONAL ( _- B- g+ m* e7 B* j5 x* D
);7 ]4 m" F1 w' m1 X7 {7 H
" `; H3 ?" M0 B1 y7 U( K4 z参数意义如下6 o, I. g) w' F: A
# a9 e: x' x$ n; M L& sSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一5 b3 U- y( P# Y# v9 x5 l" H
7 ~- j$ ^) {+ i; W/ }3 ?SystemInformation:指向一个接受系统信息的缓冲区的指针2 Y& z; f. F5 J# g# S7 G; x* `4 B
2 Z5 l+ o2 o3 j7 Z1 _3 }5 U+ r) K
SystemInformationLength:缓冲区长度6 {. }, }" f) O* r! ~! k, b( L
0 {6 K r% n7 H, L: B I: i& Y# A
ReturnLength:指向一个接受实际返回字节数的变量,可以为0. J( q8 r: l3 G- V
5 K$ y- y9 p" x n- Q! O
! p( Y6 ~- u) i% J% Z
为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation6 s) [$ f, H+ M6 G5 r: g% X- U6 k8 p0 q
' D4 s* g% I( I, H6 HSYSTEM_INFORMATION_CLASS的结构如下
* T8 B8 r2 t: `4 u# i* O
0 b2 {/ z$ @, `- ~) h' @typedef struct _SYSTEM_HANDLE_INFORMATION
. D! i0 I+ I2 `% Q{( v: Z& T: g$ x& k# z/ x! r
ULONG ProcessId;
8 ~8 ?! c C4 y. ZUCHAR ObjectTypeNumber;
t+ x1 ?4 z: n/ hUCHAR Flags;0 L4 X: P* A! A K$ l! y
USHORT Handle;
( k) K. g& K0 z2 l. w; v: T, ]PVOID Object;
0 O3 [! c. X( N; d* l6 x( vACCESS_MASK GrantedAccess;5 |. c2 l" u* o6 b- B: ?
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;) ~* ^( V7 A# G* d( d6 t) ]7 O7 H* S$ h
: }1 @' i1 m. p# n
ProcessId:进程标识符 $ X( J& } ~! x6 b/ v& F
7 ?! x' M; ^) D9 \* B# y
ObjectTypeNumber;打开的对象的类型
% E8 A) n2 z+ _" N
0 f* y+ f/ C4 `+ H3 f8 UFlags:句柄属性标志
) S. d1 b+ {2 Y# Z" N% g/ l/ N; M4 c& U6 \/ }! o2 Z+ f% j; B$ n
Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄2 e" ^* Y" R4 C
( e4 B: z% ?& _5 m- J$ zObject:这个就是句柄对应的EPROCESS的地址
3 X% Y: v7 u9 q$ H4 ]2 W6 _9 ~: d( y, k2 N# z5 ~4 }
GrantedAccess:句柄对象的访问权限- \4 b6 J7 T. J: @
' F) t! S5 Z/ E) k7 N
3 E2 O" Q: n, i6 M+ O4 T( W; Z下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )
4 G5 ~, y+ ^; ^ B2 _0 K5 ~" J0 u W: ?3 g/ a( ~8 p
比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄: n2 W6 \% K1 U% U C
( H9 d4 s! n V& ^4 b, g
怎么会这样?难道程序写错了?*_*
; q+ i, q' d2 L0 N2 d; Y
9 Z( j+ K+ o# f/ K: @6 A r现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出1 D; j A9 R' @$ l2 K
S( A L( R m) J; U:proc -o QQ
: U6 `1 n* K, [' wProcess KPEB PID Threads Pri User Time Krnl Time Status
8 q# h, q) ], D6 X2 EQQ 827CD520 11C 2A 8 00000B90 000008D4 Ready% Q0 \/ s, l$ E- j! ^7 L
4 a% s+ ~8 m% ~& w---- Handle Table Information ----
8 z- n0 r3 i5 m& |! y8 }$ j
v% x4 I- P; r# |$ a% HHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
. n- S2 V$ W& e2 x/ s t( Y+ b
! F- R+ T7 L, s4 S- N1 rHandle Ob Hdr * Object * Type& ` S0 K5 o1 X/ w# B
0000 00000000 00000018 ?
( _# U9 l) Z! S' d0004 E2DA5E58 E2DA5E70 Section
8 W5 m! F! |! \8 O( E `; q0008 FFAB35C8 FFAB35E0 Event: u9 z3 ^1 J$ Y( j N2 W
000C FFAB3B08 FFAB3B20 Event& K) h2 i0 v7 W& k
0010 85C70188 85C701A0 Event# x, W. [! e9 v8 }6 F/ T5 D
0014 81515778 81515790 Directory
* W6 R" s# y3 P/ Q( s R0018 FFAB7BB2 FFAB7BCA ?# L+ q6 s! [8 H @; V, A0 d" r
001C 814A1858 814A1870 Directory# b1 c* H, k4 T8 }+ J, @" x
0020 80288C88 80288CA0 Event! \$ [' r( j8 R$ Y5 Y* H9 m
0024 E2CFE7F9 E2CFE811 ?8 a, U ^( S4 f/ G0 C7 T1 c, W
0028 842D7B08 842D7B20 Event0 C9 N$ Y. g' H) @6 j7 N
002C 80E9B989 80E9B9A1 ?% i, N3 h* {( ^) T& a! g" p
0030 E1372198 E13721B0 Section$ u2 {2 x# b; V x# `
0034 814602C0 814602D8 WindowStation6 W. b# y* N$ J) q6 v+ Y' H; ^8 O
0038 81455CE0 81455CF8 Desktop2 c% U2 t& q6 c! a6 `9 O9 P
003C 814602C0 814602D8 WindowStation
* q" Q( b( |4 P. k, [3 H0040 E2B3C1A8 E2B3C1C0 Key2 J4 D( s# u; L; ^9 \. B( G
0044 E286D6E8 E286D700 Key0 Y9 l/ Y* ]* ~& ~. b/ B9 J* ?& ^; D3 r
0048 E2B3C0E8 E2B3C100 Key
+ ?% E X9 C% ?7 B- S r004C E2B3C068 E2B3C080 Key) T# Q2 e0 ?5 w% h& g
0050 E2BEE688 E2BEE6A0 Key
* s9 {, e* N6 u; ^% G X2 ]3 `# c0054 8147C998 8147C9B0 Directory4 ~8 T3 k( M4 [% `1 H3 E& ?% \( ~
0058 829D1128 829D1140 Event; _' @2 h5 k% _" Q$ f3 L- d
005C 83F991E8 83F99200 Event2 R! U; B8 Q' L2 t w5 P: Q E
0060 E2BEE608 E2BEE620 Key
- c% [2 n% b- p1 q' E5 q0064 FFB07568 FFB07580 Event. `% Z2 D: ^6 t5 N
0068 801747E8 80174800 Event
4 j% e" Y# | L' Q( t+ k006C 80174828 80174840 Event$ c+ _% q, D4 h2 F
0070 845E8808 845E8820 Event
9 q$ y: V$ U9 d. e5 _. Y7 U0074 81448798 814487B0 Event: @$ c, s; ]9 Q5 `4 q1 N; @1 ~/ l
0078 E2B9A888 E2B9A8A0 Key
2 A( u8 a, [$ b1 Z5 u1 H) ^ n2 u q2 @007C 845E8648 845E8660 Event
6 H! O4 H$ m9 C% O; `4 n0080 FF9E2DB8 FF9E2DD0 Mutant6 Y7 i9 m* ?) O: `2 J) m
0084 FF9E2D58 FF9E2D70 Mutant
# S$ n5 @5 D A- d9 X0088 83CFC378 83CFC390 Mutant
; t1 u+ r3 J0 {1 I008C 801749B0 801749C8 File: S4 F: u: p8 @( g
0090 E2C48668 E2C48680 Section
& T7 {0 t' G+ I4 }! H. w0 ?0094 FF965168 FF965180 Event
; s/ \0 T, R' A/ N$ T2 Y1 o- z0098 FF9E7D88 FF9E7DA0 Event
4 h5 b$ C9 R1 B% ~009C FFAD3DE8 FFAD3E00 Event0 O0 r. m" k; _$ J; v
00A0 80AD63C8 80AD63E0 Event
. i: E/ d! M/ `% J- j6 m4 o00A4 E28073A8 E28073C0 Key
! o2 @/ Q9 `- Y; Z% v! r- @00A8 FF955588 FF9555A0 Thread. R& v( ~4 `+ s8 v' K
00AC E2770728 E2770740 Key
" A/ S% Q9 _7 {0 g: ]( P, m00B0 FF923438 FF923450 Mutant# }$ V0 P5 R) S- B4 F% e
00B4 FFAE3B38 FFAE3B50 Mutant- N! q# W) G0 D2 b
00B8 83B80728 83B80740 Event
6 J7 j C0 E5 N+ o9 |4 o, n: k00BC 83B80668 83B80680 Event
0 k+ K- }2 ?' ^9 H6 D0 w00C0 E2E3C448 E2E3C460 Section+ Y5 m0 m) z' L) i2 u* [& T
00C4 83776A08 83776A20 Thread6 G/ A- A! M0 \
00C8 81489E48 81489E60 Event
. `2 O, d# T6 K0 w00CC 83776CC8 83776CE0 Event
9 A% [3 J; u/ l# R2 q+ [# q/ i4 e00D0 83776C88 83776CA0 Event
0 Z# p$ `$ B- N00D4 83776768 83776780 Event3 ^: _5 h' u5 E2 g
00D8 E2837D88 E2837DA0 Key( } |$ O3 C7 Y {! C8 n
00DC 8146B3A8 8146B3C0 Event( z8 t' O& C1 e8 R2 t7 T
00E0 FF908308 FF908320 Event
" M* T5 o8 u# P& y00E4 81494868 81494880 Event. Z+ N7 R+ R5 e0 O+ E# e* K
00E8 FF9064C8 FF9064E0 Event
0 Q5 ?" O7 m* \+ Y, K. k: ]00EC FF908FC8 FF908FE0 Event
, O6 K! ], Z0 F9 `2 z* u# O00F0 FF908F88 FF908FA0 Event9 B+ s+ p+ }! G1 T( k
00F4 FF955588 FF9555A0 Thread3 W& _& L: v: s* z
00F8 FF908F48 FF908F60 Event% `8 r% p% x. n
00FC E2CB1558 E2CB1570 Port$ Q2 C& p$ c# }' Y, @
0100 FF90A2C8 FF90A2E0 IoCompletion
9 {0 Q D2 d8 I7 U0104 E2CFE708 E2CFE720 Port
; n+ p0 a T5 I0108 FF90A2C8 FF90A2E0 IoCompletion
& L/ S" q1 ^0 b010C 837762A8 837762C0 Thread
; E" g" J' K2 `0110 8103BBC8 8103BBE0 Event5 P/ S* t0 C! ^) F3 H! c" i! N1 z
0114 813DBDB8 813DBDD0 Event
7 k; `. }, a9 s/ Z0118 FF814788 FF8147A0 Event! h- z# A+ V7 x- i2 r- e
011C E1358DA8 E1358DC0 Key
# W' ]2 }, l1 c1 h" L% x0120 E2CFC428 E2CFC440 Key h6 `. X% j" e6 O& w9 g, u, j
0124 8103B9C8 8103B9E0 Event
3 O9 ?! f* y' j6 D! }0128 E2C9A968 E2C9A980 Key
5 Q8 z3 C+ D9 I* r3 q- v012C 83B34E88 83B34EA0 Event
5 F% F. x9 L' J5 d6 b2 H0130 E2CFD948 E2CFD960 Key: t! l/ o: j2 e6 R& f9 D1 t
0134 83B34E08 83B34E20 Event/ O, v% M/ ]. y. c; `
....
}2 C7 k$ Z4 Q# w.....................省略
0 q" b. ~% `2 Z$ `* @8 ]7 T! b1 Y: w" X% Y
看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?, K; c! E7 Q: t ~+ ?5 e3 O: V6 \
$ L2 e2 k1 @6 I: `1 Y- r想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此7 E3 L: K1 f4 G, D9 x/ [$ f
% W7 t6 u+ ^/ @6 {, E可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路0 U8 A0 f/ [2 F
. |; A7 Z2 i7 T. j后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.
5 W/ W* w. w3 J# e$ V' B: o2 N1 G: n' H$ V
果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS2 |* T( y# f+ v5 c
5 M* ^% W5 |7 d* j5 r! s% N修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程
1 H$ |# [. H+ O- B1 e- Y3 C D- A2 O2 n" p q; l0 @2 S1 p
#include 9 U) ~6 `% g" ?; M! d x
#include
8 {7 l" \" b! J1 e& P6 S#include
& L# Q, l7 n2 V2 j$ e3 r& d: b#include " Y+ _+ V1 |0 J
! r) L# @/ g. D6 H- N* Y* T. I1 @
/*
* c2 P) d3 J+ r7 o* you''ll find a list of NTSTATUS status codes in the DDK header* H3 r, u7 c q4 h: m; r: [
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)$ y9 n7 b- h7 S' Y9 ^
*/5 M: r8 V$ U( Z, r$ v9 n, h
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)
' A1 b" ^$ h* S7 \#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
f8 p) r* m4 e& m$ o! g#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
% z& p, e# a6 h, a1 t( G, V, l8 t. C4 { W( t- N U
/*
0 K2 B9 h. x4 D) i*************************************************************************
: D6 M5 E% z& N; F# X* f* ntddk.h9 n2 l t" ~. }8 W! w& L2 |+ J( x
*/
4 T) M& H4 U' F: ~$ t3 ^3 }typedef LONG NTSTATUS;7 |4 q9 S* _1 G- ~4 r$ W' y% Y, X
typedef ULONG ACCESS_MASK;+ @% K) w5 M5 s" o
/*% \" F: l5 t( k) c- K
* ntdef.h
8 O/ D5 u+ W8 S& d$ p************************************************************************* ~, P2 U9 e* v/ p
*/; O% Y" F' z, `$ j9 z. Q# N2 T
9 H2 D( _$ u+ C6 |
/*: k( e! ^8 l: B5 c4 f2 ]
*************************************************************************' h/ o" o. v8 X4 n9 E. C+ l
* <> - Gary Nebbett9 q X8 y, {8 V2 [# {5 R, X( s; w
*/2 _1 D$ P8 e# {; r a! s
* i0 w. E/ _3 i5 q2 _5 ^( Y3 Stypedef enum _SYSTEM_INFORMATION_CLASS* k, F1 F" j1 e6 e: T% j2 b' t
{
$ O* O; I9 p& B3 y j- c/ Y" cSystemHandleInformation = 16; }2 L' M7 w8 @9 a; U9 b8 p
} SYSTEM_INFORMATION_CLASS;' B5 r7 l9 h% G8 S4 _9 g0 ]+ K
+ a6 h6 k: h, U& V/ ~3 N# i
/*
! F% n3 k3 X, G: q5 `*Information Class 162 Q F- }3 w/ w. h1 e/ I4 ?* L
*/0 Q: U# c/ N' v g
typedef struct _SYSTEM_HANDLE_INFORMATION
& n5 `) P4 f7 z/ L0 S{5 @/ S! z3 q8 j1 ` K# d
ULONG ProcessId;) C% c8 X7 B+ k1 q7 @( H j
UCHAR ObjectTypeNumber;+ m1 H/ w+ o; B6 e, v5 i' o
UCHAR Flags;4 i# n# U! t) T( E0 p
USHORT Handle;
+ I+ H/ ]9 m0 i" ?PVOID Object;
& [" X8 `6 U6 J o4 u% hACCESS_MASK GrantedAccess;
# W8 V9 d, z' S$ S} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;( P. Y& K5 L. ?8 m7 X5 `* j
6 k* h' u! U1 U) ^, H, `, {
#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; }
/ M. H' z' ?; j: u9 W. p/*5 `7 S$ b$ w* t4 U/ I$ K: H
*************************************************************************4 R3 U- V; N: {7 \. z
* <> - Gary Nebbett' e, o2 X6 G! S# J
*************************************************************************
2 I7 \% Z% }* S5 \*/8 Y5 |9 J1 y" q/ ]& E
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );
7 S, N V2 \. }! ^typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );
, |3 h& M7 ]- T# W/************************************************************************
* ~% `/ w0 s# i* {. V* *$ l+ s7 q! `$ v: F+ G+ O0 N0 b
* Function Prototype *8 Q0 Z h! @; |0 b1 t8 @0 m
* *
8 k9 q7 G! k N- p4 R* g( f3 O ^4 s************************************************************************/% |4 G1 {8 t* j8 U2 W7 l
. u- L J# P/ C8 w ~2 w$ p. ?$ V
static DWORD GetEprocessFromPid ( ULONG PID );% V. `/ X/ v, ^( \, k' r) f
static BOOL LocateNtdllEntry ( void );, l; @: H) Z- b! T& N
5 n2 c; b! X/ r( K
7 ~2 d! C: x: |% C- j- L
/************************************************************************
# g+ z: {$ O4 W$ o* D* *
* E" C) D" ]" B% n; Z- Y1 V* Static Global Var *# L( t* |0 m7 E8 K
* *' T* J y- x1 f+ F* Y) H
************************************************************************/( Q4 d- D$ O# D+ M; p# ], @
6 D* C, }1 c& d: R5 a$ @+ \
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;# L4 ^7 f- H i8 E
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;: {) I, z, m3 x- ]
6 W9 ~) c* W) Z5 i) Y" f3 |static HMODULE hModule = NULL;. N8 d% {! ]1 L. e
/************************************************************************/
! J( o3 _* k/ ~9 W
# n' F1 Y' H4 K
) X2 w" g$ r$ I, ^static DWORD GetEprocessFromPid ( ULONG PID )/ V; ~% T: S9 b) @* j0 d
{+ q# Q) I1 e5 y( H) G4 w5 g" f! N/ d
NTSTATUS status;4 ^4 [# K8 `# f! V. E$ h" {
PVOID buf = NULL;! i+ l; X9 X" g, Z9 m& N2 b% [
ULONG size = 1;6 ?; R% o% w: q2 e! n" g; e( ^, S
ULONG NumOfHandle = 0;9 o) o- J$ d2 E: Y' d* d1 v
ULONG i;6 O( ]" [, n3 W
PSYSTEM_HANDLE_INFORMATION h_info = NULL;3 g8 P: T# ]* q8 f, T
4 G* {# `- ]) Q! V5 ofor ( size = 1; ; size *= 2 )! {! Y. u, W# ?* F
{; L" B" v8 S/ Z+ b E% a
if ( NULL == ( buf = calloc( size, 1 ) ) )
9 d4 N& t- x( \2 |. j+ C7 k{: p4 @1 f: w9 l! |0 W, ^5 w
fprintf( stderr, "calloc( %u, 1 ) failed\n", size );/ `; k; P2 o8 e+ O' H6 n
goto GetEprocessFromPid_exit;
! l4 u" P) t: {' R* A) I}
/ b/ `; Q/ J3 w' D Ustatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
Y- J9 S. ] @# M4 b& Q2 W: T/ Rif ( !NT_SUCCESS( status ) )
: x% c5 z+ ]2 _6 {8 h8 k! z5 t{' N; {' M5 |/ u! ^1 ]: J% }4 ?7 j+ I
if ( STATUS_INFO_LENGTH_MISMATCH == status )
# s$ u. h" w$ v# }! f2 E/ u{
. v8 }+ [/ K3 G- @6 j: x6 l' _free( buf );3 |$ `' ?7 b- a4 e; p
buf = NULL;
' v5 L# R1 [8 D0 S$ N; |}
: m9 T; z) H/ J& p# ^9 V3 d/ ~else
: s* e3 Q$ `# V" V9 U0 @- s{
f6 u3 _% o0 p0 Q* m! Gprintf( "ZwQuerySystemInformation() failed");: S" B/ a& W" }! L9 W: k9 [( ]
goto GetEprocessFromPid_exit;, T5 [# t3 j# F8 d
}$ M5 G0 ?; S# }: _! p" @0 Q3 p, n
}' q; @% c3 x8 G$ m, f9 ~
else
& R, ~" y v0 J: N+ p3 Y{
" ~, ]0 Q; s9 ?5 @# `break;# `* o/ j$ e: Z* y* v8 ?/ o
}0 N0 w& ]2 b' _6 _
} /* end of for */
5 k* T1 b; k8 Z' i4 m! c7 s( F- R# C
//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组
7 l ?2 r N5 N4 j5 j cNumOfHandle = (ULONG)buf;
/ P" F" u6 ` ~* f. `8 k# C
9 V: R% I9 ^' p& T: | ih_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);: t0 u( ]. ]6 d* W# O1 c$ i$ k0 r
2 i1 ]( M1 z/ }1 Q$ e3 g, O
for(i = 0; i {; Q% A( x2 d b/ V* M
if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )
7 L( ? m3 O/ t+ [+ k+ U5 b# a{+ A3 i% e. s5 m' m& J
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);/ t$ `& y7 C, E/ M5 l8 t
return((DWORD)(h_info.Object));
* V9 p" E! I2 ?}* b+ M2 e( w" S% s4 I# _% ?4 J
}
% o+ |/ _/ J( `" LGetEprocessFromPid_exit:
+ |7 u4 ~) F7 y v# Jif ( buf != NULL )+ N. L% M$ M% G3 Q4 e+ u
{9 y: X+ r% G8 ]0 b" G
free( buf );8 o+ t9 D7 H3 l Z& M# @2 ^3 S. r, V
buf = NULL;
) H1 H) X6 w/ p" z}
; o3 u: l" W' V" p$ M: \$ kreturn(FALSE);2 M% B6 `6 B' A) [. x3 d
}
/ X; N1 g; R1 n! x: r( I
+ j) o/ M- B1 r5 @' I: F+ j4 X8 B- a" z
/*2 X$ V: w( W5 W8 k7 J' ]
* ntdll.dll3 i6 ^& Y: m5 H3 ~7 d% X3 k
*/
$ a) ~% r# |1 I+ estatic BOOL LocateNtdllEntry ( void ) d7 i" Z$ A2 L/ x
{
' h+ F7 b: k& K; X0 ^BOOL ret = FALSE;
S6 n$ `4 R8 u' Hchar NTDLL_DLL[] = "ntdll.dll";. u {. o$ d3 B1 b& e7 F
HMODULE ntdll_dll = NULL;
6 N( @/ W) ]' v. K7 L7 W* K0 X' ?$ k. L/ n5 c: _. m3 C
- x0 b. w9 R) g. q- Sif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
8 O* q$ A8 s: [4 g{
- Z) V$ Z% z2 }' P. Yprintf( "GetModuleHandle() failed");
& f. i% B% u7 Y8 }: W4 C, s1 A/ y Dreturn( FALSE );
6 l$ ]6 ]8 N+ c6 F) ?& |* x5 Z}
" q8 {' U2 F1 |: S0 ]if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )
F! o5 r$ z9 T# R; ~: o9 D, Y5 |{. n: v1 k& O7 r3 z- @4 s
goto LocateNtdllEntry_exit;
) Y+ q5 O4 R, c! [: g}
) F! J, y; P: N4 \0 @: a3 l2 H" V- Xret = TRUE;9 D+ C5 V' |" z, R U
7 ]& u$ Q' ^/ w% {, {2 aLocateNtdllEntry_exit:. n6 _' J8 {! v% z, E
* c3 Z+ ^" c2 _! y+ M- A
if ( FALSE == ret )
w5 h' L8 r5 R2 P& Q{% F# V9 t1 f( R' O
printf( "GetProcAddress() failed");+ @; o8 b& P5 Y1 x q
}6 I/ I6 \* x! x- S% t9 {
ntdll_dll = NULL;
9 t' ~$ U, B" s/ e4 B# dreturn( ret );' a+ O* v8 g$ i1 u0 r/ V! a
} /* end of LocateNtdllEntry */
; e& n! u8 } s( }8 x* R2 b2 X$ ]0 t- B* r8 C0 q7 u2 n
+ _8 e4 O; O- e9 Z8 F& J0 r
int main(int argc,char **argv)# j7 e2 q5 G" R Q! T
{
. I8 D5 L% t0 V3 E n3 X, H# k7 [/ G
LocateNtdllEntry( );" _% i8 N+ F- X$ m
% A6 J$ D7 n# e' X1 F8 n0 Q//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5
9 z2 a; q$ v/ I8 iOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );6 j& p9 L9 j$ v _4 u
9 f3 d$ p* M) p% r5 j: y
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );% J2 p2 w1 F! z0 A. N3 q
* _/ |" F5 z/ L5 W6 ^3 E
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);
) v+ t+ `7 |! F: d% o# D
) U2 `& _ I0 S! Hreturn TRUE;! N& g: O( ^; D s8 Z1 G
} |
zan
|