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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:- Q" S# X2 T& P9 [* w4 U- c
--------------------------------------------------------------------------------
& I9 _! B9 G) {! o文摘出处:http://www.xfocus.net/articles/200406/706.html
$ I& i! H T5 Q( r& c
/ u: r6 s/ k( L( L, j) ?3 {创建时间:2004-06-01& e+ x6 b2 u% u7 t
文章属性:原创" h# K9 A3 F g$ d+ h
文章提交:MustBE (zf35_at_citiz.net). H8 E) g m9 v/ w2 y- C
( }5 t9 ] b* o+ p- X* B$ ~
By [I.T.S]SystEm32; W6 ~" h2 k4 j$ D
* L. `2 O( E5 o0 sWelcome to our web site http://itaq.ynpc.com/itsbbs/
4 J$ e5 _% }% R' O" h: {" h2 W d" q# a' ]8 ]. f+ k
thanks to SobeIt : P/ G7 K0 k" ~; h9 F% Z5 u8 }
---------------------------------------------------------------------------------------------
9 d3 \. P6 x& d- w& b+ v8 W# ~
( K- c7 Z1 R5 B7 }$ E* u2 ~每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.5 G+ V' I. w; n1 m. |. Z
5 I2 z* i# y) s% V6 e7 r
绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。1 `# o" D+ q$ d
! b; q" N4 J; m4 \% q
ZwQuerySystemInformation函数原形如下
; l) |4 p& m- u* I
# Y$ B3 x- s- s# T# cNTSYSAPI0 y v4 l+ ]/ _. Y
NTSTATUS
6 D: J; `+ r1 G. z$ R$ SNTAPI
0 Y, b c( m( V; {( QZwQuerySystemInformation
% s8 W# r3 f T) M: g4 x* J(
4 u. o) m1 L# aIN SYSTEM_INFORMATION_CLASS SystemInformationClass, # c# M4 I% }$ H: f/ m4 t- y+ @+ F
IN OUT PVOID SystemInformation,
$ A, \7 O. T: P2 eIN ULONG SystemInformationLength, " g* a: S" [. U; q6 e8 I
OUT PULONG ReturnLength OPTIONAL
' l* E& }7 [7 P4 X# F9 ^);
) D6 X7 b. V" L1 D" B
( s& Z* I/ e# d3 [参数意义如下
9 O+ @, s" O7 V/ J3 |' p: w8 [
; E. x( a) R6 S4 Z6 e! ~SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
' }! Q8 F8 ^* H6 h9 i: H' |, X) ]3 ~5 |" ?
SystemInformation:指向一个接受系统信息的缓冲区的指针$ K N! e- o" |3 |
! Y6 y# s- {& J" X7 D, P; Q4 f
SystemInformationLength:缓冲区长度' Z& R) l0 }) C1 o7 C( h! A+ x
3 X4 r) @0 w3 e- HReturnLength:指向一个接受实际返回字节数的变量,可以为0
$ N2 \# R- G% W' b( n& n
" T, Q1 J( ^1 r8 v: s1 W% X, M) `1 J* N% I3 _% }
为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation
% ]# @0 d1 K( C& M; c7 }
% M$ s; ^! U2 y# O3 g* S% ^SYSTEM_INFORMATION_CLASS的结构如下8 F: i4 Z* ~0 }- _9 F( y. J8 \
5 U/ |% u" J: T) otypedef struct _SYSTEM_HANDLE_INFORMATION
* h9 o( c- V3 O6 A{3 I s, t K$ w" E% V
ULONG ProcessId;
" u& x# D* |( s2 R* C$ g; oUCHAR ObjectTypeNumber;
6 s( M% i! A, S1 {; f4 Q( L) OUCHAR Flags;
8 F; d4 N6 W" V( z2 }USHORT Handle;
: P* p; Q. D; \" i1 w5 KPVOID Object;# }/ U! z5 ~: a( |" w: N6 V
ACCESS_MASK GrantedAccess;5 I5 ^( K4 m1 I' E# U5 W
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
, W6 @% f& b# `! t9 P7 V. f+ q
& ^* [: |* c6 \* W6 U9 lProcessId:进程标识符 ' f: D! B: f" u8 T9 t J5 l I
8 d% T+ g; c* r' B8 Q7 D4 c6 [% f$ P
ObjectTypeNumber;打开的对象的类型
1 x$ L: Q9 C& t1 |( a! k4 Q" X' M
* `5 M. h" ^5 u1 E# A; y! ~" R7 HFlags:句柄属性标志0 K8 n2 W4 q" j( c0 t
/ i* J' H \- _6 I: B
Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄4 O8 o( b) m# n5 {( b" L1 v% |
" L5 \' \1 }# ~4 Z s) E. ^Object:这个就是句柄对应的EPROCESS的地址
E; r U' @! z q8 V# t' B" n$ e' c
$ H0 K; T3 ~) OGrantedAccess:句柄对象的访问权限. L+ k/ \, y+ ~4 _* Q) B( |
5 Z8 n1 v( F5 J/ N: Q
i; R" N( j6 ~ R- X8 C, J
下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )" m: Q* @8 N3 o' B% J
2 L% q9 ?6 Q! x/ \比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄! @ q; V. g. P9 ]
3 y' p2 G, K! f" _8 X+ y" r( E+ |怎么会这样?难道程序写错了?*_*& t( q# l- ^4 W( _: C7 g
; f( Z$ E2 x( {7 Q J& L+ l. U
现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出2 f, ]) M" P, p$ [3 r
/ ^% F2 c6 Q/ {5 M:proc -o QQ
. {; t% ]1 U+ Z% c8 RProcess KPEB PID Threads Pri User Time Krnl Time Status; n! H7 y; ]. \ G, M
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready
5 T8 p: E+ X' W: r
. A4 z- I6 A) r3 r( d W---- Handle Table Information ----2 i& G* o7 g2 C$ _ v( L# R
% P/ E* v* b) P7 h0 XHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
& ?* R: z9 N& T$ U9 ^+ M+ ^/ _! v% B: `+ b) q# D" z2 s
Handle Ob Hdr * Object * Type
5 `$ S" a, W4 V7 j0000 00000000 00000018 ?
; |6 `8 |$ @* _! ^" Y) V8 O0004 E2DA5E58 E2DA5E70 Section( o9 Z8 a- W, b* W4 d8 B# n
0008 FFAB35C8 FFAB35E0 Event
1 i1 v# Y3 u( S' q: H3 ]000C FFAB3B08 FFAB3B20 Event$ g8 L2 r x/ [5 H- S5 W
0010 85C70188 85C701A0 Event
# g% ?" f/ S6 Z! c& T0014 81515778 81515790 Directory3 ?: {1 y9 q5 r4 r+ K
0018 FFAB7BB2 FFAB7BCA ?
* |/ ^# C* s4 \) X: d8 p) l001C 814A1858 814A1870 Directory# t6 [( c9 \3 d' g' j, v }$ @
0020 80288C88 80288CA0 Event
' D5 P# `' {" _3 k+ q! O1 X; t0024 E2CFE7F9 E2CFE811 ?1 M2 Y1 V0 W# }) ]$ X
0028 842D7B08 842D7B20 Event; k! X0 Y9 D0 F* p; L: g/ @ e! K
002C 80E9B989 80E9B9A1 ?
]( M" v3 z5 I9 s* ^% C% D" ?0030 E1372198 E13721B0 Section
7 ? L' b; r; W/ f- L y2 h0034 814602C0 814602D8 WindowStation
4 {. D) c- I( c# a% L1 ?1 C, K1 ^4 q0038 81455CE0 81455CF8 Desktop$ }$ G4 ]% @7 \/ m
003C 814602C0 814602D8 WindowStation
* U7 F% x- P: ~ E& @0040 E2B3C1A8 E2B3C1C0 Key, a8 p; @- T; a0 ~ i% S
0044 E286D6E8 E286D700 Key
9 G. s! |4 Z- n' P2 K0048 E2B3C0E8 E2B3C100 Key- [& w+ S6 ~% y% T2 I) j/ s" F$ l& r/ b) X
004C E2B3C068 E2B3C080 Key$ W4 P# L+ T% Z
0050 E2BEE688 E2BEE6A0 Key0 s1 U) q* i/ @; h: K2 Z0 w
0054 8147C998 8147C9B0 Directory0 a7 ]' w+ B" |: S% o6 n
0058 829D1128 829D1140 Event* U+ ?4 m; d: w) e8 B) h
005C 83F991E8 83F99200 Event+ j0 Z" P1 v+ \: c, ]- {8 J' c
0060 E2BEE608 E2BEE620 Key
5 @: O+ U% g3 {0 s+ Z0064 FFB07568 FFB07580 Event% A3 Q6 _8 n7 r0 V4 v5 w0 k& {4 A4 W
0068 801747E8 80174800 Event
5 f$ S5 L5 ~& S006C 80174828 80174840 Event
& _0 `$ e+ P. |2 ?1 Y5 t0070 845E8808 845E8820 Event/ p% c; U4 v' S! c B
0074 81448798 814487B0 Event
: y3 E" G* u8 Z9 v" N0078 E2B9A888 E2B9A8A0 Key: C- x* P# S& \$ G- B5 ]4 Z0 y
007C 845E8648 845E8660 Event& @. c/ ?1 `' R" d
0080 FF9E2DB8 FF9E2DD0 Mutant$ y6 m& | x5 J& y# P4 E& u' V
0084 FF9E2D58 FF9E2D70 Mutant
5 _5 r& q( H8 U9 P; @: z0088 83CFC378 83CFC390 Mutant
; I( Y* e! w7 v6 ~* b O/ X/ B3 ?008C 801749B0 801749C8 File& U& y3 ~/ T# k- @6 R4 ^
0090 E2C48668 E2C48680 Section
9 Z p s5 V# L& h% ` d5 s0094 FF965168 FF965180 Event
: \. q6 H5 C9 U; z4 k* Y9 k1 U0098 FF9E7D88 FF9E7DA0 Event3 M( S8 U! ]* O
009C FFAD3DE8 FFAD3E00 Event
8 W4 q! A1 O1 b9 o9 o( H. Y* _ X00A0 80AD63C8 80AD63E0 Event/ v" t7 r1 j$ B$ O
00A4 E28073A8 E28073C0 Key
- ?/ G, E, f2 J6 V* c00A8 FF955588 FF9555A0 Thread
& W) @2 F% e5 T; |- }00AC E2770728 E2770740 Key, K; I# d+ M' x- g- a) K
00B0 FF923438 FF923450 Mutant
$ O. a" U4 e, Z( R9 O( C00B4 FFAE3B38 FFAE3B50 Mutant# k4 a/ o0 g! c) ^) o
00B8 83B80728 83B80740 Event0 i7 S- z# K% g3 c5 y3 h: _( ?
00BC 83B80668 83B80680 Event
( J, W- N# z# | L. r8 H$ b00C0 E2E3C448 E2E3C460 Section
- L1 I- Z z, t. ~, U$ P- {00C4 83776A08 83776A20 Thread
& u1 [: c" f7 `8 _, F00C8 81489E48 81489E60 Event
5 Y$ C8 t4 D, m1 Z, c9 O. _00CC 83776CC8 83776CE0 Event
$ }8 F( t* n% a6 T0 F00D0 83776C88 83776CA0 Event- z. {% t) j" v' E- m
00D4 83776768 83776780 Event
m) j- z' Q% K, O# P. t3 w$ W00D8 E2837D88 E2837DA0 Key
& q, M! t9 [/ S E6 q" x% Z00DC 8146B3A8 8146B3C0 Event' k0 S3 P' @: [6 b$ G
00E0 FF908308 FF908320 Event
2 h8 Z$ D$ y$ T3 x00E4 81494868 81494880 Event
/ Z: W' w$ T$ K00E8 FF9064C8 FF9064E0 Event
2 _$ K7 |, j5 H4 V- b& ?: V. I# B00EC FF908FC8 FF908FE0 Event7 W0 W' ]! y5 ^! e( U& C
00F0 FF908F88 FF908FA0 Event
; D7 O7 P4 e% F6 @( Q00F4 FF955588 FF9555A0 Thread
0 t/ C7 E- G+ X0 I+ R00F8 FF908F48 FF908F60 Event
) ~2 q3 z# A% J5 y00FC E2CB1558 E2CB1570 Port
' d0 s5 Y8 Q5 X* _0100 FF90A2C8 FF90A2E0 IoCompletion/ R, f4 q$ y8 v* M1 u
0104 E2CFE708 E2CFE720 Port* ~$ \: ~ V4 X/ v) ~" Y _
0108 FF90A2C8 FF90A2E0 IoCompletion/ t+ b/ Y& ~( b
010C 837762A8 837762C0 Thread
. ?7 _, L2 A- a/ _1 t- x. }* R: Z0110 8103BBC8 8103BBE0 Event
$ J; j( q4 T! Y0114 813DBDB8 813DBDD0 Event
# N4 E" N8 G0 P. @0118 FF814788 FF8147A0 Event
6 A& E# }5 U$ X. ~. s# }6 x5 L% Y011C E1358DA8 E1358DC0 Key" C8 C$ O4 s. p6 `' e$ H0 x: H/ Q
0120 E2CFC428 E2CFC440 Key% Y4 ^% W. U+ S. L9 F( X
0124 8103B9C8 8103B9E0 Event
5 F+ z8 e9 u, U9 m0128 E2C9A968 E2C9A980 Key
- o3 ^, l+ Q: H& U2 C: f4 s012C 83B34E88 83B34EA0 Event1 {9 `; M& W$ M) W- q
0130 E2CFD948 E2CFD960 Key6 S- U' D9 Y) M, S
0134 83B34E08 83B34E20 Event
, S+ L. |' w1 y....
_8 a+ o- Q w7 r) a* [$ H.....................省略0 j. Y* t; X9 x$ f
4 i$ O9 F' L! {+ ~
看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?: a# F# r& }" Y6 K0 C1 `
8 T/ @& V- L; V* u* h5 `& k& }+ ~
想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此
3 m+ t, R3 J5 N4 [1 Z6 E
+ |3 o6 M) y: |8 F" b可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路" H% n4 b* {9 m7 b$ H
5 e1 W; C5 [7 s+ p4 l6 \# s( s
后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.
; J$ B0 ], I* `" h2 }( l! D
; H1 \* s8 B0 j果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS+ L( p" I( o2 t) g
- e8 n( y0 L4 U, r修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程( T2 t( n) c% _* w# k1 i
/ D; \8 D' k& |) F
#include
/ d$ m& [- h& O1 {* U7 Y& m" o#include
- d1 r( A. N* T# ?6 e/ Z3 @#include + i b9 `6 p( S0 C" _( w# a9 s
#include
' G9 j/ g- B& q/ Y, n" i: Y! C- g' U6 _8 x% }# A& P
/*
, |% N$ N$ I2 W5 @$ S! ]* you''ll find a list of NTSTATUS status codes in the DDK header
# [! p1 n: g. L! `) s* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)5 ]$ w7 o, J4 p7 n( r) ?
*/
* ?% {" t( x/ [( R#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)
" |6 O$ s7 Z: I1 ]" ~( J: J#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
, l! X: A0 b9 b" c- M. Y' X#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)& y8 N# i5 t8 k. N0 E. Q8 w
2 W; R* _& P! S/*% T- L- `* m7 q7 ~$ ^" F) f
*************************************************************************4 [" y6 g+ \# J" `+ A( J! R
* ntddk.h
- f7 M$ u7 M) C% L+ ^' Q- {! v3 A*/- c4 K0 T8 b% s; ?
typedef LONG NTSTATUS;) \# {, h, k, B
typedef ULONG ACCESS_MASK;5 o+ R: B! _0 b5 T
/*
& p9 v- v: D! N* W( |+ U* ntdef.h
4 D& A; ^+ c7 {8 e; _*************************************************************************
0 i9 I$ n$ V0 W# j1 d2 S) G9 @*/7 w) {$ n+ W C0 | m3 O
8 B0 S+ N: i. H5 O, |/*
9 ^! ]' s% d3 g' A& i*************************************************************************+ A) o1 G1 z: @2 U3 f4 U3 r2 D
* <> - Gary Nebbett% R w# \( a9 Q2 j9 C
*/4 q" R' X; _5 G4 \
6 [6 z$ y+ g3 ? T6 L6 |) f$ etypedef enum _SYSTEM_INFORMATION_CLASS
1 e2 q4 k% \! f. G" D{& ]) M4 [( G0 s: B' {8 v
SystemHandleInformation = 16- {& e2 E; K5 }7 k; W! ~
} SYSTEM_INFORMATION_CLASS;
! d6 @' f1 E8 N) ?+ g# o, ?
+ Q$ c" O# H9 ], T% w( G/*" X9 U( s+ p3 X, ^( b
*Information Class 16
) h/ v7 c" O! u E0 x! Q*/
4 \1 m6 B. M4 G" i* k2 wtypedef struct _SYSTEM_HANDLE_INFORMATION
9 m) C5 F3 K. w/ u/ D{
: `4 r9 a6 O+ }' iULONG ProcessId;
5 T; w- i6 A/ W# dUCHAR ObjectTypeNumber;
7 H1 V; _! M. QUCHAR Flags;
4 G; b$ z) Y c& VUSHORT Handle;, F+ o5 J5 V7 D; B
PVOID Object;
; G$ b5 g0 C5 _, a* A; j) \. JACCESS_MASK GrantedAccess;1 ^6 A- V+ [2 h6 G- a
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
7 K4 ?5 W2 G! k! y, M8 e$ |' y
3 c# i! f! x. E) k3 d! K#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; }
3 R! N8 N# f8 I/*
4 A7 m, T9 l! O2 `1 X9 I# k*************************************************************************
/ r0 D( v) G) d* <> - Gary Nebbett, I1 M' u' l, J" J6 J1 U# M& k
*************************************************************************
% _, f* a# Y) E1 o* r0 W- @1 X*/
+ u) Y! c9 y, x/ U+ f6 h! N/ Ntypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );& \( R* v$ h8 E
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );9 T* X) g" o( t3 J+ O9 P2 X/ H0 j
/************************************************************************
* \) M) ^3 } X2 \+ r* * ?; }% m, n, |
* Function Prototype *9 k3 p/ Q3 x9 _9 ]
* *
! R# @: d) y) t9 Q************************************************************************// n6 s5 F: ~- h2 Q
4 k3 H- a- P& Q, ^% d$ C+ e
static DWORD GetEprocessFromPid ( ULONG PID );
' W; O! M5 h9 ?static BOOL LocateNtdllEntry ( void );7 N9 k e ]: a1 ]0 x( \. A
6 q& {0 A" f. `7 s. B9 {# n$ ]- b/ P( \) D Y
/************************************************************************3 p, u; C: C- C! ~: g) d$ f
* *6 z' C* R1 a0 @3 m* T
* Static Global Var *
& l4 r/ H. D" q0 u* *4 [1 a5 }. G1 Y, D% b
************************************************************************/
# o+ \3 m8 D$ I
2 g! `+ \' e& Z4 w* [# a1 ^+ P. sstatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;* F2 V- O) O, A9 H
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
5 x. F; {, G m" _9 @4 B- P6 i" d5 P& r* A8 n2 c
static HMODULE hModule = NULL;0 y: u$ C; W2 w
/************************************************************************/5 n# h, ~9 x. o$ U1 t; [ Q
: i- B# p3 \6 g: F6 z% h3 \) q% I+ R9 w3 g% P# M
static DWORD GetEprocessFromPid ( ULONG PID )
- |% K o# [- O7 C4 f{
! |" Y' m' [& Y' sNTSTATUS status;6 n1 `" d' c* x1 r8 G
PVOID buf = NULL;
! x. E2 g+ D& lULONG size = 1;9 \: W8 K2 ]5 D1 C: T+ y/ z4 X! j
ULONG NumOfHandle = 0;
6 a. v' V, Z3 N! ~: {ULONG i;% @ ~$ i! a: A8 w w8 ?7 l7 {
PSYSTEM_HANDLE_INFORMATION h_info = NULL;; i& W" Y$ U6 n/ w6 E8 z. @. y* C
8 A7 E/ h5 G2 \+ g9 A
for ( size = 1; ; size *= 2 )% W2 P# q! o" z" q
{
( S$ m, o8 X- g; A0 a5 `/ fif ( NULL == ( buf = calloc( size, 1 ) ) )
1 X! `9 n: V5 g9 C% h1 ]1 j{
0 o3 Q9 ]# u0 u3 I4 lfprintf( stderr, "calloc( %u, 1 ) failed\n", size );
$ ~) e( b7 B( A' ?+ mgoto GetEprocessFromPid_exit;
1 x. N' Y" i/ X' ^( u}9 N5 N: i3 B: Q3 M
status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
/ z4 b6 K0 \8 n _3 _3 d' mif ( !NT_SUCCESS( status ) )( ~ @" k3 H; [! _
{9 j/ Y1 e P' {. V3 \' N
if ( STATUS_INFO_LENGTH_MISMATCH == status )" C; f7 c9 S2 l0 {! [3 @: \( m
{4 N9 u. s- Y* Q4 ?
free( buf );- o2 K- ?- |. |6 Y* E' T
buf = NULL;
% y4 B9 g, d( D+ w. R A}) ?. E- X! y+ y5 f! f
else# K3 r8 q' }( k' e: |
{/ B- k0 ]' ^/ Y. y+ l' H- `: e
printf( "ZwQuerySystemInformation() failed");
3 }9 r. T `: b0 ~; v- Tgoto GetEprocessFromPid_exit;' K9 y1 X X+ {& R/ p: s$ {; ]
}# g0 ~- s( Y( o9 |$ N! P$ s
}1 W9 v7 t, y' f1 N6 Y! N8 g
else
- c6 M" E- W9 S& J. W, w! C{0 b. I$ r+ ` Y
break;
) c! k& y5 _% [6 i}
' p- i# N5 d- w C( H9 K$ |8 s! L} /* end of for */
2 ^) _5 M* e" V* H, L+ ?6 a
8 E: C; B# |& ]/ F, b//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组! m. ?* y6 k9 g i' {+ y* Y' Q
NumOfHandle = (ULONG)buf;
0 L8 c) \1 N' x3 Q; p; @3 E8 o# @2 [# @6 [
h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);
0 Y5 z" Y$ S# m4 U3 @) ^" E5 [6 g8 J# o5 Y6 J& }- M2 C
for(i = 0; i {$ T7 K9 l& h0 N. H* d
if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )# S3 k+ c. v9 p$ Y
{
/ c+ n% T: B+ Y$ S1 F( p- E6 J2 [printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);
$ W* G8 E" `* ~$ \. Y, d# j. Yreturn((DWORD)(h_info.Object));
# F9 K0 b6 O3 Z& X$ T- |7 P( c}4 n4 R% g5 M0 m0 ]
}( ~6 b( j `: H/ w: e
GetEprocessFromPid_exit:; M4 c. e8 t" T# o# T4 Q* Y; t
if ( buf != NULL )/ I: O1 }" y6 r+ D% r! W
{; w& E, O* l3 C3 C
free( buf );0 M5 h1 ]0 M8 Z( P' O1 K
buf = NULL;
* U( E) d, M8 j9 M- Z- t$ f+ c}
5 s8 Y# D: p& y+ ]' L1 mreturn(FALSE);
% l) l- Y Q- D}
; L$ J0 L: ^* J: q3 o% S+ y& L+ g+ X( X7 _9 n
6 a* Q' t$ P, u3 y
/*% h4 R2 Y" ~2 W( |) u% D0 [/ ]( W
* ntdll.dll, J" _6 F6 n4 e9 j' C% a
*/
5 r5 ?( C! {. F% _, \9 _6 `static BOOL LocateNtdllEntry ( void ), f% f% W n7 h% A4 K4 X$ Z
{
+ m. v( U# H2 z3 |BOOL ret = FALSE;
# @3 L% a8 W0 |4 cchar NTDLL_DLL[] = "ntdll.dll";
9 {% S' Y; X) @* M5 N7 iHMODULE ntdll_dll = NULL;
" [0 P9 o n' X) ?3 G+ @2 i. K9 O* U
$ m' K/ P K, s( g! w" Q O& L* i( C& X: u V w2 ?1 m. Y
if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
4 N. n; b2 S/ X. Y8 D/ `/ k: P{
- b5 J) F- d( r' g2 uprintf( "GetModuleHandle() failed");
. k. o( |: N4 Treturn( FALSE );
. x8 u$ p% l4 A; M) g2 Z0 v9 h}$ r6 I( t4 Z0 p) n! _* q+ G8 b
if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )' y% d6 b4 {8 t9 d: l+ y
{
! ^7 U" e. R6 ?3 P+ I! b5 ]# ]! H9 Kgoto LocateNtdllEntry_exit;/ @* S' q5 {& Q+ P
}6 p. u1 \4 u/ F1 O0 k
ret = TRUE;& T! E. Y1 s0 A* h9 N
3 L- x; d/ y# p5 n2 V
LocateNtdllEntry_exit:* c% s$ h) H& d: H/ X
/ _3 R* k$ M6 s1 P" v. Y' i, T! Dif ( FALSE == ret )8 f& N7 y: e0 l7 o
{' o0 P G {8 [9 Q* h9 q' e
printf( "GetProcAddress() failed"); z4 W t- Z" ^1 L- U4 ^
}0 r& U9 h9 {' w4 b# o; O! G1 }
ntdll_dll = NULL;
4 j$ [% w- Q2 d; N$ `3 Areturn( ret );' ]% v+ G& ?. {1 x# J5 p ^1 v
} /* end of LocateNtdllEntry */
$ w8 H3 W$ k0 c0 Y& o8 L0 z7 Z% r" Q- j# p0 N2 `3 A
5 P" b$ ^) ?$ c( P8 F
int main(int argc,char **argv)% G" ]$ z1 n# f
{: d: g( `3 l, ]6 a
: D" }! I- e" n7 ^0 g- t3 D3 \& DLocateNtdllEntry( );6 {# i9 h# n+ c h. z _( w
" Y( n3 J" i& n+ H/ X# A$ V
//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5
( V/ d5 Q$ R. V& S, AOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );
+ \5 Y3 K, _( r& `; d* w8 q6 z) y5 g+ n
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );
' g% w( V# C4 g9 ~3 Z: F3 X
' g) ~3 C \2 j: c6 Yprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);/ Z$ a" l. M4 U# z
9 ~% L7 m' m: N( S" areturn TRUE;
4 T0 T5 [4 C# Z9 Q% R2 o} |
zan
|