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

我的地盘我做主
该用户从未签到
 |
|
文摘内容:- z: T. K: C2 r9 J# `
--------------------------------------------------------------------------------
/ F4 J: k6 v) S* }% H2 U. q文摘出处:http://www.xfocus.net/articles/200406/706.html+ K1 v* L! f" C( Y
; V" L; z6 P% @* p8 }' O9 c
创建时间:2004-06-01* q7 ] E, H- V* F5 _% i3 R
文章属性:原创: K+ ^0 X0 ]8 W- E- [, j: q
文章提交:MustBE (zf35_at_citiz.net)# `% w& Y( F/ U/ R
0 s4 A1 d& z% {" C2 N5 NBy [I.T.S]SystEm321 H1 t; M; }1 ~: f) x* s
/ {0 x) S8 V, qWelcome to our web site http://itaq.ynpc.com/itsbbs/9 H: V* Z) n# u$ D, o9 t
4 m5 G( m' s, @% n
thanks to SobeIt : P: Y( q7 R7 e3 x7 w# K
---------------------------------------------------------------------------------------------
( w: y$ O$ o5 f5 C( Y$ u; y3 H* l) l
每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.& M, l% s R' g5 W
* o" x/ w' e: ^+ h$ c) _# W3 E+ r- w
绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。
. Q* z: ~7 t4 z8 L( w
J( n9 Y- V3 B# u$ F+ l- `2 YZwQuerySystemInformation函数原形如下, E# W" ]. @8 W4 w! v6 J6 f# Z9 L7 x
3 M+ |0 C/ U5 c1 z" Z
NTSYSAPI
( t1 S/ R- N$ R9 I$ i0 RNTSTATUS) X6 |9 N' C* l+ P% U
NTAPI
0 S2 k9 T+ Z0 ~* C: g1 f/ @ZwQuerySystemInformation/ t" w. J- @; X8 W
(
/ M, [2 l' k3 p3 b- o7 aIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 4 L+ ~+ p/ f1 C
IN OUT PVOID SystemInformation, 1 p$ `3 P; J+ _! ^* U4 B( ^
IN ULONG SystemInformationLength,
- _! L6 R1 @* _% U% OOUT PULONG ReturnLength OPTIONAL 8 z( Y+ e( F) D& d8 |% S: b
);- B2 B( b, P* t
8 g/ S& U" T: e
参数意义如下
0 z7 x& z* y% N7 c8 C+ l
" Z; @) L7 {1 m3 }/ uSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一3 s0 Q" b8 v5 ~ x- }# c
% d4 V; ?: L+ Z# P+ b$ N3 \SystemInformation:指向一个接受系统信息的缓冲区的指针
. y1 U7 C& m) W& c/ |8 }& I. _2 B: @
SystemInformationLength:缓冲区长度" t3 C O5 H0 Y6 q
" T: S2 J" E7 f( ~# jReturnLength:指向一个接受实际返回字节数的变量,可以为0: }/ j9 p! i2 h& F3 l7 p
) h* V" }0 M3 F0 I- e# [
9 J5 ~# ^, y. v- r& u ~7 M
为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation
$ ^' I" }# r1 T5 _- H% w* O" t w! \
SYSTEM_INFORMATION_CLASS的结构如下) z, V+ L* ~! A+ \. w( l% z
% H. E) \4 x, s/ X8 H
typedef struct _SYSTEM_HANDLE_INFORMATION
9 b: g7 E1 w4 t; q{
6 l$ p. B" |' I& mULONG ProcessId;. j, D% ~$ ~3 ^
UCHAR ObjectTypeNumber;5 F/ d* ~+ F. w C1 \3 s* S1 k& b( t- x
UCHAR Flags; b1 O% R$ ~2 ?, S6 I
USHORT Handle;( d( w+ V7 v5 r0 n8 Q5 y
PVOID Object;
8 k/ Q7 b6 ] S* }ACCESS_MASK GrantedAccess;
6 x4 K% A2 f5 [3 ?} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;1 v; v5 Y6 V0 R- a9 R
8 ^' F+ |$ {' g' C3 Q$ N" R
ProcessId:进程标识符
* O! }& {) X$ ~" m' Y. n# n% ?1 H% b5 S" l6 ]/ V
ObjectTypeNumber;打开的对象的类型
: W( M# w6 c! f% W0 z/ _; C7 l0 V! K
Flags:句柄属性标志
3 T, r G' H4 _7 t9 J J
% L! \6 o, b1 U8 H( @* ?+ ?! t( G' cHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄
: v! ]3 e* T7 D; v" x: H2 z# G: n. W# @6 v
Object:这个就是句柄对应的EPROCESS的地址- `$ O/ F) a5 ~9 ?8 }+ }
$ J2 h: h/ ]# v# N
GrantedAccess:句柄对象的访问权限/ P2 z$ M7 f+ X) l8 g
! S( G! Q' G9 x& n- L2 d: N d7 P6 a, l+ \0 r
下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ). g/ R, b. t1 ?/ A; o
# w. D' Q) |( H6 ]1 P7 X" X( s0 O比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄
( |+ O- H4 D( O- P f3 V, Q# t; Z8 o" f' h
怎么会这样?难道程序写错了?*_*
) `4 {, Z- `* Z) }+ {1 \# w
5 U* B' G- s& G- L现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出
1 I( {6 ], v F4 O. `) | R2 k4 X4 y! \. k6 T, x1 Q! t4 ]4 T
:proc -o QQ
5 t' l3 S8 P5 F% s$ ~Process KPEB PID Threads Pri User Time Krnl Time Status( d& X$ V, _* G% O5 l, h$ G! d
QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready
( |$ L9 w( m! w" \- Q) ]+ v5 x$ z- f" H. T
---- Handle Table Information ----5 p. n" w/ f! Q1 b
7 E& |& C- r5 {- h
Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590
# B8 Q2 x0 k0 x% z& |2 ]% o2 A6 S( ^/ }0 x( |" B
Handle Ob Hdr * Object * Type
% h0 J' Y3 o" @9 q2 @0 [0000 00000000 00000018 ? E: N/ J2 ~( {
0004 E2DA5E58 E2DA5E70 Section
! Q6 i: y0 ~+ }* W0008 FFAB35C8 FFAB35E0 Event7 q4 L6 @, ~9 q
000C FFAB3B08 FFAB3B20 Event
/ S# q8 f3 G3 O" M- ?! b S' z0010 85C70188 85C701A0 Event
- |* _0 W! p& e4 Y$ B0014 81515778 81515790 Directory
2 T- B% K: @" B3 L: C% C# W0018 FFAB7BB2 FFAB7BCA ?1 O6 S% a. ^ @8 v3 p) Z+ ^: U
001C 814A1858 814A1870 Directory
! ~! M- `0 S, a" o/ x0020 80288C88 80288CA0 Event8 k: o5 {4 K) {. Q# o) l2 \5 K
0024 E2CFE7F9 E2CFE811 ?
1 d1 a1 O2 E7 z0 l& k( ~ K- i0028 842D7B08 842D7B20 Event9 |8 j3 C" H) ?; v4 {. x( [
002C 80E9B989 80E9B9A1 ?
4 Z& T3 a7 c! ]0030 E1372198 E13721B0 Section* G& t( M4 z) K- s3 X* {% i i( Y
0034 814602C0 814602D8 WindowStation
* D. _/ `0 v6 N0038 81455CE0 81455CF8 Desktop! N7 t9 k" L& H1 M3 i' Z( c* p
003C 814602C0 814602D8 WindowStation
" o% j, m' o1 F: z+ Z4 g6 H0040 E2B3C1A8 E2B3C1C0 Key" T5 f* }7 P: S6 F( W
0044 E286D6E8 E286D700 Key" x, r# ?7 V& ^9 a) `5 A8 y- s2 _
0048 E2B3C0E8 E2B3C100 Key
' P2 e; J3 n# S, h# @004C E2B3C068 E2B3C080 Key4 ], w- B3 r+ k) v
0050 E2BEE688 E2BEE6A0 Key. ?" Z$ x: G3 R O: D
0054 8147C998 8147C9B0 Directory% P$ i; r& ~# A. }- D/ w5 `
0058 829D1128 829D1140 Event
5 I; ~3 }7 Q' j3 a005C 83F991E8 83F99200 Event
$ a V$ S5 ~) J4 j0060 E2BEE608 E2BEE620 Key( r H3 X8 D5 x' f! R
0064 FFB07568 FFB07580 Event
: _5 P& P3 ~8 i% J% e' y0 H0068 801747E8 80174800 Event5 g) l2 t5 a" U% a* v3 Y" q, M4 k
006C 80174828 80174840 Event3 Y k* B f3 x# O$ b
0070 845E8808 845E8820 Event) ]( s+ w$ w8 x- U- H5 g5 q( u
0074 81448798 814487B0 Event4 m" c p3 B* }- B- S* w s) @
0078 E2B9A888 E2B9A8A0 Key8 r; L/ u; x0 F9 Y
007C 845E8648 845E8660 Event
% b4 X1 O# R6 j0080 FF9E2DB8 FF9E2DD0 Mutant
9 t6 G# ?5 J* ?9 n; o0084 FF9E2D58 FF9E2D70 Mutant2 @# e6 V1 x" t( ^* t
0088 83CFC378 83CFC390 Mutant
/ _/ s1 Y8 |5 h& Y' J5 K008C 801749B0 801749C8 File+ w% V3 g% u/ j, y# d6 w: ^
0090 E2C48668 E2C48680 Section
! o4 r, L9 ~+ l* f) C0 l4 {! W! O/ t0094 FF965168 FF965180 Event a) s7 }& ?7 P$ L: t
0098 FF9E7D88 FF9E7DA0 Event
( N, {6 v& b- {9 o/ l009C FFAD3DE8 FFAD3E00 Event2 U+ T- v: Q; R5 ~
00A0 80AD63C8 80AD63E0 Event
, c/ @' [. E Q5 X; M00A4 E28073A8 E28073C0 Key' `5 J3 P; u, z7 `+ D- K
00A8 FF955588 FF9555A0 Thread
# r, H4 @ r6 [, g+ V5 m6 R00AC E2770728 E2770740 Key
0 R# o* h) O& M/ T! s6 T0 d00B0 FF923438 FF923450 Mutant3 e& u4 j9 s/ h! x1 g! X7 ^+ H# @
00B4 FFAE3B38 FFAE3B50 Mutant2 D4 G& d+ ~% o2 t* `# M* U
00B8 83B80728 83B80740 Event0 o; f9 \; {- u9 t0 S8 P/ L
00BC 83B80668 83B80680 Event& r( \3 n z8 u3 P$ ]) r% B$ r! X6 ~
00C0 E2E3C448 E2E3C460 Section9 K8 W7 v( _7 t( S. ~# r
00C4 83776A08 83776A20 Thread, \. C' a1 y' w9 }$ I' L
00C8 81489E48 81489E60 Event: h* k4 `+ z6 Z) T) V" {$ H ~4 P" E+ I
00CC 83776CC8 83776CE0 Event
% F8 }4 [/ g& B' w9 U# w00D0 83776C88 83776CA0 Event, `5 o- l- F( ]% R6 o& l* L
00D4 83776768 83776780 Event
/ R; i7 {: j1 r+ E, l- L00D8 E2837D88 E2837DA0 Key" }. ?4 B' t1 | h, O: Z! C( w
00DC 8146B3A8 8146B3C0 Event) k" q% ?. X# J+ r- A
00E0 FF908308 FF908320 Event
/ I6 N4 ~3 j0 M3 T; I! F( k00E4 81494868 81494880 Event
8 w! w) x% ^( S9 \00E8 FF9064C8 FF9064E0 Event$ C0 W5 {2 A- {$ K9 o, g) {
00EC FF908FC8 FF908FE0 Event
6 z" Q6 s- r/ ~( a: G$ w ^00F0 FF908F88 FF908FA0 Event3 \1 A5 ~/ C' Q2 {1 ]
00F4 FF955588 FF9555A0 Thread7 q$ V4 y% A) X
00F8 FF908F48 FF908F60 Event" [1 B; I" z; r- ]
00FC E2CB1558 E2CB1570 Port
* N$ h9 u9 y1 m$ m9 [% U) A! ]1 d0100 FF90A2C8 FF90A2E0 IoCompletion( p X* \+ E* p( [: |5 Y8 G, U
0104 E2CFE708 E2CFE720 Port8 Y. a- A: g% q% \% y& d
0108 FF90A2C8 FF90A2E0 IoCompletion6 Y% j: h$ N+ l3 g" H: K& a1 E
010C 837762A8 837762C0 Thread: D2 \( |2 U; v6 `- A8 I/ @5 [+ E
0110 8103BBC8 8103BBE0 Event
, G5 D5 S: J0 x; n3 n0114 813DBDB8 813DBDD0 Event
- Z# b- i# K1 W; J4 }0118 FF814788 FF8147A0 Event1 |0 ^; Z& E" g- ]4 K5 p9 U
011C E1358DA8 E1358DC0 Key) E& x' J" f0 ]9 _; @, Z+ v) R- a9 c0 T
0120 E2CFC428 E2CFC440 Key
: j; ]. z, {5 g8 k( i, [7 j7 i0124 8103B9C8 8103B9E0 Event
e s5 V( `+ X' \4 K0128 E2C9A968 E2C9A980 Key
# t, t, D& |+ d% N012C 83B34E88 83B34EA0 Event& b6 L1 o2 R0 R9 n1 O
0130 E2CFD948 E2CFD960 Key( h( f/ Q7 b- h& W7 i; ?
0134 83B34E08 83B34E20 Event
; a# h4 t3 A( s% B4 k( G....
; j1 I s# f% F1 u* T9 c( D& W.....................省略3 w' I! t3 b0 m9 X
2 N- m' a; T" J8 X& \
看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?
6 B5 k# i9 k2 A; u" N% F' n/ V) o& C0 U
想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此! _% E4 P0 Q: Y- N& h* `7 ]
! V5 w3 D w: Y/ C可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路# y+ z; X& T( V( l
6 T# r" F) W* }: e后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.
/ I7 J: d# ^" ~, M }2 D! @+ ?# m* o' N j# i" Q6 M5 i
果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS+ v: w" x* r0 P& z
6 ]( g! e4 g! L% n4 d; d
修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程
# k, M* u7 a3 I: W0 z( o: p3 H8 I: r% b7 _" X
#include
7 y4 K! |0 E4 p0 k, i& R4 r/ s1 F o: c#include
1 p- b* n% M/ z" T#include & e4 S5 a/ r6 r1 B+ K3 K1 H
#include , L- t' U$ A0 D& ?8 [* k
R0 H& G' t+ S( v' k; {' g' O
/*! g: [" l1 n' Z: E% v5 b" m
* you''ll find a list of NTSTATUS status codes in the DDK header7 c- h; C6 C0 b3 [' C' L
* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)
- ^+ f1 Q7 l& E o _- W*/4 O. d8 s* r6 z. ^7 l
#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)- O9 ^- e& v& c
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)0 j: E8 C5 C4 J8 F; P
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)% U0 x+ k, m, \. k) m
# f" [2 F% o% D/*
8 X* g ]# q3 R8 T% c*************************************************************************
- Z8 p8 y! |- x2 P* ntddk.h O% ~! a" X' v! [4 H7 j; ]
*/
6 d0 C. r! M: g1 ]) e k" b5 Htypedef LONG NTSTATUS;
6 Q [7 D" P4 j; }% utypedef ULONG ACCESS_MASK;3 o6 O7 ~, R% c$ R$ G
/*" O* o, d' ]" Y5 o6 w
* ntdef.h/ S0 k) i# M W: `1 t5 |- s( A
*************************************************************************
6 Y8 M6 A+ Y" J3 X4 s2 W; B" W*/
* _' D. ?! N6 n1 z0 |7 {; D- s$ @/ G4 g
/*# v- N9 o6 `8 n
*************************************************************************/ I; c, P7 v0 y( G8 y
* <> - Gary Nebbett
7 M N7 r& Z1 P; W! N* L*/6 E) @, y0 w) ^. D3 d) y6 ]3 c
* n# a% T/ N( s( U( R% L" T$ ~8 s
typedef enum _SYSTEM_INFORMATION_CLASS
$ }" w8 }' t* n, A. e! a. T{( z, Y7 C$ h% T; M6 y7 y6 G; `
SystemHandleInformation = 16# j5 a- X6 l5 [+ e
} SYSTEM_INFORMATION_CLASS;
1 v# h2 h" |! i
4 n+ V, O" j ?2 w/*, P: h" a2 U( u6 c9 E, @# l# W% m/ [
*Information Class 16
; {' K2 D' v: i! B*/. U% X; e. }5 c% [
typedef struct _SYSTEM_HANDLE_INFORMATION
& b5 L0 T* B1 l, o" y( ^{
8 `( i( ]9 \- Z9 I% K9 b1 G9 w; g2 rULONG ProcessId;
7 y4 V) p$ @* j+ L5 m9 KUCHAR ObjectTypeNumber;$ O8 v1 v0 n' r: B$ J
UCHAR Flags;. S; X& e: Q2 i# r( m5 ^" E; B
USHORT Handle;
# _8 r* g6 S9 c1 \PVOID Object;- c4 H0 W# B( S6 W5 z* A2 }+ h: y' e
ACCESS_MASK GrantedAccess;
% ~- T% b6 T) H" G} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
0 [3 t' [. y' M; n- _- n- O& ]1 ~ ?9 l; ?" R
#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; }9 Q& d j t9 t, Y# t
/*; k5 h3 k# D0 P( u' w9 N' W
*************************************************************************1 R& i) A. K) V
* <> - Gary Nebbett
) a" T5 {4 \0 o. b& i9 T; o*************************************************************************
0 I, t4 U9 `, i9 Y1 ~5 f6 _*/" m8 p2 H! s5 w" J; F: w$ ?3 L
typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );
2 z2 I/ ]9 X8 g1 ?8 htypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );& e1 j2 x/ |+ G3 Y
/************************************************************************
" t! \1 r5 t) L+ |# A2 p }* *# J. u3 f* O! t, y; i
* Function Prototype *
9 A2 c4 f6 Q3 {7 f+ o* *7 S. d+ j! N5 J: A" i) P
************************************************************************/1 {% e( J8 u t/ c
/ u7 o: [: L& U: p I. Y; `static DWORD GetEprocessFromPid ( ULONG PID );
. u- E' c5 z: W+ P" Ustatic BOOL LocateNtdllEntry ( void );' E0 p3 L' H) n ~
- n& t2 U) j* k. C1 K
$ e. T' I8 ^3 a f1 b
/************************************************************************
2 ]$ n' x, @( @* *7 B& p1 L5 r1 k
* Static Global Var *' e5 M! r8 \. t2 E+ b, ?
* *" k8 \8 p1 p9 M) Y- a: H$ ?' f
************************************************************************/
, k2 {2 x6 ?: v) r4 ]8 ] R- h! n! U, [4 A% K% K
static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;5 U8 [* }. W5 |3 @5 {9 G
static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;. V8 X1 L$ d! D: p- V& f
2 }- z9 W1 Y6 f8 m2 [$ p+ i
static HMODULE hModule = NULL;; }) x8 N" W1 Z8 \
/************************************************************************/+ k' F: F2 m7 m1 d o
9 N& r: S* }: ^5 `' i: H: G
% z9 d; _" X5 ]( j2 `2 Y5 ystatic DWORD GetEprocessFromPid ( ULONG PID )
0 W9 G6 g, N1 P% m7 X! b0 k1 G! Q{9 C, J! g$ Q2 |. D8 e2 G
NTSTATUS status;) v+ ]4 p: O' r; ~8 g7 S
PVOID buf = NULL;
/ P3 u& ]0 Y% g' {2 n. J' X& p, ]ULONG size = 1;& Y2 }# [6 [* m5 a6 [7 v
ULONG NumOfHandle = 0;
0 k9 \$ ]+ U rULONG i;
( a/ a5 d* E: M3 _) d GPSYSTEM_HANDLE_INFORMATION h_info = NULL;
' {7 E; t" [9 u2 m( s1 h y( C. `; {5 E% h& C6 b
for ( size = 1; ; size *= 2 )
* {8 f4 b! |( H' L* t5 S' a0 H{
/ s" n5 C( i" ~, ?/ yif ( NULL == ( buf = calloc( size, 1 ) ) )
( K, l, t z( U- y# V/ ~{
6 q& O( s4 q1 } T! A+ P mfprintf( stderr, "calloc( %u, 1 ) failed\n", size );' C9 T- d) a( o% e5 K
goto GetEprocessFromPid_exit;0 v+ T1 @1 V* p' A% ^+ b0 ^ K
}% ^ F$ C: l' v% `7 l% |
status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );
; z3 s3 Z* `, c, N% y/ Eif ( !NT_SUCCESS( status ) )3 J3 Y/ w/ x& R, ?% M- h# ]
{. z' d6 G) d8 s4 Y$ n4 \ n/ a
if ( STATUS_INFO_LENGTH_MISMATCH == status )
- U( c- Q6 O* T n{: {2 r; q9 K. \6 Q! Q5 r4 h! W1 ^
free( buf );
+ `. q; R0 w, A' xbuf = NULL;
. e1 j" r/ h6 S5 E' I( a' N1 y}
) Z9 h& }' x7 k. k3 ^9 velse5 H8 e$ h2 R3 Y' k- n- p t
{
; @3 x W( o* Hprintf( "ZwQuerySystemInformation() failed");% K$ S' g& o0 t
goto GetEprocessFromPid_exit;& V# h3 I' b( ]7 i6 g6 U! X5 n
}
/ M' A0 c% I/ r9 e& R Q. P! y}
0 Q6 K; l$ X5 N3 selse
. t4 D: T5 d8 k% a1 W; Q6 p! ^{
/ J5 v# U V2 Lbreak;! l- r; x, J! [6 i' k& T. B
}) K- ]% h9 Q: {' N4 `
} /* end of for */6 X/ F# v. y5 u" p& C. v7 c
7 E; h" o% r+ r$ J& T//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组
! y" `" k1 f" \NumOfHandle = (ULONG)buf;. `. S& N6 L9 @! U. a& l/ h
, k, q9 m: I' \
h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);5 i8 |6 w+ o- Y) c
, ^! S- M7 Y: l# d5 b# m3 D
for(i = 0; i {
+ i: @- ^% M/ Aif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ); _4 N2 F7 R3 }8 ?* P
{* G. P+ [# B" l5 b/ P7 K0 D5 {
printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);$ Q" |$ R3 L `" x- x. g2 Y7 V
return((DWORD)(h_info.Object));5 n0 R$ s3 t8 h
}
* G. A; M9 z8 u( P+ w}( e- m: H9 A3 t' @( N4 }
GetEprocessFromPid_exit:! u" n* |. n# K% R& d
if ( buf != NULL )
5 `1 u7 k( n* t9 e3 S{. d {& H& x8 W. p
free( buf );9 F% q" O* Y6 g' |4 \. J; ?* E
buf = NULL;4 o! Y7 B7 z; |2 g+ {
}3 L8 Z' D3 ]7 d, @' t
return(FALSE);
9 w1 G) m$ p5 j6 ]% _! f}7 R+ W" A+ O5 i6 o% ^
( e, S$ m! {" Y
2 L5 M0 ]& m1 e9 _+ i, h* d/*# d' @3 |% M& o! S2 b
* ntdll.dll
; k0 u0 e& J9 P+ u$ a- y! ]*/% M" I9 f5 Z# u: r. S0 U1 \: T
static BOOL LocateNtdllEntry ( void )
( }5 g3 s3 o( y4 e0 L{
! {$ E2 ~# e r; _BOOL ret = FALSE;. t; Y) Z3 r# d0 g& \$ m
char NTDLL_DLL[] = "ntdll.dll";
3 u+ Q) A; }7 k# A0 u' [HMODULE ntdll_dll = NULL;
' b9 m- _+ Y* _/ a+ z- s1 ~) w; M7 x/ B
4 \" G! v! Q9 ]/ r J, H( i
if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )$ [+ m1 O% m `3 T4 W
{
1 ^9 g3 N0 ?* }1 E5 \5 ^9 V; iprintf( "GetModuleHandle() failed");
% G2 Z8 F _+ R! W/ |0 V7 t0 X3 ureturn( FALSE );% D4 P2 J& o5 m
}
o; R5 ?. P3 l% R3 jif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )
+ g5 M3 D# R. F3 M- u{5 ]( G/ a& q4 Q& O% x0 q! Y
goto LocateNtdllEntry_exit;2 P. Z s! R. ~2 b3 l2 V7 g; f8 W! o
}
+ E0 Y2 K. u9 d& T& B4 @ret = TRUE;
& B+ h1 n& ^9 l \
8 g7 P* u& |5 J! E! @LocateNtdllEntry_exit:
" N: s4 V) x9 h
2 k. v5 ]% Z: y& ~$ `( Mif ( FALSE == ret )
, g2 H Z' }6 Z0 D9 v2 z{0 z; v+ v5 p+ u+ I5 |) t% E- S0 Y
printf( "GetProcAddress() failed");
8 v9 _7 x+ x5 Q' w5 J" W" p}
. k. g) D. w( g6 x( c9 Jntdll_dll = NULL;0 p; y! ^* v: H9 d; n: @
return( ret );: M: x" m/ m! Z% E4 P+ W! G' m
} /* end of LocateNtdllEntry */
4 r% O; D) |( k# Z! R8 A9 @9 S8 q+ N0 Q Y. T; q' ?. }4 \
1 D1 k6 @! l4 ]1 Sint main(int argc,char **argv)
7 Y) e/ O- ]+ `; Q$ F7 N9 F/ O{4 b) I) l1 H8 A& N0 o5 t( q5 N
9 T1 i* L v3 V0 r: ~ H* _
LocateNtdllEntry( );; \1 q& p$ c* v% U* ?; J- M4 \
! T ?3 l$ ]( Y7 z+ I' N//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5+ `4 h+ L5 u+ _5 p0 V2 G" Z4 N
OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );( d1 y/ n# N( K% I( Z
9 ]) e5 x7 E' N. ?" I
DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );
8 K2 d9 y# q6 o: B* z
" L2 u/ a* ~6 b( {: Gprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);
. k! s& W) m, n0 q& X" M, ]* J/ y. D2 h4 P: S# a$ E6 ~) J
return TRUE;/ {( j+ o* H2 N( r3 Q
} |
zan
|