QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3073|回复: 0
打印 上一主题 下一主题

获得进程的EPROCESS

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容: 5 p7 ?- m; Q( F, I! }9 d& T0 z-------------------------------------------------------------------------------- 3 H& c7 r! X& V4 \8 T3 J, p文摘出处:http://www.xfocus.net/articles/200406/706.html, a$ t% e) R# S! m% }5 s ) V1 x3 F, m9 r8 X 创建时间:2004-06-01 6 s! f6 B( Y, `2 F文章属性:原创. l% @( C) p; T' f, [ 文章提交:MustBE (zf35_at_citiz.net): d3 C* ^+ N# B$ { d& d/ w5 n9 L 0 X3 c- b+ u }/ X& mBy [I.T.S]SystEm32 8 k* ]5 H! t I* U $ W& z/ P, ]6 {9 X( p5 H. q: ^; R' gWelcome to our web site http://itaq.ynpc.com/itsbbs/* F2 o3 Y1 d7 t g7 k5 E " ]# w. a7 a" ` thanks to SobeIt : P # B/ o# d1 L7 T9 V& Y9 i) y! E---------------------------------------------------------------------------------------------& Z/ r; }) ?& w: A) Y / v7 q8 l" j& u* K0 m3 e4 Z o, y 每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.3 u% w9 o( y4 x: A9 Z+ p' f! n : F9 Q1 P% M0 L& u5 Q 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。4 C/ f0 O+ F- V5 z: I" V* W* n ) e- x( A' N0 g _ ZwQuerySystemInformation函数原形如下 4 I9 V2 {# F$ ?+ l$ B1 P/ V/ |4 C3 Z; P5 o4 _/ { NTSYSAPI& D9 M, A- P) K3 \( X5 z NTSTATUS ' N4 E3 C3 c: R, k2 _NTAPI9 n/ k/ I! S8 q ZwQuerySystemInformation 7 e: A$ E: @) M4 p9 y! f. l( 9 N" E4 \, h, n8 Z% H& YIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 2 y6 H/ X6 g1 n1 O! a }$ q- [% Y+ NIN OUT PVOID SystemInformation, + O/ x2 b, c: z8 v, KIN ULONG SystemInformationLength, / D. e5 k f4 x OUT PULONG ReturnLength OPTIONAL ' @+ u" |' G8 W+ b; ~" O); 3 P4 G* K# l$ U 4 W/ m; o& r& L2 R$ ?+ k7 V参数意义如下 9 o. `, d$ _4 M0 r7 k& o+ o/ v2 p' F% P+ g SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 ( @/ k' R1 {0 g0 z4 o4 K' }$ E5 | $ \3 [, F9 ]' BSystemInformation:指向一个接受系统信息的缓冲区的指针 + m& `# ]3 b$ V- {7 E- r2 {8 j7 e5 R& N6 y5 R5 a# d& y" Q# ^ SystemInformationLength:缓冲区长度 ( H' u' a. t9 p2 X* O6 _' g+ n1 S, F9 r ) N! m1 s- M( s q" x/ e: l/ ]ReturnLength:指向一个接受实际返回字节数的变量,可以为0# _# g8 P8 @0 o. C$ m 6 `4 A5 ~2 m7 B, g1 |7 |2 w0 \1 o! z6 G0 p) K; a 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation 8 ~ ^; E3 t0 E4 H0 m- q4 ]' u) [( m: k( C5 B: T SYSTEM_INFORMATION_CLASS的结构如下7 v6 I: m- N, R, @ U& l" O* M 3 ^5 Q9 t' f$ O y3 d typedef struct _SYSTEM_HANDLE_INFORMATION) B% W b' m$ m! { {4 `: M0 V3 Y3 M* E( s! ? ULONG ProcessId; , c6 h+ _9 J( s: e% n1 X9 pUCHAR ObjectTypeNumber; 7 x$ h% v6 ?" Z4 L2 CUCHAR Flags; 5 x! D3 i n+ K/ @& e2 C: m- z; v3 {5 xUSHORT Handle;0 |' [, d/ e% ]/ A PVOID Object; * _$ P# u$ d7 v! R% L% rACCESS_MASK GrantedAccess;2 F- j/ g/ T+ k! A* R } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; " w! E, u% q* o$ m ; t; l C6 x3 S/ nProcessId:进程标识符 $ Y! C @# |+ }9 v4 f# k- Z' R * j8 L2 f0 o9 V' i" K7 v6 p ObjectTypeNumber;打开的对象的类型 6 w- e7 r- z: h/ e* @0 |) o, A7 h; J! G0 m Flags:句柄属性标志9 s) m% k' Y: h ( t/ ]0 E1 y. K! \9 G1 a Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄8 y) _3 h0 R* u+ w' T & O1 J1 C- X) B8 ` Object:这个就是句柄对应的EPROCESS的地址 & V( S4 k1 d/ T! N, S0 G* S1 x. ]: q; `% } GrantedAccess:句柄对象的访问权限 - @2 C" v; m% O' w& y, C7 y8 \ . q( ^5 X5 J& N( b+ u! f7 i' f6 m$ {9 d3 L" R+ X4 Z6 u' U0 L1 d3 j Q 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ) " e# L2 w4 U8 G' Y Z. A8 j9 E& W3 L0 J) b! G( U 比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 2 Q2 }/ s# \- j( M2 |# G8 Q- `$ S2 L3 _( E/ m5 t6 G" D/ [ 怎么会这样?难道程序写错了?*_*: q4 m% `7 a; M5 D4 A* E4 x u P+ F0 ]! Q( X4 t- Y k K 现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出+ {& l; `+ H& ^ ) s$ B. d3 ?! G:proc -o QQ. V g6 O0 _$ Y" l) H5 z' Q" C Process KPEB PID Threads Pri User Time Krnl Time Status* p7 ^1 I" H$ ?* B9 o, [3 m QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready : A/ b4 _ Z2 c3 ?" v0 n5 Y6 p r' r L X6 H ---- Handle Table Information ----$ a! Z! [2 |" Q 9 d. F2 S* I( P9 d' `# ^ Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 5902 f; k1 ~# Q2 x1 h" ?1 y 3 ?7 j+ J$ k; h4 @# ]0 k Handle Ob Hdr * Object * Type0 g, l! C# S" S; s+ R2 Y 0000 00000000 00000018 ?; c5 J) L8 P* `% a1 o 0004 E2DA5E58 E2DA5E70 Section ! D, Y- j2 X/ I4 y0008 FFAB35C8 FFAB35E0 Event S& m+ `/ R0 A! K: I000C FFAB3B08 FFAB3B20 Event, J1 K* H* n' g/ ^, f 0010 85C70188 85C701A0 Event # E. j. C7 y' y% {0014 81515778 81515790 Directory# v( _. _( o7 w 0018 FFAB7BB2 FFAB7BCA ?& [7 [. Q1 f9 M4 _4 D" s 001C 814A1858 814A1870 Directory % Q' {( w, ?' C9 o' E! d0020 80288C88 80288CA0 Event 6 L o( ?8 {1 b0024 E2CFE7F9 E2CFE811 ? # B2 T8 K: s6 U; D1 }7 ~" B5 `0 n1 ~+ y* h0028 842D7B08 842D7B20 Event- E1 ]7 b# a7 w& ~5 t2 q( A 002C 80E9B989 80E9B9A1 ?. b( b v$ h" y4 r! T 0030 E1372198 E13721B0 Section2 {% `* G" `2 L 0034 814602C0 814602D8 WindowStation0 T- i! S, L' t; O; D 0038 81455CE0 81455CF8 Desktop 4 `1 |! f4 W& F* g* D b# \003C 814602C0 814602D8 WindowStation: U4 @. j2 c0 m9 G% Y8 U5 w2 Q 0040 E2B3C1A8 E2B3C1C0 Key 2 [" i! x q5 j r$ H g+ @/ I. A0044 E286D6E8 E286D700 Key 4 I% M; d4 P% \# \! @0048 E2B3C0E8 E2B3C100 Key $ U! Q5 m% T+ H" F& H; h$ V+ s/ |004C E2B3C068 E2B3C080 Key ' m5 u1 Y! z) ?$ c2 O/ ]' k( S( _0050 E2BEE688 E2BEE6A0 Key7 a( b# K$ W/ _- @1 H 0054 8147C998 8147C9B0 Directory ' a/ R' U5 w6 ^3 T# v0058 829D1128 829D1140 Event + Z0 a/ g+ n, N0 M$ [( d U& S) u005C 83F991E8 83F99200 Event: M. l/ k: S( \9 g9 x 0060 E2BEE608 E2BEE620 Key4 v0 t8 c4 S3 \3 Y 0064 FFB07568 FFB07580 Event 6 c4 p: L( B" h# B8 V0068 801747E8 80174800 Event : c9 \, j* n; R. s }006C 80174828 80174840 Event1 {) w: c- g1 t2 M' C- L1 Z! A5 [ 0070 845E8808 845E8820 Event & c/ y( Q& w" U5 J# T# L0074 81448798 814487B0 Event 4 l) U; ^9 G' T8 g" u0078 E2B9A888 E2B9A8A0 Key 1 O' s% \3 ^& E007C 845E8648 845E8660 Event) ?; O8 W: \1 d( n& L 0080 FF9E2DB8 FF9E2DD0 Mutant: k0 a! ], B7 G, `- y( X( \ 0084 FF9E2D58 FF9E2D70 Mutant 8 U* u" {9 b% }* y# l/ H# S* H0088 83CFC378 83CFC390 Mutant4 Q9 S" O# l) u 008C 801749B0 801749C8 File G; e! e( f/ k 0090 E2C48668 E2C48680 Section' Q( ~: y4 F+ `2 F, V) U 0094 FF965168 FF965180 Event7 p0 A* g/ ^. Z 0098 FF9E7D88 FF9E7DA0 Event v8 F: S7 Z+ ], x+ i" K# a* b009C FFAD3DE8 FFAD3E00 Event0 O7 a) E6 z6 L. W2 X 00A0 80AD63C8 80AD63E0 Event+ b" h( ?! [* J+ r# t% w 00A4 E28073A8 E28073C0 Key J7 m3 k& o1 u4 k! d/ H( R 00A8 FF955588 FF9555A0 Thread - s0 U+ _" s! ~; o00AC E2770728 E2770740 Key & _3 u3 e. q: `. j7 ]$ r0 y @4 S00B0 FF923438 FF923450 Mutant $ {5 L' c5 B; ~$ A8 \00B4 FFAE3B38 FFAE3B50 Mutant 6 [- ]% q. e" u u) O7 }00B8 83B80728 83B80740 Event b. Q2 E( v1 j" l9 E4 P00BC 83B80668 83B80680 Event ( F9 \) n1 l8 i. k: M5 V00C0 E2E3C448 E2E3C460 Section7 ]1 J- }( \+ j5 k; b# q9 ~ 00C4 83776A08 83776A20 Thread 2 I# Z$ N+ t, w* o, s, ]00C8 81489E48 81489E60 Event 9 l# \7 Z3 x( J00CC 83776CC8 83776CE0 Event3 i g' b0 A4 o6 m4 A+ j$ i 00D0 83776C88 83776CA0 Event0 ?5 l# Q v2 x$ a! } 00D4 83776768 83776780 Event & k. ]6 F8 b8 f& W6 W1 s00D8 E2837D88 E2837DA0 Key 5 ^( A9 c" T/ Y2 x00DC 8146B3A8 8146B3C0 Event 2 H2 R: [+ n' E/ ^% T00E0 FF908308 FF908320 Event; g+ q7 W7 n' [' e0 e 00E4 81494868 81494880 Event4 B# t" K: I$ h- z$ i 00E8 FF9064C8 FF9064E0 Event ?, N# N" q. \* _/ d2 u) d00EC FF908FC8 FF908FE0 Event # G! C3 Q* w* |00F0 FF908F88 FF908FA0 Event+ r4 ]/ f6 C' L! _) { 00F4 FF955588 FF9555A0 Thread # b8 W' P% { ] b5 @2 o00F8 FF908F48 FF908F60 Event # t( \9 c- C8 |; X3 N00FC E2CB1558 E2CB1570 Port / z' Y/ M) J/ A! w0100 FF90A2C8 FF90A2E0 IoCompletion 8 `6 z2 ?4 Y. y6 R0104 E2CFE708 E2CFE720 Port7 t% k/ _ {: ]) ?; r 0108 FF90A2C8 FF90A2E0 IoCompletion) Y/ V1 I3 R8 k5 A* K3 d* \$ z2 R# p 010C 837762A8 837762C0 Thread & p S' L8 Z* [& @0110 8103BBC8 8103BBE0 Event5 C, l/ F6 j0 f% a( X 0114 813DBDB8 813DBDD0 Event 6 F/ Y$ ^# h/ k0118 FF814788 FF8147A0 Event) P; l# k' P7 u0 L 011C E1358DA8 E1358DC0 Key9 |0 N0 b) s6 X4 A b( p: B' ^) J 0120 E2CFC428 E2CFC440 Key 9 h' K0 Z2 b: W7 j- w6 [3 G) T2 K5 r; [0124 8103B9C8 8103B9E0 Event 3 C- n, P, O, s8 x7 d; L0128 E2C9A968 E2C9A980 Key( Z* c' w" d* [6 R% z/ R 012C 83B34E88 83B34EA0 Event : K5 \& y7 M' E( n/ Z+ ?# ~0130 E2CFD948 E2CFD960 Key# }' ?/ S& T- } 0134 83B34E08 83B34E20 Event & v+ f5 @+ v, ]" |5 H Z: V" K.... $ A6 f& U- m$ ]/ A/ \* c2 ?3 i.....................省略" \& G+ i& f* C( _ - `6 ~- Z0 p; o% C' a 看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢? / R1 n- d; R" a3 _& Z; `& A + }0 m* Y, N* }$ `5 W+ m* H) P) Q想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此' `6 z* {$ e; C, X9 i, s ) k0 e5 s E7 h. q8 W7 l! w可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 - h) G( J, x' @1 D7 O! ?; O3 Z, ?0 g6 C 后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. r& p; K! |6 A: `/ U8 l. O ; M4 {6 K* u! u) }9 L9 d8 V% F 果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS% Z5 J; R0 Y- S 9 H6 ?; Y4 W9 x) o- k! R修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程( W+ D6 \( c. F( B0 F% G2 |4 p/ M + [0 C' C4 R3 H! K6 D#include : K( E6 w/ O& {9 q- Z; m" A #include : p+ q, p0 {( E+ N#include 1 o- W4 [" J* A #include + e' a r4 A; c $ ?* F S% F7 Q/ g/* 6 L# F8 E+ F8 M* f1 O* you''ll find a list of NTSTATUS status codes in the DDK header * l$ l) F N. {6 W* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)% [, g1 m6 F f q */- `. q: E) C }' h+ F8 s: \/ R- _/ A #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)$ _$ u; [2 t7 Q #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) % Q* k! c/ `9 A7 }1 Z#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L), J7 E \1 t* `/ c * _, z: X6 P& M, C/* 0 W" S4 ^4 [4 ?8 j, e4 d) h% i6 {$ Y************************************************************************* ( K/ l- f4 J4 s7 [" a0 D5 a* ntddk.h ! V6 Z+ X2 k4 q1 `*/" r9 Y1 b- }/ f- J X. X- F& \ typedef LONG NTSTATUS;3 x" D$ {2 H1 P: S. A; ^$ ~. L typedef ULONG ACCESS_MASK;) F" q% a1 p. {! U /* $ z P- ]/ @9 W* a4 ?/ c* ntdef.h! O0 p+ l* _! f ************************************************************************* 5 C" h, P0 n# q. \( D*/ 1 a5 |% o% B2 v$ S3 r! d 0 h; B# P1 E8 I- k7 {) V* Z3 i* f/ n) g/* 0 \) P: g2 V3 a: r5 U% c1 E; X! W************************************************************************* % w5 c$ [# Z+ G" }* <> - Gary Nebbett6 H( k6 `# S, |7 n2 O6 q$ X6 r6 p8 [ */' _4 i; A3 r4 P9 w + t" K& r& e8 R( z4 T* P0 Htypedef enum _SYSTEM_INFORMATION_CLASS8 R% |9 E# v6 b" w2 {5 e { * D0 Q! S: i: `% b& q, sSystemHandleInformation = 16 + I, {7 c+ @/ _) g} SYSTEM_INFORMATION_CLASS; 7 E( `/ u1 Y5 ^. f X# u6 |# j+ U4 C$ c. o1 W0 ~* C7 l( V' V Y /* & m* v# i+ F) ]3 M! A*Information Class 16 9 M, r! x" D. o: E y% k*/7 d. |% M1 I& B7 @ typedef struct _SYSTEM_HANDLE_INFORMATION7 _5 X& k2 o* z% P+ P {" Z' Y; ^2 d0 N! G7 N9 I- t ULONG ProcessId; H: S ? a) h UCHAR ObjectTypeNumber;4 n* u' O3 @; i; ^ @( X) V UCHAR Flags;5 _2 Y( b# P3 D9 M USHORT Handle; ( k" i! y$ B/ j9 K; d- o; k. ?PVOID Object;4 H% E( z; w& ]3 Q( n; K; \ ACCESS_MASK GrantedAccess; + Q& {$ R8 X- I} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; " G3 |! _) G) } 9 x6 @4 i8 K' ` V/ j1 N#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; }: |( W) ?, l+ x8 n: @ /*' f. p1 Y) ]& u& W5 E ************************************************************************* 1 W5 k' i+ F& @! o. ` M* <> - Gary Nebbett6 ~6 X+ D* n. A" U0 s6 m: T! x9 C ************************************************************************* ?9 t" F* s! A) ~3 m6 N% \ j! N */, }) [( C# E$ z6 R' n6 u typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );% Z; e8 [* e- m" i0 ` typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); - g# e( x) S0 U! k& ~) N* T* ~; m+ b/************************************************************************ 1 V" r! O0 b* r) C0 @5 e9 F* *( J. D: I# B- ` * Function Prototype *4 S! ~) S% w9 @' s * * 8 V+ y. ` O! M/ v$ j************************************************************************/2 ]$ V7 z; p7 H2 Q6 Y, h# G V" G7 t* w9 u I5 c( d* @; d static DWORD GetEprocessFromPid ( ULONG PID );5 I1 h8 a4 X: H7 v static BOOL LocateNtdllEntry ( void );1 Q: I5 k& `7 h5 {# N5 J. E; U + J- \; y. x" U9 |4 O* \ : q7 d/ B% }) ~9 y& @4 Q/************************************************************************+ D \$ K2 c) y, L * *6 q/ I3 G, d0 \; B5 F * Static Global Var * ?# s5 a& Q- f7 U4 ]* *+ q/ o! X% q! y; p ************************************************************************/3 h8 O5 B8 p2 |3 q1 Z2 w : C- Y, c. l& x! J2 N5 g, astatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL; ) z; b+ b7 h4 A8 ~# c/ U& S4 }static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;7 F s" G4 x, t+ }9 e( {$ c% X 4 V& N( B; o1 O, F2 istatic HMODULE hModule = NULL;) q( v: S2 G% S% X /************************************************************************/ : N3 X" a/ B9 p% F5 m. g " D2 h/ ]; G1 ` K* m( ~# [7 f7 C4 A5 H2 ~. H$ K static DWORD GetEprocessFromPid ( ULONG PID )' C1 g e) d1 |( s" s& ~ { & W! M% i1 M% S) rNTSTATUS status; 2 C: ]3 l+ @( v9 W; w! kPVOID buf = NULL; + X. x5 J$ D, b5 z* SULONG size = 1;+ J6 L( M$ ^( x- @/ B ULONG NumOfHandle = 0;- u# P/ E* h7 n$ y ULONG i;9 p5 Q, s( Y. f r5 R$ P& U PSYSTEM_HANDLE_INFORMATION h_info = NULL; : H4 R0 v8 |2 ^- R0 T ?# I# f6 `1 c 8 \/ N7 C7 A- L$ [9 k# efor ( size = 1; ; size *= 2 )( Y( D+ B2 w5 h) {# D. y {+ Y, c0 [9 M3 J5 X, \ if ( NULL == ( buf = calloc( size, 1 ) ) ) , ^0 w+ V$ @+ q{& ~; ] J# t7 ]" l: Y6 x5 b) m fprintf( stderr, "calloc( %u, 1 ) failed\n", size );) j3 N& y4 U; F, o goto GetEprocessFromPid_exit;1 z' j8 t% K+ y( X } ' x; W' R; n: B! U, bstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );9 v1 i( z/ {/ @! Z8 k( b if ( !NT_SUCCESS( status ) )0 h/ a5 o% X5 X) U1 B1 P { * m1 _" a1 j% mif ( STATUS_INFO_LENGTH_MISMATCH == status ) ! d( @4 H4 U! H5 A{ - n% V* T5 u2 P( K) x$ dfree( buf );& H F8 ~) A! r buf = NULL; 1 w$ {+ s) F9 A} 2 |1 K" D2 C) n9 z6 p$ A8 welse ; c( m# o, l1 Q( v{! D0 ^0 j/ \" _/ `# o1 q1 y printf( "ZwQuerySystemInformation() failed"); 7 D0 w7 w* H n0 j8 V& J& [goto GetEprocessFromPid_exit;# x Q/ j6 v0 y' o y } 0 i2 r8 F3 }) f, n/ k) a( p} . z' d+ A5 n/ B# @9 h( yelse 3 O4 [& z$ z9 d* K{ ' p# G3 K0 r3 e) g& N1 U! N2 abreak; ! R6 a+ [ I6 }9 m3 r}, E( g, y( `( ]7 P } /* end of for */& R6 r; y$ [- L$ f* h) U ! A2 L9 ~# G, Q$ F' e3 h //返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组0 d7 a+ u" F6 ~ NumOfHandle = (ULONG)buf; 1 g* s! J6 m6 w( G, ?. I6 | 0 ?2 r2 N$ O+ B7 q5 l' kh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4); ! g k' t' x- e5 r+ ?1 D+ U# D: t$ `1 Q) h1 j0 z4 Y+ x3 K) ?) j* { for(i = 0; i {8 g$ S5 Y2 d. M3 Z9 C" Q' F3 q if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) " g- ^, F: v5 J. w% z{ n/ P, ~" E1 H. f, `) D printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);" l# d/ R8 G) R return((DWORD)(h_info.Object)); $ o+ P" T9 y0 g} 3 l- \# t) k3 r6 y+ C# ^} : H( i5 Z4 `: NGetEprocessFromPid_exit: 1 n. D/ y1 V# u" ?3 v* m6 wif ( buf != NULL )" I& P, R" K* V3 c" C: ?8 ] { ) m9 A% ]! W; Q4 |; S7 Xfree( buf ); * a [3 k1 L/ J( I1 i& Jbuf = NULL; : C3 m6 C" O4 c6 i( r}! x* d: ?& ?4 T! B$ ^% s return(FALSE);5 a0 n1 V3 u; h% K( m( x' x } 0 c* @+ c' d' v, j* p & I% v& ~; F) K+ [# G3 s1 i 6 v; x/ L, l: L/* : u1 F5 i8 W$ v) X7 ?" @( q; o8 B* ntdll.dll # z' H; ]7 @* U S' Z*/* j+ z' u+ O$ U* B1 `8 \$ B static BOOL LocateNtdllEntry ( void ) " N( z- i2 S0 K/ g% j2 d' [# U. t{ ) q4 v/ @/ A$ s* W! ?BOOL ret = FALSE; 8 x3 ^4 N2 _$ U! a+ v- ]char NTDLL_DLL[] = "ntdll.dll";( {! ?& v( }% {" O HMODULE ntdll_dll = NULL; 3 X+ B; x( I T1 _& y( H( ]/ w! a$ S0 x 0 r( g. W1 i6 S& I1 E2 |- iif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) 9 ?- a( D" K" x{; i! q( ]: r5 y" L7 p printf( "GetModuleHandle() failed"); & Z* `$ i3 A$ N3 {" oreturn( FALSE );" r& v9 m2 {; A, {) |6 z }* C4 g% U, K: g6 f y% J7 C; i1 p7 X if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) 7 a+ V7 i7 [, e( O' G, F6 F0 U% _{% ?; ]+ T. V0 X2 U2 E, c goto LocateNtdllEntry_exit; % t. k$ U' g# O1 B0 u0 c} C, T% Z( C1 v% u! a) m% O- Y# aret = TRUE;6 Z$ @, u& L$ O1 d V# X$ F: O2 B1 _ H7 S4 cLocateNtdllEntry_exit:# p) ?. Q; Q! _ 9 V- V/ S+ `; J' qif ( FALSE == ret )+ I- X; I' C6 i7 S S6 g0 x8 A { ' k+ U2 l5 M6 x. L5 ]; w( Cprintf( "GetProcAddress() failed");- d, o. j3 w6 Q d" C. c }$ S. j% D# V7 ^6 D7 K ntdll_dll = NULL; 5 F2 [9 A q9 d" t6 H* ]5 Breturn( ret );2 W- W8 u- p8 n* |4 x# V8 e1 Y } /* end of LocateNtdllEntry */0 u2 t; J5 y; k; U' M : ?+ L0 z7 z; A 8 E( v7 _0 Y& F+ f0 Q% p6 ~int main(int argc,char **argv) , p" }) |+ F- J, |$ q u{ ; L; A& P+ Y: J 9 u" R; d) ~/ Q& o6 yLocateNtdllEntry( );$ u4 _# B$ e c+ g ; v$ Y R. l6 ]1 }7 z" I //打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5 9 j# X% |6 Y( A/ O+ J4 pOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );3 J6 F7 t* `8 C+ I- f 6 {) @( f' s4 Y2 t ]DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); [+ ~1 n$ o- i! R - y& f9 k4 ~- ]0 S" T9 a printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);: M2 L* s! L7 h. Y 8 C) T5 S4 W3 Qreturn TRUE; 5 A- A" o {* e; O) B}
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-18 14:18 , Processed in 0.457563 second(s), 51 queries .

回顶部