QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |正序浏览
|招呼Ta 关注Ta
文摘内容: 8 w' h; ?* z$ Z+ T-------------------------------------------------------------------------------- & e& ^1 [* u4 `. k2 ^1 j文摘出处:http://www.xfocus.net/articles/200406/706.html , Y8 q& L; g6 ]2 J" U$ U s! ^: d; {; M" t创建时间:2004-06-01 * ]; A8 q7 \, {& A7 C文章属性:原创 6 X0 N* x( Y- q+ K( x2 y7 Y. n文章提交:MustBE (zf35_at_citiz.net) 5 e: M2 \* u( [! E6 E7 j: T4 S. I7 P: O$ @+ g' b/ P By [I.T.S]SystEm32% }7 [& J6 s& E: {" H# B . f/ D! k$ o3 j. S6 Y7 Q Welcome to our web site http://itaq.ynpc.com/itsbbs/ 9 Z' F+ q: F! R: X* z& v' i/ J% t! P7 I" o thanks to SobeIt : P ( D6 L' F( Z5 ^' ^0 V" j# h5 g--------------------------------------------------------------------------------------------- : E/ j4 o9 }, j `" o/ u9 b5 R& |5 A 每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.; a1 _8 V$ j/ Z5 @" G7 W2 d5 W ) m- J% k- v& h1 M7 j- A0 W. D绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。3 W6 b7 {% V- U% D7 K5 C R1 q . Q: u+ `$ J. ]' v' F ZwQuerySystemInformation函数原形如下* ^) c6 v5 Q) m ( H+ |- {' h1 @# B NTSYSAPI : m4 Q; ]' |/ G0 |! Q; Q* b& qNTSTATUS [1 U" q3 X# } g+ x NTAPI% B. U' B, c& x/ q ZwQuerySystemInformation7 J7 l7 _( e/ S- ?6 y ( 1 U* e& X I- V, v# |9 |' xIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 9 t3 v3 G' M' R6 {9 eIN OUT PVOID SystemInformation, 8 B! K' b h5 k; O) BIN ULONG SystemInformationLength, : H/ `$ b# N# X- Y9 W! p( x6 N OUT PULONG ReturnLength OPTIONAL - i& z% V6 m& U ); # Z# d6 S# T$ E8 K / T5 h K7 ^. X2 _2 K参数意义如下 ( r! y- H7 b) e6 a9 R! T) _( E. c! J5 h, v P9 @1 w" z- H( P* _/ _ SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 & T5 F/ |% H1 |) i8 ] $ e& v S& y/ \9 n! @$ i$ B# F4 A" CSystemInformation:指向一个接受系统信息的缓冲区的指针6 j2 p2 G- e( g" }/ V % L/ J2 {% H3 r1 i1 N! } SystemInformationLength:缓冲区长度 8 q5 C- B. }, }/ D' `# a: J; _/ o ReturnLength:指向一个接受实际返回字节数的变量,可以为0# @0 U% r' R: i & s4 F+ a' p4 a : x+ q' Y' [, y( R7 y! B为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation * v: m4 V: Z: J( }8 C2 R$ y& c# g # Y* v0 m& S$ j9 E! l! K" y1 bSYSTEM_INFORMATION_CLASS的结构如下' y# N, i+ j6 {. z) r. ] 5 [" i/ t0 u9 s" l# o& Ptypedef struct _SYSTEM_HANDLE_INFORMATION 7 u* P) L4 n9 o$ _: S) B% D{# U8 x" s4 ~' O% c. M ULONG ProcessId; * D) E& Q7 ?3 h1 V+ C6 [UCHAR ObjectTypeNumber; # n" z, D( L0 V C$ `UCHAR Flags;0 {2 |$ }( Z/ P! [3 Z( B USHORT Handle; # p# D1 r. m3 @PVOID Object;" e8 L; V" Z0 t( h |4 T- c ACCESS_MASK GrantedAccess;9 _( d) j# m# H1 p } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; - }. d* d' u6 g) w1 F6 Y H) J9 t# `0 o6 x0 r ProcessId:进程标识符 % ~/ C7 U4 j/ c' F+ \ p' C3 C) B+ t& i! b ObjectTypeNumber;打开的对象的类型# P) `8 E# n' `) b h & h. }& U0 ~% D$ r2 KFlags:句柄属性标志0 t" J* n; y* `4 h0 O 7 l5 Q: L, z0 k" v# |: W( t x/ G Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄 , N: X! W' Q' }0 q T3 m ; p& R( t& t5 O- ]Object:这个就是句柄对应的EPROCESS的地址" E: D/ H _ s& m. W; t ) `- o# M; O8 K# XGrantedAccess:句柄对象的访问权限 : s5 l# {+ x/ W( [8 `! V+ f3 o6 i1 Y/ M3 r , [6 G5 ]& [7 t4 o; w 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ) 6 E3 B7 a @8 M& u+ g 9 ]2 e- X0 ^1 E& O比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄) x; j Z8 O& `& z ) e# j0 }3 j: Z/ r$ s+ Z 怎么会这样?难道程序写错了?*_*9 ^+ r) ]0 l4 s1 \+ f $ p6 O7 k8 T3 b1 s& s! }现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出 8 \1 B; V* q5 l9 t" T4 v; m " [& j4 E H; s2 a7 A8 e:proc -o QQ % z4 c' f6 c! w0 j; m6 k( tProcess KPEB PID Threads Pri User Time Krnl Time Status. Z: o h9 N4 h+ o b QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready * Y$ P8 p# {4 M 4 l( S) b0 k9 o& ] N9 s+ m---- Handle Table Information ---- 6 c9 K% p2 g/ o; v7 F3 c, k0 G5 ] N Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 5909 U, Z7 N) w" k' c0 s' d* v . z* d1 n. o. y; \- uHandle Ob Hdr * Object * Type & |* I, u* _* A# S0000 00000000 00000018 ? - f6 T" A5 ~: g( j0004 E2DA5E58 E2DA5E70 Section 6 @ C4 T' }5 y8 B% U E0008 FFAB35C8 FFAB35E0 Event 9 K- B/ A+ {4 x) X/ ]1 f: G% H000C FFAB3B08 FFAB3B20 Event # ~0 K; H/ ?% \6 y0010 85C70188 85C701A0 Event 5 V+ [# a3 I. }6 {0014 81515778 81515790 Directory5 s; C9 h a V/ ]" `( y' X" V4 v 0018 FFAB7BB2 FFAB7BCA ?) r; ]5 g7 z3 m/ e; C 001C 814A1858 814A1870 Directory7 g) B! ^' g& q( g8 d' s$ s3 G 0020 80288C88 80288CA0 Event x! |4 h1 b& y: |$ _& p9 x0024 E2CFE7F9 E2CFE811 ?/ a- R# c" u: j5 P- n3 X 0028 842D7B08 842D7B20 Event: v3 N% s- R. ^% M 002C 80E9B989 80E9B9A1 ? + @" Q9 r! e! R' F0 g0030 E1372198 E13721B0 Section + c% B& p% T9 m& B, e0034 814602C0 814602D8 WindowStation ) J- ^6 N8 S% e% b e: p; i0038 81455CE0 81455CF8 Desktop4 Q/ c7 `3 y' O$ d- T 003C 814602C0 814602D8 WindowStation! t. p% a \; I! k: ?! K9 E& C 0040 E2B3C1A8 E2B3C1C0 Key' F1 M4 A0 [' k) W8 `8 O 0044 E286D6E8 E286D700 Key' j/ i6 B8 F( r+ ~0 ~ 0048 E2B3C0E8 E2B3C100 Key) `) Q; r/ C; K' S3 W: Y9 \ V 004C E2B3C068 E2B3C080 Key3 y) `+ r7 [( n1 D( E8 W% k 0050 E2BEE688 E2BEE6A0 Key 5 p: l* P- t1 }5 T, `9 J0054 8147C998 8147C9B0 Directory2 G7 e5 K; }6 Q) d 0058 829D1128 829D1140 Event 3 F- W7 C0 ~) v8 H; u1 Q' u5 ^ E$ n005C 83F991E8 83F99200 Event4 l) O3 A6 S& e& M 0060 E2BEE608 E2BEE620 Key ) T* Y# h9 w: J- M3 @3 v0064 FFB07568 FFB07580 Event 1 W T: b7 y' r3 r0068 801747E8 80174800 Event $ \0 e. l4 y ]006C 80174828 80174840 Event, w" g0 [( U" Q) N5 ^3 |) V 0070 845E8808 845E8820 Event * m, ~2 h% Q; d5 R/ w- ?7 z0074 81448798 814487B0 Event 4 \. n7 V2 T" K7 S. R5 a# j0078 E2B9A888 E2B9A8A0 Key9 o9 ^( `6 f6 f/ G6 ]1 i {$ r9 n" Q 007C 845E8648 845E8660 Event & U, W% g+ D2 p0080 FF9E2DB8 FF9E2DD0 Mutant , N* z- k/ q3 ] j3 O9 u0084 FF9E2D58 FF9E2D70 Mutant 5 p7 l- G0 h; `; W5 Y9 Z# P0088 83CFC378 83CFC390 Mutant b- X% j. Y: O8 v2 W0 l 008C 801749B0 801749C8 File7 G7 ^0 B0 @5 o h6 n+ d4 J 0090 E2C48668 E2C48680 Section: e" v' t% N) X% b 0094 FF965168 FF965180 Event / v- ^# D8 A9 x3 O9 t a# ]0098 FF9E7D88 FF9E7DA0 Event! d: ]2 ]* H& _9 t, b, w- h& F* O! u 009C FFAD3DE8 FFAD3E00 Event : s) E- l, i' w! Y" y00A0 80AD63C8 80AD63E0 Event 2 G# F5 N7 {7 B( }00A4 E28073A8 E28073C0 Key $ D- D6 A: N [$ a00A8 FF955588 FF9555A0 Thread {& j$ q7 _2 Z1 | 00AC E2770728 E2770740 Key: p! A: l8 D5 P2 x 00B0 FF923438 FF923450 Mutant( ]5 t9 V, ^; j2 d2 F0 z( c 00B4 FFAE3B38 FFAE3B50 Mutant) F# T( B+ I/ Z+ [ 00B8 83B80728 83B80740 Event9 N/ y0 v2 g O' ? 00BC 83B80668 83B80680 Event, m$ i$ a3 Z0 [ 00C0 E2E3C448 E2E3C460 Section. v7 d, w8 k3 t' `$ z; p# N4 o 00C4 83776A08 83776A20 Thread 8 ^$ v) \% K9 h' o$ n- e00C8 81489E48 81489E60 Event # h# n2 g7 d( e0 h* P00CC 83776CC8 83776CE0 Event + _2 D$ x# \( @0 }7 p/ T00D0 83776C88 83776CA0 Event' D' e) ~1 M$ P7 F) _, }" z 00D4 83776768 83776780 Event. N9 Z4 M* V3 L7 M 00D8 E2837D88 E2837DA0 Key8 W e* P" b( h5 ^, }7 R 00DC 8146B3A8 8146B3C0 Event* w5 t* {# p9 x' d- m+ [. c' @ 00E0 FF908308 FF908320 Event& ^! O6 L* c/ X9 R! o1 ^ 00E4 81494868 81494880 Event ) G) w+ a0 X9 R00E8 FF9064C8 FF9064E0 Event+ t8 G3 g7 ?# s9 [! o2 I" r 00EC FF908FC8 FF908FE0 Event . f7 }* M z$ ^3 h7 W8 H4 s00F0 FF908F88 FF908FA0 Event# k5 K: v1 r4 X+ z6 C& { |# M 00F4 FF955588 FF9555A0 Thread0 _+ {5 w# T' @& t7 z 00F8 FF908F48 FF908F60 Event; L( e1 P {& I 00FC E2CB1558 E2CB1570 Port $ K5 W* |! y' U& |. H0100 FF90A2C8 FF90A2E0 IoCompletion % `8 Y+ {5 G& l3 y( [0104 E2CFE708 E2CFE720 Port) ~! I# Z Z! [: A 0108 FF90A2C8 FF90A2E0 IoCompletion) `# u3 I4 d2 F/ n- @ 010C 837762A8 837762C0 Thread$ g4 Z9 M% ~- ~+ ~4 Q 0110 8103BBC8 8103BBE0 Event + |+ |2 W `0 b' N0114 813DBDB8 813DBDD0 Event4 G4 f1 p* f& w. e) Y 0118 FF814788 FF8147A0 Event) u. G! B$ X% s 011C E1358DA8 E1358DC0 Key) C: n, ^3 o* J: g 0120 E2CFC428 E2CFC440 Key. l3 B, y$ `! _; t 0124 8103B9C8 8103B9E0 Event I* Q' r# w6 Q 0128 E2C9A968 E2C9A980 Key( M/ S0 b; {4 P 012C 83B34E88 83B34EA0 Event" [5 S( }& u2 r+ J" [ 0130 E2CFD948 E2CFD960 Key ( k: f% g9 Y( v/ v5 G8 K. I0134 83B34E08 83B34E20 Event2 Z9 T5 E/ Z4 F' {$ | .... . v4 S/ T& C. @1 I.....................省略 3 H2 s3 d2 t7 r3 q8 U* p4 Z ) a, P: n f+ B0 T. v1 P2 Y& \看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?% Y3 n. G/ F! _ 4 J" g4 D0 O% h; C, n9 n想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此8 K. N0 R. ?1 ]! R6 Y3 C! d9 s ' d- q4 C' p* n3 k/ D$ H1 U可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路- [6 N! i1 J @/ F( U; F ' Q8 l& Z1 @& f; I. z 后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.* w! e1 }$ X. H9 C+ F( W. y P 8 P% m# ~2 w) t* Q$ G* h果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS " t; c( y* j7 ?6 V3 y' p# p4 @! |1 O: p 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 ' q: h2 p# ~9 [* Y6 W B/ q' E& k* y#include ! ^5 ]5 C- y" W' p9 v#include % c* x' f; u! }3 e2 J0 T" G3 y#include + C1 \' r. H) u2 v& @: |5 x3 w+ z #include ' z: s. Q% h- v, v& F" y3 B6 J& m' X0 h /*% l5 x7 d- C6 ]1 X4 { * you''ll find a list of NTSTATUS status codes in the DDK header- \: J7 ~9 q" [1 N4 [! d9 ^" e * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)# g0 H m8 |7 } */ : @- V# p4 r, r3 Z. A#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)+ P; o- I- T" l6 L$ f* J8 E2 j, G #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)9 |2 \ O& J# l. w+ O; x( [ #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) 0 w7 v* `* A4 h. R9 I9 F& V0 @* _6 A k: K% E4 n. ]# l# O /* 0 Z! `2 O2 p9 v( `6 I*************************************************************************; ]- S. t3 @+ I! t1 r7 N1 l1 b * ntddk.h; H, j+ Q% Y/ s Y */ . O) @2 Y. Q$ u$ z# Vtypedef LONG NTSTATUS;/ G! j+ c' U! Q a typedef ULONG ACCESS_MASK; v2 |4 X, M: g/ O/*1 {8 D% H% n5 }0 N. ^$ F * ntdef.h+ Q3 j$ b* T& f T* R" P *************************************************************************. _7 o* |- N) Z) ?- n */ 4 \/ V* }5 y& z, y5 c: | 3 c5 u+ {) N7 R: P' o/* 6 R2 r& t& m* y j0 p) x5 _*************************************************************************8 S2 a! c' h- U * <> - Gary Nebbett 9 F( b& Q9 ]# j0 X+ F*/ * o" V# Z( S3 S" c& C) {! B3 f2 F5 J typedef enum _SYSTEM_INFORMATION_CLASS 2 [8 Z$ y" e5 \6 D; I{8 ~; `8 Q# x" P* |2 g' z SystemHandleInformation = 16- H1 R5 r/ {- A* V3 j$ a } SYSTEM_INFORMATION_CLASS; 8 ?4 i# H6 V$ u2 N9 J' @ ! `( p4 D2 W o% c1 R0 f+ S; O5 f$ @/* % V6 `1 Z/ c- L( U- w6 n& p*Information Class 168 ~) L( S8 r, f( w */ 4 |! w' g8 o" F6 l5 J# {typedef struct _SYSTEM_HANDLE_INFORMATION" W) Z) N" {9 z1 M {0 ?7 j1 _7 K2 A6 z ULONG ProcessId;; Z) K7 v& s7 n' _- K UCHAR ObjectTypeNumber;5 l7 t. P, u$ b UCHAR Flags; 4 @- w# e/ z9 o# k5 G2 E9 {USHORT Handle; ; H X# ?1 P3 y; X W* x7 m1 K! qPVOID Object; + h* m- ]) _8 {; p8 a8 pACCESS_MASK GrantedAccess;, z- Q6 ?3 j6 L3 S9 K) y( h* z3 s } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; / f+ M, ]# f& r! j+ V3 Y2 F1 e( y5 R( }% ^* g- ? #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 i$ a) u9 r2 _5 x8 B k6 K) s/* 0 F7 z8 F$ C5 k' G*************************************************************************# \, \8 L s, u" r4 B( j! I * <> - Gary Nebbett + y4 m, y# X# s' V) ~3 T+ c; U*************************************************************************8 ~! x! Z1 N$ y7 I */) c! `$ E& J: _4 _1 t e" A. c, n& ~ typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); % h2 {& t9 G e, u4 b9 ~typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );' ^( E: l1 Z* _ /************************************************************************$ b, K6 t: C' j4 [ * *9 x7 i& L) y4 N * Function Prototype * q; B3 q! o4 g* * ' ^$ M" g9 m' f) ?% D************************************************************************/ ( `9 Z% q& m: `+ t l0 n$ H$ |8 W2 w, ^. ystatic DWORD GetEprocessFromPid ( ULONG PID );1 s3 C' d1 q; h9 }0 ] static BOOL LocateNtdllEntry ( void ); / b+ U! S0 m& P! j; D! ~1 b, B4 T5 N i( @- v1 H6 h, E5 i 6 {2 f' x7 J( I' o0 v /************************************************************************! [# ?) F# w1 u: y2 i% W8 c) ~- ]* Q L8 K+ | * * ' @ }0 t( p* z8 H* Static Global Var * + @$ J" d! u( z: C7 m, s8 m* *# u2 u2 r. L" b. h ************************************************************************/3 e0 `, w$ d4 H( |/ w$ Y$ k+ O . S, H9 e+ D% C) y( Gstatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;$ W. c9 s+ r% G" s static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;; U$ q, X) T" }' S+ {. ]- }; [ T& o' [, t% g H8 [+ p* v8 G$ Sstatic HMODULE hModule = NULL;2 b% p/ V9 W+ G6 a& K /************************************************************************/ ( Y! Z5 e; s; ]" y* e3 O3 D 6 Q9 M9 j$ q' V/ F( _# Q * Q* e. }5 m% h) Wstatic DWORD GetEprocessFromPid ( ULONG PID ) 2 r' W3 ?5 k& M+ ~6 l* U{9 d: l: D# p( h; q- A# m, h NTSTATUS status; 6 M& m* P/ M/ b5 B9 d$ m- RPVOID buf = NULL;$ b' _3 C" _7 D. w. R+ x ULONG size = 1; # c( V* u2 s( Z6 B5 f: C/ S' N. _5 kULONG NumOfHandle = 0;3 i' p, T7 Y) K3 `/ R+ p% I ULONG i;; D8 n4 O, {9 r' \) ` PSYSTEM_HANDLE_INFORMATION h_info = NULL; & h- C) S' H- v& V; d. d4 g4 s3 a/ [+ G2 F for ( size = 1; ; size *= 2 )$ [ |+ ]' t8 k2 Q7 E& u3 O! | { ' i+ k3 c. {. u2 I+ S( [if ( NULL == ( buf = calloc( size, 1 ) ) ) ( R6 B, z/ c6 t5 r{ # ~; g+ e, \7 M' ~fprintf( stderr, "calloc( %u, 1 ) failed\n", size );+ }& y/ b% w4 {1 M1 S goto GetEprocessFromPid_exit;# |( x: P; I% b6 @' R" f }1 e. o0 m/ v" e! G9 I status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );) P+ [. ~, V9 Z& F! `' T$ ] if ( !NT_SUCCESS( status ) )2 `% A' {+ o! O; S( y { 5 Q* T4 B( x b$ u: B, x- e4 N, {if ( STATUS_INFO_LENGTH_MISMATCH == status )9 K% ~' M( h/ o* x5 H ^$ W {' |, e# }9 A/ K% X9 x" U free( buf );$ Y# I7 W" {4 T) _- T buf = NULL; $ u m5 c- o/ ~% F- l g}0 C! q0 I F5 G2 X+ T else # \$ H c( z5 i* C; Z; z{8 W/ O& ]+ {6 l3 F6 L1 W printf( "ZwQuerySystemInformation() failed");* E4 G* ]# K J; _4 h+ X2 U( B3 i goto GetEprocessFromPid_exit; 9 t8 Y! s" @' a- ]6 d' y) ~7 t}" d: S4 D$ e8 m( A6 {) b }2 Y5 G1 _- a+ F3 u' s) y else0 c% x: Q, b/ [* R% ^* w { . P& ^: Z I4 H+ kbreak;2 E( V8 A1 G! }" e, L } / K I; C) Y5 ~9 N} /* end of for */ : r: f; q/ G- w3 J) r. a5 M# c2 M6 |" [! H //返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组# S1 n$ f3 z6 h0 k- F7 E NumOfHandle = (ULONG)buf;: R5 b }& ]4 I1 @) \) S, v; p ' z0 K: h1 T! `$ ^# y- i( Q4 V. z h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);* |6 c. m0 P7 T6 H , H! u. ^: r7 K9 o) L for(i = 0; i { O5 h- n. J- k2 _: d5 x; { if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) 7 V- r# o: [+ R; K{ 0 D$ ~/ ~$ {+ _& |. ~printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); 7 y+ J" T" A& R" ` Areturn((DWORD)(h_info.Object)); 5 j0 i) |: s% P; b}0 n: J; `% L# K2 o" M& L- p- Z } 0 }8 R7 f. f% `8 _% uGetEprocessFromPid_exit: # ~# E* E d) m! {% N' Xif ( buf != NULL ): l# j+ h$ F, r- i) Z; } { 3 W8 y9 Q- Q7 ]0 Xfree( buf );7 |1 Z7 |1 r# j; h% E$ |$ M buf = NULL; $ ]) y6 {7 y( |1 g o& O6 p3 t} ) w2 I/ E: e4 y6 M& @0 Wreturn(FALSE); ' ], }" z5 n# x% t2 c/ r}( [0 e' C' @. o+ L9 B ( K! z2 r3 J7 n0 m2 Z3 y. k$ | , u, c+ v# a5 O, P /* , R5 E- N5 Q5 m# }, G$ R3 \* ntdll.dll9 @. Q3 ?1 n9 Q2 Y */5 ?3 `% [- q p( ]% W- R static BOOL LocateNtdllEntry ( void ); d9 d8 }5 Y) E8 u2 `2 R/ W { - E" N: M: f. y+ V7 h: t8 \BOOL ret = FALSE;0 G j2 x# u6 v! T char NTDLL_DLL[] = "ntdll.dll"; ' P: e; D( x R( ^- H3 r4 M E# |HMODULE ntdll_dll = NULL;8 t: F' @$ K6 X: p2 _9 ? 3 e h j! T7 B# d2 o. D) ^/ l" Y6 ^; } * W/ P7 s: x2 P5 I5 aif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )/ U4 _5 Z, H9 o7 s: J( ? {( D. t2 ~" }1 z! u) V! A printf( "GetModuleHandle() failed"); % f9 [; {/ w; c K- H& breturn( FALSE ); ( P- `+ s6 s$ t' A2 L l# F9 c0 H k}* d" _0 T. ^" }$ q3 B7 ]8 A if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) M( K; o( J3 u4 {$ d; x7 b {* T2 a; f. X+ i: h' v/ n( m goto LocateNtdllEntry_exit; 9 K; J8 o$ n7 `9 g4 {! `. z} / |, X9 J. y3 c+ }- s! v7 F2 |4 yret = TRUE; 3 q. Z8 y! o$ V' W% m 0 `7 Q7 r7 a/ a+ Y6 I" PLocateNtdllEntry_exit:) [2 d/ y7 V6 N) ]8 r6 Y 6 r v- `: x6 e% t/ mif ( FALSE == ret ) & `# e7 T4 X9 a2 g{ : e0 F) G! K$ e$ [% m& lprintf( "GetProcAddress() failed"); - P. s# P7 i, s/ h' }7 x! T}# |/ }( H: k, F( v ntdll_dll = NULL;6 D" D; s# K" F T& }4 g7 z" P8 l return( ret ); , z, r! q6 \- s} /* end of LocateNtdllEntry */( b6 I5 b0 _( s! ~ 9 F/ W+ Y/ N4 ]. C; L+ z ) ]& L2 Z% m5 \0 P1 M2 D qint main(int argc,char **argv)1 C( p* ?0 U6 N5 y { # |5 _6 x. c$ u8 A* _ . B* I+ G1 M x/ y! \3 @LocateNtdllEntry( );$ K, w' `+ y1 z4 `. n! I/ A/ {" L 4 g3 X0 r9 b9 I5 Z//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5. n" h; W; W" |( X/ H9 N7 [( ~ OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );& D4 k' ]6 k* v8 c- x6 x4 \" J 0 G0 o6 F! S# g' c! @DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); 0 p3 i5 }" {% H% u) d w( O7 D4 g+ _5 m* E printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);3 l- C/ q* l% X/ H, C6 N T2 B9 @6 w4 ^4 creturn TRUE;8 i. H0 |* x% c0 Z8 b7 |, n7 G }
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-8-28 14:31 , Processed in 2.608031 second(s), 52 queries .

回顶部