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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:
0 G% Q ^/ u' Z$ W, F$ X; l* r--------------------------------------------------------------------------------. {$ }8 i# [7 z% S- J1 G% R0 ?
文摘出处:http://www.xfocus.net/articles/200406/706.html6 m6 L) B1 G) u. V. U' G, m
% ~& h! K& h- Z9 j# L; t# w7 C创建时间:2004-06-01
5 ?; Z5 C% v# v; c文章属性:原创
+ w9 R' R( d8 [, `( h文章提交:MustBE (zf35_at_citiz.net)) R" i5 P5 l% d6 o. u& t( [% W- D
, r3 ?9 I; l' q2 }: P
By [I.T.S]SystEm32
5 _! C) k# W% p2 c* e2 |
2 W* H( U* l, s7 i1 b8 A# DWelcome to our web site http://itaq.ynpc.com/itsbbs/
7 m/ V. N8 K; i$ E9 g
5 H+ m* y- l8 q" R# B' Sthanks to SobeIt : P
u1 t: ]$ x) v3 ^0 A---------------------------------------------------------------------------------------------8 z0 s7 C4 Z$ s$ M' e2 H) U
5 q( [5 ~3 I/ p! R2 G) z5 C每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内., C _; ~: X( d. _: E
1 F& Z8 |+ j$ f* B% |
绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
3 a* c- @( B9 E4 b) x" q" ]
* |9 l! s# P# ]1 K9 l; x+ qZwQuerySystemInformation函数原形如下
2 {- v1 q) p7 O$ j2 @
/ i0 y+ I8 C0 j; K. m+ M% uNTSYSAPI
0 [9 F' _) T: }/ q$ p, kNTSTATUS* @" V# e0 w2 C( E
NTAPI
7 |' d$ [1 z! f, W# uZwQuerySystemInformation
! G \9 m/ {' H6 l8 E(
; F' b: C, |1 zIN SYSTEM_INFORMATION_CLASS SystemInformationClass, - x' m; W+ G% s1 d
IN OUT PVOID SystemInformation,
. e% \: J! X; QIN ULONG SystemInformationLength, 6 \* o) p& z" `. o# }8 g
OUT PULONG ReturnLength OPTIONAL
n6 X+ c" _, L1 ^- a: F q; ~);% R! X* G5 h3 Z/ Z) l
8 G$ T* j9 Z% F2 i- f- ]8 M$ R% q参数意义如下1 M2 o. `7 \& W. G
: [, Y" ?4 {+ V- h2 ZSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
0 P* U, K. T+ y0 h5 }) C5 {) X k# P) `( @2 t, |
SystemInformation:指向一个接受系统信息的缓冲区的指针& r+ Q* H( M& E3 E6 `, E
+ u/ f' P6 b+ |: ^
SystemInformationLength:缓冲区长度
2 `7 t. `9 a& N: c; e# `! X) C
) f1 u# q3 A7 n8 F. U( s3 @ReturnLength:指向一个接受实际返回字节数的变量,可以为0
6 O( ]; |; ~2 y3 Y5 t4 m! v0 {4 M& J3 g% X6 R/ l. w2 x
. j& D+ I$ b4 Z8 [+ |为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation
% q* ]1 |4 F r5 `+ k3 M6 [: U! o7 h5 h* _
SYSTEM_INFORMATION_CLASS的结构如下- L" e( r7 l6 q0 C4 Z0 l4 z6 O& l/ a
# u: c6 C& t, f5 A& k- W0 e) ~
typedef struct _SYSTEM_HANDLE_INFORMATION
, I+ m& q+ z: c* f T! p& i{
% w* d9 N) u: ]9 Y' G. Q# iULONG ProcessId;% `5 Z! f) O+ s. m6 F! _
UCHAR ObjectTypeNumber;) T4 o$ U e* V5 n) w
UCHAR Flags;
) x( x9 h$ y- Z/ Q3 Q XUSHORT Handle;" }6 r" T+ E( S' l* {
PVOID Object;% _# R) y! c4 ^0 }. [9 E% H1 Y. T9 ^
ACCESS_MASK GrantedAccess;
- A" @6 K% O/ k& \ w! u} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
( t- C0 J+ `- s+ [
5 O! O2 H+ z! ^2 E6 x2 N! kProcessId:进程标识符 1 _8 S0 e- c3 H% u- n; }
! }1 n: M$ L6 ~* }ObjectTypeNumber;打开的对象的类型
5 \+ m1 ~, r/ y; |" B* |, y9 N6 n9 V
: U" E6 D" ~1 x* L1 R mFlags:句柄属性标志0 p B' Q [1 p
7 ^0 v" q: ^6 J! @2 Y( \* o
Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄
3 X# X7 g- h' R C' t, W8 @! [% ]0 }6 G# o9 V
Object:这个就是句柄对应的EPROCESS的地址& d" p( L' M) T' A
2 S7 F- l6 p' Y5 x0 O$ S# I4 \GrantedAccess:句柄对象的访问权限
, [) b3 E( m" M1 [$ Y' C% |- \! ~! j
0 C( k- A# ?7 v7 q! E% q5 F下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )$ X0 h9 Q1 a* [% ]( n% m8 D! D+ l
/ Z! |/ t3 @) K O4 P/ [比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄5 w' B H+ H3 ?5 ]4 |/ U" A- @7 \! W8 M, t$ e
2 i, J9 m; j" E4 I4 q怎么会这样?难道程序写错了?*_* u# `1 F* C$ f# u
0 K: \$ ? W6 e- x2 T5 F
现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出
. f- {( O6 O5 ~+ f* ^/ }& w6 p; ?! t. c0 d: _9 @# i) s
:proc -o QQ
, ^& z0 I2 ?3 @3 e5 ]Process KPEB PID Threads Pri User Time Krnl Time Status
- t! V/ [+ E; u3 F2 ^) L2 i9 SQQ 827CD520 11C 2A 8 00000B90 000008D4 Ready5 F4 a) {+ g0 f3 {1 N+ _4 t! f4 B3 Y
0 w6 F2 F6 k2 X( O% x; n' V
---- Handle Table Information ----
# N0 P+ J$ ]* p+ i' ^( ~6 e6 T" ^
4 d( c* E1 r' m3 {, uHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
4 |& C Y/ }, i/ l5 w: J# m- k* o! ^5 u
Handle Ob Hdr * Object * Type- Y, q( j O$ J* B: l# o
0000 00000000 00000018 ?
1 |7 G) z+ m& }! [* ^. L2 B1 f0004 E2DA5E58 E2DA5E70 Section- h$ Y3 u- q$ A; y( @ p
0008 FFAB35C8 FFAB35E0 Event
4 q0 G% r8 |, G# B8 C000C FFAB3B08 FFAB3B20 Event
; \6 l, _% X# z9 v* E- N0010 85C70188 85C701A0 Event
3 K7 O5 K$ b) K% G0014 81515778 81515790 Directory
( X& f; a% i$ B. f" l6 C1 {$ ~) j1 ~0018 FFAB7BB2 FFAB7BCA ?$ s& W, ]8 Q- o( U! b9 A7 |
001C 814A1858 814A1870 Directory( {- r, ~. u7 X4 r
0020 80288C88 80288CA0 Event
+ ?; | p0 d8 _" c( E4 E0024 E2CFE7F9 E2CFE811 ?
7 ]& I( Z/ q: n8 h' q E& a0028 842D7B08 842D7B20 Event- R% q% L9 f1 H' _
002C 80E9B989 80E9B9A1 ?0 A3 ?% ?, L9 B q! O6 k; F9 a' ~
0030 E1372198 E13721B0 Section
. `3 f3 {. A; T; y* m$ I0034 814602C0 814602D8 WindowStation9 ^9 R' j, Y/ k% l; D! t
0038 81455CE0 81455CF8 Desktop
6 ~# k" m3 D, J5 R7 U, W2 K; B/ ^9 G% @003C 814602C0 814602D8 WindowStation
* q2 A' n L& _- c0040 E2B3C1A8 E2B3C1C0 Key
2 n1 `0 C. z7 v: @$ e9 Q* p! `0044 E286D6E8 E286D700 Key
- i" w) |9 m2 I! e% n: f. w0 @' ~0048 E2B3C0E8 E2B3C100 Key
. u: D* V$ K( p4 J% p004C E2B3C068 E2B3C080 Key; {, I6 O/ D. T, j! k
0050 E2BEE688 E2BEE6A0 Key
9 V/ V ]' o' c0054 8147C998 8147C9B0 Directory( R! }( u* A y, t+ ^
0058 829D1128 829D1140 Event
- G: `8 h# S, x1 Q: H: w/ K2 E3 x5 C# o4 j005C 83F991E8 83F99200 Event0 ?; e' T# g% D$ r
0060 E2BEE608 E2BEE620 Key( k& s! ?: J1 X. X4 x& [* Q
0064 FFB07568 FFB07580 Event# Y: T" x; F7 [) U6 ?" u
0068 801747E8 80174800 Event. I, F, g( t- P" P$ t& c8 Y2 b# ~# J
006C 80174828 80174840 Event7 d2 m$ T3 F$ \8 A$ t m# |0 ^
0070 845E8808 845E8820 Event
$ V R# Q3 F* g0074 81448798 814487B0 Event+ y) V5 Z8 O1 f0 C* d7 ~) C
0078 E2B9A888 E2B9A8A0 Key" a+ m3 J3 ^* L8 t) u: F/ q U
007C 845E8648 845E8660 Event
% T+ n) N% W2 a6 B0 f: B0080 FF9E2DB8 FF9E2DD0 Mutant
* V. a/ n, T4 w2 C( l0084 FF9E2D58 FF9E2D70 Mutant
) Q* C, F( n4 q& m, H0088 83CFC378 83CFC390 Mutant
/ K( h5 G, N4 o$ D6 ^5 |; M) \008C 801749B0 801749C8 File
1 [0 s6 I. Y) Y3 I s6 C0090 E2C48668 E2C48680 Section
4 m4 Y& C6 i( j9 l7 ]0094 FF965168 FF965180 Event
1 x/ g/ t, q3 Q- L+ D0098 FF9E7D88 FF9E7DA0 Event0 w2 h7 w% [/ Q" R" [+ \
009C FFAD3DE8 FFAD3E00 Event9 M6 ?* J$ o+ i
00A0 80AD63C8 80AD63E0 Event
( @+ T5 ^4 t( L G; ?8 s00A4 E28073A8 E28073C0 Key( y3 \+ h4 L- Z2 n9 z; E; ]1 |
00A8 FF955588 FF9555A0 Thread" P0 d; H, d/ W
00AC E2770728 E2770740 Key! A9 d/ k% }# K4 z# O0 {! A& X
00B0 FF923438 FF923450 Mutant
$ ]8 Q3 X- b" Q& }$ v* r8 n. k1 m00B4 FFAE3B38 FFAE3B50 Mutant: u8 J0 ]! M z- n. J. K
00B8 83B80728 83B80740 Event8 _% f0 c& k1 `9 ]9 y J4 w9 V6 r2 |
00BC 83B80668 83B80680 Event/ D) a- R8 v2 t: M7 K0 ~6 e
00C0 E2E3C448 E2E3C460 Section
5 O6 f+ N* }/ Q0 I9 S& _00C4 83776A08 83776A20 Thread8 Q3 `, w0 u. I( w8 g
00C8 81489E48 81489E60 Event
; ^& N2 F; m8 Y, L00CC 83776CC8 83776CE0 Event
! P, Y' a7 M% @00D0 83776C88 83776CA0 Event
% L: O" t ^" Q, \" j" p! X00D4 83776768 83776780 Event! X, m$ z! B1 V
00D8 E2837D88 E2837DA0 Key
0 V: F, K7 _; P( i. a3 b00DC 8146B3A8 8146B3C0 Event F" w* L9 G. o2 A& e
00E0 FF908308 FF908320 Event: ~% o" w" ]9 r$ Y8 g4 t8 Z
00E4 81494868 81494880 Event4 W3 s1 h8 w/ E# b1 z
00E8 FF9064C8 FF9064E0 Event9 g+ U) q* B6 F$ N
00EC FF908FC8 FF908FE0 Event' \" A; G7 E1 D
00F0 FF908F88 FF908FA0 Event
3 L3 L! ~" o( n8 V+ s2 u" Z00F4 FF955588 FF9555A0 Thread
( e0 ]3 @, y" u# y- _00F8 FF908F48 FF908F60 Event
; p' T+ L- [- c0 |00FC E2CB1558 E2CB1570 Port
Y; c+ v( v1 {0 V o! }$ {0100 FF90A2C8 FF90A2E0 IoCompletion8 O: K( w% `2 R0 }) E1 {6 S* p7 s
0104 E2CFE708 E2CFE720 Port
( t7 X1 M6 z1 ^! i0108 FF90A2C8 FF90A2E0 IoCompletion
$ o) n& U( k# r4 |" G; U0 {/ f, B! d010C 837762A8 837762C0 Thread3 `/ G/ r% q/ E+ y
0110 8103BBC8 8103BBE0 Event z$ w4 {. g; T r4 h
0114 813DBDB8 813DBDD0 Event
* |+ C( U: I/ D. Y# V( o# g: r0118 FF814788 FF8147A0 Event" T9 v! i3 Q) z& R# _! e
011C E1358DA8 E1358DC0 Key& ^8 P! j9 c' x0 S: q: T
0120 E2CFC428 E2CFC440 Key. I; q; u/ V$ p% n+ Y; H W) i# w! V
0124 8103B9C8 8103B9E0 Event
0 c: o( ]5 E; A' P2 `0128 E2C9A968 E2C9A980 Key; ~" }7 o3 f- Q! d
012C 83B34E88 83B34EA0 Event
9 G1 y/ c% @* ?" o) k( t0130 E2CFD948 E2CFD960 Key
1 \: h& x7 d! N3 }& q/ B% [0134 83B34E08 83B34E20 Event7 E8 ]' M* M. D2 S
....
! l8 @( ~$ I) p& t8 x6 w- s.....................省略
; D- D0 m9 X( T. V8 `8 |% C
$ j" n9 h" a) ~看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?' M ^0 _% ]* J7 l6 ~4 l6 |* ^
`' d* b9 h9 ^+ i想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此
2 `& @7 E4 J2 n# q" d4 p& ~ N$ M' j5 v0 ?" m Y
可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路9 d. {3 {( `: z# D
; Y7 H* B# y- [后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.
) e2 L1 l# v4 ]1 U/ o! A# s# v/ `) f) f- k0 B* a
果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS6 |( H! Z$ V- X% [/ z: j8 q6 W
+ m. s/ s5 _$ @+ \修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程
* P9 u4 V+ N6 a& v* u! q9 O$ w- P$ Q& u3 c! m
#include # {6 v$ P- G* @0 d4 l! j3 S
#include
3 L4 p8 m: Q) v+ ~2 \- t; Q( A: S) y#include 2 {1 N8 A. f2 o5 Q* `9 R' i
#include
+ ^8 Z4 z2 [* r9 N# R) B9 ?& i5 N) W+ T3 q
/*
7 i# {: G4 v- E; t0 ]* you''ll find a list of NTSTATUS status codes in the DDK header7 K; D% J% a7 r8 T& t B
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)$ }5 a. m; U5 U" _0 f% ], U7 v
*/. V* n" W; U- X" l
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0); X- v& v( |( p6 g
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
+ }3 \, K. B5 r#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L). ^/ V0 i- ?7 w# O/ y; ?+ g+ J1 O) Y
+ p1 Z" w& n& }
/*" j7 {* U7 J" R, U6 N
*************************************************************************
. F3 o2 f- `! ] `' J$ R5 i* ntddk.h$ {; l7 M+ I3 o9 g# c6 ]
*/
' R9 j1 V7 }8 f% ^+ itypedef LONG NTSTATUS;
5 }7 L6 E7 G# Dtypedef ULONG ACCESS_MASK;5 B- S# q6 P( S+ v( F2 q
/*2 u9 Z6 g! Z" ?5 V# o, f8 E3 t! }- w
* ntdef.h
6 Z3 I& S- A8 c, F& y*************************************************************************6 r* C( j" a3 j0 k' E
*/
/ V6 V9 u. z- h- o* h( ]
% W7 r) i3 A' \7 H# |8 z/*4 D- D, p7 U# T* X* C
*************************************************************************
1 e) ]. y) i* |) g- G+ {: l* <> - Gary Nebbett9 w0 v! X I+ W2 Z3 W3 }
*// {8 x1 Q: P( ~- [* }
" q7 g7 h) S9 a, O# _2 e
typedef enum _SYSTEM_INFORMATION_CLASS( f# s3 s# K( L) a( F6 ]8 s
{& N9 z( P6 ^. x) |/ \) ?0 L+ x( F
SystemHandleInformation = 16
) ~8 }4 d E2 o8 z! p5 d F, [} SYSTEM_INFORMATION_CLASS;9 p8 ?" C# q' r( Y0 M: ~; ?
6 k, {7 m4 U1 l: R/*
6 B& r5 N5 a, } l*Information Class 16
8 o3 d( Z: i3 A w1 \*/4 M& J8 y+ a! ^4 u0 N: O0 |
typedef struct _SYSTEM_HANDLE_INFORMATION
2 N8 M# o w' ?4 a4 D+ K3 S) |{! X/ N# {" T) k; Z1 [
ULONG ProcessId;
3 C7 Q, `1 L% ]0 m" p' _: @6 XUCHAR ObjectTypeNumber;( B% d" b/ S- ?+ O* j" i! N
UCHAR Flags;4 C* }' K0 l& u% u
USHORT Handle;8 p8 q* O) |: h# G. d4 _0 y
PVOID Object;% t+ B1 n8 A2 e. N* C
ACCESS_MASK GrantedAccess;3 h1 P5 ?2 A. k/ E+ Z
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;1 \( { G h5 p4 O& X! Z! b+ O! j9 H
9 h+ l3 y f, @$ F
#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; }
$ s! v& F- E2 c% e/ r5 {9 p! e( q/*
2 A( k8 X! h# }1 i! q*************************************************************************
4 \- @2 h- V! _$ J/ n, ?* H* <> - Gary Nebbett
( X$ F7 |3 K1 V7 Y2 E% J8 Z*************************************************************************
8 F4 v7 v1 t5 D2 `*/
! ~8 Q& e' c# P! dtypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );" a2 r- d) l/ |1 W
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );+ F0 s: y, o- ~2 o, j0 q
/************************************************************************5 s A. F0 c! ?" {9 ^
* *+ m* p( e9 q0 i
* Function Prototype *
a2 d* ^) g: R' \& N* *
; r7 P5 ~% P. d1 a- a& V7 @, n************************************************************************/
5 |& M- K7 T( @+ V) N6 [# |# k6 J9 H" H `( x8 ^% Q$ z2 v; c
static DWORD GetEprocessFromPid ( ULONG PID );
" i& V- J; X/ C( j4 t0 _) gstatic BOOL LocateNtdllEntry ( void );
0 c* D* c, u2 S6 p0 u9 e) W' ?; x @
* p) e! d9 \) f8 |/ o2 Z0 \6 \2 f$ Z3 l, F' _, D$ O- C
/************************************************************************
9 t7 h+ E5 W' C$ F8 w2 y- `( V* *
4 ^( b6 k) D+ c1 o t9 Q& e8 V8 B* Static Global Var *2 G. i! `' X1 b4 w
* *
" F8 [; l0 c. Q: f" H; q************************************************************************/
, X, B* i5 K. I$ g, Q
! u' W, X* `* O" O8 Xstatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;
) q6 f% T( {+ p$ fstatic ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
& A+ h7 [ W) J6 n# D/ v5 L, U; H- ?# h$ w. j8 p0 W& A
static HMODULE hModule = NULL;1 M: G1 @! V/ U' ~( [# _' Y# k
/************************************************************************/
8 C7 ~6 R6 B6 q7 Z7 K7 V: V" f9 P5 C. u5 L
5 W) z4 u" L8 T4 H
static DWORD GetEprocessFromPid ( ULONG PID )3 t( F' _& W% ^/ e, F+ [7 T
{
# J; j, o" Y" i% M( k& ZNTSTATUS status;! z7 }) j W2 m" w4 o0 l6 K2 i! n
PVOID buf = NULL;9 C+ C8 G9 X% Z! I& U
ULONG size = 1;
: x9 w2 Y" G5 ?! r: fULONG NumOfHandle = 0;: s. r7 _! J2 N
ULONG i;# F3 N" n, A0 `" C7 U
PSYSTEM_HANDLE_INFORMATION h_info = NULL;
' u9 e2 `0 r+ v% H# B. c' \- c n8 v" q+ i6 j4 H( |5 v; S
for ( size = 1; ; size *= 2 )
2 d% l2 q9 p$ `* }6 l{
3 V \& Z6 Y$ {9 M# _& b( Z' Nif ( NULL == ( buf = calloc( size, 1 ) ) )4 ~/ h1 _, H" E& z4 a- F1 j
{
8 c' X' S: g0 g0 i5 j& Y k1 U/ Qfprintf( stderr, "calloc( %u, 1 ) failed\n", size );5 P8 @/ ^4 F2 @
goto GetEprocessFromPid_exit;
c' P8 _3 N; a$ {. h& V3 S8 z}' b* g: c3 G% I
status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );* f9 M, V1 O! ?) h* b
if ( !NT_SUCCESS( status ) )
3 Q; x0 r* _4 H1 C. t) x{
# ^3 ]9 t0 [ Aif ( STATUS_INFO_LENGTH_MISMATCH == status )
! o8 h3 A% h5 E/ s2 m& g* G{
% _( D0 D9 H T$ ]free( buf );
+ i# Y: y6 o9 {1 J3 B$ Kbuf = NULL;
' ]/ U' c( d7 f2 z( R; r* {}7 l1 B( o# { w- _6 h+ X
else* f+ A E' V+ e6 l* o( A
{4 [- E- T8 x- u/ p( t
printf( "ZwQuerySystemInformation() failed");
( p% v9 k3 U( O1 B7 dgoto GetEprocessFromPid_exit;
X( j9 H3 N: {& O# V( `}0 s" I$ J+ W. B$ J5 \" r9 @2 T* ~9 D
}- q/ p' l$ W! [' D, l
else/ f3 Y" ~3 Y9 [ D+ a& e
{
, s9 V8 h/ k# w' z8 Tbreak;8 o" k" E" l7 q4 _- E/ d% z* |
}
; n" ]: r8 N9 {. l8 O, n} /* end of for */
4 ^; ~ p& }2 b- C6 h' K
5 y, D( p9 E' F# A//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组. ]' A+ F/ H* ^
NumOfHandle = (ULONG)buf;1 |' }1 e, R% s+ k2 \: g3 M
+ O" M( r' M1 K" H9 _ Lh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);
7 ]% U4 H2 x: Z0 [2 c) K
* g1 r$ y0 E0 E6 d, p5 ^1 }for(i = 0; i {
9 ? u/ n2 [6 R3 ^if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )
% h2 a5 i+ h# v1 x5 D3 ^+ J{4 K% ] H; | X& x4 x$ d
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);
+ y s# I6 o& R! vreturn((DWORD)(h_info.Object));, E8 o4 c& T4 N1 N
}8 d ^ }( q6 g2 [$ x& b7 t9 D
}( L5 V( h9 J, O" q/ l3 ~
GetEprocessFromPid_exit:
2 B6 L+ s4 U8 y0 G8 a$ |4 Hif ( buf != NULL )
. U- Q* Q: N! f* _8 e5 H{
0 k9 @5 }; y: L' D1 ~free( buf );
! ?" ?2 _. h# Gbuf = NULL;
! F: ?, A+ Q3 B6 a2 {1 j- U0 P}
2 C! Q7 `/ [. W$ y$ mreturn(FALSE);
' P- l- ^) J- V} _# l& ?9 Z. [7 q5 k# F0 j) } O
, N9 u- }6 U- l) C/ L) T8 S0 F
+ a& z, [7 H/ x1 q8 M
/*
& \8 Y. C; j9 E$ F( G8 k* ntdll.dll
7 w: w. C4 k- C1 N% w* |* x0 P4 G*/ f v9 t f' h" x4 }1 J
static BOOL LocateNtdllEntry ( void )* p) e( C# R( M, f3 _7 w4 [8 I
{
4 k+ N# h1 s5 q" W# \BOOL ret = FALSE;
& E6 U0 A" G+ n# W' Ychar NTDLL_DLL[] = "ntdll.dll";! B* n# U* L8 E5 d! g5 y8 U
HMODULE ntdll_dll = NULL;
2 ^2 L: s! A, M4 A' Y! q: Q% u0 `0 @( s( r
) v; \5 ]/ V) \$ n- fif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
3 a+ e5 Y& H1 w0 ~6 ~{
! q1 Y$ X4 ~' y( r9 V5 m! W$ _: o. dprintf( "GetModuleHandle() failed");5 N( _, }' s0 A& n
return( FALSE );/ n7 D8 f9 i4 @) l1 y; m# o3 l
}
+ x& g9 t5 n3 f& Fif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )" M: j& ^. \; i! O# `! a. H
{9 Q# y) _% O) U* q
goto LocateNtdllEntry_exit;
3 W; z6 v5 m K& F0 [" C& Z3 v}
' Z2 O2 P2 I* x8 Hret = TRUE;8 R A! C' b. [ k8 s3 y
, k* Q: _& ~0 O$ N; E
LocateNtdllEntry_exit:
4 L/ A' X7 h/ g4 j2 O6 h" a
6 q4 F+ | a0 C/ K1 yif ( FALSE == ret )8 m6 U1 n# h! s0 f
{: S1 Z7 O5 \ G! g3 A: |
printf( "GetProcAddress() failed");+ s2 V& Q" [! y& S# {9 v: }
}: f, v+ D* o6 A- t8 D* j
ntdll_dll = NULL;; E7 f: l2 W7 _0 b# K% N: V4 y- d
return( ret );
) A! H( R' T; }/ o7 z- T- B} /* end of LocateNtdllEntry */
0 A- X+ ~0 z3 ~+ @+ s& Z3 {; f+ Y
0 x4 q7 r2 M& I6 p8 {% J1 Y3 e# A0 W% t% w/ ^4 C
int main(int argc,char **argv)1 w: J% o3 x! [; P3 w0 j
{
& ^9 u+ R/ v8 `- u }# v5 R! V5 z/ V
1 K3 ?3 [. U# u" Y% GLocateNtdllEntry( );$ G z6 H! R9 y% A
9 n& U# P K$ a3 H1 d( U8 j6 B
//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为54 J! y" ?& ^1 Q' h ]3 n, g" u- v* R
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );
# t: [ m& e0 o5 P) x$ f0 R: v7 q- e+ h" ]6 Y; @5 c8 f
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );) Z8 A" T& c7 b
' H+ i( M6 p" V6 t% v1 gprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);
6 R/ Z5 j/ A1 J4 P, u& s i$ q. T y$ K7 b/ Y
return TRUE;
; R, u+ k9 [; E! ^) Q5 x} |
zan
|