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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:; W' a7 T' C3 C9 r1 C
--------------------------------------------------------------------------------
+ U; K2 n! i$ v$ A文摘出处:http://www.xfocus.net/articles/200406/706.html
9 g4 X' W% K" f; g3 A& X+ ~/ j0 o! S) Z
创建时间:2004-06-01
' |6 @+ C& t B) m5 J; m文章属性:原创
( b- \, x; h' ~文章提交:MustBE (zf35_at_citiz.net)( v: K8 Q. B) L
$ H6 t% _* t* `; I
By [I.T.S]SystEm32) _3 g$ }& L! J
" Z) m& S) \0 r3 r" E
Welcome to our web site http://itaq.ynpc.com/itsbbs/7 @/ N: ]1 q" s" M8 ]
* m: G$ E9 ]9 m" B1 R- Y
thanks to SobeIt : P
; x5 R' R/ j5 @ ^5 J---------------------------------------------------------------------------------------------& v/ d7 {% O3 z3 L7 S8 B
! ~% M" Z5 R* P \' M5 U每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.5 H! L9 e; _: {5 G
" @! k0 M4 c. u0 W7 _
绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
7 a7 G+ D' ^0 ?% a8 h: ]2 j( Y! V+ q6 c8 ?
ZwQuerySystemInformation函数原形如下1 j1 {3 _6 g, g: q0 @4 ^
! n9 s: v7 T# Q5 D0 m c+ O# J
NTSYSAPI% Y& B& m! }+ P" s. X
NTSTATUS
& d7 ~4 h0 B! m8 _9 a# lNTAPI
2 G- ?" ]' B) {% E& X. sZwQuerySystemInformation
6 ] M. ~' w' O, _1 v& _- Z7 N7 _(
$ z: g: X: c; U. `, ]IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
4 O* T4 }9 J4 i4 I7 H) pIN OUT PVOID SystemInformation,
1 x5 M2 ]% |/ a# cIN ULONG SystemInformationLength, / r! j+ h- a8 ^) g6 H
OUT PULONG ReturnLength OPTIONAL
7 ]6 A6 V6 e% S, ^& g* ~7 Q) s' k);
; A q! R* F. ^$ {+ `4 S" g! D0 ]9 Q
0 B7 H9 a: L& D, U+ \ J参数意义如下
3 L* l+ z7 v2 ~& a* f$ e: j
( Z0 n6 p! u5 M4 v6 j( ^6 ^" mSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
+ `1 }& H. s8 b, G( d6 v/ i0 k) F- E4 u! u: Y
SystemInformation:指向一个接受系统信息的缓冲区的指针
1 i0 C3 B+ t; t6 u9 T9 F- j
' Q; {8 p9 M q7 v& TSystemInformationLength:缓冲区长度9 |) B- P4 r- u& Q7 ^: ^
4 `, B: O, X. g. B' Y0 y) L
ReturnLength:指向一个接受实际返回字节数的变量,可以为0
# {, L9 d% t* r- m. f& p
* V+ |9 s: i& D$ R1 {* d9 Y$ {3 i9 A" m. P* F* J! t
为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation* g' C' O2 f/ b( n6 u
3 S& b# q* u `+ ^1 ~ {8 h7 NSYSTEM_INFORMATION_CLASS的结构如下( N1 m( d( L n( {; l& [6 E
% a% D! L' X" ^ }* U0 otypedef struct _SYSTEM_HANDLE_INFORMATION; ~( E/ ^, H) D" z
{! d$ W: b/ e4 a9 q3 Z, _1 L
ULONG ProcessId;7 ?9 f' H" d2 _, w4 ]# F
UCHAR ObjectTypeNumber;
h) T" u5 P: q$ l7 f) L% G/ |UCHAR Flags;
$ M9 s) P7 }' i# L& gUSHORT Handle;: s2 E- t+ G. S8 Q9 u+ {% E
PVOID Object;3 u, B9 x7 e" [- }
ACCESS_MASK GrantedAccess;4 ?: L( S1 L% k- q2 D
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
. U( i. H- ~7 u9 F7 \
% h8 Z8 T7 v" x9 Z, X+ zProcessId:进程标识符
* m/ O& k& v" M D
' b# q, L; o2 E- J7 G0 nObjectTypeNumber;打开的对象的类型7 W: m9 ~/ ^ o* U" e0 Q t8 q4 T
) R. I! K; U( C$ R' x: h8 J
Flags:句柄属性标志, v, A% t# u0 }3 n! @8 H* C& e
! W$ g9 ^6 T* r& X: Q: U$ CHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄
0 I# ^3 k' f/ ~& c! A, N1 g
9 z6 E4 ?6 e: H4 a+ FObject:这个就是句柄对应的EPROCESS的地址
. {# W9 C% Q7 ~1 r0 N8 B0 q* C1 q; z+ b( s; {: \( x! s2 | t9 \" A
GrantedAccess:句柄对象的访问权限
9 k$ L' V% ~/ i% a$ I6 l
! U. \4 E, s7 j) @, H6 C; v) F- t- c+ |
下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )3 J a j4 F" V& p/ ~
3 {6 G# H6 w5 i6 f: _
比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄9 Q) R0 v; b& v E6 w! [
2 m6 d9 y6 a6 s7 |# F
怎么会这样?难道程序写错了?*_*5 x$ t: u, m8 R* I M3 I" |
) B, W$ J- `7 n {5 l
现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出4 l! Z' [" g/ {' J# a, i1 ~( b
% V: W% R% T$ N# H:proc -o QQ
. X9 s' h6 _9 \7 NProcess KPEB PID Threads Pri User Time Krnl Time Status, m2 j" J- |- T, o/ |
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready
/ r0 W4 R5 s" }, ~( v' S* i9 @
- l. K. ^4 Z. T- O* r---- Handle Table Information ----
- A3 j" r3 @+ l
2 m; @! s* h1 DHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
4 K) ^+ S% M1 M3 d
, X% ~( B$ ?. K/ vHandle Ob Hdr * Object * Type
5 X$ g% e' P- U! }: y9 J0000 00000000 00000018 ?
5 d* o* x: l7 ?: h0004 E2DA5E58 E2DA5E70 Section
8 d. k+ w. `" E8 v; y, z% i2 Y0008 FFAB35C8 FFAB35E0 Event
1 `, J b( T, g" S& t000C FFAB3B08 FFAB3B20 Event; r% U1 V4 S% A2 v# y* \' {6 g
0010 85C70188 85C701A0 Event
2 F- E) i; E+ C: ?9 K0014 81515778 81515790 Directory w% z2 |* Q! f# H( T
0018 FFAB7BB2 FFAB7BCA ?
4 y# y( l8 x0 M$ Y0 @001C 814A1858 814A1870 Directory
) w7 C, j, i$ o' C" w0020 80288C88 80288CA0 Event% l! Y: g1 X) }* E
0024 E2CFE7F9 E2CFE811 ?
2 R2 S) L# L* c4 j0028 842D7B08 842D7B20 Event$ Z. u6 \4 b5 b: v( M( b
002C 80E9B989 80E9B9A1 ?& t& ^. C6 y c* J+ h* C5 q; ~
0030 E1372198 E13721B0 Section
1 W( k8 P/ r4 C( E4 Q1 r0034 814602C0 814602D8 WindowStation
( y( C: y, ^! ~* q* G6 _ ~( E* C0038 81455CE0 81455CF8 Desktop% N8 l& ~# W2 X }5 k
003C 814602C0 814602D8 WindowStation5 L* H! D8 h( [3 D4 ^7 G- D5 ^$ n
0040 E2B3C1A8 E2B3C1C0 Key8 [7 T ?5 j8 K6 n4 G) \8 n! C4 |. M) ?6 R) z
0044 E286D6E8 E286D700 Key- A& A/ z5 ?5 O# q( }( V' y* `
0048 E2B3C0E8 E2B3C100 Key+ q5 T" t3 m% }. j
004C E2B3C068 E2B3C080 Key
, }; s% I- u3 G+ ~1 m$ I0050 E2BEE688 E2BEE6A0 Key5 e3 M% i2 L* Z. y
0054 8147C998 8147C9B0 Directory- a, r2 I6 v$ |/ t) {
0058 829D1128 829D1140 Event
5 a0 e3 f/ e# B/ { }, W005C 83F991E8 83F99200 Event0 I. z# E! k6 j" ^; Q8 ~" G
0060 E2BEE608 E2BEE620 Key
% i: d' h$ Q8 Q; U: U! m( G0064 FFB07568 FFB07580 Event
% w1 {& Q& f* [5 X0068 801747E8 80174800 Event
, q( S, q" r7 B* U* K006C 80174828 80174840 Event
* ^" d* U0 C$ Y1 B$ x6 H$ G0070 845E8808 845E8820 Event
( S( d7 Q& ~) m$ k. G0074 81448798 814487B0 Event
* ?4 v. e) K0 F1 Y S0078 E2B9A888 E2B9A8A0 Key' y+ r4 x* ^% H0 d, S
007C 845E8648 845E8660 Event
* _' T' X; g) e" O- u3 Z0080 FF9E2DB8 FF9E2DD0 Mutant
+ q1 u6 M) [3 U; o" V- O5 H2 X0084 FF9E2D58 FF9E2D70 Mutant
* W1 H8 S% T) O0088 83CFC378 83CFC390 Mutant
2 H/ Q, A( Y1 B/ ~5 ^4 ~008C 801749B0 801749C8 File2 R5 w$ b& v2 S
0090 E2C48668 E2C48680 Section& N( \2 K# {" C6 x) N' R
0094 FF965168 FF965180 Event9 m- c9 g5 f( _% O
0098 FF9E7D88 FF9E7DA0 Event
" J% M! H0 x. ?, _& O009C FFAD3DE8 FFAD3E00 Event
- i) E2 c+ b! M& G! H00A0 80AD63C8 80AD63E0 Event
d: k+ n/ T4 {1 v00A4 E28073A8 E28073C0 Key8 F- B/ \; ~3 b7 z1 a! u
00A8 FF955588 FF9555A0 Thread
e) j7 G" q5 `( I8 B/ W00AC E2770728 E2770740 Key* p D# `# }! ?) e" ^# X+ g, K4 c
00B0 FF923438 FF923450 Mutant
% H2 o9 G9 `% o2 N% a5 b+ d00B4 FFAE3B38 FFAE3B50 Mutant+ O8 W/ F! }$ Y0 f4 {
00B8 83B80728 83B80740 Event% g: }4 l. _- K( ^3 J+ q
00BC 83B80668 83B80680 Event
( ^ |. L/ x$ u4 k x& N( b* Y" s4 G& Y00C0 E2E3C448 E2E3C460 Section( r+ X( o4 y, l( k& ?
00C4 83776A08 83776A20 Thread
# z' T6 t; v+ s! t00C8 81489E48 81489E60 Event( z/ L( J | `" t- L7 F
00CC 83776CC8 83776CE0 Event1 j7 m* a$ |' U% d
00D0 83776C88 83776CA0 Event
! z& I8 c: l0 Z+ C/ ^' N, n$ W( V% T00D4 83776768 83776780 Event
! J G3 x2 m+ O4 `( A00D8 E2837D88 E2837DA0 Key
3 S: J4 o5 t. {& b: m: A( i00DC 8146B3A8 8146B3C0 Event
- @% z" i0 t, L4 T& ?00E0 FF908308 FF908320 Event
0 ^& \8 \6 ]! c( y5 B00E4 81494868 81494880 Event$ }) X7 I& j: L
00E8 FF9064C8 FF9064E0 Event4 X+ u" o9 ]4 X% t" O( `
00EC FF908FC8 FF908FE0 Event: r% i/ \* U+ L$ |/ z
00F0 FF908F88 FF908FA0 Event
% g/ q2 e0 X) N$ Q: {: t$ c00F4 FF955588 FF9555A0 Thread
( R. L0 J% ^' X8 ~9 l1 t w00F8 FF908F48 FF908F60 Event7 o# e! u# R' y: J7 Z! [
00FC E2CB1558 E2CB1570 Port
; y- H6 U$ f0 T: v9 O$ ]9 @5 f8 y0100 FF90A2C8 FF90A2E0 IoCompletion: U3 ?: {: D3 v4 Q' X4 m5 ]
0104 E2CFE708 E2CFE720 Port
s L. z( K- P3 y6 Z2 _4 b, G0108 FF90A2C8 FF90A2E0 IoCompletion& _5 ~ t; f9 V
010C 837762A8 837762C0 Thread
) e1 {1 i( G7 J" e- {# c9 B" Y0110 8103BBC8 8103BBE0 Event
( h& L7 G- |! \3 `9 p# [0114 813DBDB8 813DBDD0 Event
" x( |6 V" v+ {; X- i3 ]7 z) r8 Q0118 FF814788 FF8147A0 Event9 }. X5 x2 B) ~7 ]; _
011C E1358DA8 E1358DC0 Key
5 f/ B8 R! ]) u& x! g F; D' L0120 E2CFC428 E2CFC440 Key/ Q* a) D2 w E) i& ?
0124 8103B9C8 8103B9E0 Event" L4 r6 ~& ~2 [" v( X( O% A
0128 E2C9A968 E2C9A980 Key' d( S# n+ Q4 T
012C 83B34E88 83B34EA0 Event' P F ^- d# g
0130 E2CFD948 E2CFD960 Key
$ C) Z! ?0 v2 j5 ]5 S0134 83B34E08 83B34E20 Event6 `( t+ \( \/ U/ S
....: I9 S- j- [, Y+ G" Q0 S0 l8 R
.....................省略/ B) b2 q/ _: o y7 e: ^
7 o- q* F$ b5 F2 M$ u2 X看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?
+ W: u8 q& V2 |
/ \- F/ v" l& \" r1 a( `# n想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此
1 F- c2 X: O& ]6 g) r* K
4 z g0 ?( `) p0 t4 m可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路
& r; b$ R. `! X% h, ~# g6 @
7 @- C+ l, a* W8 _2 M& X: f: Q; N后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.; F c) @0 D. l3 u
8 \, x+ n( {/ I果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS
+ d7 h6 f: w' P3 \
! P- D# |0 y- c: X3 z+ ]修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程' ` X# J! E6 {& `& i- P) l
8 a, W S; _0 I, a
#include
$ j( N% A0 K3 X: L8 ]# e3 A#include
5 w5 v( B; s/ \! ~ O' |) C# X#include
, Z/ R# Y G. ?' b#include I( v. f6 R8 a$ X* i/ k; o. a
Q g& r% Q* b4 D7 P) I/*% m2 i( Z: Q/ l; ^1 T
* you''ll find a list of NTSTATUS status codes in the DDK header
* l+ `3 Q2 \/ m! Z+ j# m* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)0 Y: Q0 w4 k8 r; O$ f. p2 \
*/
" m' i9 J. |! {1 g#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)5 w$ ~: y% I6 e: A
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)9 |* g8 @; d8 w. p; v4 G7 g
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
4 o6 r* ?. S% `% D4 l N2 a( k% J6 s$ O( ]) @+ F6 _
/*. t* x( O4 k( y( P) q
*************************************************************************
% C. e3 p3 G: i* ntddk.h" L% N8 v; X; r( b8 j! @
*/
- j! Z- E7 q2 Mtypedef LONG NTSTATUS;
- |- S1 |) z1 Q1 [! U6 I$ k1 J5 e; vtypedef ULONG ACCESS_MASK;; A& V) V3 @2 \0 B
/** c7 q+ [( D4 l2 h; H
* ntdef.h$ y/ k5 s- b. D5 d: V. S
*************************************************************************
: k1 D# i: h/ X% s2 a" K*/
5 F0 [2 [% f+ z7 d1 a @6 W! _5 o: C
/*$ z" w/ z7 i, s) V8 T: K+ D
*************************************************************************7 f- `. ?; }3 |, D( [: d$ e
* <> - Gary Nebbett7 ?6 Q+ J2 Q8 h7 m2 D6 m
*/3 c+ d" v4 I) U( P9 g7 f
; K$ s$ n' k3 ^: M t# S o- s
typedef enum _SYSTEM_INFORMATION_CLASS
6 T0 k( W3 E+ U* I{
! l8 i# N: n2 b! tSystemHandleInformation = 16/ N8 N+ G) h! U% u
} SYSTEM_INFORMATION_CLASS;
! |2 X/ t+ G; h% ^# L& P! K' }; Y- @0 t! W& S* r7 ^$ |
/* G7 X |7 L4 \9 _5 i3 n
*Information Class 16
4 c1 a' M, W7 p# T2 y$ Q*/
2 z. C+ ^/ a6 {" n( itypedef struct _SYSTEM_HANDLE_INFORMATION
% u: b7 t& N+ ?" t$ {) B{
1 K) U/ g+ y7 A2 V, S: }ULONG ProcessId;9 [$ l% w) A# J
UCHAR ObjectTypeNumber;. h! E) t' j# @- J! M' Y
UCHAR Flags;
/ I9 O* r6 j* S3 C& D& m8 E$ w$ `" d7 V/ MUSHORT Handle;4 d3 ^2 X$ }6 E, W3 |- P0 O$ i
PVOID Object;
, C) L% `" j0 jACCESS_MASK GrantedAccess;- V! ]8 s& Q7 Z4 J- _/ J
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
, p, N& s X# K8 ]5 I) s: e1 D3 z2 b0 E/ T6 L2 L3 s
#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; }
* i- t7 w f# N( h$ T/*! m* K3 E9 ?; ?$ E. c( f* f% o
*************************************************************************# K. D. `7 p" i' D
* <> - Gary Nebbett. S3 B7 H0 g! n- Z7 S9 w! W* Z
*************************************************************************3 v; t8 q% M$ m, c
*/ z6 R5 u3 g9 `8 p) R
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );
1 P! O u3 O$ f9 itypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );) j7 c8 ?+ [% I( {3 B* \
/************************************************************************+ R8 N8 \/ R$ x, k9 {. n& J
* *( R! _: e% G1 p7 @" L5 ]4 q a
* Function Prototype *4 u8 c& _; ]' v1 {& A8 u- u
* *
# g/ H9 c9 I9 V4 q************************************************************************/
- X4 n' a/ \9 s2 [' z* {. E0 f. l- l! R2 u7 j& z% x7 U3 |
static DWORD GetEprocessFromPid ( ULONG PID );
4 O/ z) x6 y. {# U- dstatic BOOL LocateNtdllEntry ( void );
. H$ i0 H# y6 m9 @5 A" `5 H5 g" l
5 @% l- ]5 r. m! t" ?" T9 v* Q2 w7 G1 J1 a$ j8 [. H
/************************************************************************/ A! u* X# f$ ]7 g+ f
* *
; K) | m4 a3 X1 f0 {( c* Static Global Var *
/ n6 Y# s/ P# ^: j: ~2 S7 T% g* *7 p& g6 k( d7 `9 v( ~" Z
************************************************************************/
# L v- M$ r' V# D- b# R# N$ M& ~/ P" Z+ b8 c I. D
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;
7 v) G6 J$ }! c: H: I$ q2 Hstatic ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;
2 a# Q1 S8 l) Z4 }) t8 E" n! E
, O2 W( X9 R8 U& Q3 l9 }static HMODULE hModule = NULL;+ ^$ Y/ b2 ~' m
/************************************************************************/
8 P" D' u' D( H5 P+ @8 r& L7 r$ S$ y- i+ f. u" ]( ?
& I2 `( D4 B t: l1 ]! _# nstatic DWORD GetEprocessFromPid ( ULONG PID )
' u3 C9 o! f, G) Q/ p1 _7 m{& {+ {+ A! x, |% j& q
NTSTATUS status;
. \ M$ o* f _1 Z1 }0 }PVOID buf = NULL;' o) N+ U5 c) o' ~7 {1 C; C! r: w" A5 U
ULONG size = 1;( ^0 n9 H- q4 R9 k
ULONG NumOfHandle = 0;, O- y2 S* _6 u3 \
ULONG i;
1 M6 n* e( c9 B2 G P9 o* K7 X ?PSYSTEM_HANDLE_INFORMATION h_info = NULL;" [6 g/ I5 O* C$ o. k
+ w7 p$ N7 |' c9 Y! e( k- i
for ( size = 1; ; size *= 2 )% b( ~! W, W% d& G5 l( U
{% u* C: j% J- w9 C( |# ?9 L' n
if ( NULL == ( buf = calloc( size, 1 ) ) )
, T+ y/ S9 U( s+ ^/ S3 v{
$ X+ p* d& C4 R( _& lfprintf( stderr, "calloc( %u, 1 ) failed\n", size );" _6 F7 P' e! s1 { h; ^; k
goto GetEprocessFromPid_exit;
: T3 M$ x. ~9 v1 ]! E( ^* k}
3 v* B" Z5 F" k4 b7 Z+ {+ qstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
3 `- @/ y7 a0 l8 gif ( !NT_SUCCESS( status ) )
3 `5 w A4 J) @8 y8 v{# v: h; a# b {0 V
if ( STATUS_INFO_LENGTH_MISMATCH == status )% p) F- a7 P; E* b) K
{
* o; ^1 b; ~1 q; q! D; k7 T7 Yfree( buf );0 E" K o# k; ?+ H( V: _5 E
buf = NULL;
' x. r7 w3 g% c6 y( O X2 o" W}
! {3 L- `$ _6 j; |) T& M: h6 Nelse1 _+ f% N+ W* N7 Z+ s/ h5 J
{. m3 V7 m9 t9 n4 T; r/ H% K# @
printf( "ZwQuerySystemInformation() failed");& r! `) W1 n( f3 N
goto GetEprocessFromPid_exit;
6 q. e2 R) N- R" [4 X5 K& o" b}( U8 }# u+ \3 k' o& q/ z
}
$ L6 `1 @- P- x) G" Yelse
) _( N6 |, Y/ E8 @0 e{: [" v: E( ]" R" V& @
break;
8 \2 K( {( V$ N3 s! ~, [$ r}9 Q* d' B. V+ u+ y4 x v
} /* end of for */+ b3 g3 i+ W; W: Z! P+ p4 M5 A
5 R. C% k' x D+ I2 s: f, d, a J//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组
) e. D% }3 ]) e* B5 D! p XNumOfHandle = (ULONG)buf;; Z* \- U9 }+ y
" W6 H( f/ C w# A# f" ]( }
h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);4 w) Q4 u1 { y
4 U' t- V7 h* x. W8 [/ Xfor(i = 0; i {
2 q1 W& ~. r" C# [# eif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )# A& A+ q7 {9 |9 x8 Q
{
( q; Y1 e- C! F' r U- Y l/ G* j gprintf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);
4 N* r2 P9 A9 G; } M8 u2 _return((DWORD)(h_info.Object));
; A5 j2 C- R$ y}
: E0 U9 l+ S5 H& [2 X1 N! k# Z}* Y+ g5 s, V, J+ W' E
GetEprocessFromPid_exit:
0 N7 V6 d; L: ~, m" S; Tif ( buf != NULL )
4 Z; p W. ~8 y# y. w x5 o{
) F! S3 i2 R: [free( buf );
+ j5 J0 Y7 ^7 K [& I ]buf = NULL;3 V! P9 J/ G) s5 S4 \. i: I( n, o
}% v! ^" _0 ]$ X# j. k
return(FALSE);6 {- k( ^) T! G5 \8 o
}
0 N9 J, W- o0 b8 W7 p! G w% a& g+ j( D# U8 A6 [: D
0 \7 O' U: |0 F6 L4 F# m1 p) \/*2 G3 E0 T( x/ |
* ntdll.dll
, s5 i$ T9 Z, @/ ], A$ t8 Q*/
4 Y$ z) `% {! V0 |static BOOL LocateNtdllEntry ( void )
" D1 N, Q) v2 q. E0 A4 n{; R6 h% I4 I8 @+ g8 G; |" ~
BOOL ret = FALSE;
# O+ Q! a N( zchar NTDLL_DLL[] = "ntdll.dll";) a. y, {, V, w
HMODULE ntdll_dll = NULL;2 n$ ]0 m$ w5 o! T: f
9 j3 i* @8 T4 o2 l; Y' w; n9 R3 Z
if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
+ u$ N/ y: }5 M6 Y4 W{. e2 l- G. \4 B! N* c& G
printf( "GetModuleHandle() failed");
9 w/ d. A, R0 ereturn( FALSE );# T9 \$ q- L u8 t
}
8 C! ~6 c+ f6 x) O1 rif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )
4 s3 N) r& A/ m+ R{
X( E& H6 ]1 k, L) X( i# tgoto LocateNtdllEntry_exit;+ z! }) H( l- m* ]) b2 e* D
}) Y" x2 d" v1 c: Z1 y
ret = TRUE;2 O6 U8 d/ @) |( L$ M7 d
0 l; H+ B2 I2 l* ]LocateNtdllEntry_exit:
3 h# k- N9 p; Z. `+ |+ p) h) w, h, a( B
if ( FALSE == ret )
( n) M8 J- E# o8 W& C+ h+ @% N& I' J! G{" A* s9 W9 P( v4 @1 l+ S
printf( "GetProcAddress() failed");1 P$ e% u1 i7 A# Z. a. }$ r* B, q
}; T! t7 l6 ]5 j$ p
ntdll_dll = NULL; b! G0 |& D! Q/ @9 W
return( ret );$ y; T$ I6 `2 E- F; @0 U4 r# L$ N
} /* end of LocateNtdllEntry */
, E8 H7 L7 F/ u S5 [3 Q9 n. {+ |/ D- \/ H- l9 I
$ I0 G5 W A$ J" `6 o" E! ?int main(int argc,char **argv)
1 Y& n0 `8 O1 V) M8 j{
" E4 U$ ^7 b7 s0 j3 b6 `6 s0 v6 g; I4 [; q; o7 X9 D# z) {! j
LocateNtdllEntry( );1 C, l; c0 K+ s2 m
1 g ?3 O& I3 X( z# G' Z% t0 X//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5- |3 u; D' ?1 |( P' X
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );
# w9 [, m @9 {5 Z1 o9 A# j# F1 h* _1 e" ^- i
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );
3 |/ }9 `6 f0 g! t+ Z9 V' l" S3 S8 E. H
printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);; Q5 X2 n! S) D- q4 G9 o. X9 ]
) K2 p9 L9 ~3 m q
return TRUE;' @. _8 S* N9 t8 Z
} |
zan
|