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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:
5 p7 ?- m; Q( F, I! }9 d& T0 z--------------------------------------------------------------------------------
3 H& c7 r! X& V4 \8 T3 J, p文摘出处:http://www.xfocus.net/articles/200406/706.html, a$ t% e) R# S! m% }5 s
) V1 x3 F, m9 r8 X
创建时间:2004-06-01
6 s! f6 B( Y, `2 F文章属性:原创. l% @( C) p; T' f, [
文章提交:MustBE (zf35_at_citiz.net): d3 C* ^+ N# B$ { d& d/ w5 n9 L
0 X3 c- b+ u }/ X& mBy [I.T.S]SystEm32
8 k* ]5 H! t I* U
$ W& z/ P, ]6 {9 X( p5 H. q: ^; R' gWelcome to our web site http://itaq.ynpc.com/itsbbs/* F2 o3 Y1 d7 t g7 k5 E
" ]# w. a7 a" `
thanks to SobeIt : P
# B/ o# d1 L7 T9 V& Y9 i) y! E---------------------------------------------------------------------------------------------& Z/ r; }) ?& w: A) Y
/ v7 q8 l" j& u* K0 m3 e4 Z o, y
每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.3 u% w9 o( y4 x: A9 Z+ p' f! n
: F9 Q1 P% M0 L& u5 Q
绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。4 C/ f0 O+ F- V5 z: I" V* W* n
) e- x( A' N0 g _
ZwQuerySystemInformation函数原形如下
4 I9 V2 {# F$ ?+ l$ B1 P/ V/ |4 C3 Z; P5 o4 _/ {
NTSYSAPI& D9 M, A- P) K3 \( X5 z
NTSTATUS
' N4 E3 C3 c: R, k2 _NTAPI9 n/ k/ I! S8 q
ZwQuerySystemInformation
7 e: A$ E: @) M4 p9 y! f. l(
9 N" E4 \, h, n8 Z% H& YIN SYSTEM_INFORMATION_CLASS SystemInformationClass,
2 y6 H/ X6 g1 n1 O! a }$ q- [% Y+ NIN OUT PVOID SystemInformation,
+ O/ x2 b, c: z8 v, KIN ULONG SystemInformationLength, / D. e5 k f4 x
OUT PULONG ReturnLength OPTIONAL
' @+ u" |' G8 W+ b; ~" O);
3 P4 G* K# l$ U
4 W/ m; o& r& L2 R$ ?+ k7 V参数意义如下
9 o. `, d$ _4 M0 r7 k& o+ o/ v2 p' F% P+ g
SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
( @/ k' R1 {0 g0 z4 o4 K' }$ E5 |
$ \3 [, F9 ]' BSystemInformation:指向一个接受系统信息的缓冲区的指针
+ m& `# ]3 b$ V- {7 E- r2 {8 j7 e5 R& N6 y5 R5 a# d& y" Q# ^
SystemInformationLength:缓冲区长度
( H' u' a. t9 p2 X* O6 _' g+ n1 S, F9 r
) N! m1 s- M( s q" x/ e: l/ ]ReturnLength:指向一个接受实际返回字节数的变量,可以为0# _# g8 P8 @0 o. C$ m
6 `4 A5 ~2 m7 B, g1 |7 |2 w0 \1 o! z6 G0 p) K; a
为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation
8 ~ ^; E3 t0 E4 H0 m- q4 ]' u) [( m: k( C5 B: T
SYSTEM_INFORMATION_CLASS的结构如下7 v6 I: m- N, R, @ U& l" O* M
3 ^5 Q9 t' f$ O y3 d
typedef struct _SYSTEM_HANDLE_INFORMATION) B% W b' m$ m! {
{4 `: M0 V3 Y3 M* E( s! ?
ULONG ProcessId;
, c6 h+ _9 J( s: e% n1 X9 pUCHAR ObjectTypeNumber;
7 x$ h% v6 ?" Z4 L2 CUCHAR Flags;
5 x! D3 i n+ K/ @& e2 C: m- z; v3 {5 xUSHORT Handle;0 |' [, d/ e% ]/ A
PVOID Object;
* _$ P# u$ d7 v! R% L% rACCESS_MASK GrantedAccess;2 F- j/ g/ T+ k! A* R
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
" w! E, u% q* o$ m
; t; l C6 x3 S/ nProcessId:进程标识符 $ Y! C @# |+ }9 v4 f# k- Z' R
* j8 L2 f0 o9 V' i" K7 v6 p
ObjectTypeNumber;打开的对象的类型
6 w- e7 r- z: h/ e* @0 |) o, A7 h; J! G0 m
Flags:句柄属性标志9 s) m% k' Y: h
( t/ ]0 E1 y. K! \9 G1 a
Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄8 y) _3 h0 R* u+ w' T
& O1 J1 C- X) B8 `
Object:这个就是句柄对应的EPROCESS的地址
& V( S4 k1 d/ T! N, S0 G* S1 x. ]: q; `% }
GrantedAccess:句柄对象的访问权限
- @2 C" v; m% O' w& y, C7 y8 \
. q( ^5 X5 J& N( b+ u! f7 i' f6 m$ {9 d3 L" R+ X4 Z6 u' U0 L1 d3 j Q
下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )
" e# L2 w4 U8 G' Y Z. A8 j9 E& W3 L0 J) b! G( U
比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄
2 Q2 }/ s# \- j( M2 |# G8 Q- `$ S2 L3 _( E/ m5 t6 G" D/ [
怎么会这样?难道程序写错了?*_*: q4 m% `7 a; M5 D4 A* E4 x
u P+ F0 ]! Q( X4 t- Y k K
现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出+ {& l; `+ H& ^
) s$ B. d3 ?! G:proc -o QQ. V g6 O0 _$ Y" l) H5 z' Q" C
Process KPEB PID Threads Pri User Time Krnl Time Status* p7 ^1 I" H$ ?* B9 o, [3 m
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready
: A/ b4 _ Z2 c3 ?" v0 n5 Y6 p r' r L X6 H
---- Handle Table Information ----$ a! Z! [2 |" Q
9 d. F2 S* I( P9 d' `# ^
Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 5902 f; k1 ~# Q2 x1 h" ?1 y
3 ?7 j+ J$ k; h4 @# ]0 k
Handle Ob Hdr * Object * Type0 g, l! C# S" S; s+ R2 Y
0000 00000000 00000018 ?; c5 J) L8 P* `% a1 o
0004 E2DA5E58 E2DA5E70 Section
! D, Y- j2 X/ I4 y0008 FFAB35C8 FFAB35E0 Event
S& m+ `/ R0 A! K: I000C FFAB3B08 FFAB3B20 Event, J1 K* H* n' g/ ^, f
0010 85C70188 85C701A0 Event
# E. j. C7 y' y% {0014 81515778 81515790 Directory# v( _. _( o7 w
0018 FFAB7BB2 FFAB7BCA ?& [7 [. Q1 f9 M4 _4 D" s
001C 814A1858 814A1870 Directory
% Q' {( w, ?' C9 o' E! d0020 80288C88 80288CA0 Event
6 L o( ?8 {1 b0024 E2CFE7F9 E2CFE811 ?
# B2 T8 K: s6 U; D1 }7 ~" B5 `0 n1 ~+ y* h0028 842D7B08 842D7B20 Event- E1 ]7 b# a7 w& ~5 t2 q( A
002C 80E9B989 80E9B9A1 ?. b( b v$ h" y4 r! T
0030 E1372198 E13721B0 Section2 {% `* G" `2 L
0034 814602C0 814602D8 WindowStation0 T- i! S, L' t; O; D
0038 81455CE0 81455CF8 Desktop
4 `1 |! f4 W& F* g* D b# \003C 814602C0 814602D8 WindowStation: U4 @. j2 c0 m9 G% Y8 U5 w2 Q
0040 E2B3C1A8 E2B3C1C0 Key
2 [" i! x q5 j r$ H g+ @/ I. A0044 E286D6E8 E286D700 Key
4 I% M; d4 P% \# \! @0048 E2B3C0E8 E2B3C100 Key
$ U! Q5 m% T+ H" F& H; h$ V+ s/ |004C E2B3C068 E2B3C080 Key
' m5 u1 Y! z) ?$ c2 O/ ]' k( S( _0050 E2BEE688 E2BEE6A0 Key7 a( b# K$ W/ _- @1 H
0054 8147C998 8147C9B0 Directory
' a/ R' U5 w6 ^3 T# v0058 829D1128 829D1140 Event
+ Z0 a/ g+ n, N0 M$ [( d U& S) u005C 83F991E8 83F99200 Event: M. l/ k: S( \9 g9 x
0060 E2BEE608 E2BEE620 Key4 v0 t8 c4 S3 \3 Y
0064 FFB07568 FFB07580 Event
6 c4 p: L( B" h# B8 V0068 801747E8 80174800 Event
: c9 \, j* n; R. s }006C 80174828 80174840 Event1 {) w: c- g1 t2 M' C- L1 Z! A5 [
0070 845E8808 845E8820 Event
& c/ y( Q& w" U5 J# T# L0074 81448798 814487B0 Event
4 l) U; ^9 G' T8 g" u0078 E2B9A888 E2B9A8A0 Key
1 O' s% \3 ^& E007C 845E8648 845E8660 Event) ?; O8 W: \1 d( n& L
0080 FF9E2DB8 FF9E2DD0 Mutant: k0 a! ], B7 G, `- y( X( \
0084 FF9E2D58 FF9E2D70 Mutant
8 U* u" {9 b% }* y# l/ H# S* H0088 83CFC378 83CFC390 Mutant4 Q9 S" O# l) u
008C 801749B0 801749C8 File G; e! e( f/ k
0090 E2C48668 E2C48680 Section' Q( ~: y4 F+ `2 F, V) U
0094 FF965168 FF965180 Event7 p0 A* g/ ^. Z
0098 FF9E7D88 FF9E7DA0 Event
v8 F: S7 Z+ ], x+ i" K# a* b009C FFAD3DE8 FFAD3E00 Event0 O7 a) E6 z6 L. W2 X
00A0 80AD63C8 80AD63E0 Event+ b" h( ?! [* J+ r# t% w
00A4 E28073A8 E28073C0 Key J7 m3 k& o1 u4 k! d/ H( R
00A8 FF955588 FF9555A0 Thread
- s0 U+ _" s! ~; o00AC E2770728 E2770740 Key
& _3 u3 e. q: `. j7 ]$ r0 y @4 S00B0 FF923438 FF923450 Mutant
$ {5 L' c5 B; ~$ A8 \00B4 FFAE3B38 FFAE3B50 Mutant
6 [- ]% q. e" u u) O7 }00B8 83B80728 83B80740 Event
b. Q2 E( v1 j" l9 E4 P00BC 83B80668 83B80680 Event
( F9 \) n1 l8 i. k: M5 V00C0 E2E3C448 E2E3C460 Section7 ]1 J- }( \+ j5 k; b# q9 ~
00C4 83776A08 83776A20 Thread
2 I# Z$ N+ t, w* o, s, ]00C8 81489E48 81489E60 Event
9 l# \7 Z3 x( J00CC 83776CC8 83776CE0 Event3 i g' b0 A4 o6 m4 A+ j$ i
00D0 83776C88 83776CA0 Event0 ?5 l# Q v2 x$ a! }
00D4 83776768 83776780 Event
& k. ]6 F8 b8 f& W6 W1 s00D8 E2837D88 E2837DA0 Key
5 ^( A9 c" T/ Y2 x00DC 8146B3A8 8146B3C0 Event
2 H2 R: [+ n' E/ ^% T00E0 FF908308 FF908320 Event; g+ q7 W7 n' [' e0 e
00E4 81494868 81494880 Event4 B# t" K: I$ h- z$ i
00E8 FF9064C8 FF9064E0 Event
?, N# N" q. \* _/ d2 u) d00EC FF908FC8 FF908FE0 Event
# G! C3 Q* w* |00F0 FF908F88 FF908FA0 Event+ r4 ]/ f6 C' L! _) {
00F4 FF955588 FF9555A0 Thread
# b8 W' P% { ] b5 @2 o00F8 FF908F48 FF908F60 Event
# t( \9 c- C8 |; X3 N00FC E2CB1558 E2CB1570 Port
/ z' Y/ M) J/ A! w0100 FF90A2C8 FF90A2E0 IoCompletion
8 `6 z2 ?4 Y. y6 R0104 E2CFE708 E2CFE720 Port7 t% k/ _ {: ]) ?; r
0108 FF90A2C8 FF90A2E0 IoCompletion) Y/ V1 I3 R8 k5 A* K3 d* \$ z2 R# p
010C 837762A8 837762C0 Thread
& p S' L8 Z* [& @0110 8103BBC8 8103BBE0 Event5 C, l/ F6 j0 f% a( X
0114 813DBDB8 813DBDD0 Event
6 F/ Y$ ^# h/ k0118 FF814788 FF8147A0 Event) P; l# k' P7 u0 L
011C E1358DA8 E1358DC0 Key9 |0 N0 b) s6 X4 A b( p: B' ^) J
0120 E2CFC428 E2CFC440 Key
9 h' K0 Z2 b: W7 j- w6 [3 G) T2 K5 r; [0124 8103B9C8 8103B9E0 Event
3 C- n, P, O, s8 x7 d; L0128 E2C9A968 E2C9A980 Key( Z* c' w" d* [6 R% z/ R
012C 83B34E88 83B34EA0 Event
: K5 \& y7 M' E( n/ Z+ ?# ~0130 E2CFD948 E2CFD960 Key# }' ?/ S& T- }
0134 83B34E08 83B34E20 Event
& v+ f5 @+ v, ]" |5 H Z: V" K....
$ A6 f& U- m$ ]/ A/ \* c2 ?3 i.....................省略" \& G+ i& f* C( _
- `6 ~- Z0 p; o% C' a
看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?
/ R1 n- d; R" a3 _& Z; `& A
+ }0 m* Y, N* }$ `5 W+ m* H) P) Q想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此' `6 z* {$ e; C, X9 i, s
) k0 e5 s E7 h. q8 W7 l! w可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路
- h) G( J, x' @1 D7 O! ?; O3 Z, ?0 g6 C
后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. r& p; K! |6 A: `/ U8 l. O
; M4 {6 K* u! u) }9 L9 d8 V% F
果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS% Z5 J; R0 Y- S
9 H6 ?; Y4 W9 x) o- k! R修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程( W+ D6 \( c. F( B0 F% G2 |4 p/ M
+ [0 C' C4 R3 H! K6 D#include : K( E6 w/ O& {9 q- Z; m" A
#include
: p+ q, p0 {( E+ N#include 1 o- W4 [" J* A
#include + e' a r4 A; c
$ ?* F S% F7 Q/ g/*
6 L# F8 E+ F8 M* f1 O* you''ll find a list of NTSTATUS status codes in the DDK header
* l$ l) F N. {6 W* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)% [, g1 m6 F f q
*/- `. q: E) C }' h+ F8 s: \/ R- _/ A
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)$ _$ u; [2 t7 Q
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
% Q* k! c/ `9 A7 }1 Z#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L), J7 E \1 t* `/ c
* _, z: X6 P& M, C/*
0 W" S4 ^4 [4 ?8 j, e4 d) h% i6 {$ Y*************************************************************************
( K/ l- f4 J4 s7 [" a0 D5 a* ntddk.h
! V6 Z+ X2 k4 q1 `*/" r9 Y1 b- }/ f- J X. X- F& \
typedef LONG NTSTATUS;3 x" D$ {2 H1 P: S. A; ^$ ~. L
typedef ULONG ACCESS_MASK;) F" q% a1 p. {! U
/*
$ z P- ]/ @9 W* a4 ?/ c* ntdef.h! O0 p+ l* _! f
*************************************************************************
5 C" h, P0 n# q. \( D*/
1 a5 |% o% B2 v$ S3 r! d
0 h; B# P1 E8 I- k7 {) V* Z3 i* f/ n) g/*
0 \) P: g2 V3 a: r5 U% c1 E; X! W*************************************************************************
% w5 c$ [# Z+ G" }* <> - Gary Nebbett6 H( k6 `# S, |7 n2 O6 q$ X6 r6 p8 [
*/' _4 i; A3 r4 P9 w
+ t" K& r& e8 R( z4 T* P0 Htypedef enum _SYSTEM_INFORMATION_CLASS8 R% |9 E# v6 b" w2 {5 e
{
* D0 Q! S: i: `% b& q, sSystemHandleInformation = 16
+ I, {7 c+ @/ _) g} SYSTEM_INFORMATION_CLASS;
7 E( `/ u1 Y5 ^. f X# u6 |# j+ U4 C$ c. o1 W0 ~* C7 l( V' V Y
/*
& m* v# i+ F) ]3 M! A*Information Class 16
9 M, r! x" D. o: E y% k*/7 d. |% M1 I& B7 @
typedef struct _SYSTEM_HANDLE_INFORMATION7 _5 X& k2 o* z% P+ P
{" Z' Y; ^2 d0 N! G7 N9 I- t
ULONG ProcessId; H: S ? a) h
UCHAR ObjectTypeNumber;4 n* u' O3 @; i; ^ @( X) V
UCHAR Flags;5 _2 Y( b# P3 D9 M
USHORT Handle;
( k" i! y$ B/ j9 K; d- o; k. ?PVOID Object;4 H% E( z; w& ]3 Q( n; K; \
ACCESS_MASK GrantedAccess;
+ Q& {$ R8 X- I} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
" G3 |! _) G) }
9 x6 @4 i8 K' ` V/ j1 N#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; }: |( W) ?, l+ x8 n: @
/*' f. p1 Y) ]& u& W5 E
*************************************************************************
1 W5 k' i+ F& @! o. ` M* <> - Gary Nebbett6 ~6 X+ D* n. A" U0 s6 m: T! x9 C
************************************************************************* ?9 t" F* s! A) ~3 m6 N% \ j! N
*/, }) [( C# E$ z6 R' n6 u
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );% Z; e8 [* e- m" i0 `
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );
- g# e( x) S0 U! k& ~) N* T* ~; m+ b/************************************************************************
1 V" r! O0 b* r) C0 @5 e9 F* *( J. D: I# B- `
* Function Prototype *4 S! ~) S% w9 @' s
* *
8 V+ y. ` O! M/ v$ j************************************************************************/2 ]$ V7 z; p7 H2 Q6 Y, h# G
V" G7 t* w9 u I5 c( d* @; d
static DWORD GetEprocessFromPid ( ULONG PID );5 I1 h8 a4 X: H7 v
static BOOL LocateNtdllEntry ( void );1 Q: I5 k& `7 h5 {# N5 J. E; U
+ J- \; y. x" U9 |4 O* \
: q7 d/ B% }) ~9 y& @4 Q/************************************************************************+ D \$ K2 c) y, L
* *6 q/ I3 G, d0 \; B5 F
* Static Global Var *
?# s5 a& Q- f7 U4 ]* *+ q/ o! X% q! y; p
************************************************************************/3 h8 O5 B8 p2 |3 q1 Z2 w
: C- Y, c. l& x! J2 N5 g, astatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;
) z; b+ b7 h4 A8 ~# c/ U& S4 }static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;7 F s" G4 x, t+ }9 e( {$ c% X
4 V& N( B; o1 O, F2 istatic HMODULE hModule = NULL;) q( v: S2 G% S% X
/************************************************************************/
: N3 X" a/ B9 p% F5 m. g
" D2 h/ ]; G1 ` K* m( ~# [7 f7 C4 A5 H2 ~. H$ K
static DWORD GetEprocessFromPid ( ULONG PID )' C1 g e) d1 |( s" s& ~
{
& W! M% i1 M% S) rNTSTATUS status;
2 C: ]3 l+ @( v9 W; w! kPVOID buf = NULL;
+ X. x5 J$ D, b5 z* SULONG size = 1;+ J6 L( M$ ^( x- @/ B
ULONG NumOfHandle = 0;- u# P/ E* h7 n$ y
ULONG i;9 p5 Q, s( Y. f r5 R$ P& U
PSYSTEM_HANDLE_INFORMATION h_info = NULL;
: H4 R0 v8 |2 ^- R0 T ?# I# f6 `1 c
8 \/ N7 C7 A- L$ [9 k# efor ( size = 1; ; size *= 2 )( Y( D+ B2 w5 h) {# D. y
{+ Y, c0 [9 M3 J5 X, \
if ( NULL == ( buf = calloc( size, 1 ) ) )
, ^0 w+ V$ @+ q{& ~; ] J# t7 ]" l: Y6 x5 b) m
fprintf( stderr, "calloc( %u, 1 ) failed\n", size );) j3 N& y4 U; F, o
goto GetEprocessFromPid_exit;1 z' j8 t% K+ y( X
}
' x; W' R; n: B! U, bstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );9 v1 i( z/ {/ @! Z8 k( b
if ( !NT_SUCCESS( status ) )0 h/ a5 o% X5 X) U1 B1 P
{
* m1 _" a1 j% mif ( STATUS_INFO_LENGTH_MISMATCH == status )
! d( @4 H4 U! H5 A{
- n% V* T5 u2 P( K) x$ dfree( buf );& H F8 ~) A! r
buf = NULL;
1 w$ {+ s) F9 A}
2 |1 K" D2 C) n9 z6 p$ A8 welse
; c( m# o, l1 Q( v{! D0 ^0 j/ \" _/ `# o1 q1 y
printf( "ZwQuerySystemInformation() failed");
7 D0 w7 w* H n0 j8 V& J& [goto GetEprocessFromPid_exit;# x Q/ j6 v0 y' o y
}
0 i2 r8 F3 }) f, n/ k) a( p}
. z' d+ A5 n/ B# @9 h( yelse
3 O4 [& z$ z9 d* K{
' p# G3 K0 r3 e) g& N1 U! N2 abreak;
! R6 a+ [ I6 }9 m3 r}, E( g, y( `( ]7 P
} /* end of for */& R6 r; y$ [- L$ f* h) U
! A2 L9 ~# G, Q$ F' e3 h
//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组0 d7 a+ u" F6 ~
NumOfHandle = (ULONG)buf;
1 g* s! J6 m6 w( G, ?. I6 |
0 ?2 r2 N$ O+ B7 q5 l' kh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);
! g k' t' x- e5 r+ ?1 D+ U# D: t$ `1 Q) h1 j0 z4 Y+ x3 K) ?) j* {
for(i = 0; i {8 g$ S5 Y2 d. M3 Z9 C" Q' F3 q
if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )
" g- ^, F: v5 J. w% z{ n/ P, ~" E1 H. f, `) D
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);" l# d/ R8 G) R
return((DWORD)(h_info.Object));
$ o+ P" T9 y0 g}
3 l- \# t) k3 r6 y+ C# ^}
: H( i5 Z4 `: NGetEprocessFromPid_exit:
1 n. D/ y1 V# u" ?3 v* m6 wif ( buf != NULL )" I& P, R" K* V3 c" C: ?8 ]
{
) m9 A% ]! W; Q4 |; S7 Xfree( buf );
* a [3 k1 L/ J( I1 i& Jbuf = NULL;
: C3 m6 C" O4 c6 i( r}! x* d: ?& ?4 T! B$ ^% s
return(FALSE);5 a0 n1 V3 u; h% K( m( x' x
}
0 c* @+ c' d' v, j* p
& I% v& ~; F) K+ [# G3 s1 i
6 v; x/ L, l: L/*
: u1 F5 i8 W$ v) X7 ?" @( q; o8 B* ntdll.dll
# z' H; ]7 @* U S' Z*/* j+ z' u+ O$ U* B1 `8 \$ B
static BOOL LocateNtdllEntry ( void )
" N( z- i2 S0 K/ g% j2 d' [# U. t{
) q4 v/ @/ A$ s* W! ?BOOL ret = FALSE;
8 x3 ^4 N2 _$ U! a+ v- ]char NTDLL_DLL[] = "ntdll.dll";( {! ?& v( }% {" O
HMODULE ntdll_dll = NULL;
3 X+ B; x( I T1 _& y( H( ]/ w! a$ S0 x
0 r( g. W1 i6 S& I1 E2 |- iif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
9 ?- a( D" K" x{; i! q( ]: r5 y" L7 p
printf( "GetModuleHandle() failed");
& Z* `$ i3 A$ N3 {" oreturn( FALSE );" r& v9 m2 {; A, {) |6 z
}* C4 g% U, K: g6 f y% J7 C; i1 p7 X
if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )
7 a+ V7 i7 [, e( O' G, F6 F0 U% _{% ?; ]+ T. V0 X2 U2 E, c
goto LocateNtdllEntry_exit;
% t. k$ U' g# O1 B0 u0 c}
C, T% Z( C1 v% u! a) m% O- Y# aret = TRUE;6 Z$ @, u& L$ O1 d
V# X$ F: O2 B1 _ H7 S4 cLocateNtdllEntry_exit:# p) ?. Q; Q! _
9 V- V/ S+ `; J' qif ( FALSE == ret )+ I- X; I' C6 i7 S S6 g0 x8 A
{
' k+ U2 l5 M6 x. L5 ]; w( Cprintf( "GetProcAddress() failed");- d, o. j3 w6 Q d" C. c
}$ S. j% D# V7 ^6 D7 K
ntdll_dll = NULL;
5 F2 [9 A q9 d" t6 H* ]5 Breturn( ret );2 W- W8 u- p8 n* |4 x# V8 e1 Y
} /* end of LocateNtdllEntry */0 u2 t; J5 y; k; U' M
: ?+ L0 z7 z; A
8 E( v7 _0 Y& F+ f0 Q% p6 ~int main(int argc,char **argv)
, p" }) |+ F- J, |$ q u{
; L; A& P+ Y: J
9 u" R; d) ~/ Q& o6 yLocateNtdllEntry( );$ u4 _# B$ e c+ g
; v$ Y R. l6 ]1 }7 z" I
//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5
9 j# X% |6 Y( A/ O+ J4 pOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );3 J6 F7 t* `8 C+ I- f
6 {) @( f' s4 Y2 t ]DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); [+ ~1 n$ o- i! R
- y& f9 k4 ~- ]0 S" T9 a
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);: M2 L* s! L7 h. Y
8 C) T5 S4 W3 Qreturn TRUE;
5 A- A" o {* e; O) B} |
zan
|