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

我的地盘我做主
该用户从未签到
 |
|
文摘内容: e0 I" W5 W5 |4 l! l
--------------------------------------------------------------------------------( U/ e0 H# D6 p& q+ }
文摘出处:http://www.xfocus.net/articles/200406/706.html
4 z& m) Y" g4 U# m1 Z% u/ d
& o5 z" p1 i- D4 z创建时间:2004-06-014 @4 w, m2 o8 T- S4 C" F
文章属性:原创
# P; D( c5 }6 M% c文章提交:MustBE (zf35_at_citiz.net)' C; q! h8 m8 G/ K7 _2 v
: I. }! ]$ @# O) N( W) ]' G: S6 FBy [I.T.S]SystEm327 {3 B3 n& j- Z- j5 B! }
i, h3 j1 G. AWelcome to our web site http://itaq.ynpc.com/itsbbs/
3 s0 T. J3 k6 k- |0 s
, a# u- o( g9 F' ethanks to SobeIt : P' r$ b: b4 ?/ n, y9 e; V
---------------------------------------------------------------------------------------------
( K& _0 I2 }" o( j; h$ r+ Y( h& S# q, l' g
每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.
2 e+ F6 a2 O. K3 A9 Q( k" a: Q8 p6 F1 F( x2 P2 [2 j
绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
# j! w6 C& O& i% E* t+ k6 p0 ]) K: w1 p: A ]9 s6 B" p
ZwQuerySystemInformation函数原形如下
" ~6 M. G# D9 |$ f- r# g+ D" e7 ?; `, J ]
NTSYSAPI( l* ~- s! M: o9 E3 X1 x
NTSTATUS) |, c$ o: k( W
NTAPI
& O: K3 p0 a9 `3 X7 v5 kZwQuerySystemInformation
2 |( i" H* F& S' A( : W; [3 w, F/ a1 ^
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
3 X6 c* t L1 y. Q% E7 @IN OUT PVOID SystemInformation,
' j1 T% s" X! w. {) V' D( vIN ULONG SystemInformationLength, 2 m$ I0 | ?; H& O$ {
OUT PULONG ReturnLength OPTIONAL 9 g1 D4 J5 X) [; j/ l
);
" y$ e% X( h, j8 A, k; h1 g8 R; u4 D: f4 [2 E3 K
参数意义如下
' E: o d3 y# D9 g/ m
! O8 h2 L0 L) e7 }& z, o0 I e8 }SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
h: M5 b9 X( @: H9 O/ ~# o+ a9 Y) a
2 _# ^; Y9 R( pSystemInformation:指向一个接受系统信息的缓冲区的指针
! m# Z1 d- ~# V$ u! ^' {9 h2 {( \0 x' v- z1 C" |! M+ {6 W
SystemInformationLength:缓冲区长度) M. p) C+ q2 F; t" a1 X8 q( g
$ z9 d- q/ d" \8 iReturnLength:指向一个接受实际返回字节数的变量,可以为0! d* f- D; n0 r) |4 l9 w. v/ T
4 p5 z0 o1 y* G
6 n/ E) g# c- s& q1 Q. m/ a为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation; N! g) o( \; U, g6 E+ i- ^
! K8 _* b& [/ N3 Q9 |7 ~* q( n9 ~
SYSTEM_INFORMATION_CLASS的结构如下
2 D- A' @; h7 K3 N6 I7 G) u g5 D+ m: y8 Q5 P0 s
typedef struct _SYSTEM_HANDLE_INFORMATION/ ^" b2 l0 r% V* k) |+ [9 n
{8 T0 Z( j: x9 D9 r `* T
ULONG ProcessId;
; d4 w9 s# P+ }7 HUCHAR ObjectTypeNumber;' G% k2 c3 @/ R7 B6 k
UCHAR Flags;
~+ y( y8 f; s) A+ OUSHORT Handle;
$ \' F' r b, j$ K' EPVOID Object;
# P( l% I; N! F8 sACCESS_MASK GrantedAccess;: q8 p D& k' E. O( m
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;) d$ ~; ~5 x! R
+ y+ c2 s. S) f; P. H7 c
ProcessId:进程标识符
, ]9 @# d, ^$ ~7 J# Q( i
7 x" Z6 z) e _' z: c. t6 c7 ]ObjectTypeNumber;打开的对象的类型
2 e4 @/ Q) a" ]; L, m2 ?) ~
$ o& V! i2 u4 P' F- K, C$ e! S& jFlags:句柄属性标志4 H+ d. S" D- l( P U! \& K j0 y
/ q" _1 z4 y3 W9 f' Q- {
Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄: s4 R% P: | | D" s
, V- p7 b. w9 E' E
Object:这个就是句柄对应的EPROCESS的地址
/ t- |: n S! K2 J! H# Z& v& L# [ S9 |5 ?
GrantedAccess:句柄对象的访问权限
8 K: h% H! A0 e% G3 o
& c; E) |) Z! }
$ ~- x# V% [/ o- R/ p下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )
9 L p+ e9 F9 X8 O* Z& K7 V/ L. v z) d- ?8 ~$ y
比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄1 s# ~5 P9 T8 `1 L! Y
, g& v2 p! L4 V+ h* F& q! p" z+ G# _
怎么会这样?难道程序写错了?*_*
. d% `3 I' |) a9 H8 X
9 l) v, `8 I* f, s' J- ~现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出! s% o% @) U3 A$ _0 F( f, w
& v. x6 s( G7 D% j3 n
:proc -o QQ
. M! b% I y j; ^0 F4 bProcess KPEB PID Threads Pri User Time Krnl Time Status
( b3 Q; P2 h% k' }' dQQ 827CD520 11C 2A 8 00000B90 000008D4 Ready
; G+ E2 H% p" }3 g+ f7 j+ X: Z" G% e3 S
6 E$ z5 c9 u. v- s- n0 f% N---- Handle Table Information ----( Z) M9 v6 p) }
4 @8 e) K- u5 k7 y" ?) J2 c4 VHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590- N& Q0 F$ O% {+ i" C
/ O4 X: |$ M6 f
Handle Ob Hdr * Object * Type9 `& y( [8 u5 G
0000 00000000 00000018 ?) U/ [8 d* ?, U* D& |" L5 @5 k
0004 E2DA5E58 E2DA5E70 Section+ Y# }2 E: M9 n0 J2 b' y9 _
0008 FFAB35C8 FFAB35E0 Event9 }( q& ?( V# |6 ~8 b1 V# K
000C FFAB3B08 FFAB3B20 Event% @2 t: X& i* B- C
0010 85C70188 85C701A0 Event
" {- w5 V6 v' G" T% [- t0014 81515778 81515790 Directory
* g; q7 K0 W1 x! A1 V, y0018 FFAB7BB2 FFAB7BCA ?! o) o2 B! R% H" e
001C 814A1858 814A1870 Directory
% O8 b1 k7 |% z8 A3 p0020 80288C88 80288CA0 Event! Y0 m0 X. A7 u
0024 E2CFE7F9 E2CFE811 ?
9 J' F2 e$ P V% [0028 842D7B08 842D7B20 Event) P1 l" I/ I: ]' A# }2 t9 ]
002C 80E9B989 80E9B9A1 ?
' m2 S' ?" Q& l& {1 [7 ^0030 E1372198 E13721B0 Section
4 T/ J' ~& e m2 _ T; B2 ^* x+ |0034 814602C0 814602D8 WindowStation( {; n* m# Q6 `) u& l# E
0038 81455CE0 81455CF8 Desktop
- L8 c4 f! [6 B7 ?( n) n003C 814602C0 814602D8 WindowStation
$ n% i, H4 ~* R: P* f4 l; x0040 E2B3C1A8 E2B3C1C0 Key4 B# o9 }5 e0 l0 p
0044 E286D6E8 E286D700 Key
0 [; c# n- }% r# p' c" b0048 E2B3C0E8 E2B3C100 Key
; W! ?2 Y$ i3 u2 J: [- U, F004C E2B3C068 E2B3C080 Key
- w% K$ A/ i7 p" z. N) Y# p8 I0050 E2BEE688 E2BEE6A0 Key
1 t- [0 r( Y, @0054 8147C998 8147C9B0 Directory& {" `# C' F1 o+ N7 r4 K
0058 829D1128 829D1140 Event
# @; r$ ?% @1 X6 g z: N005C 83F991E8 83F99200 Event- ?1 T7 y" t) m) p2 ^) P
0060 E2BEE608 E2BEE620 Key
) d6 E) A7 t4 ]" O3 C! \" k2 O1 f0064 FFB07568 FFB07580 Event
/ z9 B0 ]: S$ Q0068 801747E8 80174800 Event
5 x# t; j6 K$ d1 H7 d4 T006C 80174828 80174840 Event2 t8 N* M. V; A
0070 845E8808 845E8820 Event. _7 }/ i2 i) k$ w) a! P, }
0074 81448798 814487B0 Event6 I! B, b6 @( T# B l- e
0078 E2B9A888 E2B9A8A0 Key
( d% b& h* o3 Y; _7 H2 p! v% _# c007C 845E8648 845E8660 Event$ q7 B5 M& k$ B1 m7 J% v$ @
0080 FF9E2DB8 FF9E2DD0 Mutant
$ u* g2 N/ y' M1 {9 Y0 \3 T0084 FF9E2D58 FF9E2D70 Mutant. o+ |, m4 ~- t" W( I. j& ?1 N
0088 83CFC378 83CFC390 Mutant; t/ F8 J4 M6 e
008C 801749B0 801749C8 File
# D" p! \ ^) K7 e0090 E2C48668 E2C48680 Section
. n5 K; r/ _5 i- W0094 FF965168 FF965180 Event, F& E0 ~" x" H8 S; ~0 z4 }: @
0098 FF9E7D88 FF9E7DA0 Event
! q( V7 E* Y# N; e009C FFAD3DE8 FFAD3E00 Event
; H! ]; G7 q- T+ k) z9 X00A0 80AD63C8 80AD63E0 Event
: T; F6 A: Z; G' {! T; Z( P00A4 E28073A8 E28073C0 Key
! U: s+ h7 y0 ]) ^5 O1 E) L00A8 FF955588 FF9555A0 Thread& P9 T0 z( K) B) ^0 ?
00AC E2770728 E2770740 Key
. s* q1 b3 `2 c00B0 FF923438 FF923450 Mutant* f6 h Z8 v( w5 s" k8 G* ?
00B4 FFAE3B38 FFAE3B50 Mutant
7 r; r; I' g! M00B8 83B80728 83B80740 Event
9 A; g, O: y7 {00BC 83B80668 83B80680 Event
6 A. x$ m8 b: b+ d00C0 E2E3C448 E2E3C460 Section; ^1 z3 q$ Y( V
00C4 83776A08 83776A20 Thread5 I+ z4 }: \0 i( v1 S! @3 m( Z
00C8 81489E48 81489E60 Event
2 l' C, i5 g% n4 [' [7 ~00CC 83776CC8 83776CE0 Event
+ O5 }+ p) O. \! _ c/ J. w2 ]00D0 83776C88 83776CA0 Event0 W7 [2 n/ \9 x
00D4 83776768 83776780 Event V( p, b. U, F3 c, ^+ S s/ ~
00D8 E2837D88 E2837DA0 Key
3 }, z% L- |2 {% x, \% x# a+ `: \/ I00DC 8146B3A8 8146B3C0 Event
# [. e. s. B- W00E0 FF908308 FF908320 Event/ p# c) K( ?- N
00E4 81494868 81494880 Event1 W# z% M# Q' a
00E8 FF9064C8 FF9064E0 Event
! @4 f' \8 A; }00EC FF908FC8 FF908FE0 Event! c9 U3 ]0 l6 q
00F0 FF908F88 FF908FA0 Event" q/ U y* T4 o4 ]) H% Z# P
00F4 FF955588 FF9555A0 Thread/ T: D3 c' J" e1 x7 t' e. K
00F8 FF908F48 FF908F60 Event
. Y0 [1 R1 e" _00FC E2CB1558 E2CB1570 Port
, @/ Q. Z+ ~; g1 K0100 FF90A2C8 FF90A2E0 IoCompletion6 t5 H) _1 u2 D; n* H0 h2 I: Q
0104 E2CFE708 E2CFE720 Port
! P ~# I/ U1 e6 H5 s- p0108 FF90A2C8 FF90A2E0 IoCompletion
% a6 G" R: x D+ ]! Y010C 837762A8 837762C0 Thread) e' P. B: k2 @
0110 8103BBC8 8103BBE0 Event
5 p9 ^; ]: e# N% R3 s0114 813DBDB8 813DBDD0 Event1 |) F0 v1 m' z' s4 J6 J
0118 FF814788 FF8147A0 Event% _8 F8 K7 h+ i- z
011C E1358DA8 E1358DC0 Key$ x% k% `9 M0 K
0120 E2CFC428 E2CFC440 Key( [0 f0 D; l. ?/ e. w/ [5 z ]
0124 8103B9C8 8103B9E0 Event
* m; K* D# {. o7 k/ B$ q4 v0128 E2C9A968 E2C9A980 Key' r6 B- j7 d( c
012C 83B34E88 83B34EA0 Event2 ]' [5 ?; y9 ~* s; ]* [
0130 E2CFD948 E2CFD960 Key
6 m% ^3 r6 {3 s7 W: S; L0134 83B34E08 83B34E20 Event
. b S" Q' h; L....4 r" Q: w6 T/ ]8 Q
.....................省略9 C; r7 K) E" A1 [9 c
2 b {. J: }' |. T R6 {6 S看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?& ~5 L" p& Q/ F" ~7 D; o
# | p' Z+ I% a# R
想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此
; h6 g" i. D# E# `' W5 p' o
! q0 g! C4 |% Y可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路
0 f* v, i/ M# l t. F9 k7 k1 W* {9 o: ^' i2 x6 }3 R2 e1 V" O' y
后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需., U/ g- X6 @& z5 x+ ^
3 P( U; e7 P/ U果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS
. [; j% Z, y* W( q# p! f; \( \- M/ r2 h% P$ P3 e8 W9 R3 ~. A9 n
修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程6 _9 M7 `' f! W& T: A7 g9 `( _1 {
& B1 ~$ h' ~% A' y/ D#include a1 x0 {% C% t+ l
#include / c+ n1 W+ y) x s# R v' V
#include
6 z0 R4 v7 I2 R. G/ ]+ o#include % T( o' S5 ~* z; [+ M% I( m& K( \
( _- l: Y- p: ^/*0 x# z5 N- Q" ? l! s) B
* you''ll find a list of NTSTATUS status codes in the DDK header1 y/ A" X+ k, s% ^( {9 Z
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)2 ^* Y- c( K2 [+ k% q" K7 p7 |4 X
*/, E3 G' Y+ s0 M4 O9 e9 ^$ X
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)0 o. {6 z0 s6 N! C9 Y) E u7 S
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
' _$ G6 K' L1 C+ N9 o6 |1 h# R#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
4 a* ?& v! c2 c6 j7 K% a* u) G# ]
' X* [. \( k G% ]8 A/*
4 R' [; h O$ w- f; m( X- @*************************************************************************5 ^8 P+ w$ T$ u* A
* ntddk.h
) b3 [' `4 ]8 V+ ]) w8 l*/
/ i6 v1 _0 ~3 x6 s+ P0 ~2 Ctypedef LONG NTSTATUS;7 E/ N, `7 E- D. R( \. N
typedef ULONG ACCESS_MASK;8 i! q1 N& q; M0 J# K+ \
/*
3 m8 E/ s6 \6 U! O* ntdef.h
1 P2 m% R! g6 A' Y8 e) M" D, H2 w*************************************************************************
! f0 w! c! z, d$ i3 g$ T0 B) @*/. x6 P9 g. e! v" ^* J F/ ]: B M
9 P; ?7 V _2 ^ B$ |6 j. X% P C0 ?/*
& M) ^, ?0 v. ~2 Z3 ^( h4 d*************************************************************************" c' ~) Y0 |- c9 k! c6 {
* <> - Gary Nebbett" }% S% s1 c- Q" C
*/! y% E$ N$ h9 [3 b! \( p6 K
: |3 m4 J! j+ k, V* j& [+ Dtypedef enum _SYSTEM_INFORMATION_CLASS* h; f% r8 O* n9 E( l
{
- s L* N6 a. E) g* LSystemHandleInformation = 16
1 ^: e- e( @! a} SYSTEM_INFORMATION_CLASS;) Q$ L6 M- w, Z, F) z
& g& @4 A# ] P( [% z" n, d m/ ^
/*
0 l: L8 A/ \& W*Information Class 16: H- V4 I0 V/ x. {
*/
: {" w+ t* O* ]0 X; z/ Stypedef struct _SYSTEM_HANDLE_INFORMATION
; e' H2 X% G4 i; y{7 W9 n# h9 ^% D) v3 O) i- g9 s
ULONG ProcessId;
# K0 |! o( ]1 r" x0 h' \0 I, G" T iUCHAR ObjectTypeNumber;$ K# ?6 C7 x. [! Z0 m* ^. C f
UCHAR Flags;
% l- `9 |1 B" hUSHORT Handle;
3 ?! }' L. @1 x0 {: r7 i5 A" sPVOID Object;8 M0 N3 X' W4 Z3 q5 R
ACCESS_MASK GrantedAccess;
) o) ?5 i/ B# w% j( z' y} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
5 l7 G4 p; f r& M7 V3 Z U9 t1 \: [5 N+ E
#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; }
* F5 w' `6 j* i/*, [# B6 v+ |& c' K
*************************************************************************" L# p) X5 Q E3 n, R6 e& U
* <> - Gary Nebbett4 v% f7 I$ [ |% F4 W. [3 P" T
*************************************************************************
# e' X a2 g3 H K) }* N*// i' a* E; y/ B8 k5 J
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );& u0 @. x$ e4 F* B3 ^" ]/ h
typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );
% J a" Q- w0 ^3 d; G/************************************************************************( w* T5 Q& Q* _5 R
* *
; j* |& H7 L" ?& k4 s* Function Prototype *; R! R$ O& a; w/ m8 X. L% l
* *9 A+ K5 V4 H: s
************************************************************************/# u: L6 h$ w( _7 t- j3 v+ J' J
/ b( H2 K" ]% k# w8 g( r, A
static DWORD GetEprocessFromPid ( ULONG PID );
" E* d+ k# `$ ustatic BOOL LocateNtdllEntry ( void );
" D4 F; L3 S4 x; k$ `) a
' `9 Z+ `# x- G0 C7 h! S
" j! i0 H) Y7 d( S" w, D/************************************************************************
7 O3 \$ R4 E" u+ R+ ?. `6 S& X* *4 a; k3 w: e4 j3 ^% p4 a
* Static Global Var *
' ?4 I. M* c: T' f, z* *
% y% Q7 T# F+ Y/ Q1 L9 P* ?************************************************************************/! t7 E* Q7 |) Q% Q' ?, e& b% s
0 |7 Q v n9 i3 k/ `# U' R+ O/ Z
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;# W: G# a6 Y. @3 }9 a
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;/ O. k$ a7 v- b" n/ V
) o5 \9 E& ]6 @static HMODULE hModule = NULL;
: k W+ h" g0 K: i8 M3 r) n7 k0 n/************************************************************************/ l9 r5 D |! |/ q* O
2 Q9 b& S) P" `- E5 \( K% T& m! C" f# Q- H2 I" ]
static DWORD GetEprocessFromPid ( ULONG PID )
1 r# r' n1 T# Z1 ^{
- @: m/ p( E7 B9 O! SNTSTATUS status;" J& ?0 X5 A2 s" T: S0 k: ^
PVOID buf = NULL;, {' s7 m9 l" `' l+ R
ULONG size = 1;3 [# g0 ~* v0 f" M
ULONG NumOfHandle = 0;: z* d7 U% V! n9 }8 g
ULONG i;
6 E% ]; c7 V- c" Z% t2 ePSYSTEM_HANDLE_INFORMATION h_info = NULL;
9 q" Z, q3 d5 J$ f9 ]1 B9 }0 o! l: H/ e. g _0 z
for ( size = 1; ; size *= 2 )9 F) _. Q. c9 ^& ~
{' Z8 U! Q' s: @
if ( NULL == ( buf = calloc( size, 1 ) ) )* X! W8 K! R" m, v( L
{8 \5 [, c. ^$ J; r$ `
fprintf( stderr, "calloc( %u, 1 ) failed\n", size );
6 h4 A. t5 H% i5 L3 W$ j" D0 k; v8 rgoto GetEprocessFromPid_exit;
! Q* j& B+ m0 D- Q& _}+ u4 X( [" H# p( n; w ^
status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
$ Y6 W+ Y# z8 U. Q/ _if ( !NT_SUCCESS( status ) )
3 j% Y% t+ t4 M! a9 A9 y{' I/ u) @. J& `: T
if ( STATUS_INFO_LENGTH_MISMATCH == status )
) Q* P3 w! {/ u1 C( v* X{2 @# ^5 W" j$ I$ z7 I8 | j
free( buf );
4 p0 q1 r! X5 d, X- B+ Ubuf = NULL;
) W; R: J/ V% `, V8 y S}
* `) L j: l5 |4 t4 N5 Y- y( helse
% U- O7 d- d, t8 U, [0 [{! A" z2 d6 B; n! S
printf( "ZwQuerySystemInformation() failed");* J8 ?2 n" |% V# _
goto GetEprocessFromPid_exit;
[5 ~; c7 [9 d( M# a: j}
3 b$ I! p8 [8 A- k4 D* ]}% D# I6 d# ]' T6 {! V4 q$ F& U
else
* Z F) j! ?! x& J/ B{
' z; \- M6 X8 E4 \break;
) e7 }6 Q: W3 W9 j: ~' k2 p& c}
2 } W3 i, K5 }. w" `1 w} /* end of for */$ E' r2 m$ u" Z0 p6 X2 _0 h
. ?! p8 @* M$ d! w! O; \/ [' Z7 K//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组# ?* G, O& j! q4 x. p$ v9 r
NumOfHandle = (ULONG)buf;7 c2 Y& q" ~' |- d/ A$ Y
" e4 b1 _% L) l' j
h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);* `+ y O0 H$ R3 S3 P
$ v2 l& G7 ~7 z! V5 x
for(i = 0; i {
/ T0 U+ E$ \$ L3 h& j* `if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )
% z( E8 O9 M1 x{
7 D& g6 s8 K) hprintf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);
) s+ x4 u( y2 d" T ~return((DWORD)(h_info.Object));
( n1 C/ O8 K) G$ ~0 z1 C7 ~$ k}7 R7 r% G8 ?( _5 ?7 \+ z! M/ T6 v
}! {; q* w0 m# ?
GetEprocessFromPid_exit:
% U2 I" Z2 Q; ^' hif ( buf != NULL )2 R: I- D4 V: r
{( M7 ~/ Y9 k- }
free( buf );7 U0 E$ d* A! g
buf = NULL;2 l, H V4 z6 T! K# M
}# c2 r9 q0 a( x; `& q$ @
return(FALSE);
( @* k1 z4 j: B: g. r# t: p, O}
% f, l/ W" V% K0 y' g! l5 ?$ y2 R
5 J) k7 a. K3 @6 T- n/ S
% K: G' e) `& V! i+ g. `/*# |! S6 _0 @% x3 X) {! B
* ntdll.dll
( @, E/ o! M9 r8 C3 r# Q/ `*/
9 Z- }. P# n/ @8 z" y; gstatic BOOL LocateNtdllEntry ( void )
+ W( g/ e6 u# n5 U. ^* X; ?; O* E{
$ O5 W0 M0 U. j- H0 J e8 iBOOL ret = FALSE;- W, Y; | [% W6 |: X7 u- i6 L1 r
char NTDLL_DLL[] = "ntdll.dll";* U, F: U9 [! X0 o
HMODULE ntdll_dll = NULL;
" A2 b" q# e) s7 n9 ~2 K' b% T9 H" ?
; J0 M3 R- `6 f: k4 X9 U
if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )1 S) {, x* j w2 o# P1 E
{
4 M2 |* s3 N' C: {printf( "GetModuleHandle() failed");
5 R8 K; u& P; ]2 U' H4 x9 _9 Y. rreturn( FALSE );* ~, R$ |7 K' @7 \7 _8 o2 Q
}
9 h% f: G8 r4 A& E; F; v, ]if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )1 h1 X1 x H" Z0 u( a! }
{
' S% a4 M$ Z4 |2 | ~5 K7 H6 ^goto LocateNtdllEntry_exit;2 ]! z' g t4 p: _# K) I! {
}3 p& a: |! B7 j2 _3 W9 q
ret = TRUE;# [% n" e+ \8 K9 g2 J" Q5 z
! c% O+ o1 B+ l+ g" T) L: m+ e/ n
LocateNtdllEntry_exit:
/ Z) {9 L1 |: \
" V3 v4 z8 c; M# a! O# K. _if ( FALSE == ret )
- Z0 X$ S" x5 v' F1 |' J2 r5 B{& _2 B3 Q& ^( E, h$ \6 |
printf( "GetProcAddress() failed");
0 @; Q4 ^% T4 B1 w( p}
, y1 C* o& f3 [3 ^, i9 ~4 W% `7 @/ j5 antdll_dll = NULL;* G H0 M! ^/ X: D3 o: {
return( ret );/ g6 A1 H9 u+ |* M! t
} /* end of LocateNtdllEntry */! V8 q: N2 j; r+ ^2 R8 e0 ~
4 x* X6 K4 A* l0 T) u# ^0 M7 N! Z) B9 |( I$ R0 V! L' c) x
int main(int argc,char **argv)4 H! ], E* \2 w, b
{
7 F# b/ W4 T$ F% U, c _) c) r
% Y5 Y5 l: T) c$ o. i( O0 W$ \LocateNtdllEntry( );9 n$ w7 U7 j5 H+ A
- E1 i8 D6 i+ j//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5
( h Q: N% }# i8 C$ ~* N5 kOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );' E5 I) T$ r: A5 E* ]
* t3 ^% U) ^+ v$ ~9 I' B9 NDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );
. ~) ~# q$ ` B+ M4 f" ]6 V$ S( d( G! |* b8 p1 p: H0 A6 R
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);
) m8 @ k6 j5 V# g$ R2 |" L( |+ P- U
return TRUE;! `( S/ s# `4 u. [7 v
} |
zan
|