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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:4 @0 l* N6 H+ `( P8 b3 n
--------------------------------------------------------------------------------
1 b" G+ A- n8 q& q' Q- A文摘出处:http://www.xfocus.net/articles/200406/706.html
5 ~6 ]9 H: G' }& F) r5 b" V% P# z5 k( ^+ _: \. Z6 l! J, }
创建时间:2004-06-01( t4 y4 [* V( X! ~. u8 k7 M
文章属性:原创: S0 P+ b6 G- N) h2 p4 U {- E9 S
文章提交:MustBE (zf35_at_citiz.net)
9 y6 K( l% y; b& z4 v. f! ^( k% G6 ]3 T0 A) a2 V, x
By [I.T.S]SystEm32- J- D; k/ ^+ S5 F1 h
/ G! d$ b0 b7 P L4 {% N2 a R
Welcome to our web site http://itaq.ynpc.com/itsbbs/
" K9 W/ {5 j. H, _6 X1 w/ Y; c% _6 u# u3 ~3 j
thanks to SobeIt : P3 w* m4 I) S; a. Q# ~
---------------------------------------------------------------------------------------------
: r+ Q" f" n! s; t W
: {, [' e& [5 n, e1 M1 Y- }每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.$ H; s" [8 Y4 B5 t
! }5 A8 D1 j8 Y/ U) O5 e绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
! }. y! e9 A' ?& s) _3 n
2 i2 s- @& [! XZwQuerySystemInformation函数原形如下) A i) ]. a# o1 }* P5 ^0 c
8 ?5 R1 Y& L* I2 R" G
NTSYSAPI# f* t, y+ ]- w( u' Y# ~8 G3 _
NTSTATUS" X9 g2 a% P) e, s* Y; E$ J% ?
NTAPI
8 W5 V) G. @. L* k- h, U1 [; TZwQuerySystemInformation. r* {$ Q [3 ?; z9 K2 [
( , t7 z) m1 j, F: J
IN SYSTEM_INFORMATION_CLASS SystemInformationClass, ' Z' X! F/ x# K; u; \; ]/ T% {
IN OUT PVOID SystemInformation, ! e1 d- n- U, O+ G1 C. g
IN ULONG SystemInformationLength, : B6 j, Z, Z" ?5 L6 l1 @
OUT PULONG ReturnLength OPTIONAL , t, e- @: L$ R( t) e ^; R8 G
);: n+ y; ]2 ~0 U+ C, V* i0 b4 C$ Y
" O0 B/ X" g$ Q2 Q
参数意义如下0 b. ]+ [1 o* C7 v1 n$ {$ O8 L
* I I* U& t3 E9 ^0 | G9 BSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一' u5 U6 q# n' I0 K+ V0 F" N5 V# A2 Z/ C
9 i$ Q9 a+ K$ v, d! y4 M
SystemInformation:指向一个接受系统信息的缓冲区的指针
/ O9 Q7 a2 V) v1 f; F+ o9 N
7 v5 `' O0 B3 B' BSystemInformationLength:缓冲区长度" b" B' a6 w# _7 F/ e, q, s3 E) X
3 ]4 ]6 s4 H8 P& \9 b& gReturnLength:指向一个接受实际返回字节数的变量,可以为04 @1 b9 N1 T7 \3 m# T4 z& p; i* H
( f* H& F' Y2 H, A3 s1 }8 I$ e. z+ H0 h
为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation* ?2 j3 X* C- c+ ?( n- o+ E# j
5 ^7 M) m' G9 }
SYSTEM_INFORMATION_CLASS的结构如下
' C5 _# k1 E8 A3 b! D, S" v+ A- i. ?3 K. ~, G9 [ ~' v; m, x
typedef struct _SYSTEM_HANDLE_INFORMATION
6 P) T* @( p) F{
% K3 n& B# _* d6 Q* O: JULONG ProcessId;9 u7 B7 m1 K: \3 `- y' ?
UCHAR ObjectTypeNumber;
! A5 f! h2 Y" I h" H6 j( {5 F( sUCHAR Flags;; l8 i/ }" Q$ r
USHORT Handle;$ |7 Y- I% ?6 z
PVOID Object;
7 D- R* U6 y5 E1 {! UACCESS_MASK GrantedAccess;
2 m* D: v3 ^: _" C8 D} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
; `+ _- o9 z* y
2 j7 z# _9 i6 [ ~1 H D) Z! YProcessId:进程标识符
% D: {- n4 Q# a3 Q1 O" f$ k" ]8 w
- y( E1 C2 S9 t, X* rObjectTypeNumber;打开的对象的类型
" ?, r* z7 T- Q, N6 i' a2 t
- b% _# R6 b" R2 g! k. _Flags:句柄属性标志
7 O% X$ h+ A# X" F
( S5 r5 b" p+ |* o6 QHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄2 H" e& p* H4 K: \7 }
- S' G2 m; ?$ b9 ]/ |
Object:这个就是句柄对应的EPROCESS的地址
0 \; ?2 U( A( A' c2 j6 h6 w/ K, z! [) N( O0 h2 l5 I
GrantedAccess:句柄对象的访问权限' l' ]: z7 P8 T' G. E, N
V$ C0 o; v/ D& L
6 E2 h9 E' X8 [7 ~4 V下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )( z% B( {/ q1 r8 d! o* \
. j1 Z+ C# P* G( a3 l& b. h比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄
5 t8 y g6 w4 P6 a F* r2 ?) ^3 R# W8 W8 ~! o; H0 ~
怎么会这样?难道程序写错了?*_*6 v S8 w( R+ `# ]6 w, @3 _( _
6 o+ r3 c% P4 g现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出4 c! d/ u4 H2 a5 @- ~
# @/ ?1 y5 O+ |( f* g; J4 g; \
:proc -o QQ
7 N1 N8 A0 ^2 `( H* m: g& XProcess KPEB PID Threads Pri User Time Krnl Time Status2 t! c9 W. j7 v
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready6 [( ~: {+ Q9 ]& ~4 A/ |. U' A5 Z
( q& f) Q. p) I% E# u: A2 ?---- Handle Table Information ----
0 }( w" ?# `' o- e% ~) R# o/ I0 v8 k; e" x% ^/ G
Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
0 k- ^- a: Y1 O" T( E7 @
' R# r" o2 G& d$ MHandle Ob Hdr * Object * Type. p7 O- s6 h- _& q3 F, m2 _
0000 00000000 00000018 ?
; c! R1 k+ s, n, h/ j, N2 ]0004 E2DA5E58 E2DA5E70 Section3 P Y) G$ i! e$ u6 l7 R. U: L
0008 FFAB35C8 FFAB35E0 Event
+ ~6 v5 r7 G* ?% }3 ] d000C FFAB3B08 FFAB3B20 Event$ Q# x7 u- ^" ~' R" a$ c; T
0010 85C70188 85C701A0 Event/ L. L/ [5 t& w. m
0014 81515778 81515790 Directory C% r# b9 a6 }; p
0018 FFAB7BB2 FFAB7BCA ?
8 B6 k" s% i: Y$ s5 _001C 814A1858 814A1870 Directory" b+ K3 \) J3 z
0020 80288C88 80288CA0 Event
2 T' l7 W$ X( M0024 E2CFE7F9 E2CFE811 ?
" o) Y1 t" i3 S4 I0 H8 z! Q0028 842D7B08 842D7B20 Event
# D: |5 A5 z! k: _8 x- n* |002C 80E9B989 80E9B9A1 ?/ S! T3 P. {9 f8 F N% b
0030 E1372198 E13721B0 Section. W8 }8 L% u6 d0 D
0034 814602C0 814602D8 WindowStation
7 S# h/ Z4 }4 w& Y) A0038 81455CE0 81455CF8 Desktop
1 P" }& V" H% K3 f003C 814602C0 814602D8 WindowStation$ i2 P# ~3 q9 {7 v! E/ p# B
0040 E2B3C1A8 E2B3C1C0 Key
9 p+ Y9 |, c6 B) `0 S( U5 p0044 E286D6E8 E286D700 Key/ m% B* j$ {2 e2 i7 H) Q# D
0048 E2B3C0E8 E2B3C100 Key3 X4 O+ N6 u2 E9 e) y) h7 j
004C E2B3C068 E2B3C080 Key
: c/ B( n0 e" Z0050 E2BEE688 E2BEE6A0 Key4 [7 e- f3 m* n" b
0054 8147C998 8147C9B0 Directory5 x2 k: [) S- t- g+ ]( \ ^5 A$ K
0058 829D1128 829D1140 Event
7 [' [& O" y$ h( r+ C+ V u005C 83F991E8 83F99200 Event* M* G) _& u% H. N. J8 ~; U
0060 E2BEE608 E2BEE620 Key4 t0 C0 Y; v; p# c% s: B( M
0064 FFB07568 FFB07580 Event! ~. R9 I- r7 {
0068 801747E8 80174800 Event
+ H" S! Q6 y. F* E( S) J" \006C 80174828 80174840 Event
! R% p$ c5 q# t. t" d: x$ D0070 845E8808 845E8820 Event# V! n+ w4 z- m
0074 81448798 814487B0 Event
' ]4 S: O5 V+ m4 H, U' _/ Q0078 E2B9A888 E2B9A8A0 Key* D5 A" W* @6 s, Z
007C 845E8648 845E8660 Event
# f% o2 [+ X$ {" ~/ |0080 FF9E2DB8 FF9E2DD0 Mutant4 J; j* m8 X/ z. N5 ^
0084 FF9E2D58 FF9E2D70 Mutant
+ h- W6 a! S1 |7 }* M h, m' v0088 83CFC378 83CFC390 Mutant+ f* U( }/ M: ]! y: a* v5 \
008C 801749B0 801749C8 File
7 [9 W8 x0 v' v9 L% A0090 E2C48668 E2C48680 Section
1 @! h* u" U1 ]6 A: R$ M& ?3 ]$ R. D0094 FF965168 FF965180 Event! _, _' t/ \, \: X# f3 w
0098 FF9E7D88 FF9E7DA0 Event9 D8 D- ^9 {/ j9 T J
009C FFAD3DE8 FFAD3E00 Event
! A9 m. o I$ J" D7 D D2 i00A0 80AD63C8 80AD63E0 Event
4 m x% f$ o( a- z; |% t' w2 C* B00A4 E28073A8 E28073C0 Key
# @9 h4 a& i+ l9 q7 H) U# M00A8 FF955588 FF9555A0 Thread5 @) m. ]" w# O2 |+ S$ d% h- e' x2 ?/ Y
00AC E2770728 E2770740 Key4 e# ]0 u" `- w- T" j, ~
00B0 FF923438 FF923450 Mutant+ d7 C4 v9 J2 N/ f. ]
00B4 FFAE3B38 FFAE3B50 Mutant
, C8 L# G: u" M$ {) i% a' ]00B8 83B80728 83B80740 Event
5 ]# R8 g3 j* S* y5 L3 F0 R00BC 83B80668 83B80680 Event6 v/ E* b; B8 ^
00C0 E2E3C448 E2E3C460 Section
5 l0 i" R1 f/ n w1 ~8 @' P5 B00C4 83776A08 83776A20 Thread5 l1 D f& L A5 A: e( u
00C8 81489E48 81489E60 Event- I/ N3 I! P7 a
00CC 83776CC8 83776CE0 Event
$ f" m7 w# S; W00D0 83776C88 83776CA0 Event
+ E8 R3 ~' \% i" T p) b00D4 83776768 83776780 Event7 I& p2 a( ~; p6 I- h- R
00D8 E2837D88 E2837DA0 Key0 _7 G+ w) D Q7 _" S' \8 ?" M
00DC 8146B3A8 8146B3C0 Event
; @' W) n9 Y C# d: _$ p% R8 t00E0 FF908308 FF908320 Event3 z$ v" W7 k/ Z/ M" ^( s+ \: P$ {
00E4 81494868 81494880 Event. B `, k$ C9 A8 o: M
00E8 FF9064C8 FF9064E0 Event
8 |. K- k3 X0 J F# ~4 D* n00EC FF908FC8 FF908FE0 Event5 L3 P; o" Q; D7 m+ O' D: _+ P
00F0 FF908F88 FF908FA0 Event
" n6 F. H3 f3 n# D8 W$ T2 a00F4 FF955588 FF9555A0 Thread
5 X* y+ c! z2 } m/ Q00F8 FF908F48 FF908F60 Event: j, i' f W1 k$ t+ r/ z
00FC E2CB1558 E2CB1570 Port1 H- d6 m/ M2 W
0100 FF90A2C8 FF90A2E0 IoCompletion
8 p# `4 Y8 I: J$ [3 O( @' E0104 E2CFE708 E2CFE720 Port- X; d, a& R6 L- [% k9 }3 j$ j$ b
0108 FF90A2C8 FF90A2E0 IoCompletion
0 W0 H! L# U( u- z010C 837762A8 837762C0 Thread
N3 R- u! k9 h% t7 l1 A$ Y0110 8103BBC8 8103BBE0 Event
8 }; b- l! h1 P$ V5 n0114 813DBDB8 813DBDD0 Event: `* n# y1 x; R7 {
0118 FF814788 FF8147A0 Event; A# M4 Q7 S0 J) m; V
011C E1358DA8 E1358DC0 Key
. o+ y& d( p" X1 N T# g: T0120 E2CFC428 E2CFC440 Key" N3 n |7 w4 G; @$ L* `+ I
0124 8103B9C8 8103B9E0 Event2 _' A# W5 |) U
0128 E2C9A968 E2C9A980 Key0 Q2 Q; J1 c; x- z5 p+ |
012C 83B34E88 83B34EA0 Event; f/ J& i9 N9 `. i! {3 {8 l, G7 D
0130 E2CFD948 E2CFD960 Key$ q! D; \2 U) a+ U: Z
0134 83B34E08 83B34E20 Event
! W4 l) _% r0 T....
: V) N5 H: q( s: s! E.....................省略6 @; Y+ k9 q/ Y) p
9 Z6 r: }: q5 B" q) p7 V看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?
( V5 q7 W' c0 m9 ?
6 ?- r8 f5 w0 w1 y$ D/ o; D! Z: C想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此0 [4 o- b( T) _& G# }, G
H) s5 r! r2 H, }
可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路
6 z7 ^) S7 D2 C; E+ x3 {( k# E, z7 b! N4 H" x* t" X" v' G, ]7 y D9 ?
后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.
$ t6 V! {( n) p% }" Q1 x# C: H7 c- z8 @, K
果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS
2 T, J/ N1 e! r6 t( x+ N6 Y$ G
" K0 M8 i. T1 {! s1 t8 Y修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程: B) x2 ]- Q; y6 ]( f- N
- ~$ b% y0 Q6 b
#include
! m3 r x8 D+ }1 q* F6 ]#include 7 N4 D, k6 W n |
#include \ l$ [) a, J0 h3 B
#include , T* P6 j4 ]+ S0 m0 ~0 W
6 v% i" l/ C# U3 }! v2 b* P/*
" P/ m( x0 u* W. [8 I# z; |* you''ll find a list of NTSTATUS status codes in the DDK header0 I* i. ?! C$ l3 ?
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)
7 s8 ^ h: T1 q9 `' V* k*/' @0 O6 Q: m9 a) a- X6 [5 F
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)
6 b& M" n; ^5 c. `& g5 E; g1 \- ^#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)$ M/ o0 X% v7 a, D% C# Z# O
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)" f# P8 g$ _7 S
: K/ q( \9 ]1 E$ E
/*/ S F# T/ J& ^. V; \
*************************************************************************7 W4 D' M" `4 Q
* ntddk.h, L: T9 q9 |$ T c0 v9 x+ _
*/
7 c3 Q3 ~ a- V* p, X/ ^$ E9 b& Ktypedef LONG NTSTATUS;
* B! p# B' d Q5 T% Itypedef ULONG ACCESS_MASK;. T* q& L U3 y5 U+ X5 G
/*
! ?% G- C+ C9 H; ?5 `6 [; O4 f* ntdef.h
, D9 V, h7 [* @9 |*************************************************************************5 v) U7 Q: I8 Z9 n. o
*/
- `( C. b$ ^2 h) e+ _; Q3 |) N$ r1 Q: L( u
/*& C' u+ _0 }& S7 h
*************************************************************************5 O( i% U( b6 a3 p. N k6 e# }: e, i
* <> - Gary Nebbett
2 D" @( I) h$ }; f& y! p. ~1 e*/
$ \# ^& g A% z8 s
" r# ^' A) M8 c) R& B: N: J8 xtypedef enum _SYSTEM_INFORMATION_CLASS+ P. j t$ ?2 Y) ~* p" {
{6 ^# q z9 n7 K8 L! J& R
SystemHandleInformation = 16
4 z/ f6 g: c' r3 [/ W+ Q0 R$ {} SYSTEM_INFORMATION_CLASS;
) y! }" r& p8 h' ~ l L2 l6 a- @' ~
/*
! Z# N7 ?9 R3 o* `6 c8 {2 ^6 b*Information Class 16% P* k. }1 l' q( R% ^- J( Y
*/
@0 M! L; T1 X) Ztypedef struct _SYSTEM_HANDLE_INFORMATION! z6 }$ I( L5 }( `$ T
{& g/ K1 y F5 |: X7 a
ULONG ProcessId;! a% b+ b) ~! A0 @5 @, {
UCHAR ObjectTypeNumber;4 y6 i+ k+ w- [+ O |
UCHAR Flags;
7 O- d$ {/ Z. KUSHORT Handle;
2 z3 A% B5 `- y) N* Z$ |+ \$ nPVOID Object;+ U: A' b- m$ }
ACCESS_MASK GrantedAccess;6 s7 D0 C2 S, a9 F: ?
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;5 X G. g! f% l& k% d
2 P! C5 X. g9 Y
#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 t2 `# }; o# d& k( J. ]8 T C- ~# O
/*
4 V7 L: Q4 Z7 n, _ s% W*************************************************************************- l. Q3 H7 R! C9 j
* <> - Gary Nebbett
( L, s/ {0 k& ?4 K$ |2 o*************************************************************************
* b& W7 w7 R! m1 F; J8 C/ v*/0 L2 [! @( T% u
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );# }0 A. E0 c3 X& z: B, T
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );% _0 z9 R& g* E9 X9 I8 Y
/************************************************************************
6 |4 k- ~4 d6 H+ t( b. F5 e0 L* *( `9 A# M+ N$ p4 `8 P. e
* Function Prototype *; q( g# E3 u: a8 ~; a5 q& P
* *
; Y1 `, v2 V. a% J& t/ F$ G! f* P************************************************************************/
* j& \. h$ G ]! v; ]) S' p) m
9 ]" ?! C2 K/ e1 w5 ]: ~8 Cstatic DWORD GetEprocessFromPid ( ULONG PID );7 A: [9 t$ d- n2 ^" R
static BOOL LocateNtdllEntry ( void );! N8 n* r9 m* ?! f3 G
0 M( [! f" e4 \* [
8 ~" F6 g. k& G* _
/************************************************************************
% T* A" ~% a4 m# Q- d- `( {* *$ d, C- g# ?9 @
* Static Global Var *. K, T2 O7 S: E+ n1 P6 z# C C3 b
* *0 z& q1 Z. x3 n* N7 }- r
************************************************************************/: v* F& u# n4 h) z" o/ e; c
5 ]# S5 e; q% y
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;3 R6 V" L( k8 G2 i# m- _. `, o7 ?4 J/ o
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;8 i9 R1 A, k9 g; H3 M
3 r6 d9 G; B: ?# Z( X; x. E/ l1 ], Dstatic HMODULE hModule = NULL;: Y6 M2 q$ a" c, q4 ~* D
/************************************************************************/- ?, R% \7 t# F& w: H4 l
7 i8 d4 a, w7 A9 \7 K6 E1 v M
- y4 W" O' y) i6 {8 j- F+ V6 h
static DWORD GetEprocessFromPid ( ULONG PID )
m; Y6 n. l0 H3 t4 h6 l# z: c. Q{1 c* u7 L8 [5 ^& |' `. ~
NTSTATUS status;1 l2 A; \, n9 |8 m1 d. U, E* g
PVOID buf = NULL;6 [+ z9 F) v- ?$ Z& x' U9 W
ULONG size = 1;% O$ j" Q. N5 u2 l8 Y" k# z
ULONG NumOfHandle = 0;) v6 o) Z- L( v# i' |0 j1 Z/ I
ULONG i;
) a* D3 L7 S1 P/ A' FPSYSTEM_HANDLE_INFORMATION h_info = NULL;
: c3 F, X" W7 a+ j N$ x2 o! l8 O; k6 F% B' s+ d
for ( size = 1; ; size *= 2 )0 \4 w0 ?( t+ D6 `, i) {
{
* f6 d. M- i( K# g2 ^2 a3 X1 Pif ( NULL == ( buf = calloc( size, 1 ) ) )
- `9 j& e% k% v$ R7 y: M; L{
# Y8 X; ?3 Q; K: jfprintf( stderr, "calloc( %u, 1 ) failed\n", size );4 z* ~- a1 |0 |6 f
goto GetEprocessFromPid_exit;$ n7 i) e$ W* j# H5 g% R. h
}7 f) ? g7 _, U2 t7 L+ G4 W$ S5 O
status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );4 Z$ w2 b2 B- E$ {
if ( !NT_SUCCESS( status ) )
+ n/ ^" ~* N# W6 o+ h{: Z6 Y: Q' m+ S. V
if ( STATUS_INFO_LENGTH_MISMATCH == status )
& }/ W+ I3 g# T: a* W{
$ J. T4 l( p2 p; u; e6 wfree( buf );
& |) o0 H. s/ b# v0 Lbuf = NULL;
* i0 S6 h, q( }}
: v: x7 h- T! N, c+ Eelse" m8 d: @: |3 b# p/ D
{/ E, a( `* }: \
printf( "ZwQuerySystemInformation() failed");
9 K: W ~# n. o3 D+ ?" |. |goto GetEprocessFromPid_exit;: k+ @; O5 h3 B2 f7 l; w0 ?
}
i5 I) N( p9 J: Z% t; N4 h3 D}! A; b! E/ }* k) M+ D
else
, c& A- b- p0 L$ q) V; `{# e3 _+ S) ?3 p/ X; v; I
break;1 U) \$ @1 N: j" u2 K
}
/ s5 s P: t5 ?5 |6 X} /* end of for */
& x# ~( O" I/ j6 d! ?" r7 F
8 K% ?0 c" d+ V* b//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组. x1 V( E. R& v( n$ Y
NumOfHandle = (ULONG)buf;% z3 J2 m1 ]2 Q+ t& A
$ w3 s( {, [1 Y; d" ^4 Dh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);: x8 ?( _5 V6 w8 _, u$ t
+ r9 }# M0 j1 Y$ y
for(i = 0; i {
: E. W& g) Y3 W) ]- \" p- G2 [9 ~* F. nif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )" H$ @% Q# Q5 b2 W
{
, P- q: a$ t; V1 Aprintf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);$ \! W% }, X2 I8 M' o* b
return((DWORD)(h_info.Object));
6 d7 V( b; G2 v0 z}
9 C( y0 z5 k9 ]2 b7 B}
! o' E* p' C' c: q1 AGetEprocessFromPid_exit:% h( Q. ]2 ?- W, n6 |8 X- B
if ( buf != NULL )/ @3 y3 J9 M& A( f
{; X" w/ J# V' L- U B+ v2 R6 @
free( buf );
- @$ b/ a. z a0 g" ubuf = NULL;
( {; d" x2 d( ?}: d/ |* j+ |, K! J$ v' O
return(FALSE);" T; n" b7 @' [ `
}
' R D0 n1 p7 B( R7 z# g
s" {4 ?8 N! q8 J& c9 V# M0 m& D j1 @- u7 C
/*& r3 h' g. c: Y* ^; h8 m
* ntdll.dll
; j2 { g' c- I/ ^6 ~6 f*/
# b6 A% Z' F! {3 h/ i* N; t+ dstatic BOOL LocateNtdllEntry ( void )! B4 g" T- O3 o6 _- S! v
{
7 R- p7 W% S5 W1 I, F$ |. \/ p. b& |BOOL ret = FALSE;
) X0 f9 u) C6 U) a% }7 x8 G: Ychar NTDLL_DLL[] = "ntdll.dll";! k5 b) P w7 W7 [( D0 k
HMODULE ntdll_dll = NULL;' G: z5 K7 } ]% `( \8 m) [/ }
5 _8 {, m' r2 I5 u( c
. b6 U2 S. ?! [' m. W% Qif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
Q% \. k5 X) v{ u$ D; }7 O/ B/ n
printf( "GetModuleHandle() failed");
0 G$ X! A4 F3 _return( FALSE );! T* S% `3 u+ M8 d+ R6 w
}
/ H7 ~, C: H3 a! s$ X3 y" iif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )
. N9 N) Q) p& y4 s; J{0 ?% }2 ~2 p! w K: s; F2 L; w
goto LocateNtdllEntry_exit;8 _' Y6 g* F7 O) d- \
}7 h; M/ T) z9 W
ret = TRUE;* R% _: ~) Z! C
q; K, b" J, K2 T6 i9 ALocateNtdllEntry_exit:! l, F8 W2 L' l
# h! C3 b1 S; @9 \! {' b9 @5 v1 hif ( FALSE == ret )
8 w T5 G/ w) P1 A8 V8 B{
5 `/ f; D- [/ Z8 Aprintf( "GetProcAddress() failed");
0 R% C: D# E0 P}2 {0 `# H" h2 O/ e
ntdll_dll = NULL;
# w6 e3 s6 {& V: w/ y/ w4 N4 nreturn( ret );" Z6 @. _5 P' t+ ?, d& I0 J2 b
} /* end of LocateNtdllEntry */
) V% w+ ?9 S I6 v
( N2 ~; M+ M4 C( o8 T9 G8 P0 K. h
' f5 z% b9 A; r; {! U/ b5 B. m7 a- xint main(int argc,char **argv)4 y0 m/ }7 a* _4 a$ O1 |( P: I1 [+ U
{
0 _1 d3 W: V2 Z* Z; q. b g0 W& X @
LocateNtdllEntry( );6 B/ X/ {: \" A8 b1 g3 t; J! \5 E
% O8 ?9 b4 a0 F//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5! j, V$ }- r! G4 c# f* V; q
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );2 M) ?1 u4 q) P) Q4 ^+ p' R8 _
9 _, n' ^ y# |; m% j# u
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );
& [, F: A6 S; ~) ^/ V* x0 a/ ]& [1 A% y" D2 X# k9 I6 h1 C* t
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); i& s% i9 m5 d! e# g* y. U
3 ~; i) L" `7 a6 L5 u) N, Wreturn TRUE;
9 Y# D* ?2 u$ s' K' Y- ~( Z- u9 ^% m} |
zan
|