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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:
5 \( u8 Z c- u! H) c- K3 t; v--------------------------------------------------------------------------------; a! y9 t. S# K5 C! {
文摘出处:http://www.xfocus.net/articles/200406/706.html* x4 x v9 M# j+ l) L
- `* W0 ]3 K9 K
创建时间:2004-06-01: X5 |2 U _: \/ o, m0 B
文章属性:原创
1 s" n1 H! r! Q7 n7 ] P文章提交:MustBE (zf35_at_citiz.net)% e7 k! i* R& P7 _
- i7 Z9 G" I9 F' v. n# j& W4 xBy [I.T.S]SystEm32, I4 V _% g% i% c0 S
( M/ t! w$ v6 D5 n& G5 m5 p- X, fWelcome to our web site http://itaq.ynpc.com/itsbbs/# y3 `0 q g/ P0 X8 X; v6 A
S, K/ ^/ S8 H% @6 l3 m6 zthanks to SobeIt : P
8 t& f) H& ?. @1 G' }: L---------------------------------------------------------------------------------------------' g+ d) H) R6 i/ s
! U6 S; D& y0 z/ e- C5 [5 k6 Q每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.: N3 |- O1 c8 @( ?8 h
- f9 K$ v: Y) W6 F
绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
! \2 O' Q7 t: ^5 v8 y
/ e7 f( p7 \5 X% xZwQuerySystemInformation函数原形如下
+ u0 ]* A0 y. D, n/ G4 L& b
& i1 n* H) S- j/ Z6 G. ANTSYSAPI
+ H+ F, M7 S: h7 @: K( D0 P0 INTSTATUS6 L+ }4 W. X$ f' F& o- u4 _+ w
NTAPI
% M4 F( h! o! R G* }+ ?ZwQuerySystemInformation
9 C: p/ E8 P1 e2 l6 X0 a(
& ~+ O5 i5 `4 _: wIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 4 {* B' t; {9 x! T. H& z
IN OUT PVOID SystemInformation, 6 u$ I. z- f( m8 k
IN ULONG SystemInformationLength,
6 u6 L. z4 l& M$ M5 i9 s. c& Q2 UOUT PULONG ReturnLength OPTIONAL
9 G2 n4 h- {( Y+ m7 ^) m);
6 I2 v" T" X$ ] Q! r
+ W6 k, ?7 [$ M% i参数意义如下
. ` e1 T/ h. t
4 E& q2 @5 i5 `1 [5 M qSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一
7 ^" C, h/ o& U& r9 _ x9 ?4 @. J
SystemInformation:指向一个接受系统信息的缓冲区的指针" T e# W+ G6 P
& ?9 x0 l- T+ A3 t: c" f! q
SystemInformationLength:缓冲区长度
6 g* q! H' W/ V0 d% s X
. t* U* t. @) r1 s/ G! X' MReturnLength:指向一个接受实际返回字节数的变量,可以为0
, p" k( f k$ |* Y- ]6 f* t
/ r# b# U$ b5 W+ e7 r8 g9 r( H( T$ K
为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation
- I# t p. O2 b6 l' h: i
1 c( a6 c& l3 NSYSTEM_INFORMATION_CLASS的结构如下3 f6 Y% q9 B) F
" b7 X/ M5 I8 o G0 V8 Htypedef struct _SYSTEM_HANDLE_INFORMATION, }9 F) w6 G0 M4 f% I
{$ f# D& w4 |$ b! y0 K* L
ULONG ProcessId;5 A0 G2 P- D9 J6 A
UCHAR ObjectTypeNumber;! X4 w& `: r& T2 A/ u7 \8 B7 @
UCHAR Flags;
! m* x0 m4 [3 p0 ]USHORT Handle;4 ^: d* d( g' p" _/ M- }
PVOID Object;
# B2 x: M, W" ?5 O7 YACCESS_MASK GrantedAccess;
" E1 f: z( B# x# M! t6 N* f, n} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
7 E" J" O9 H' U
, w7 r& I; J9 |, HProcessId:进程标识符 0 A$ h% @( {- ?0 _$ g$ a: ?
' A* V/ b3 B( ]6 e5 L( v9 N% KObjectTypeNumber;打开的对象的类型# |7 R' T3 ]$ w r3 G
: G' P2 w$ e# P i8 u$ \! iFlags:句柄属性标志
2 B; T; K3 K2 }. ?9 ^+ U: C5 T, V% A! l v7 P
Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄) g. R0 _ s! h1 Q" h, C$ _
% K' l1 y* P: E/ A- @4 o4 q
Object:这个就是句柄对应的EPROCESS的地址
0 g( K" B7 P5 V/ I
5 o, s1 m9 r. t$ U2 \( y1 o& \5 MGrantedAccess:句柄对象的访问权限
4 m' p% O4 n5 U$ f) |
4 B/ t& q' C" q6 P, _
- I" j7 [9 Z# ? s; _下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )' d: K5 _! \+ W# e7 w. d$ ^5 N" L/ B
2 A+ i6 m8 ]! _- W比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄
/ z, y: Y2 Z- s, O$ `6 `) [, h* U
( Q5 o5 w( X6 z" O! _怎么会这样?难道程序写错了?*_*
8 l: `; R( E0 V) S0 \! b2 ]
& H/ L" R0 P' a1 x# f; E: S现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出3 F N7 W a$ t) \# ^
" G4 L4 n/ q. n! e7 P8 H:proc -o QQ
* G' n/ m( P& S; `' P6 qProcess KPEB PID Threads Pri User Time Krnl Time Status! S9 C. C8 n6 y5 R
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready2 A' T- b4 J5 q; |- E/ [
# ^" x( L4 K/ y1 e& v---- Handle Table Information ----7 d& p1 _/ ?& [: r
+ [5 t" C" s( W) sHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
* P4 s% a' X, u) o q1 T2 d
% N* L5 O4 Z- i) \; ]1 NHandle Ob Hdr * Object * Type
& r, V# {$ a$ ^% N4 U& P' c- R0000 00000000 00000018 ?
, b/ a' E- h% }: }' O6 Z0004 E2DA5E58 E2DA5E70 Section/ p$ ~; \& W2 `9 C' H) |
0008 FFAB35C8 FFAB35E0 Event
! p9 L7 d \0 ]/ H5 v000C FFAB3B08 FFAB3B20 Event/ C0 c1 I' \; [
0010 85C70188 85C701A0 Event
, E1 L* [, J \" v- O0014 81515778 81515790 Directory. p/ W* v5 N/ \ [& e
0018 FFAB7BB2 FFAB7BCA ?. c+ F3 c$ A8 V% [4 h
001C 814A1858 814A1870 Directory
. u$ j! z% \+ ^, R6 [3 Y' e U0020 80288C88 80288CA0 Event
" S* a1 i% G0 h- v* O/ q/ l! B0024 E2CFE7F9 E2CFE811 ?; Z& h k! Y, K5 n2 {
0028 842D7B08 842D7B20 Event
* w% r; g5 a# L+ {6 L% O2 Y002C 80E9B989 80E9B9A1 ?
! L2 h7 J1 A5 m8 ~& E& o/ v: [( v0030 E1372198 E13721B0 Section
. C+ t {7 u5 ^3 t/ B6 m6 s0034 814602C0 814602D8 WindowStation4 @. k1 D; j: A. h" y
0038 81455CE0 81455CF8 Desktop4 R+ a7 _( ~/ b) |
003C 814602C0 814602D8 WindowStation
7 B+ @* G! c" W ~0040 E2B3C1A8 E2B3C1C0 Key1 z9 X8 g J& ~ _# T
0044 E286D6E8 E286D700 Key$ S, w9 H1 O, \/ _+ f" W
0048 E2B3C0E8 E2B3C100 Key6 X; O4 x) j8 u- S, J [
004C E2B3C068 E2B3C080 Key
, m p' z8 V# i5 F1 G) S0050 E2BEE688 E2BEE6A0 Key
% Q0 }1 I$ _ R* T0054 8147C998 8147C9B0 Directory" q9 ^7 O2 m ?# R
0058 829D1128 829D1140 Event. B5 ~1 }. t% R% I) k
005C 83F991E8 83F99200 Event4 e: t7 X2 _$ b8 H$ Y2 m
0060 E2BEE608 E2BEE620 Key
( z/ Q/ Y9 g- s5 s0064 FFB07568 FFB07580 Event
; o B, m5 K/ W0068 801747E8 80174800 Event
1 d$ e7 s5 Y: A, ?, a' u006C 80174828 80174840 Event: g* N% K3 i7 E: Z, G: ?$ ?+ ]
0070 845E8808 845E8820 Event
. [5 q* _' J: O! F0074 81448798 814487B0 Event0 [5 {) [# {- _: ?# S6 A% Y6 k
0078 E2B9A888 E2B9A8A0 Key3 _4 ~! _- q! X2 J
007C 845E8648 845E8660 Event5 }3 }% N, b6 f# X
0080 FF9E2DB8 FF9E2DD0 Mutant* L( }' y. u' z5 [1 U
0084 FF9E2D58 FF9E2D70 Mutant8 r3 A$ P& v' A8 y. M* {
0088 83CFC378 83CFC390 Mutant, i6 k' V$ u0 |- R' i# s
008C 801749B0 801749C8 File, d7 s; x& ~7 j% ]2 J! v
0090 E2C48668 E2C48680 Section1 r1 i0 A+ q5 z' m( w1 Y
0094 FF965168 FF965180 Event- p2 P2 Z; [( K4 @7 }
0098 FF9E7D88 FF9E7DA0 Event
& u$ T( `! p$ H009C FFAD3DE8 FFAD3E00 Event' H* ~/ z, O1 g8 r/ i9 W0 g
00A0 80AD63C8 80AD63E0 Event
$ w* i; B% U& S% j! T* F6 [00A4 E28073A8 E28073C0 Key$ a$ O% q% ^9 z" J' D' V ~8 L
00A8 FF955588 FF9555A0 Thread
& W, s }3 ]# @00AC E2770728 E2770740 Key
) D8 q, M5 f% T: e00B0 FF923438 FF923450 Mutant% O, m/ y: d# z4 _
00B4 FFAE3B38 FFAE3B50 Mutant
# ]$ L% P( n+ E) v. V. v00B8 83B80728 83B80740 Event
, |+ h- ?7 N2 B. O00BC 83B80668 83B80680 Event
: s/ l4 p" b$ G5 I+ l- N1 x2 t5 K00C0 E2E3C448 E2E3C460 Section- A. _& h8 J- S% C- g
00C4 83776A08 83776A20 Thread
: b4 ]8 B: m* |) Z$ @+ Y$ h00C8 81489E48 81489E60 Event
0 y; P$ `: [; a Y6 j( {5 x00CC 83776CC8 83776CE0 Event
0 h* N( {& y/ ?0 p% c00D0 83776C88 83776CA0 Event7 q$ q1 \2 G- |* _
00D4 83776768 83776780 Event
2 ]& q& h& M. ?: d. Q00D8 E2837D88 E2837DA0 Key
+ g7 D! k/ ] }+ ~6 u! G00DC 8146B3A8 8146B3C0 Event- v6 B+ I4 e3 w4 i4 E6 }
00E0 FF908308 FF908320 Event! W- t. r4 K/ o, q G
00E4 81494868 81494880 Event( p# t! b. h6 D7 j# [. |; |' C: l
00E8 FF9064C8 FF9064E0 Event" `2 v9 ~- \; j- H
00EC FF908FC8 FF908FE0 Event3 o' Q3 z$ r1 Z7 n; d
00F0 FF908F88 FF908FA0 Event
, \+ X0 u3 a' \7 v! R* T( `00F4 FF955588 FF9555A0 Thread" s+ A* t3 J5 w K# B! c: Q
00F8 FF908F48 FF908F60 Event
4 y5 K" m. L$ R- \. x; R00FC E2CB1558 E2CB1570 Port
, j& T9 ?+ Z+ \1 U/ L% ~0100 FF90A2C8 FF90A2E0 IoCompletion
8 J0 U" U* _0 M2 o! g- N1 C+ B0104 E2CFE708 E2CFE720 Port3 V" y3 W6 \" p/ _! v$ U) q5 v. I- I9 b
0108 FF90A2C8 FF90A2E0 IoCompletion* Y1 S- e' E$ D7 t" y
010C 837762A8 837762C0 Thread/ J$ I* c% x: |1 N3 m/ ?
0110 8103BBC8 8103BBE0 Event4 @' _" q0 n* G/ t
0114 813DBDB8 813DBDD0 Event* a1 P) S; q7 o& ?4 N
0118 FF814788 FF8147A0 Event
0 M( h% t+ [- N011C E1358DA8 E1358DC0 Key
. w, G6 Z% ?' y0 d0120 E2CFC428 E2CFC440 Key# }' p. Z! s+ R! }; C. A4 N! u
0124 8103B9C8 8103B9E0 Event' x4 T1 j$ P. Z0 C
0128 E2C9A968 E2C9A980 Key
1 U& i* Q" v: }. u" ^7 n012C 83B34E88 83B34EA0 Event
2 P: E7 f8 m# c i0130 E2CFD948 E2CFD960 Key
. p# z+ ~3 k% b0134 83B34E08 83B34E20 Event( |' [3 h" ~( _1 L( j
....
' Z/ R: M: E; r2 I% C9 i/ O.....................省略* l8 }( }0 y. {/ _
: G' y9 R; N+ o) K看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?
. d% X( ]5 D. \; D9 e# t1 w( R) i% T- a( V" m% N7 g1 p2 a
想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此2 [8 b; Z/ {8 q# V. }
# x* X7 Z! U$ N' {) f可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路
^9 k6 B* n' e5 ~
8 ], S' p+ ^6 w* H1 `后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.
% B+ }) ?9 @/ H2 O( g+ Z* a
6 ]7 {+ o& m) g H果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS
; {: Z5 N. X0 n( \# d, \3 M+ A2 M' P+ o3 q/ r* Z, b( `. {
修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程
" ]. @' C/ y8 F" ^. n3 _
: K2 N8 D8 |# m#include 7 @ m! {7 _8 G- l* u9 y$ i) F
#include 4 K" a. i9 I$ w, t/ q; }. S: A
#include
. i" i0 l0 E y r7 ?7 e" K#include 0 C% ~ s6 s* U/ k
( q% V$ N. ^0 w2 |) k/*: l4 L' ]' D% D" F
* you''ll find a list of NTSTATUS status codes in the DDK header' ]3 j; ~ G+ M4 R3 R! t, d9 p/ v
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)8 _8 }& T. U4 u
*/" {3 I# ?9 z% y
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)
4 f% Y! Q6 E2 C% n# ]#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
9 h/ L; K/ c4 Q, M. L" m1 H#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L); ?' u! P$ R# A v
( L: @* k1 o, p. q/ B0 o
/*
6 b% X, k3 b- g8 d/ E3 ^*************************************************************************
9 ?8 q0 x9 V+ Y% P* ntddk.h
8 w$ V+ D' A4 a*/
! j! J1 H% \8 ] L* a2 Wtypedef LONG NTSTATUS;
3 E3 k0 M" G u7 w5 ?: H. Ntypedef ULONG ACCESS_MASK;1 J/ U/ O+ J* q4 ]; P& H0 w
/*
3 R3 _1 y/ i/ _( L0 S* ntdef.h$ C, N8 G6 e% P t# Z! v0 n
*************************************************************************& j8 V9 \1 g# P
*/' b6 d, _* Y# @3 l4 H6 a v
' j& o4 O+ d/ @1 s: j
/*
% ^; H% Y) K/ Q0 z6 P# H7 j*************************************************************************
3 T6 O3 G' C( ^/ i4 Z8 r* <> - Gary Nebbett) S, e4 S8 }% K+ g3 W! u( }) H8 k
*/
! U5 \. l+ }4 L$ f c) H+ k$ M/ B% j& H
typedef enum _SYSTEM_INFORMATION_CLASS2 N3 D/ a! |$ }6 k
{5 k+ U$ F/ f: I. t) s' ?0 h! J
SystemHandleInformation = 16
4 }; D9 }; b6 @+ q# t} SYSTEM_INFORMATION_CLASS;- h/ I( h8 i1 N1 E
# M( I2 _& k6 w" L9 h/*
$ d8 Z7 Q1 t( ^; j3 N*Information Class 16& Q7 a( D& N' P: h0 m0 N/ ?
*/( |1 r8 M6 [) _8 M' W
typedef struct _SYSTEM_HANDLE_INFORMATION' J$ b& U- o' ]# Z
{
1 w# F4 T5 m* @5 sULONG ProcessId;
, m* @3 {* ?) H4 q! nUCHAR ObjectTypeNumber;
0 L9 N/ y/ X. I; l5 n7 {UCHAR Flags;3 c1 o7 c4 W8 ]' N' M! U; Z, M \
USHORT Handle;
a6 X. h6 x% l$ z9 X9 k" TPVOID Object;" b# d' ~. X4 J9 l3 j3 |% v+ Y$ k
ACCESS_MASK GrantedAccess;" S- X, r, }$ F7 X$ t
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
/ v1 |# N6 c4 }$ b, ~! y& i" \4 K$ B8 m# F+ p+ N: 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; }
8 \, [" [; U" H% h( w% ]' W) N/** B0 J' B4 ~( n0 r' E
*************************************************************************
" a* k. ?- I' U/ \# U. e* <> - Gary Nebbett
! _$ j; T6 ^( `2 L' q9 o*************************************************************************5 f3 e6 K8 }5 h2 a7 C5 x& \! y
*/$ V M$ w; W. n# R" Z0 t% o2 f) ?
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );
0 z' W! p9 `& C& a: [) Q6 E" v1 ztypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );
2 z( P% e5 m4 m/ ^# [6 J8 t; r0 S/************************************************************************+ G i0 g. Y& o7 S/ r/ x
* *8 s9 y4 c2 \* N9 o9 K: Y
* Function Prototype *' e" `, g( _+ h/ L
* *5 O0 Y8 `( F/ Z+ n+ d. ?
************************************************************************/4 w( W2 }3 M7 u
0 E% e; x6 b& Y
static DWORD GetEprocessFromPid ( ULONG PID );8 E4 K5 b9 y" o5 i" S! K% B8 f
static BOOL LocateNtdllEntry ( void );
( z8 Y! ^0 W5 m( T# k2 p2 H' J. L
% n0 _% u" V. J4 |- ^+ l
( [( d8 X* c# T; R% ]* p/************************************************************************
- N: r$ J: R e; d0 W; N* *
/ g1 m% k+ z, L( @3 l5 x: Y1 D* Static Global Var *7 j5 k# A9 ]$ Y$ U' `$ f
* *
. e1 b% E7 T4 N' G6 j5 u************************************************************************/
) n! V4 S' o9 X/ U0 j5 W) ~7 h0 ]6 |7 |' q- x0 s! g- o. m7 X
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;
7 ]- U7 i. A6 I0 g* }, @- s6 ?static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;3 } J( s! o8 E
! }: T/ L# u% B7 [% U, v- _
static HMODULE hModule = NULL;
6 p. }/ D6 z# ~1 ^5 m7 y/************************************************************************/
! A2 _& F% n8 L% f+ G* Y
# z- V) Y0 Q! C: q
% y: r- T: T7 a: D6 [- astatic DWORD GetEprocessFromPid ( ULONG PID )
% S- L4 j1 X6 ]& ~- u4 G{
1 V7 x( v- x$ E+ HNTSTATUS status;) j! M+ ?7 L; |9 Q r9 F. F
PVOID buf = NULL;; @% a, [) @ s4 m( T6 L
ULONG size = 1;
# y" o: ^+ Y& o: Y/ IULONG NumOfHandle = 0;1 o% V3 H4 L6 z, F- H2 P
ULONG i;" c2 ?6 A3 O8 z% U
PSYSTEM_HANDLE_INFORMATION h_info = NULL;. g: O$ u, G7 C4 t3 ^4 G% u
- U1 C( Z: @2 x' y
for ( size = 1; ; size *= 2 )
" Q, @ ?0 M" y9 ~' P" v9 l{
& ]1 `* G( {9 i+ t2 m3 l; Pif ( NULL == ( buf = calloc( size, 1 ) ) )
; W! N5 l& \3 h% m" ?: L{
) ?2 }' ]( |: jfprintf( stderr, "calloc( %u, 1 ) failed\n", size );
4 V/ t# k* e0 x7 e% {- Ggoto GetEprocessFromPid_exit;
" c; K6 D/ a6 H' n) I}0 t O7 v1 U' x& l8 X
status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
0 T3 T) a. l" b. h3 ~if ( !NT_SUCCESS( status ) )
0 E- o2 w& v4 p) o{! ^2 W9 k, i2 L
if ( STATUS_INFO_LENGTH_MISMATCH == status )
# h; K. k# V2 V1 E, K/ p{- A5 i) h1 A8 q$ v$ s5 T/ d
free( buf );: L, `* q; u" i# ~6 O/ G, r, l. K
buf = NULL;
% o( O/ S5 t' X$ d' K& q. n2 j}
) o- i* e( m; X$ T; e8 Y. R/ `else# U* d9 y% B/ f! o8 [; C
{
; [1 X1 {6 _/ `& bprintf( "ZwQuerySystemInformation() failed");/ Z) e F4 T% r( a7 T C
goto GetEprocessFromPid_exit;
" C3 }0 U% s Y} h5 e/ b/ u' s8 h4 V4 D
}, n' L$ N/ m1 [- {2 j/ \
else) v) E- J) \8 _. ~: F
{
. U3 X7 m5 k$ w5 b" c) }break;
) e x6 Q+ e! z8 u$ e}+ h" E- I. C& y
} /* end of for */
- Z% I- O q) o* t) C# R8 x7 _: n: x: f ?9 m. X J
//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组( q+ Q1 M- V: ^4 g/ B7 t
NumOfHandle = (ULONG)buf;5 K; G* M- e4 l0 F4 m) c4 O( a
' c q0 |2 Q2 K# I9 `- gh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);' c) k3 l. ?/ {
; c/ N# P2 m6 M' G# E' X: ?! a7 @for(i = 0; i {( P' `- O5 M. d* o
if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) ]1 @/ v! K+ x" b3 H( J( E
{& y# n+ r5 d- C% ^' d
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);
% B- s" x6 w/ b, n$ ]return((DWORD)(h_info.Object));6 L( F% A0 d" _8 [2 N' b# u
}9 d7 m8 {, {6 A. M; r. H* X# C
}3 A7 Q. I- {; L7 D
GetEprocessFromPid_exit:
: g# \) w) ~: O9 h% O& Dif ( buf != NULL )% x7 n' Q4 k7 `( v, A
{
k( o3 ?& @6 Dfree( buf );
% F9 r( K7 K) n+ V- B9 E( z% N9 g @buf = NULL;
9 M1 p. Q0 c4 W( H& e) [5 P1 L. q}: r4 B; b' c P+ o! \
return(FALSE);
+ m8 o; O+ x$ L( _- u% F s8 r}# h0 p! o' Y1 f: J& K' i
* k0 I' x$ Q! J7 g$ d7 c& `4 ?3 d5 H3 `
/*6 I! e% e3 z7 R
* ntdll.dll7 E$ R; h1 V; q- x$ ~
*/$ P o a* |5 q
static BOOL LocateNtdllEntry ( void )
' R3 M3 i2 ~3 [ x$ j2 i+ U{
2 A8 y D, V$ U" N1 ~5 }7 T1 q; oBOOL ret = FALSE;" A9 a* W* S, ?7 T
char NTDLL_DLL[] = "ntdll.dll";; z% `# ~; e7 o$ j0 q+ @* X
HMODULE ntdll_dll = NULL;
: a- w4 j& y6 j( v% b* e3 f$ i7 u$ G6 L% s& _& k
6 d9 ]* i) ~. j9 V+ x1 E
if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )
1 W% Z3 Q- }; q6 K{ R2 K8 E5 j- ?' i
printf( "GetModuleHandle() failed");1 B; f6 ]; P6 \$ L$ k# R3 d: S) T
return( FALSE );4 d+ M/ z7 W$ `% P/ _0 g: P. A
}( u, A- n0 E+ P$ C: E3 e, X
if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )
, X2 M1 W$ T( k4 Q4 O" t+ Y; P{2 ^ R/ j' Q6 ~1 V9 B
goto LocateNtdllEntry_exit;
C4 ~- ?# g( ^, l( ^}
) t3 j+ x# F9 H& S1 Wret = TRUE;
5 X) o) g6 }* r& g8 \: c4 H) j: @6 A0 Q
! T, _) M6 l- F4 r5 Q) ^5 iLocateNtdllEntry_exit:0 v( \8 `! J9 H" X( z7 @
8 d. k* U; D$ R# A' L# Nif ( FALSE == ret )# ?& y& \# |! w+ z) V- P& j7 X9 b
{ h( m. n' C$ ~
printf( "GetProcAddress() failed");, d" K' K, k. V5 L
}
: {6 f! G8 D. _ntdll_dll = NULL;
, o$ j5 L- ?$ {/ ?2 s; creturn( ret );
3 e. Q5 ]) {4 V% W( N. w} /* end of LocateNtdllEntry */
; K4 O9 h$ P8 i' j4 q [( @+ Y$ _! }+ q# C( V: M
1 L _* {. \: L. _% |5 Z( e x* P: z2 t
int main(int argc,char **argv)0 l0 [# _+ z7 G3 z! P2 k
{3 M7 k O& a$ `; j+ c7 z( _
1 g+ G6 w Y9 f. }0 `$ @LocateNtdllEntry( );, x% U$ U Q% a6 y9 c9 ~
; G/ A; u; U, c8 x+ p. r+ L, D2 \//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为59 \3 y' E) B3 B4 ?
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );
: L5 d1 v4 ?' P( h
" B! l. F8 ]+ Q/ f X E" HDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );
$ V: E5 N7 Z- n6 ?- S2 ~/ {
* d; m5 ^/ u0 z# d* @printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);
: I$ O7 p! S- \. V: B* u) X" X1 v4 [9 {9 d, i8 ]
return TRUE;! |2 W# W4 d" c3 R) @6 }
} |
zan
|