QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:% Z0 Y6 | \5 j$ w -------------------------------------------------------------------------------- % Q* Q+ l A& |- ?文摘出处:http://www.xfocus.net/articles/200406/706.html + _+ }# ^: f+ r/ K0 s a6 A4 x5 D* e% i& N7 ~/ u- i8 I创建时间:2004-06-019 ~" R+ b2 ]* t1 P% L6 o 文章属性:原创 ( g W; M, v0 y+ k$ c2 l' Q8 H5 X- b文章提交:MustBE (zf35_at_citiz.net)1 x: l4 T! H7 J% O: o) a % ]6 h: M5 i- {5 [- d* F By [I.T.S]SystEm32 0 o @0 C. W" G0 d5 e) f: r8 P6 x, N2 t* S4 {3 m! o: f7 w Welcome to our web site http://itaq.ynpc.com/itsbbs/ 4 d/ C5 b/ X9 `+ {) s4 G6 J2 y+ t8 e2 ^$ w thanks to SobeIt : P* q3 g) o# B8 f: c) t1 J1 R% k ---------------------------------------------------------------------------------------------0 e+ j0 ^6 r V 0 W" v5 \9 R: @" q# I 每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.# c$ |$ r. g y5 S5 z 5 r L6 j4 Y4 N F 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 , U; N6 w! O \7 e( e 9 u6 N2 ~7 D* |; y* A: _. JZwQuerySystemInformation函数原形如下 a1 `! O- p- u4 q( ? - ~- \. J; `0 Q% M- E( l NTSYSAPI$ f9 A5 |3 F& {4 I( L$ N7 H NTSTATUS) m* o: e& G+ h; l0 j2 Z NTAPI ) W8 E- T6 R7 C* i( wZwQuerySystemInformation( i1 i1 j4 E V0 ~: o [ ( " N8 a3 k1 p) a9 o* @+ k IN SYSTEM_INFORMATION_CLASS SystemInformationClass, / d# ?9 p5 P- d IN OUT PVOID SystemInformation, 1 e/ `% \; a4 w6 D IN ULONG SystemInformationLength, - c, O1 I/ h z- g OUT PULONG ReturnLength OPTIONAL ( Z0 H9 Q% B0 Y); + C: _, f8 y2 T f3 o) W" E1 @) v( {3 t 参数意义如下 / I. Q; z; v, V" a) K- z& [3 T- @4 B2 _5 G- e SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 & U b( m5 ^4 a% _, e7 E |! v- }- P SystemInformation:指向一个接受系统信息的缓冲区的指针 E' r. R- H& \6 [, l 6 |* R% X" V" G) rSystemInformationLength:缓冲区长度, g( ~2 L. \. N* w % b0 I# B) e% q* ]5 R$ i/ ? ReturnLength:指向一个接受实际返回字节数的变量,可以为0 d# ?- g* @5 h2 Q 6 e, g# l, i1 F: _7 f+ a 1 h' u; w/ `( R 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation* ^2 y1 f9 Z; z$ k1 ? 2 e# p& M7 ?' l( `8 S9 QSYSTEM_INFORMATION_CLASS的结构如下 4 w6 e* ]( x ?% Y2 i6 I* T5 B3 u 7 {! H6 n; m) b: q' N+ ctypedef struct _SYSTEM_HANDLE_INFORMATION 6 J& w) v X3 T+ Q{ 3 p3 W/ X$ @; c9 H" r7 GULONG ProcessId; $ u7 ^$ @" r% u2 fUCHAR ObjectTypeNumber; * W5 R$ W4 ] q# D8 zUCHAR Flags;7 z0 C3 w& t8 Y7 p o( X! U5 K& p USHORT Handle; & n K7 t1 Y6 ?6 h: d# M' k' VPVOID Object; 7 g5 Q3 u. i5 J& C6 k9 AACCESS_MASK GrantedAccess;& V% K O/ y# W5 U) R: H" I8 r4 v } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; ' l. o2 _. A+ P+ A ( o- W4 z% x* j! qProcessId:进程标识符 ) `% e! l9 Q4 r- c3 k+ q8 A) w 2 V/ s; U* [% F3 V! b$ w9 mObjectTypeNumber;打开的对象的类型 4 S' y; b& ^2 D3 q$ e" x& r4 v ( o P; R b$ A& h4 @1 s: \2 L, T5 E0 i8 g+ yFlags:句柄属性标志: a$ A/ @! v) c5 g5 u 3 K0 S$ d3 }7 N% d Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄 * D3 s3 w( l4 w w$ ` & p9 G" z3 I% a* t* D2 u- n4 XObject:这个就是句柄对应的EPROCESS的地址6 u/ w) Y9 R+ C% ~ 7 z3 Y/ o4 v2 \, ZGrantedAccess:句柄对象的访问权限 8 X4 k% j( a# a) Z 7 k8 F( v2 N9 V* `- `; _* W \/ M5 A* T% l- Y) b 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )' K$ s y1 L: D* k% p, G 8 R$ U2 s8 Y6 T, F2 p3 ]. m; N$ ]比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 . F4 R2 Y+ H, a) d* m3 c0 A$ b% }. p5 b8 a/ X, x# ?- J& L 怎么会这样?难道程序写错了?*_*/ d+ O+ z3 O0 W1 a: ] " N8 Q% `' I" Y& J0 g现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出5 @3 a. o* L1 D, H6 e2 d 3 Z' i2 b, l, _& L2 {. F' a:proc -o QQ4 n0 w7 ?; Q' P5 J. w. Y Process KPEB PID Threads Pri User Time Krnl Time Status4 T0 c6 ]2 J$ C C0 E$ b7 r QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready- y3 f3 \7 S# l - Q6 J6 d/ C+ a, S ---- Handle Table Information ---- ) r. ?2 j2 l7 V- v7 H; l 0 S3 ~' ]* w8 O G1 ^; SHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 5909 |/ ~9 E- G1 r# w+ J4 P 5 ~1 f7 Q S% q6 m% w& m. s/ R Handle Ob Hdr * Object * Type 8 t! h, i8 N7 ~0000 00000000 00000018 ? / _8 ~- y. R$ R0004 E2DA5E58 E2DA5E70 Section% b w! i& J9 b$ k/ \% m 0008 FFAB35C8 FFAB35E0 Event' s; R! ^! S. L- r" U5 Q1 I+ m 000C FFAB3B08 FFAB3B20 Event # H: S- z2 U; v9 M" c. A0010 85C70188 85C701A0 Event8 s# b7 I+ c; l/ C: G3 _2 N 0014 81515778 81515790 Directory o' A- T9 q* M, l7 G 0018 FFAB7BB2 FFAB7BCA ? 2 X: R5 Y6 Q( I' p. j8 r5 V001C 814A1858 814A1870 Directory ( l. {: }3 M$ J( }% R& O4 _0020 80288C88 80288CA0 Event4 ?3 k1 [( o: x6 L 0024 E2CFE7F9 E2CFE811 ?$ s$ p5 X3 L+ f& N* ?4 ~ r( B 0028 842D7B08 842D7B20 Event 3 q% a. ]1 V" i+ P- _% L002C 80E9B989 80E9B9A1 ?4 _5 }+ z/ _/ h 0030 E1372198 E13721B0 Section0 _; X& h: l4 {+ ^8 a# G 0034 814602C0 814602D8 WindowStation8 \2 F7 E( ~. p0 x; r5 z+ z+ @0 _ 0038 81455CE0 81455CF8 Desktop7 l' n/ D" b2 P1 Q: u- H" j+ `8 W2 ?- @ 003C 814602C0 814602D8 WindowStation! W1 ~" }/ ^# _; L; p! I2 k 0040 E2B3C1A8 E2B3C1C0 Key8 ~ o/ M5 I1 C0 @/ b4 J 0044 E286D6E8 E286D700 Key! G* v, i+ u7 W1 h 0048 E2B3C0E8 E2B3C100 Key6 m+ W, e3 D: ^) g2 V 004C E2B3C068 E2B3C080 Key % s' u- z/ j; H. z* o* ?0050 E2BEE688 E2BEE6A0 Key - M" @% C1 R- }0054 8147C998 8147C9B0 Directory 3 Z0 D: b# u) R; |: k0058 829D1128 829D1140 Event# w4 d/ E8 A) t; C' @: x7 {0 c 005C 83F991E8 83F99200 Event! \: [. P, s" I! R$ N1 R8 h9 B 0060 E2BEE608 E2BEE620 Key & ]; u1 I+ t: i0064 FFB07568 FFB07580 Event . W' x$ { @/ C3 X6 q9 H0068 801747E8 80174800 Event ; q& ]9 o g( I, y- R+ W006C 80174828 80174840 Event 7 e o, z) I$ }& `0070 845E8808 845E8820 Event , O2 V# K& @2 |- C1 t" R/ D0074 81448798 814487B0 Event % t. {. G p" Y$ l0078 E2B9A888 E2B9A8A0 Key) \+ t: U. | Y 007C 845E8648 845E8660 Event " o6 @5 Q9 H2 n0 u: s' O2 Y0080 FF9E2DB8 FF9E2DD0 Mutant# c1 v5 d7 m/ F `: C# K 0084 FF9E2D58 FF9E2D70 Mutant$ l' o: `$ j D) y2 C4 g 0088 83CFC378 83CFC390 Mutant \, H Q+ ]7 f7 A008C 801749B0 801749C8 File " |; n9 `7 c' ~( g: a0090 E2C48668 E2C48680 Section / G8 E3 U5 b E. ?' I+ m6 F2 P0094 FF965168 FF965180 Event, _+ @; O% U. v! q( T. b6 S 0098 FF9E7D88 FF9E7DA0 Event l. W3 e1 ^. W 009C FFAD3DE8 FFAD3E00 Event- v: P+ @: t: f/ k 00A0 80AD63C8 80AD63E0 Event3 _$ S( a2 l0 p* g' ]! } 00A4 E28073A8 E28073C0 Key 0 a) V7 c9 l0 @/ i# W7 Y# f00A8 FF955588 FF9555A0 Thread * d9 E' K5 R* @" ]00AC E2770728 E2770740 Key * Y& d. L, _4 h: R$ m4 K9 q$ o00B0 FF923438 FF923450 Mutant ' s7 j" _, q$ ]7 r; Y( |00B4 FFAE3B38 FFAE3B50 Mutant 5 l: e% l# s7 G8 L( v00B8 83B80728 83B80740 Event" |* p4 V+ n7 ~$ }6 M, e k 00BC 83B80668 83B80680 Event / i( ] I3 b* S) h% d& x00C0 E2E3C448 E2E3C460 Section ) v& \0 x. g0 O! I' N* H00C4 83776A08 83776A20 Thread 5 n9 g* g/ O7 N1 p+ l( T00C8 81489E48 81489E60 Event$ k) ]; {7 {0 O K- y; ^$ j 00CC 83776CC8 83776CE0 Event! W4 ~( z' s& L5 Q- L$ C* ~& U 00D0 83776C88 83776CA0 Event# {' V6 O* u/ C, _* O. X: B2 M# \ 00D4 83776768 83776780 Event 5 \+ \9 G# h& c0 e+ e00D8 E2837D88 E2837DA0 Key * w4 p) i. C7 b% v9 e00DC 8146B3A8 8146B3C0 Event 8 w" Z0 s1 S2 y7 ^# E( X1 i% a00E0 FF908308 FF908320 Event$ ]+ e" |3 Y2 q0 v3 D 00E4 81494868 81494880 Event' j6 I" R5 y, c* L+ S- ?7 i% o h 00E8 FF9064C8 FF9064E0 Event # U' p0 X' K1 w: ]00EC FF908FC8 FF908FE0 Event$ M7 j7 P& d2 _: L# d 00F0 FF908F88 FF908FA0 Event / B; N) y: O6 e" d00F4 FF955588 FF9555A0 Thread! ?6 }6 d: n) d R7 ^2 x 00F8 FF908F48 FF908F60 Event* a' l# _7 N2 X 00FC E2CB1558 E2CB1570 Port4 G: G' z) g3 R3 D 0100 FF90A2C8 FF90A2E0 IoCompletion * q2 R6 K: V" U$ Q& Q* {0104 E2CFE708 E2CFE720 Port1 N2 b+ @" t8 n 0108 FF90A2C8 FF90A2E0 IoCompletion4 u. j8 \- ~8 ^, b, U" o 010C 837762A8 837762C0 Thread! I% N% j1 y* i 0110 8103BBC8 8103BBE0 Event6 y2 E6 C" x! a) h. }5 O! H# f 0114 813DBDB8 813DBDD0 Event $ W1 ~" q X! F0118 FF814788 FF8147A0 Event8 q- G0 y% A3 u6 } 011C E1358DA8 E1358DC0 Key # v. H0 r! f8 s+ |1 c- N0120 E2CFC428 E2CFC440 Key1 L4 O- w% o+ s, ?' Y9 V 0124 8103B9C8 8103B9E0 Event. t, V; A" `. J7 v 0128 E2C9A968 E2C9A980 Key8 t" A5 s3 [3 n: D 012C 83B34E88 83B34EA0 Event 8 Q# Q- x6 p2 h+ I: }2 C9 t* m9 s0130 E2CFD948 E2CFD960 Key0 t, {: ^+ E( f0 A4 X9 U1 Z# R 0134 83B34E08 83B34E20 Event . I6 @% q$ L" v.... ' p% R! G, s" O+ E3 V# b.....................省略 4 G8 L0 r' o* m6 M4 L: ~; I# P! j! g( D! e6 q+ Z. e( F) G3 M 看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?2 e8 `: i% _# H$ W5 t 3 H: [! |* G+ H3 p' a想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此4 V, U/ G, o1 g2 K4 E) V% p: X : c0 X0 H( w; ]: _9 N6 b. D$ F2 s" X 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路- c, a( X; o* [& i! k2 t3 E. P+ U. j ) t& S+ h$ t# x3 {后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. 3 {1 j' o* b; s! W+ M1 u5 N5 u) t) A" o' G& F 果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS : e# X9 d% b' H S/ V* \! ], a3 x" i" U1 z- S; F 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 ; e Q' \4 w/ u$ J6 W: m6 Z# [& {5 f #include 9 S1 ?1 a4 G l5 Z#include 0 V* V$ e1 M/ k" ~! `#include & r' H- X- Q! ~+ [1 W: _ Y' H! f#include 2 Z3 W' b x0 c& f ; r# w/ w$ _ O( _0 u o) Q/*5 d! B7 d ^- [ Q" A * you''ll find a list of NTSTATUS status codes in the DDK header5 i& S# H+ A5 M1 d3 a- d * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\) & u* U. ?2 f! j6 `*/$ ?- q, D/ w/ b #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)& h- h F: o3 n/ H2 x4 X #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L); F r" g% g# q. q* W) f1 E' w3 w #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) 8 p. p! A2 {7 o : H6 u+ y6 Q8 g9 h/*+ p% u4 M7 D3 z" @% t *************************************************************************' L( F, N/ l8 H" ] * ntddk.h! J1 F# z9 r7 r7 n/ i */% u* }5 Q% K" j3 O# u typedef LONG NTSTATUS; $ y+ U7 R" B4 @2 d+ [typedef ULONG ACCESS_MASK; 0 ~4 H; i# J% a6 ?/* , y1 l* |7 b4 t: b* ntdef.h g( c5 n9 H3 f" { ************************************************************************* 9 g3 U* ~+ D1 m& U# h$ u* u*/" L$ G) ?/ u; y1 A7 f " ]0 x+ {' g" L7 t2 ]6 J /* 7 k% J2 z" m1 [ W7 M, O*************************************************************************: {3 q) p, A. q# t. q0 H * <> - Gary Nebbett - `% A/ i e) z5 x*/5 G+ `( {$ B3 h/ E; n8 x 5 B8 r6 M( M" F6 \5 _3 x typedef enum _SYSTEM_INFORMATION_CLASS & H/ z$ d. w* D' m% z. J( z! g{ ! y) M, d' O# gSystemHandleInformation = 162 J7 K. O" F$ \& Q7 [2 G } SYSTEM_INFORMATION_CLASS; - l( Y' a5 K: c' y( h# |6 `8 G- X$ {7 j5 K1 g9 Y( b /* - p( ?$ U! e, R A, a*Information Class 16 3 Y" p2 I( q3 E' v+ ^/ Y*/6 P, X' Q5 ~! F6 x typedef struct _SYSTEM_HANDLE_INFORMATION % k- x5 x+ P# K/ J" X* {/ D{ - ^! w, V! _: P2 _/ |! {ULONG ProcessId;$ q1 N8 z8 Y4 y% m) `" n: L UCHAR ObjectTypeNumber;0 O" X* n, L' ^6 y5 p UCHAR Flags;. Y. n, n6 W: x3 d6 T USHORT Handle; 6 b! W" @" i3 h" q9 p/ UPVOID Object;7 B* c0 h5 Q5 `8 H- k, g ACCESS_MASK GrantedAccess; 3 V# X- H/ x& ]/ F} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;3 L. M- C' r/ n ! B" W* [, `9 o#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; }" u: |+ W! B: _) Z. s$ D; H+ D /* " X8 n% j( M) f5 T) ]************************************************************************* . K) f* ~, i& \. n* d* <> - Gary Nebbett 0 o# W0 o7 x9 _- y*************************************************************************9 J9 Q! J. m( _% [8 H */ - s0 @( M$ {0 V& g. s4 a% v* Etypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); p( t$ Y7 r9 Q* w* I typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); 9 D# M- ~' N# M) {/************************************************************************9 d) e9 v) r( F * * # @1 h6 G! `) E8 _* Function Prototype *! Z. I! ]$ K% d. |" y' z * *+ b& U3 p! T, V1 g9 Y* `8 ] ************************************************************************/ $ S& G* L. {; d! `# a* t9 e4 L# X- l* ?2 v/ ?- E s; g5 A; p static DWORD GetEprocessFromPid ( ULONG PID ); 9 G- [% X F, `9 Cstatic BOOL LocateNtdllEntry ( void ); 0 a$ }1 q8 O6 B8 S5 @5 U0 Q0 n0 w! t$ P3 i, f ; p: }( ^$ a. L- J& n/************************************************************************ ; x6 k/ M- g" |+ R4 i& M* * & k! i, ?, v% L( V! Q4 i# O d3 c* Static Global Var * ; d2 \9 U- U# J) C. c* * ' E4 }% K$ i: R************************************************************************/ 5 J z7 ?4 W5 {6 w9 ~+ a# d! z9 T$ @$ b static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL; / \+ h' u) ?$ |% `; kstatic ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL; 0 q" Y- ~" l$ |- G3 ~, [+ B% D h: e* J8 O" m( Y static HMODULE hModule = NULL;# E' T7 b, h% L& F' ^ ? /************************************************************************/ - T$ Q2 u. g* d' g) Z4 _0 }& j- ^1 g% G6 F; C. G , o' C C. z/ K; m$ |/ @( e9 m9 J, e& x static DWORD GetEprocessFromPid ( ULONG PID )7 H: T$ f8 X6 e, |: r { 7 s" t L. V0 e3 V( I6 {; INTSTATUS status;, @0 X" ~2 K7 e PVOID buf = NULL;+ W0 o/ d& Y4 v0 I+ d ULONG size = 1;! H& D& a: Y/ f2 `; T9 [ ULONG NumOfHandle = 0; 2 g9 g- S5 N) ?3 g3 P& e$ RULONG i; $ x5 V0 m" R9 V# A! YPSYSTEM_HANDLE_INFORMATION h_info = NULL; ! Q N9 a& N, f3 D4 m, p 2 }; w- j( [: u8 W' A) Dfor ( size = 1; ; size *= 2 )2 h Y. r1 F4 k; s% s1 l5 r5 G {8 x; ?+ [1 t7 `5 P if ( NULL == ( buf = calloc( size, 1 ) ) ) ! `6 Y; {1 r6 w6 a3 R G& f9 B+ E{ & v2 B( o# l$ E0 U* Z/ [fprintf( stderr, "calloc( %u, 1 ) failed\n", size ); # p( W' l/ ^7 a$ o$ }% Wgoto GetEprocessFromPid_exit; ! S' l/ e% B# |: A* g} 8 s: y+ L' \$ }2 Lstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );! R0 | v/ y& m. [1 D) I if ( !NT_SUCCESS( status ) )8 G7 U( I Q+ r2 \8 U {: R: T3 H5 e [, h$ a9 ~ if ( STATUS_INFO_LENGTH_MISMATCH == status )6 R" y m$ J8 U$ u { ( `& M$ g6 H, N7 W7 }# Lfree( buf ); 0 c# H3 e2 Z5 d+ \- |buf = NULL; ! c6 [/ ^! J [2 _6 N' d. \}* F) f. }' \' o+ z% x. j else0 e. |0 I4 G9 z3 Z { : ?$ S- Q" `! j/ xprintf( "ZwQuerySystemInformation() failed");) a1 p% O7 o" j1 h goto GetEprocessFromPid_exit; 4 L( F, @& H" I6 |3 K} : c% p2 m: g3 y$ C, J; {# S" _& W}; m- }% o6 H5 y. u8 G else5 ^6 t* R3 E% A. x {, H% E& t! l" Z3 t5 |9 O% S6 _# ? break;2 ?/ `4 ~' T' i. K } 3 q5 c( ]( N7 V# S Y2 z/ O2 R o} /* end of for */ 8 u" `5 l& Q/ Z* k / D& w8 h( w( U- H, B0 j2 k//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组 & |% ?2 Y O$ t' N! |* N; J, ANumOfHandle = (ULONG)buf; + f4 A7 a C( G( f0 L3 w 4 u6 E- V% Z! ^8 {h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4); % b' j; s. s4 v: y1 G$ r" Z7 [ & A1 B. Q8 @* ?: B& b. ufor(i = 0; i { % n; E% j& [8 s5 i# Qif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )- ?' r1 ?5 p2 R {& M' e6 A I0 H) k3 s& S; [8 h7 ?+ y printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);' U9 G( T2 s& ~5 i$ a return((DWORD)(h_info.Object));$ Q, V& l' G/ {- Y% `' g% B: W }3 i8 }- {' y$ N' _, T. H } / ^& R" R+ x( B0 y9 i+ DGetEprocessFromPid_exit: 3 s: x% ^& n4 d3 dif ( buf != NULL ) 7 A4 ?; ?) R1 E2 I* u* _4 c{ ; G5 s3 k! L, L4 H# J9 Nfree( buf );% l/ A1 k& s+ o; ~ buf = NULL; : I# Y$ O% R' n2 a6 I9 j) V}. N3 Z& l# Z% S return(FALSE); 7 s8 G# z+ {$ z3 j( B' [; b}2 O0 ?& d$ j. C o9 t) K; u * Q; D/ K2 l; H: i 9 w. h3 [3 v1 o/*5 z, E O! |( {9 E! w * ntdll.dll 4 l. H) Y; _5 \ t3 k L" a2 Q*/ , a4 [& O& R& I+ @6 F2 Y! X! u" @static BOOL LocateNtdllEntry ( void ) : j9 S! h2 [1 a" ]{: c" C% B9 r( ~, Y4 S BOOL ret = FALSE; / F2 \- b1 l4 s9 e) uchar NTDLL_DLL[] = "ntdll.dll"; % o/ e7 w0 R: I* C* l- |HMODULE ntdll_dll = NULL; 4 v" q3 r+ ?7 Z! j/ c2 b' J5 {$ i+ Y& T( x6 j ( Q3 B7 f$ Z8 S" @ if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) 4 S/ V8 O* m) i7 z- R{ $ _/ T. {' l) _3 s \# X5 [/ bprintf( "GetModuleHandle() failed"); ' q+ {* w: i$ n0 ~, @. creturn( FALSE );& j5 f) n4 |2 `. Q; D5 m% N }; X, B! j i8 l6 c if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) 2 s& {8 {) V/ M" H: P- F{9 f |# ~; g# g goto LocateNtdllEntry_exit; : U* ]' \% p: |) U1 `}6 W8 J. q0 J3 a* S. { ret = TRUE;/ Z* ^6 v" q, \ 3 S+ d, G7 Z) M: d' ` LocateNtdllEntry_exit:7 K! N- k) p5 `% j( E8 s/ @ 5 j+ [5 k X$ z/ Q k3 }if ( FALSE == ret ) 0 N' s, c9 \8 S, D; Y8 w1 @{ $ [+ N% \/ e! k- @( V2 kprintf( "GetProcAddress() failed"); : P5 w- i; y, @% L# h9 e5 g}2 [" m! R& G) H ntdll_dll = NULL;7 L- Q: V) i: p1 Y return( ret );+ F- m* _ d8 ]8 t* g } /* end of LocateNtdllEntry */ ; W. U. H& Y+ y. p& p' O& T" y$ P0 ` ( I% b8 E7 ]" g! b int main(int argc,char **argv) ! c9 {0 [0 X! ]. Y p7 a0 |' I{ % t+ H! \7 ^6 A' n6 D: h% ]- w - u# p) r, a& t; Y3 }6 _LocateNtdllEntry( ); 1 ~4 X/ p1 x2 W4 l& o7 u; `0 u- V U, h, w7 z* o: O+ e) v6 Z //打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5 . y& F* J4 W3 {1 T, W8 K% ^; a$ o) G6 IOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );7 \/ y4 |5 X. x: f / u) ~( w9 K% e7 t- VDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );( H& F1 y) W8 e$ v# U* { ) r3 v8 T1 V" Lprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); 9 a9 _) L0 |( i& n) Z, o6 v8 B- \( |' _( w1 A: M9 b" k8 g" x return TRUE; ) |, O6 m. z6 U! A7 y4 Y* f}
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 16:12 , Processed in 0.488141 second(s), 52 queries .

回顶部