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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:
8 w' h; ?* z$ Z+ T--------------------------------------------------------------------------------
& e& ^1 [* u4 `. k2 ^1 j文摘出处:http://www.xfocus.net/articles/200406/706.html
, Y8 q& L; g6 ]2 J" U$ U
s! ^: d; {; M" t创建时间:2004-06-01
* ]; A8 q7 \, {& A7 C文章属性:原创
6 X0 N* x( Y- q+ K( x2 y7 Y. n文章提交:MustBE (zf35_at_citiz.net)
5 e: M2 \* u( [! E6 E7 j: T4 S. I7 P: O$ @+ g' b/ P
By [I.T.S]SystEm32% }7 [& J6 s& E: {" H# B
. f/ D! k$ o3 j. S6 Y7 Q
Welcome to our web site http://itaq.ynpc.com/itsbbs/
9 Z' F+ q: F! R: X* z& v' i/ J% t! P7 I" o
thanks to SobeIt : P
( D6 L' F( Z5 ^' ^0 V" j# h5 g---------------------------------------------------------------------------------------------
: E/ j4 o9 }, j `" o/ u9 b5 R& |5 A
每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.; a1 _8 V$ j/ Z5 @" G7 W2 d5 W
) m- J% k- v& h1 M7 j- A0 W. D绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。3 W6 b7 {% V- U% D7 K5 C R1 q
. Q: u+ `$ J. ]' v' F
ZwQuerySystemInformation函数原形如下* ^) c6 v5 Q) m
( H+ |- {' h1 @# B
NTSYSAPI
: m4 Q; ]' |/ G0 |! Q; Q* b& qNTSTATUS [1 U" q3 X# } g+ x
NTAPI% B. U' B, c& x/ q
ZwQuerySystemInformation7 J7 l7 _( e/ S- ?6 y
(
1 U* e& X I- V, v# |9 |' xIN SYSTEM_INFORMATION_CLASS SystemInformationClass,
9 t3 v3 G' M' R6 {9 eIN OUT PVOID SystemInformation,
8 B! K' b h5 k; O) BIN ULONG SystemInformationLength, : H/ `$ b# N# X- Y9 W! p( x6 N
OUT PULONG ReturnLength OPTIONAL - i& z% V6 m& U
);
# Z# d6 S# T$ E8 K
/ T5 h K7 ^. X2 _2 K参数意义如下
( r! y- H7 b) e6 a9 R! T) _( E. c! J5 h, v P9 @1 w" z- H( P* _/ _
SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
& T5 F/ |% H1 |) i8 ]
$ e& v S& y/ \9 n! @$ i$ B# F4 A" CSystemInformation:指向一个接受系统信息的缓冲区的指针6 j2 p2 G- e( g" }/ V
% L/ J2 {% H3 r1 i1 N! }
SystemInformationLength:缓冲区长度
8 q5 C- B. }, }/ D' `# a: J; _/ o
ReturnLength:指向一个接受实际返回字节数的变量,可以为0# @0 U% r' R: i
& s4 F+ a' p4 a
: x+ q' Y' [, y( R7 y! B为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation
* v: m4 V: Z: J( }8 C2 R$ y& c# g
# Y* v0 m& S$ j9 E! l! K" y1 bSYSTEM_INFORMATION_CLASS的结构如下' y# N, i+ j6 {. z) r. ]
5 [" i/ t0 u9 s" l# o& Ptypedef struct _SYSTEM_HANDLE_INFORMATION
7 u* P) L4 n9 o$ _: S) B% D{# U8 x" s4 ~' O% c. M
ULONG ProcessId;
* D) E& Q7 ?3 h1 V+ C6 [UCHAR ObjectTypeNumber;
# n" z, D( L0 V C$ `UCHAR Flags;0 {2 |$ }( Z/ P! [3 Z( B
USHORT Handle;
# p# D1 r. m3 @PVOID Object;" e8 L; V" Z0 t( h |4 T- c
ACCESS_MASK GrantedAccess;9 _( d) j# m# H1 p
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
- }. d* d' u6 g) w1 F6 Y H) J9 t# `0 o6 x0 r
ProcessId:进程标识符
% ~/ C7 U4 j/ c' F+ \ p' C3 C) B+ t& i! b
ObjectTypeNumber;打开的对象的类型# P) `8 E# n' `) b h
& h. }& U0 ~% D$ r2 KFlags:句柄属性标志0 t" J* n; y* `4 h0 O
7 l5 Q: L, z0 k" v# |: W( t x/ G
Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄
, N: X! W' Q' }0 q T3 m
; p& R( t& t5 O- ]Object:这个就是句柄对应的EPROCESS的地址" E: D/ H _ s& m. W; t
) `- o# M; O8 K# XGrantedAccess:句柄对象的访问权限
: s5 l# {+ x/ W( [8 `! V+ f3 o6 i1 Y/ M3 r
, [6 G5 ]& [7 t4 o; w
下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )
6 E3 B7 a @8 M& u+ g
9 ]2 e- X0 ^1 E& O比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄) x; j Z8 O& `& z
) e# j0 }3 j: Z/ r$ s+ Z
怎么会这样?难道程序写错了?*_*9 ^+ r) ]0 l4 s1 \+ f
$ p6 O7 k8 T3 b1 s& s! }现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出
8 \1 B; V* q5 l9 t" T4 v; m
" [& j4 E H; s2 a7 A8 e:proc -o QQ
% z4 c' f6 c! w0 j; m6 k( tProcess KPEB PID Threads Pri User Time Krnl Time Status. Z: o h9 N4 h+ o b
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready
* Y$ P8 p# {4 M
4 l( S) b0 k9 o& ] N9 s+ m---- Handle Table Information ----
6 c9 K% p2 g/ o; v7 F3 c, k0 G5 ] N
Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 5909 U, Z7 N) w" k' c0 s' d* v
. z* d1 n. o. y; \- uHandle Ob Hdr * Object * Type
& |* I, u* _* A# S0000 00000000 00000018 ?
- f6 T" A5 ~: g( j0004 E2DA5E58 E2DA5E70 Section
6 @ C4 T' }5 y8 B% U E0008 FFAB35C8 FFAB35E0 Event
9 K- B/ A+ {4 x) X/ ]1 f: G% H000C FFAB3B08 FFAB3B20 Event
# ~0 K; H/ ?% \6 y0010 85C70188 85C701A0 Event
5 V+ [# a3 I. }6 {0014 81515778 81515790 Directory5 s; C9 h a V/ ]" `( y' X" V4 v
0018 FFAB7BB2 FFAB7BCA ?) r; ]5 g7 z3 m/ e; C
001C 814A1858 814A1870 Directory7 g) B! ^' g& q( g8 d' s$ s3 G
0020 80288C88 80288CA0 Event
x! |4 h1 b& y: |$ _& p9 x0024 E2CFE7F9 E2CFE811 ?/ a- R# c" u: j5 P- n3 X
0028 842D7B08 842D7B20 Event: v3 N% s- R. ^% M
002C 80E9B989 80E9B9A1 ?
+ @" Q9 r! e! R' F0 g0030 E1372198 E13721B0 Section
+ c% B& p% T9 m& B, e0034 814602C0 814602D8 WindowStation
) J- ^6 N8 S% e% b e: p; i0038 81455CE0 81455CF8 Desktop4 Q/ c7 `3 y' O$ d- T
003C 814602C0 814602D8 WindowStation! t. p% a \; I! k: ?! K9 E& C
0040 E2B3C1A8 E2B3C1C0 Key' F1 M4 A0 [' k) W8 `8 O
0044 E286D6E8 E286D700 Key' j/ i6 B8 F( r+ ~0 ~
0048 E2B3C0E8 E2B3C100 Key) `) Q; r/ C; K' S3 W: Y9 \ V
004C E2B3C068 E2B3C080 Key3 y) `+ r7 [( n1 D( E8 W% k
0050 E2BEE688 E2BEE6A0 Key
5 p: l* P- t1 }5 T, `9 J0054 8147C998 8147C9B0 Directory2 G7 e5 K; }6 Q) d
0058 829D1128 829D1140 Event
3 F- W7 C0 ~) v8 H; u1 Q' u5 ^ E$ n005C 83F991E8 83F99200 Event4 l) O3 A6 S& e& M
0060 E2BEE608 E2BEE620 Key
) T* Y# h9 w: J- M3 @3 v0064 FFB07568 FFB07580 Event
1 W T: b7 y' r3 r0068 801747E8 80174800 Event
$ \0 e. l4 y ]006C 80174828 80174840 Event, w" g0 [( U" Q) N5 ^3 |) V
0070 845E8808 845E8820 Event
* m, ~2 h% Q; d5 R/ w- ?7 z0074 81448798 814487B0 Event
4 \. n7 V2 T" K7 S. R5 a# j0078 E2B9A888 E2B9A8A0 Key9 o9 ^( `6 f6 f/ G6 ]1 i {$ r9 n" Q
007C 845E8648 845E8660 Event
& U, W% g+ D2 p0080 FF9E2DB8 FF9E2DD0 Mutant
, N* z- k/ q3 ] j3 O9 u0084 FF9E2D58 FF9E2D70 Mutant
5 p7 l- G0 h; `; W5 Y9 Z# P0088 83CFC378 83CFC390 Mutant b- X% j. Y: O8 v2 W0 l
008C 801749B0 801749C8 File7 G7 ^0 B0 @5 o h6 n+ d4 J
0090 E2C48668 E2C48680 Section: e" v' t% N) X% b
0094 FF965168 FF965180 Event
/ v- ^# D8 A9 x3 O9 t a# ]0098 FF9E7D88 FF9E7DA0 Event! d: ]2 ]* H& _9 t, b, w- h& F* O! u
009C FFAD3DE8 FFAD3E00 Event
: s) E- l, i' w! Y" y00A0 80AD63C8 80AD63E0 Event
2 G# F5 N7 {7 B( }00A4 E28073A8 E28073C0 Key
$ D- D6 A: N [$ a00A8 FF955588 FF9555A0 Thread {& j$ q7 _2 Z1 |
00AC E2770728 E2770740 Key: p! A: l8 D5 P2 x
00B0 FF923438 FF923450 Mutant( ]5 t9 V, ^; j2 d2 F0 z( c
00B4 FFAE3B38 FFAE3B50 Mutant) F# T( B+ I/ Z+ [
00B8 83B80728 83B80740 Event9 N/ y0 v2 g O' ?
00BC 83B80668 83B80680 Event, m$ i$ a3 Z0 [
00C0 E2E3C448 E2E3C460 Section. v7 d, w8 k3 t' `$ z; p# N4 o
00C4 83776A08 83776A20 Thread
8 ^$ v) \% K9 h' o$ n- e00C8 81489E48 81489E60 Event
# h# n2 g7 d( e0 h* P00CC 83776CC8 83776CE0 Event
+ _2 D$ x# \( @0 }7 p/ T00D0 83776C88 83776CA0 Event' D' e) ~1 M$ P7 F) _, }" z
00D4 83776768 83776780 Event. N9 Z4 M* V3 L7 M
00D8 E2837D88 E2837DA0 Key8 W e* P" b( h5 ^, }7 R
00DC 8146B3A8 8146B3C0 Event* w5 t* {# p9 x' d- m+ [. c' @
00E0 FF908308 FF908320 Event& ^! O6 L* c/ X9 R! o1 ^
00E4 81494868 81494880 Event
) G) w+ a0 X9 R00E8 FF9064C8 FF9064E0 Event+ t8 G3 g7 ?# s9 [! o2 I" r
00EC FF908FC8 FF908FE0 Event
. f7 }* M z$ ^3 h7 W8 H4 s00F0 FF908F88 FF908FA0 Event# k5 K: v1 r4 X+ z6 C& { |# M
00F4 FF955588 FF9555A0 Thread0 _+ {5 w# T' @& t7 z
00F8 FF908F48 FF908F60 Event; L( e1 P {& I
00FC E2CB1558 E2CB1570 Port
$ K5 W* |! y' U& |. H0100 FF90A2C8 FF90A2E0 IoCompletion
% `8 Y+ {5 G& l3 y( [0104 E2CFE708 E2CFE720 Port) ~! I# Z Z! [: A
0108 FF90A2C8 FF90A2E0 IoCompletion) `# u3 I4 d2 F/ n- @
010C 837762A8 837762C0 Thread$ g4 Z9 M% ~- ~+ ~4 Q
0110 8103BBC8 8103BBE0 Event
+ |+ |2 W `0 b' N0114 813DBDB8 813DBDD0 Event4 G4 f1 p* f& w. e) Y
0118 FF814788 FF8147A0 Event) u. G! B$ X% s
011C E1358DA8 E1358DC0 Key) C: n, ^3 o* J: g
0120 E2CFC428 E2CFC440 Key. l3 B, y$ `! _; t
0124 8103B9C8 8103B9E0 Event I* Q' r# w6 Q
0128 E2C9A968 E2C9A980 Key( M/ S0 b; {4 P
012C 83B34E88 83B34EA0 Event" [5 S( }& u2 r+ J" [
0130 E2CFD948 E2CFD960 Key
( k: f% g9 Y( v/ v5 G8 K. I0134 83B34E08 83B34E20 Event2 Z9 T5 E/ Z4 F' {$ |
....
. v4 S/ T& C. @1 I.....................省略
3 H2 s3 d2 t7 r3 q8 U* p4 Z
) a, P: n f+ B0 T. v1 P2 Y& \看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?% Y3 n. G/ F! _
4 J" g4 D0 O% h; C, n9 n想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此8 K. N0 R. ?1 ]! R6 Y3 C! d9 s
' d- q4 C' p* n3 k/ D$ H1 U可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路- [6 N! i1 J @/ F( U; F
' Q8 l& Z1 @& f; I. z
后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.* w! e1 }$ X. H9 C+ F( W. y P
8 P% m# ~2 w) t* Q$ G* h果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS
" t; c( y* j7 ?6 V3 y' p# p4 @! |1 O: p
修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程
' q: h2 p# ~9 [* Y6 W
B/ q' E& k* y#include
! ^5 ]5 C- y" W' p9 v#include
% c* x' f; u! }3 e2 J0 T" G3 y#include + C1 \' r. H) u2 v& @: |5 x3 w+ z
#include
' z: s. Q% h- v, v& F" y3 B6 J& m' X0 h
/*% l5 x7 d- C6 ]1 X4 {
* you''ll find a list of NTSTATUS status codes in the DDK header- \: J7 ~9 q" [1 N4 [! d9 ^" e
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)# g0 H m8 |7 }
*/
: @- V# p4 r, r3 Z. A#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)+ P; o- I- T" l6 L$ f* J8 E2 j, G
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)9 |2 \ O& J# l. w+ O; x( [
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
0 w7 v* `* A4 h. R9 I9 F& V0 @* _6 A k: K% E4 n. ]# l# O
/*
0 Z! `2 O2 p9 v( `6 I*************************************************************************; ]- S. t3 @+ I! t1 r7 N1 l1 b
* ntddk.h; H, j+ Q% Y/ s Y
*/
. O) @2 Y. Q$ u$ z# Vtypedef LONG NTSTATUS;/ G! j+ c' U! Q a
typedef ULONG ACCESS_MASK;
v2 |4 X, M: g/ O/*1 {8 D% H% n5 }0 N. ^$ F
* ntdef.h+ Q3 j$ b* T& f T* R" P
*************************************************************************. _7 o* |- N) Z) ?- n
*/
4 \/ V* }5 y& z, y5 c: |
3 c5 u+ {) N7 R: P' o/*
6 R2 r& t& m* y j0 p) x5 _*************************************************************************8 S2 a! c' h- U
* <> - Gary Nebbett
9 F( b& Q9 ]# j0 X+ F*/
* o" V# Z( S3 S" c& C) {! B3 f2 F5 J
typedef enum _SYSTEM_INFORMATION_CLASS
2 [8 Z$ y" e5 \6 D; I{8 ~; `8 Q# x" P* |2 g' z
SystemHandleInformation = 16- H1 R5 r/ {- A* V3 j$ a
} SYSTEM_INFORMATION_CLASS;
8 ?4 i# H6 V$ u2 N9 J' @
! `( p4 D2 W o% c1 R0 f+ S; O5 f$ @/*
% V6 `1 Z/ c- L( U- w6 n& p*Information Class 168 ~) L( S8 r, f( w
*/
4 |! w' g8 o" F6 l5 J# {typedef struct _SYSTEM_HANDLE_INFORMATION" W) Z) N" {9 z1 M
{0 ?7 j1 _7 K2 A6 z
ULONG ProcessId;; Z) K7 v& s7 n' _- K
UCHAR ObjectTypeNumber;5 l7 t. P, u$ b
UCHAR Flags;
4 @- w# e/ z9 o# k5 G2 E9 {USHORT Handle;
; H X# ?1 P3 y; X W* x7 m1 K! qPVOID Object;
+ h* m- ]) _8 {; p8 a8 pACCESS_MASK GrantedAccess;, z- Q6 ?3 j6 L3 S9 K) y( h* z3 s
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
/ f+ M, ]# f& r! j+ V3 Y2 F1 e( y5 R( }% ^* g- ?
#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; }
9 i$ a) u9 r2 _5 x8 B k6 K) s/*
0 F7 z8 F$ C5 k' G*************************************************************************# \, \8 L s, u" r4 B( j! I
* <> - Gary Nebbett
+ y4 m, y# X# s' V) ~3 T+ c; U*************************************************************************8 ~! x! Z1 N$ y7 I
*/) c! `$ E& J: _4 _1 t e" A. c, n& ~
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );
% h2 {& t9 G e, u4 b9 ~typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );' ^( E: l1 Z* _
/************************************************************************$ b, K6 t: C' j4 [
* *9 x7 i& L) y4 N
* Function Prototype *
q; B3 q! o4 g* *
' ^$ M" g9 m' f) ?% D************************************************************************/
( `9 Z% q& m: `+ t
l0 n$ H$ |8 W2 w, ^. ystatic DWORD GetEprocessFromPid ( ULONG PID );1 s3 C' d1 q; h9 }0 ]
static BOOL LocateNtdllEntry ( void );
/ b+ U! S0 m& P! j; D! ~1 b, B4 T5 N i( @- v1 H6 h, E5 i
6 {2 f' x7 J( I' o0 v
/************************************************************************! [# ?) F# w1 u: y2 i% W8 c) ~- ]* Q L8 K+ |
* *
' @ }0 t( p* z8 H* Static Global Var *
+ @$ J" d! u( z: C7 m, s8 m* *# u2 u2 r. L" b. h
************************************************************************/3 e0 `, w$ d4 H( |/ w$ Y$ k+ O
. S, H9 e+ D% C) y( Gstatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;$ W. c9 s+ r% G" s
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;; U$ q, X) T" }' S+ {. ]- }; [
T& o' [, t% g H8 [+ p* v8 G$ Sstatic HMODULE hModule = NULL;2 b% p/ V9 W+ G6 a& K
/************************************************************************/
( Y! Z5 e; s; ]" y* e3 O3 D
6 Q9 M9 j$ q' V/ F( _# Q
* Q* e. }5 m% h) Wstatic DWORD GetEprocessFromPid ( ULONG PID )
2 r' W3 ?5 k& M+ ~6 l* U{9 d: l: D# p( h; q- A# m, h
NTSTATUS status;
6 M& m* P/ M/ b5 B9 d$ m- RPVOID buf = NULL;$ b' _3 C" _7 D. w. R+ x
ULONG size = 1;
# c( V* u2 s( Z6 B5 f: C/ S' N. _5 kULONG NumOfHandle = 0;3 i' p, T7 Y) K3 `/ R+ p% I
ULONG i;; D8 n4 O, {9 r' \) `
PSYSTEM_HANDLE_INFORMATION h_info = NULL;
& h- C) S' H- v& V; d. d4 g4 s3 a/ [+ G2 F
for ( size = 1; ; size *= 2 )$ [ |+ ]' t8 k2 Q7 E& u3 O! |
{
' i+ k3 c. {. u2 I+ S( [if ( NULL == ( buf = calloc( size, 1 ) ) )
( R6 B, z/ c6 t5 r{
# ~; g+ e, \7 M' ~fprintf( stderr, "calloc( %u, 1 ) failed\n", size );+ }& y/ b% w4 {1 M1 S
goto GetEprocessFromPid_exit;# |( x: P; I% b6 @' R" f
}1 e. o0 m/ v" e! G9 I
status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );) P+ [. ~, V9 Z& F! `' T$ ]
if ( !NT_SUCCESS( status ) )2 `% A' {+ o! O; S( y
{
5 Q* T4 B( x b$ u: B, x- e4 N, {if ( STATUS_INFO_LENGTH_MISMATCH == status )9 K% ~' M( h/ o* x5 H ^$ W
{' |, e# }9 A/ K% X9 x" U
free( buf );$ Y# I7 W" {4 T) _- T
buf = NULL;
$ u m5 c- o/ ~% F- l g}0 C! q0 I F5 G2 X+ T
else
# \$ H c( z5 i* C; Z; z{8 W/ O& ]+ {6 l3 F6 L1 W
printf( "ZwQuerySystemInformation() failed");* E4 G* ]# K J; _4 h+ X2 U( B3 i
goto GetEprocessFromPid_exit;
9 t8 Y! s" @' a- ]6 d' y) ~7 t}" d: S4 D$ e8 m( A6 {) b
}2 Y5 G1 _- a+ F3 u' s) y
else0 c% x: Q, b/ [* R% ^* w
{
. P& ^: Z I4 H+ kbreak;2 E( V8 A1 G! }" e, L
}
/ K I; C) Y5 ~9 N} /* end of for */
: r: f; q/ G- w3 J) r. a5 M# c2 M6 |" [! H
//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组# S1 n$ f3 z6 h0 k- F7 E
NumOfHandle = (ULONG)buf;: R5 b }& ]4 I1 @) \) S, v; p
' z0 K: h1 T! `$ ^# y- i( Q4 V. z
h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);* |6 c. m0 P7 T6 H
, H! u. ^: r7 K9 o) L
for(i = 0; i { O5 h- n. J- k2 _: d5 x; {
if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )
7 V- r# o: [+ R; K{
0 D$ ~/ ~$ {+ _& |. ~printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);
7 y+ J" T" A& R" ` Areturn((DWORD)(h_info.Object));
5 j0 i) |: s% P; b}0 n: J; `% L# K2 o" M& L- p- Z
}
0 }8 R7 f. f% `8 _% uGetEprocessFromPid_exit:
# ~# E* E d) m! {% N' Xif ( buf != NULL ): l# j+ h$ F, r- i) Z; }
{
3 W8 y9 Q- Q7 ]0 Xfree( buf );7 |1 Z7 |1 r# j; h% E$ |$ M
buf = NULL;
$ ]) y6 {7 y( |1 g o& O6 p3 t}
) w2 I/ E: e4 y6 M& @0 Wreturn(FALSE);
' ], }" z5 n# x% t2 c/ r}( [0 e' C' @. o+ L9 B
( K! z2 r3 J7 n0 m2 Z3 y. k$ |
, u, c+ v# a5 O, P
/*
, R5 E- N5 Q5 m# }, G$ R3 \* ntdll.dll9 @. Q3 ?1 n9 Q2 Y
*/5 ?3 `% [- q p( ]% W- R
static BOOL LocateNtdllEntry ( void ); d9 d8 }5 Y) E8 u2 `2 R/ W
{
- E" N: M: f. y+ V7 h: t8 \BOOL ret = FALSE;0 G j2 x# u6 v! T
char NTDLL_DLL[] = "ntdll.dll";
' P: e; D( x R( ^- H3 r4 M E# |HMODULE ntdll_dll = NULL;8 t: F' @$ K6 X: p2 _9 ?
3 e h j! T7 B# d2 o. D) ^/ l" Y6 ^; }
* W/ P7 s: x2 P5 I5 aif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )/ U4 _5 Z, H9 o7 s: J( ?
{( D. t2 ~" }1 z! u) V! A
printf( "GetModuleHandle() failed");
% f9 [; {/ w; c K- H& breturn( FALSE );
( P- `+ s6 s$ t' A2 L l# F9 c0 H k}* d" _0 T. ^" }$ q3 B7 ]8 A
if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) M( K; o( J3 u4 {$ d; x7 b
{* T2 a; f. X+ i: h' v/ n( m
goto LocateNtdllEntry_exit;
9 K; J8 o$ n7 `9 g4 {! `. z}
/ |, X9 J. y3 c+ }- s! v7 F2 |4 yret = TRUE;
3 q. Z8 y! o$ V' W% m
0 `7 Q7 r7 a/ a+ Y6 I" PLocateNtdllEntry_exit:) [2 d/ y7 V6 N) ]8 r6 Y
6 r v- `: x6 e% t/ mif ( FALSE == ret )
& `# e7 T4 X9 a2 g{
: e0 F) G! K$ e$ [% m& lprintf( "GetProcAddress() failed");
- P. s# P7 i, s/ h' }7 x! T}# |/ }( H: k, F( v
ntdll_dll = NULL;6 D" D; s# K" F T& }4 g7 z" P8 l
return( ret );
, z, r! q6 \- s} /* end of LocateNtdllEntry */( b6 I5 b0 _( s! ~
9 F/ W+ Y/ N4 ]. C; L+ z
) ]& L2 Z% m5 \0 P1 M2 D qint main(int argc,char **argv)1 C( p* ?0 U6 N5 y
{
# |5 _6 x. c$ u8 A* _
. B* I+ G1 M x/ y! \3 @LocateNtdllEntry( );$ K, w' `+ y1 z4 `. n! I/ A/ {" L
4 g3 X0 r9 b9 I5 Z//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5. n" h; W; W" |( X/ H9 N7 [( ~
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );& D4 k' ]6 k* v8 c- x6 x4 \" J
0 G0 o6 F! S# g' c! @DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );
0 p3 i5 }" {% H% u) d w( O7 D4 g+ _5 m* E
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);3 l- C/ q* l% X/ H, C6 N
T2 B9 @6 w4 ^4 creturn TRUE;8 i. H0 |* x% c0 Z8 b7 |, n7 G
} |
zan
|