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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:
# Z) m+ ~8 m* {2 d0 y6 d6 O--------------------------------------------------------------------------------
7 v! i' |+ V a0 }/ Q( Q文摘出处:http://www.xfocus.net/articles/200406/706.html
; N& g% }( w! M& E2 S8 U( [( ?* c' X% L4 h+ \; V! L$ V
创建时间:2004-06-01
- R# \4 b. J% b. n' _文章属性:原创: p; f+ O4 B8 W9 h# o% D
文章提交:MustBE (zf35_at_citiz.net). q; s( f7 \) ~6 s4 h" Y# `/ t
8 W3 Y( w$ X+ e/ e9 R7 r
By [I.T.S]SystEm32* ~; B1 p. j& z: l
% d, G$ B+ o; G7 K) T
Welcome to our web site http://itaq.ynpc.com/itsbbs/
" G1 u: G0 P. t* M: G
; p j; I1 `- w% S0 sthanks to SobeIt : P9 E0 E9 f4 T5 ?/ B% q$ r
---------------------------------------------------------------------------------------------
( e, j5 p+ A0 s. G0 m p
2 J( [' r5 l9 y9 e3 E每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.
; j1 w% c; t6 [. g. ?) s0 g* X- C3 X/ A& \
绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
4 F, O, C, |2 m, \6 S
* Y. ^6 m; Y* k8 k" B) vZwQuerySystemInformation函数原形如下" V& o0 J+ m0 G9 u6 B
6 h- s; P( ?5 f6 I! G7 ?NTSYSAPI
8 K# \( D7 l2 w* [' _7 ]' k. zNTSTATUS* q( i9 p3 s$ V
NTAPI$ z2 Z9 n/ N) l/ A0 j
ZwQuerySystemInformation
# P9 v; p; V# F+ `3 D3 q6 @& [9 ]( 3 U b2 h. X" m
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
: |5 j, k) Q1 E3 b+ o2 c3 l9 HIN OUT PVOID SystemInformation,
0 B( s7 \1 v/ A- t, o. VIN ULONG SystemInformationLength,
0 W& ^! K: v4 h' j# W& u( ROUT PULONG ReturnLength OPTIONAL
- q- v8 L) A1 K& t# L9 ~);/ `/ W; W# q# S9 t; a# d1 a
7 z, h; |& u( _6 w" C
参数意义如下
. Y, `/ m$ g2 d6 o! @: j& Y; I1 m: G8 d. R- N5 S
SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
6 d! Z" w. n' n" @
R# f, z$ i- l% o1 hSystemInformation:指向一个接受系统信息的缓冲区的指针
4 K0 x. Y7 k4 O
* O4 ~" w2 G7 f) P" H6 H6 qSystemInformationLength:缓冲区长度
0 r1 X* M$ x. Y' W8 {/ Y! c" R) H! ~7 X/ h2 |" h4 X9 W
ReturnLength:指向一个接受实际返回字节数的变量,可以为0
1 U4 L- j5 R8 Q
# T$ |+ a/ D! B) _1 W9 M3 S
- J# L! I( N% I" Y3 `( V8 t为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation
0 f. `# F' s- n7 ^
" t: p, c6 ~& B3 R) r# M$ @2 vSYSTEM_INFORMATION_CLASS的结构如下
8 F' m# H. r$ s& {, N" G8 Z4 t0 d/ E! X' a- p7 b+ l
typedef struct _SYSTEM_HANDLE_INFORMATION' Q1 p! V6 `% ~% e/ Y$ ^
{
8 A x/ O9 f. ]% a5 sULONG ProcessId;
0 @' A7 X4 w" s% eUCHAR ObjectTypeNumber;
9 k+ |/ P7 O% t0 HUCHAR Flags;: g6 i4 h) J/ V" y2 P, Z
USHORT Handle;2 w1 h) e ^% h7 P, w
PVOID Object;" l+ R, a6 A/ J g) O
ACCESS_MASK GrantedAccess;
/ j" P" z4 R" o& w+ [} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;8 L* v: S. X% S
3 p( e; a6 ^8 C$ k9 l3 W9 K% J/ N
ProcessId:进程标识符 ) G9 h' I) ^) T; w, P. t
6 m! a% }0 J: {0 |- ]* e$ J7 g
ObjectTypeNumber;打开的对象的类型9 ?9 t# m- |( K( ~& [* w
$ Y1 H2 P. h. u7 x& @- ?Flags:句柄属性标志& f* j1 s6 P( a$ T8 f
7 K8 y2 J9 C2 x& B: QHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄3 O) m* T5 l& A7 W
7 f5 _* G* U. E& ~+ E; o% \2 yObject:这个就是句柄对应的EPROCESS的地址% Q7 K) W3 j# c2 A2 v6 K1 i
; F3 r2 E; D* \, y+ K. S# YGrantedAccess:句柄对象的访问权限9 D! L$ h. ?3 @; x$ X
1 H" ?4 \4 v4 T" Q2 P! ~# k
6 F5 D6 v- Y; A" Q/ B' k下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )
+ \* X% o" W; H' R' X/ B+ k5 n' _9 D- M0 ?3 W, }
比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄8 V6 c7 X0 |3 D# ?- K
! w) X" B; B. J% M2 X) |. b) e
怎么会这样?难道程序写错了?*_*! L- d7 J; K" }3 S/ `
+ N/ A# I$ z4 @* M6 L. z/ J4 Q现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出
" }& A) m9 {: A% w' f+ R! L g2 _5 p. ?8 B) _9 Z% i
:proc -o QQ% z& G% r, D1 e+ L: P' H
Process KPEB PID Threads Pri User Time Krnl Time Status; b: t4 i8 b' ^0 q5 m
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready4 I" _2 s% j# e/ }* Z
+ @4 v# P( d3 u& y. |---- Handle Table Information ----
( R# v$ ~' ^! Q$ d
' s* t- I! }. I# z0 r/ GHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
2 O9 a0 O$ Q, x1 D" a
. z0 ]* U- H- m" w0 x! Q- X% QHandle Ob Hdr * Object * Type, i* N# q% o3 T8 s1 L* t
0000 00000000 00000018 ?
, Y1 W t6 b7 |% S0 q8 Y) K# @0004 E2DA5E58 E2DA5E70 Section W9 @+ _3 I4 J
0008 FFAB35C8 FFAB35E0 Event
7 Z- W3 U1 @9 }; O000C FFAB3B08 FFAB3B20 Event
1 _4 F0 j5 F% R" z" }7 Y0010 85C70188 85C701A0 Event
- W: [3 {; t+ M0 ~) t3 k8 d- d0014 81515778 81515790 Directory
! U4 }, F0 S$ Y& ]- E0018 FFAB7BB2 FFAB7BCA ?
2 f- o: W' Z/ D9 g001C 814A1858 814A1870 Directory' {4 M P' S8 }% n$ ]8 K! Z
0020 80288C88 80288CA0 Event2 K# e, p( D, d+ K2 U
0024 E2CFE7F9 E2CFE811 ?
: [6 e/ J, P: y- \5 O" ^: z0028 842D7B08 842D7B20 Event
4 @5 ~0 \8 M5 ]2 r& f3 R& J002C 80E9B989 80E9B9A1 ?
- R9 E$ }' n" M9 y0030 E1372198 E13721B0 Section
* P& Y* ~' J$ } V$ C4 a& d, H. J2 Y0034 814602C0 814602D8 WindowStation
, t+ M# S- T- `+ _$ q0038 81455CE0 81455CF8 Desktop
) ^; t+ Q/ A/ R$ v003C 814602C0 814602D8 WindowStation
( c2 Z1 ]; b/ h0040 E2B3C1A8 E2B3C1C0 Key3 q/ r' v8 L* ~1 U
0044 E286D6E8 E286D700 Key
( ^9 \8 a2 F2 C0 }8 B& {( k6 a" k0048 E2B3C0E8 E2B3C100 Key
0 N$ w2 h, t7 ?4 r' b004C E2B3C068 E2B3C080 Key
6 ?/ H; S* m; m9 q/ l P. g. ~9 s. L( Z0050 E2BEE688 E2BEE6A0 Key
, c2 V' E* B, W, x% t7 }0054 8147C998 8147C9B0 Directory2 _0 H( N; w2 B- i4 H
0058 829D1128 829D1140 Event8 h8 q/ W8 W- m1 s0 O5 X
005C 83F991E8 83F99200 Event) {0 z4 \/ h$ N% u( t, {( x, f
0060 E2BEE608 E2BEE620 Key
" z, Z* }" \5 Y u" b M5 Z! N& V! i* _0064 FFB07568 FFB07580 Event
- L+ R! E$ }6 C9 |- z/ F: L; `0068 801747E8 80174800 Event
# m( Z) B o! v4 J, m006C 80174828 80174840 Event
( k- a1 ?5 U8 q* o4 s' z, v+ N: @0070 845E8808 845E8820 Event, G6 R) k; @% d5 H+ l, A* G2 d
0074 81448798 814487B0 Event$ N( a( [4 L& B' o2 W7 \
0078 E2B9A888 E2B9A8A0 Key6 l: ^" z5 G% _: ]. x' [1 n% _
007C 845E8648 845E8660 Event
% ^+ K( w6 a0 Y0 T( D0080 FF9E2DB8 FF9E2DD0 Mutant
2 |: X |* y. t4 G" d! i5 T0084 FF9E2D58 FF9E2D70 Mutant# B* d- \4 Y! A) r' Z
0088 83CFC378 83CFC390 Mutant7 I! p U( f; D
008C 801749B0 801749C8 File
" Q! n Q7 Z1 O; G/ A0090 E2C48668 E2C48680 Section- j+ p8 f9 u, L' u$ ~
0094 FF965168 FF965180 Event9 ?0 ^7 R8 [' P. F8 f
0098 FF9E7D88 FF9E7DA0 Event" h$ ?1 f3 {, S
009C FFAD3DE8 FFAD3E00 Event6 X F" w4 p1 K+ }0 o( b
00A0 80AD63C8 80AD63E0 Event
: m( ^+ f7 b! Y' _% h00A4 E28073A8 E28073C0 Key
r! a4 w8 ^1 J4 o+ L# I00A8 FF955588 FF9555A0 Thread
# [% w( b9 c# y S$ E00AC E2770728 E2770740 Key* B# @ \! ~3 l- U9 J9 ?
00B0 FF923438 FF923450 Mutant* @4 B, Q# H B3 X3 _7 O# s
00B4 FFAE3B38 FFAE3B50 Mutant2 Q8 I7 U7 n2 l2 E: }6 V! w
00B8 83B80728 83B80740 Event! y1 l5 j L2 K4 C; h
00BC 83B80668 83B80680 Event
/ G* j$ T1 U1 g( N7 j00C0 E2E3C448 E2E3C460 Section
/ H- C% x8 D* a, Q5 P7 L p$ t/ r00C4 83776A08 83776A20 Thread
3 {2 j! J- [0 h4 T* Q, d: T00C8 81489E48 81489E60 Event
$ D6 M/ t( |$ p C7 d4 H. G00CC 83776CC8 83776CE0 Event
0 }' s; b: k- [+ S! {" H2 T; k% p3 @00D0 83776C88 83776CA0 Event" ^7 Z# }1 \! `& }% M
00D4 83776768 83776780 Event# i. g( f* u; u. k% B" k4 s+ B
00D8 E2837D88 E2837DA0 Key% b' v' Z u% l' x- j/ k
00DC 8146B3A8 8146B3C0 Event; P/ h" Y. i* s+ K' j% r6 G+ H. R
00E0 FF908308 FF908320 Event
; u! |7 N3 ]4 F) w00E4 81494868 81494880 Event
: P$ L( F2 a( x/ C00E8 FF9064C8 FF9064E0 Event
4 z$ V9 w, n0 f0 t: p00EC FF908FC8 FF908FE0 Event
; G; S" y' n7 Q8 ~9 C3 e x00F0 FF908F88 FF908FA0 Event
/ t# l1 E4 {0 Z \1 r( R4 T- F00F4 FF955588 FF9555A0 Thread
( h/ u* `8 u l+ o' Z& Y00F8 FF908F48 FF908F60 Event
( R+ V1 A* g' R3 `) }% F5 W/ g00FC E2CB1558 E2CB1570 Port
* }% {$ N h, `( F& P0100 FF90A2C8 FF90A2E0 IoCompletion* `9 L- u7 `0 M) f
0104 E2CFE708 E2CFE720 Port
, h/ V8 N- s2 Q7 v- a0108 FF90A2C8 FF90A2E0 IoCompletion' u( p4 l+ M \/ q! l; `3 a
010C 837762A8 837762C0 Thread$ e' b7 V$ U4 s, E, c. ^
0110 8103BBC8 8103BBE0 Event4 S' e ]3 r# {% r; W* K ]
0114 813DBDB8 813DBDD0 Event0 n' B) t$ p4 M
0118 FF814788 FF8147A0 Event; v, X% D. _2 _3 N1 v& o) K9 L% v
011C E1358DA8 E1358DC0 Key1 x( \8 d: x" i k" M8 F/ S
0120 E2CFC428 E2CFC440 Key8 v0 j, Y% ~! a; M$ c$ V/ C6 ]
0124 8103B9C8 8103B9E0 Event
4 m6 l% ~! D8 `3 l3 r8 u8 s! Y0128 E2C9A968 E2C9A980 Key
4 t8 J. J* R, U# W012C 83B34E88 83B34EA0 Event5 I/ u8 K; }) w
0130 E2CFD948 E2CFD960 Key# T8 {! O: c0 q" l. K3 J
0134 83B34E08 83B34E20 Event
1 q- g$ R# R/ t# g) l....9 k4 _4 z5 Y8 o; S$ E. Z9 V, n
.....................省略
2 k& L* W# v, Y& a; w: G- X6 b* x8 d/ ^( {
看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?2 a- |, I1 K8 a- [' \( i
; V t! ^4 W I4 o想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此
5 u: \8 L0 F p- d' @- }) o Z$ K2 ^. h( \/ _
可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路
1 e& @% l+ {" P
; m$ b! i! V. e4 [& {3 x后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.& Q- x9 A) D% j1 V# |
$ M. ~1 h, x9 f1 C" t
果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS
! b" P0 x5 m O# d7 l, Y: x! t( |6 c1 ]7 I
修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程3 w9 z9 _) o0 `
+ P" [8 E2 _* b9 I#include
; q# J- X2 x1 Z. T( p#include ; |$ L+ _8 e7 H& @
#include
: m8 c3 a. \" f9 C2 I" K#include 5 ^1 P2 s: |4 O F. J& k
# C0 W; G- f% Q" Y- u7 L8 B) e+ }+ A/*
5 M h# T3 f% P6 }1 j" T: I* you''ll find a list of NTSTATUS status codes in the DDK header
$ S' P; p& z. K* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)6 I8 o' y, J: U% i/ Z& |8 X" N$ h- e( X
*/
: [& y: p6 |5 c% Q, e: o5 d) d#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0). `; g% R3 K/ U1 B( N
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
0 A( h: x7 h& B6 z; U#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
( o6 o. F4 T' f) `8 P h! ^- v p# |& x+ `7 G8 f
/*
4 B7 ~' z4 U! O' c, T: G*************************************************************************; {8 r7 T9 i9 N/ I
* ntddk.h& N2 B/ ?8 j3 B7 R# ~' W
*/
, Y8 J5 M6 e& Q) F1 |+ E: V; ]6 a0 Ktypedef LONG NTSTATUS;: z& H, z4 `. o8 E
typedef ULONG ACCESS_MASK;" V9 P' `$ g5 L- d5 I/ z! }
/*. |& B2 \2 T x! V: B+ r
* ntdef.h
( `: x; p! c7 u7 z8 |*************************************************************************
$ E6 B2 e! \1 ]( z' x9 M*/3 a8 `3 H; e, @' D
; H0 J. ^) T5 K+ k, a# g; k* h# s/*
' p$ u6 h3 C3 D* A6 H*************************************************************************7 s1 O! l/ h8 U
* <> - Gary Nebbett
$ B3 z7 K0 {7 g9 w# t1 W*/
$ j8 Z5 a$ D0 P% L9 R+ I4 b/ m/ l9 N; @2 ~8 s, E
typedef enum _SYSTEM_INFORMATION_CLASS
5 E8 W. F2 |& m( `3 k+ Q{
' Z8 A8 R/ g+ |( R6 C. vSystemHandleInformation = 160 C. M- d) r; p+ ?, x3 w
} SYSTEM_INFORMATION_CLASS;. D' g e# V1 D' }6 P5 u$ p
1 j# C7 p5 d$ ?" K, _7 X/*3 M3 s& r6 l, ?5 ?# c
*Information Class 16
( P5 |+ t. i0 o v5 `2 j*/
, \. X. \! Q# [; Atypedef struct _SYSTEM_HANDLE_INFORMATION8 w5 W8 K9 |3 j" W, j; Y
{
; s- |& s7 E2 o3 Z5 ]# u% QULONG ProcessId;( x7 O2 L0 g/ }7 @
UCHAR ObjectTypeNumber;. {+ _0 e9 }* k( t# C$ c
UCHAR Flags;
' @4 F& A( Q% l! ^! b: kUSHORT Handle;
+ R0 x1 j9 i8 L! ~9 LPVOID Object;
* d8 f2 U8 ^7 f! R4 f; s) e0 L( uACCESS_MASK GrantedAccess;
) O- v+ f3 I4 S* ~' E% ?& \} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
' i! c8 f* x0 x- y0 d# X; A* L$ @& 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; }
/ c2 {( N8 ]5 E1 ~0 t1 K1 h. K7 g/*5 L( r% a6 K! E) k
*************************************************************************9 J; T" j) d) D. {+ o
* <> - Gary Nebbett
( @; Y3 G( z1 K% h/ M% g*************************************************************************, Q- Q7 K+ l* T3 A$ q
*/ G/ D6 y! M2 W0 c
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );9 A, n) w% G& Z- F! j8 E) M
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );, y4 i0 c( j/ V" p% h- O9 [. y
/************************************************************************
$ E% | g; u# g% J! y. N/ F* *
4 [1 `! C* W) |: V* Function Prototype *
. A: P$ J/ c: i8 x S! q1 Q) A* *
- Z r& t8 h# a# T/ ~% ~+ R% k************************************************************************/
( f0 [3 P" }7 t8 d" Y: g) m
) u" O3 |1 y. g' Ostatic DWORD GetEprocessFromPid ( ULONG PID );* `4 H: p# o8 F7 b. Q
static BOOL LocateNtdllEntry ( void );2 G3 |/ C. n% D/ h. E; V
. g& v( E, B& n
2 ^4 P- ^" X5 H. y/************************************************************************
2 t2 L" h' f$ A1 k! j- c* *' G5 U8 x6 o+ c/ e7 T! x
* Static Global Var *, K2 K# e% F8 A- d) u
* *1 [2 J& q/ G# K
************************************************************************/* G. {3 }! O' ~- o/ G+ s, y
! q) D J, D; b: j) l
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;3 k3 R k5 y% C& S
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;" ]) W! X& H1 R: x
: o6 N# `8 v9 P5 D% F1 F% E8 n
static HMODULE hModule = NULL;
) ^# S4 {4 F& j( y% P* J' U/************************************************************************/
5 x4 k% e/ k% P! W, N" j
; G7 J$ T% o$ M& U% g! _, Q5 d# k% s) M ?& f
static DWORD GetEprocessFromPid ( ULONG PID )
; v9 o0 X' D, t- h+ b8 n$ i4 ?8 C{
, A. d& x. x1 P: @NTSTATUS status;
, P7 g5 }7 ^, e6 U2 gPVOID buf = NULL;) e4 o$ N3 w% n4 i( r5 v
ULONG size = 1; }) w. _2 v" {: {
ULONG NumOfHandle = 0;' {2 Q; {# n% H ^, ]
ULONG i;% b& G- {. P6 M
PSYSTEM_HANDLE_INFORMATION h_info = NULL; r$ u# M( s* P( [. Y4 X. V
. w2 n* R7 x" F! a/ Zfor ( size = 1; ; size *= 2 )
0 D# {0 w. t0 d{
9 r. g# j0 L$ _' B6 F7 Bif ( NULL == ( buf = calloc( size, 1 ) ) )
9 h) ~* s) y; Z* h{% v/ n- u' B* A" [# [4 z) Y
fprintf( stderr, "calloc( %u, 1 ) failed\n", size );5 n: x# i4 Z# S5 }
goto GetEprocessFromPid_exit;* q& \# D+ a8 t% m
}
! d/ `1 c0 R5 i: `% L5 S2 d. qstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
; z! b V% M5 H" D3 H2 sif ( !NT_SUCCESS( status ) )+ X6 C; C9 O$ B3 n; g2 m
{ z g* G+ S0 k* x) T
if ( STATUS_INFO_LENGTH_MISMATCH == status )& r" \5 p# u3 U, |9 S8 B
{
$ S3 n* M8 c+ @0 L- Bfree( buf );6 }9 {: o; _% n+ r
buf = NULL;
, b/ j% M. S3 A" n9 r# |}8 `# a$ p+ \) b( @
else' p- d0 q! m* }. I5 \3 k; S
{
" k% O I9 ?1 g/ V7 aprintf( "ZwQuerySystemInformation() failed");% E4 ~" ]! R1 b% l
goto GetEprocessFromPid_exit;5 { E" G) u8 n; D" A
}4 b @& j/ w! }! ?3 }; r: e3 l1 e
}
# z4 c, K4 a$ g: H8 Relse8 S L* V3 c4 b) }) H5 F2 \' F
{
S' m x) R1 d$ Q# n; _3 Ubreak;% W& X8 q6 q: X a6 y7 p* ]( }
}; M& A u' y; r0 x$ Q ^8 n
} /* end of for */
! B- T( p/ X! o9 z( ]/ i3 a% H" _2 ]! _$ P( e+ ]0 e$ W0 n
//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组
, W6 a3 G0 s9 _NumOfHandle = (ULONG)buf;
& @- e6 }% A, e9 }* [9 I7 n& J1 v5 p/ N+ n
h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);
! U. ~* K) f, U& ]3 h3 P7 T8 Z6 E
% l. P( E {) S% _# E- {" o3 Cfor(i = 0; i { S: }; D+ ]$ e/ r
if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )
$ U; L2 e7 C. i f5 B( a/ w{. I8 G. V, n# s L
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);
$ U" n: D. S7 w. t6 creturn((DWORD)(h_info.Object));: `1 p+ F: A7 B' Z1 \
}
) u* v# {/ `% n7 t/ R* I/ K} @3 k' Q, ~) y8 Y4 S6 m3 g( T
GetEprocessFromPid_exit:% N! i$ |( k2 _+ \2 l2 d& g
if ( buf != NULL ); n; o% ~- @; m) q, N
{7 p: L! i( C9 ?
free( buf );0 C4 W* x2 n+ b' D7 n! j
buf = NULL;) k6 `0 N& v( k8 \+ w
}" b) V% F3 v y) N, \. U3 s
return(FALSE);' ?1 w/ z) Q! n
}* v" i* t0 i% S" V; G l& N; l
1 L% f# l' V8 H5 n+ P8 P2 s
, _8 z E9 ?$ [/ D/*
$ u3 T* O. V$ [: ^; c( m' \7 a* ntdll.dll
, c5 T1 U0 K7 b4 n. _*/
, P; H7 a* y7 ~# Z3 |3 r) Xstatic BOOL LocateNtdllEntry ( void )
: L' q. `3 f% b' A{6 ?- e( t. |3 C8 L! a
BOOL ret = FALSE;. h7 S- y( N! K% H
char NTDLL_DLL[] = "ntdll.dll";* ~$ M7 n; L6 S- L1 M _
HMODULE ntdll_dll = NULL;
% V) D$ z" i: p5 A; e8 V& B2 Z8 r) \ C
8 H3 }# W) W) \1 U2 ?* ~# b* pif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )6 K+ O) P/ Y0 W+ K3 b7 x5 Y
{2 w1 u6 V$ o- n; k
printf( "GetModuleHandle() failed");
8 w, T1 [7 U+ n) L* Creturn( FALSE );
! x; a* g1 Q: [' C& M: z; K, |6 i}" s( w" h* `& p, J ~* ?
if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )2 k. R8 s6 T7 } \
{& k7 q5 V. N. t; f, l! s; ^+ J* q
goto LocateNtdllEntry_exit;
. z' l) { t$ N}; y- E" n# J4 K' ?% I
ret = TRUE;7 S: _$ V/ Z$ D( Q0 S. s( Q
4 G2 R( ], E3 dLocateNtdllEntry_exit:% f: z3 X; b2 L" M( W9 h( x
8 v1 [7 P% H- Q0 A( `
if ( FALSE == ret )
1 i3 V8 A; A5 q, y' O: [7 V# ^{! x: ]+ j O9 Y. A
printf( "GetProcAddress() failed");
' u4 z2 ?+ y! J2 t! d5 M}( B" U% f9 U) z& a" V' [
ntdll_dll = NULL;8 Q$ y- t/ ]* p/ F1 v
return( ret );
2 `" U* O- f* P r} /* end of LocateNtdllEntry */' F/ v3 h- E) g" R3 @- s! T
5 N* ]+ D3 x$ B8 l1 U9 @# @4 ^
. i$ t, H, {1 @+ Y" dint main(int argc,char **argv)
, n/ ~* V+ d( `. I9 \{6 N! s+ ^7 ]* Y8 k
l8 U- i7 T; \& X1 L) K k) @LocateNtdllEntry( );
& R/ e7 y; a! e7 ^9 B4 m# k9 M) n, e5 {8 e
//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5) t [- A& m0 N- k; q+ K x
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );
1 ^- D# d- N4 `6 x8 G1 f# ]
& T/ |& B1 v+ F7 ~0 J% S" WDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );- F; m* V- b+ I
9 F( n3 _% ?, a8 S/ I( V/ D3 O
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);
/ |) L+ {* f8 n- `2 U
1 H5 o$ H' A V/ s5 }6 ureturn TRUE;
3 i0 b6 l2 j/ c: M} |
zan
|