QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容: ( a: c0 l! l) Q8 M; }: u6 N--------------------------------------------------------------------------------- J. n6 b# F5 t+ K: f 文摘出处:http://www.xfocus.net/articles/200406/706.html; i0 ]2 w# z: y * ?& x4 \6 E* ?5 H1 `6 }0 q 创建时间:2004-06-013 M& _. T, y0 O. D( _$ B 文章属性:原创0 U2 e1 D* i4 F$ F( L; _ 文章提交:MustBE (zf35_at_citiz.net) 4 ^; ]) ^! e F( ~9 L ( \2 T! O0 B' M9 Y, X' v p& |0 P7 ABy [I.T.S]SystEm32 4 B, }5 O$ g% I; D: n( b; S7 E* n% q% i: s4 A( o" n Welcome to our web site http://itaq.ynpc.com/itsbbs/ + Q$ V( n" Y4 i1 m& ^. _# v - }9 b. {! s/ x% }7 }thanks to SobeIt : P 2 S) s6 [0 c6 i6 `' {! ~--------------------------------------------------------------------------------------------- 3 Y- _' j7 c% Z9 l. [2 H + `- g. j: l) |# m每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内. & L7 f2 D; D7 p, a( M" ^- j0 l5 E2 D: \; M7 P1 Y) y 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 , Y/ _, s% Q# ?/ l4 |% g+ q # u: ?8 b! T2 O! K! A: v( F5 {& FZwQuerySystemInformation函数原形如下 2 J# y7 W1 n: z; W$ V4 ?% c; ~9 G! O# }, P/ Y NTSYSAPI ' Q$ f$ K' Y7 _NTSTATUS: ]4 {' L: ?( @3 E NTAPI" k, G* g. @& L# }- E6 C: e: k ZwQuerySystemInformation * r: @/ I8 |( j& e( @( ' O' f" y7 [7 I- h( [7 ZIN SYSTEM_INFORMATION_CLASS SystemInformationClass, . }- g5 t% ~; u% O; v8 k+ P IN OUT PVOID SystemInformation, ' T P6 H5 i6 t/ [/ A1 A2 |IN ULONG SystemInformationLength, " W+ J# w" C4 y- ]" x) N2 vOUT PULONG ReturnLength OPTIONAL * D u/ X9 A7 B% M ); 9 P" T7 ~. P! ?! M" n) A; o. m: L 参数意义如下 . D r y" E7 j' b$ L; _ ; R5 a( Q- a1 T/ C( B Q( @SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 P$ k4 v2 s( c. k8 x : h# P2 \' _9 _& v4 X/ V; Q7 D9 M SystemInformation:指向一个接受系统信息的缓冲区的指针 # j( ^: R, V, m, a& y/ k/ u# E5 ^- u; i, }9 G1 G SystemInformationLength:缓冲区长度 0 g5 B) X7 O& A4 y& o0 ]# ]$ F) `9 u4 o" Q" A' J. f- X+ H ReturnLength:指向一个接受实际返回字节数的变量,可以为0 & ~/ l; V: m& ~% j/ L# \2 s q' N3 V; f2 C* h, G, U" d7 B $ F! A! k L1 v% p' k3 z# c. b 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation$ j+ j8 U2 Q1 V4 l 7 O9 K* P+ N1 F q# B1 ~ SYSTEM_INFORMATION_CLASS的结构如下, p8 o8 [' q3 ?1 L+ t2 ] ! I- u/ p, Q. q. j% H$ P4 {9 U# rtypedef struct _SYSTEM_HANDLE_INFORMATION 1 e9 y* O( K5 t9 K8 t3 ^1 V{ * ~* S. B: E- T4 h8 q5 U$ ]/ @ULONG ProcessId; 5 ` U, {* o" q2 L& y rUCHAR ObjectTypeNumber;+ U. P x/ D3 r, f2 k) X! x UCHAR Flags; . x4 R! S# x" ?! b, SUSHORT Handle; s( U/ b) J7 B7 L& c' T5 kPVOID Object; $ P8 \1 {5 ?" I- OACCESS_MASK GrantedAccess;- N( E8 w, t1 P( |* E } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; . \! L) _$ y. N4 Y1 Y. A' M, ?# I1 i @# t0 [6 S0 R ProcessId:进程标识符 " `" a' i. E, Q! u" P1 l, K$ H8 }0 h6 s: e% H ObjectTypeNumber;打开的对象的类型 & o7 c7 J) g' B8 F. Q4 K 5 T- f# }. l5 s M' |Flags:句柄属性标志 8 h I/ `* s" `& Z u3 B# |7 L- L! |+ s$ d1 q" Q6 W5 l- m Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄 6 C$ b; x t% z5 X" M/ r5 ?" t U/ J( i% c& J. e/ I, L Object:这个就是句柄对应的EPROCESS的地址 & J( Z! o! V$ d0 O A ( ]3 H% g. ^9 _ U! X- CGrantedAccess:句柄对象的访问权限 ( h* d( r! E% W+ g1 W2 J0 n c; k: Y5 r1 s- K* l9 e7 m5 y9 d6 p" A* t7 F/ a2 \ 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )6 X7 \) W0 G0 g1 c5 l8 o) E 1 T( v0 `: w! _ S- R9 T+ ~比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 6 ` j1 u' s# k2 e1 R9 G 1 D% k+ ^& f, K8 R* D# x, J怎么会这样?难道程序写错了?*_* # F0 H' t, I* q5 P, R: M& H& z8 D$ n 2 k* `9 D% e9 F* [8 @1 h9 F现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出 ( k% I* W7 ?$ L; j X. Q# k/ H- i$ [9 c# B i1 p. U :proc -o QQ # _! m' Z, l) q1 }Process KPEB PID Threads Pri User Time Krnl Time Status/ R$ @; Y6 f% F# f7 E; { QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready2 }+ I6 m# A$ D+ W# M9 u2 j' s 6 H4 A7 R! p- j( z6 V2 W, C ---- Handle Table Information ----$ b, u% G, m: ^- r 5 n3 b4 N9 A8 c, wHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590. T; e+ r" |* w) \; F# F; z # ^: q2 U& X3 @" G( [ Handle Ob Hdr * Object * Type' f, R" _0 e/ p" @ 0000 00000000 00000018 ? : ~# ?* h. W \, D; o" c9 F6 H0004 E2DA5E58 E2DA5E70 Section! @/ A; C* H0 O, t6 C9 j8 ]. ` 0008 FFAB35C8 FFAB35E0 Event 0 M' X" ?. E; v, j0 |000C FFAB3B08 FFAB3B20 Event' B8 ~* N( U3 N& q 0010 85C70188 85C701A0 Event 2 J' E1 P; z) R) X0014 81515778 81515790 Directory * T3 D4 b6 w- e: k9 Z* U0018 FFAB7BB2 FFAB7BCA ?2 p) T% F6 L& X; f1 X- O. f 001C 814A1858 814A1870 Directory $ t7 `" I& @) l) H0020 80288C88 80288CA0 Event ! s/ V; a! y3 _( q) l; Y0024 E2CFE7F9 E2CFE811 ?7 }7 f- w( X4 Y% T. Z4 M; C 0028 842D7B08 842D7B20 Event $ x( e: o4 T% B: f/ h+ Y002C 80E9B989 80E9B9A1 ? 0 S+ H, c% ~: A' P- T5 r1 H( d; K0030 E1372198 E13721B0 Section 9 S; q& R# J9 Y8 H5 @0034 814602C0 814602D8 WindowStation' H1 e9 X/ w* n8 x 0038 81455CE0 81455CF8 Desktop 3 E4 W W R) y3 [& [2 ^& j# D003C 814602C0 814602D8 WindowStation % s5 m3 z. h' J) J; X: R0040 E2B3C1A8 E2B3C1C0 Key" {- J# L4 B9 I4 Y 0044 E286D6E8 E286D700 Key. { i# W* R# k& _" d3 U8 K8 Z) z 0048 E2B3C0E8 E2B3C100 Key 6 r9 x, v4 T% F0 P$ P004C E2B3C068 E2B3C080 Key : ]) B8 L8 \# J& {0050 E2BEE688 E2BEE6A0 Key # T/ b: D4 l1 C$ {9 u0054 8147C998 8147C9B0 Directory! w3 d; }4 \# F x8 w: \7 ~ 0058 829D1128 829D1140 Event8 w: c3 w! w/ O* {5 g 005C 83F991E8 83F99200 Event/ G) n! m4 U8 Z) H 0060 E2BEE608 E2BEE620 Key 7 Q1 U% n+ Q1 I, a6 | j. _' A0064 FFB07568 FFB07580 Event6 T% }: N& g7 g7 G+ ^$ u2 q0 z 0068 801747E8 80174800 Event ' l' w8 ^+ K/ K7 ^* \006C 80174828 80174840 Event 3 M, {% N( D3 R' w, }0070 845E8808 845E8820 Event 7 {, b1 P+ v- e* i: O7 D4 Q0074 81448798 814487B0 Event + P6 c9 C7 Y9 j: ?7 I0078 E2B9A888 E2B9A8A0 Key, T" ^( ]$ }' _& J/ Y& }/ L# n; _ 007C 845E8648 845E8660 Event ) n8 l# J& d s9 f% h x; p0080 FF9E2DB8 FF9E2DD0 Mutant" J J( o0 q% F: @- I2 V2 l# | 0084 FF9E2D58 FF9E2D70 Mutant0 [5 P1 X& j( K 0088 83CFC378 83CFC390 Mutant1 r: t9 h. A, x- |& Y& I 008C 801749B0 801749C8 File: @5 I! A& N; b7 M' Z 0090 E2C48668 E2C48680 Section6 W: F3 @& j2 N 0094 FF965168 FF965180 Event6 [% y4 C/ B+ ]/ L 0098 FF9E7D88 FF9E7DA0 Event* m2 v: A+ Y- Z$ K% R$ ^" H% w 009C FFAD3DE8 FFAD3E00 Event ) d* o5 H; H) N, ^4 M1 d* q00A0 80AD63C8 80AD63E0 Event' ^4 ?: _3 O# G D' \ 00A4 E28073A8 E28073C0 Key ' U7 I/ X% T/ S- v8 l9 X( w00A8 FF955588 FF9555A0 Thread , H: t0 w8 k; I, O00AC E2770728 E2770740 Key# Y: r& M- q" E2 ]6 Y9 a, {9 f( q( r& w 00B0 FF923438 FF923450 Mutant / y3 e9 N" G3 V00B4 FFAE3B38 FFAE3B50 Mutant 4 }- u! }, w9 w2 A* t00B8 83B80728 83B80740 Event * `& \5 {1 H7 W00BC 83B80668 83B80680 Event- i+ Y; R+ P! S& |( H' W, T0 z 00C0 E2E3C448 E2E3C460 Section & u( ?- ` G& ?. q( T G$ d00C4 83776A08 83776A20 Thread 4 I ]6 c$ G0 l) U00C8 81489E48 81489E60 Event 0 X& |& ]( E) Q0 P9 |6 Z! Y1 L00CC 83776CC8 83776CE0 Event, _7 `$ l/ G, K7 f8 Y 00D0 83776C88 83776CA0 Event 9 G y0 x/ r: v! W# D% D" v; M5 g a" u00D4 83776768 83776780 Event 1 P |/ t. M( |00D8 E2837D88 E2837DA0 Key% y) X: c7 L, _& F# X7 U5 {/ _! G 00DC 8146B3A8 8146B3C0 Event! m1 v$ K) n1 \; Z3 b) w6 w 00E0 FF908308 FF908320 Event ' c6 p8 u' o, E. A00E4 81494868 81494880 Event ( o- }( a% g- m! N* g00E8 FF9064C8 FF9064E0 Event Q7 W2 g, M- O7 P00EC FF908FC8 FF908FE0 Event, P! ~8 r( p/ D( l: h% j! Z: s% S 00F0 FF908F88 FF908FA0 Event0 |# y0 F) s8 V* R9 m& W 00F4 FF955588 FF9555A0 Thread F$ c0 v# e# J1 n" q00F8 FF908F48 FF908F60 Event $ {/ m7 S, d* F- t6 p* K: |00FC E2CB1558 E2CB1570 Port . I' P8 B+ n6 T0100 FF90A2C8 FF90A2E0 IoCompletion 1 D7 {" I6 }" I1 c& C2 b) t0104 E2CFE708 E2CFE720 Port ( f) d0 f a; Z0108 FF90A2C8 FF90A2E0 IoCompletion * E& P3 S2 {) Z) x7 n8 a0 \6 o8 M010C 837762A8 837762C0 Thread 4 ~* y* O2 W, ^* ]5 v# w0110 8103BBC8 8103BBE0 Event% H0 A) o$ F+ T- m 0114 813DBDB8 813DBDD0 Event3 e9 Y8 w8 ]- T 0118 FF814788 FF8147A0 Event * h# Z k) n8 T% _2 `011C E1358DA8 E1358DC0 Key5 X4 h' D# f: M% | 0120 E2CFC428 E2CFC440 Key 6 I& Q7 ~9 x% B# R6 R4 n. P0124 8103B9C8 8103B9E0 Event3 T/ ~% a# j) t+ H- ` 0128 E2C9A968 E2C9A980 Key- L) U7 W6 J) L( y 012C 83B34E88 83B34EA0 Event3 M/ k# e9 f9 E Y 0130 E2CFD948 E2CFD960 Key 6 ]- E6 @3 Y/ |+ U7 O# M& I3 ^0134 83B34E08 83B34E20 Event) p: u5 @) `, l .... 5 [5 B8 p5 P3 h% p+ l.....................省略 p- C# D- Q# ~ . O0 W& `: N# j; @8 q! y" h看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢? ' c( y5 s5 S$ r8 m 3 t7 y: T9 q, f& ]想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此, N" M& g) u {: m + R. N/ z* S' J* o/ j$ ?% {9 @ 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 2 e* N3 G3 p& r, A+ N' ~ 9 }2 i* s1 E) c$ v6 w后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.9 L% t, c4 l; U 1 z4 @, a& b" Y1 m M( l$ E 果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS' e0 ]5 D( N& s5 p' @- V: m5 i : }* [2 j. @( y- L, ^" @& K 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 / y3 w' w; Z+ ~! |" @2 d' K3 e9 a3 y* U+ {5 D #include $ N/ A5 U% \# Y! ~$ c k#include ; d; Z8 p1 p: p! b& S #include $ Y, J) j( W# w5 B+ g #include 4 j! T$ ]. L. g5 t0 A* }3 R# F/ _( o! O3 n( ^4 L$ }2 b" f4 K7 N /*7 [7 k5 r3 H E) }8 n$ M2 k0 S * you''ll find a list of NTSTATUS status codes in the DDK header 5 ]8 F1 K$ J) }; j' h1 P* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\) " O2 R" P, J+ K7 |2 \# D7 }! R*/ . b- r% A R. H2 V' I8 e/ P& U3 R#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) - g$ D( [5 ]( L" ^+ o9 J+ A#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)1 n0 W3 @- N" I+ K6 | #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)3 P8 b! P4 Z( H% q 0 L0 e9 |' D% E* r: ~! R" N, ~ /*1 ~. G$ h' q: A, a *************************************************************************% Z2 a" l/ k- p2 G- q% i. I * ntddk.h1 I n* w/ k: [& B4 }. Q; j */ I$ _7 w/ V& B; P; z4 y3 S8 R; utypedef LONG NTSTATUS; 1 L: i' V7 T' Atypedef ULONG ACCESS_MASK; 8 w! h; l. Z" | W: h' o/*& O* }8 P; Q0 ^% `- r * ntdef.h4 a: u. g: T+ j8 P ************************************************************************* 8 h- S# b- _. n1 D( R*/5 }( W) [) ^4 ]1 o 2 j) g- x5 U9 u7 [+ a5 ^/*/ _1 \: L. `* [5 w g* ]9 M ************************************************************************* m% g7 H9 ?2 g * <> - Gary Nebbett1 v7 W' L/ E- f& f */& |: m. u+ |9 ]4 N ! _0 Y' I( ~- l4 J1 u+ @9 e* l4 dtypedef enum _SYSTEM_INFORMATION_CLASS 0 Z- @* o; D' F' W{ 5 C" c4 B* b- n9 I; z" mSystemHandleInformation = 16 # {* g: H: J9 h} SYSTEM_INFORMATION_CLASS;6 ^- U- n J3 D4 Y0 h. J* R% w ( |* [' x$ S0 v, l+ f8 O. \% [& F /* 1 u7 H, p+ N+ i! \( y/ \*Information Class 16* \. D9 Q& T$ b& D+ P* A2 i/ R */- d( W# Z* H8 z3 U5 z4 O6 s typedef struct _SYSTEM_HANDLE_INFORMATION ' C; H& k) l$ g0 s k- j) ]{ - P/ Y+ {+ |4 d* `, _ULONG ProcessId;* V6 O8 i" L+ ~* V! F7 O8 c! P UCHAR ObjectTypeNumber; 5 t, p: x$ Q1 d/ @UCHAR Flags;6 X& |) R% d+ q, \! O2 T! L9 M USHORT Handle; - r0 o: a& Z4 T* i3 B$ s; ], U! `" ]PVOID Object; 7 q9 f" X& f5 C& M+ ZACCESS_MASK GrantedAccess;; w% g# i6 _+ J9 V# `4 D% y } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; : i% L5 R) d$ K, m2 n: I' z7 w |5 V; ~! W) P$ S' F #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; } 1 S! Q/ z, I2 y/ E9 S B( J. c' L/*$ o a: N7 M' P, I- ^6 ?) C# V ************************************************************************* + ^4 {+ N: c5 e4 n K* <> - Gary Nebbett. i$ [! L9 d; y* n *************************************************************************9 z c2 O9 m& U- v ~ */, h4 q1 Y; U2 X" P* w4 q typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); 0 G& s1 w1 r# s5 v+ ]typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); ( d+ N. y! t% n* S8 R3 ^/************************************************************************0 F) \9 ?% v: I' N- Z- D) P * * 8 |! y8 u( E. K5 {* Function Prototype * , y: y( u+ A& C; ^* * , q1 M' O4 `" q+ s************************************************************************/5 Z3 Z& b( f" A6 U8 |, q ' A& d, X% s; _( E3 e" l/ s static DWORD GetEprocessFromPid ( ULONG PID );4 F) M, N4 u0 b6 a1 @5 j9 _ static BOOL LocateNtdllEntry ( void ); 1 _8 F3 A, A! x' S _( h; |- i0 @9 l % }; ]5 [$ f; h /************************************************************************6 `0 S% N) `! F8 O$ j( ~ * *, u6 j- Q: j6 Q0 G * Static Global Var *. k+ y& M( C# r* E! T, d! \/ } * * ! y- G, @ @* z( n% C, ^) v************************************************************************/9 ` v9 e9 |, V: M ' c9 p* w/ F% ]3 E+ dstatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL; & T' {$ x6 ], c! x8 rstatic ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL; ) e- c" V3 |' H: c% Y# d5 @) i% L ! v1 ~: d# |6 Sstatic HMODULE hModule = NULL;& F- x4 ~8 V7 }) F6 }& q /************************************************************************/ ) x/ I: [' g% k0 C7 C( G# u( j 2 J5 G# N- H4 \ ' x) `, t3 v# O( f# @/ qstatic DWORD GetEprocessFromPid ( ULONG PID )2 a+ `, ?* U ?2 _9 ~+ w3 i { 7 M5 o6 t, Y2 n- Y- Q4 F/ p2 JNTSTATUS status;! e0 s3 _" C& s" K% p PVOID buf = NULL; ) d e$ r9 ?2 Q2 HULONG size = 1;2 r0 M3 r. q5 a! U w! ~ ULONG NumOfHandle = 0;* }3 N; L) K) }0 a8 {7 M' v ULONG i;9 q# x. h/ t" t3 q! O' i. n PSYSTEM_HANDLE_INFORMATION h_info = NULL; 6 O1 G4 l; R* E1 c& g/ h6 A$ O* D n3 p& Y g b/ r for ( size = 1; ; size *= 2 ) 2 y+ i" y8 H" P1 \5 o{& _2 d8 W1 s" c: q) a* L if ( NULL == ( buf = calloc( size, 1 ) ) ) / C$ w5 |! A+ T1 |! L* Q{2 Q% y0 O' k1 d0 ^! Y& A, C5 r5 G fprintf( stderr, "calloc( %u, 1 ) failed\n", size );( G$ O8 S8 y$ C g. a2 T4 @! B goto GetEprocessFromPid_exit; # p8 L' n5 H4 m} & O, E. Y4 Q9 h) [/ f' x* bstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );0 ?8 o6 D( u X7 B, d1 e5 s6 z$ ] if ( !NT_SUCCESS( status ) )7 E; I. G' k: B( S { 3 w( R j. \0 f. h1 c; p$ xif ( STATUS_INFO_LENGTH_MISMATCH == status ) ) H4 x( ]# W- m% s8 k5 W- r& f{ * _: t, O, U( F0 J1 u* Tfree( buf );9 n3 d: D% @ P) z7 ^0 A, ~ buf = NULL; , B7 D5 l5 f! c5 p} # T- B7 \; ]! M' v5 C$ X* q" d, delse , K8 U. o- _5 ?{ : O2 [' R: m) ~1 ?- [, _printf( "ZwQuerySystemInformation() failed");" |+ O: i, H0 |1 l goto GetEprocessFromPid_exit; 0 A0 u5 n1 l! k1 D$ P) s( ]} ( m( |$ c& g) h3 c3 |% F- E4 i}- `% q/ ~( l6 b8 I& K! | else1 A. G- A; \. g, E6 z% z: j {$ l1 L0 Z! H) D0 I$ c. F break; " L% V' ]0 U8 o} 5 v) [( J% N+ i; Q& ~& W( R# k3 z} /* end of for */& s! }. @, Z) W7 O 2 v: x6 u& n6 q" d/ A! b//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组6 a' V( [% O( L+ m) \" l/ H NumOfHandle = (ULONG)buf;. @2 S' u& k8 c* ^2 U 7 z1 U" F! E% \$ z3 t h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4); / |1 L8 ]+ u; F' }, a8 ^2 J: {0 S: I4 }1 K `7 S" r. G for(i = 0; i { 9 W, Q: J& T, \if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )/ u8 Y3 @8 m, e# a: V {+ _+ j; D5 Y6 w( D2 O. U. t printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); ) m) J( Y k' t, s0 s7 Zreturn((DWORD)(h_info.Object));& [) j4 K( p0 X6 {; s' h5 c }, E. [' ]8 n* l } / v, X0 y% C8 o" WGetEprocessFromPid_exit:7 g$ x7 c" L. D/ y# K& ?$ a if ( buf != NULL ) ! z& t$ O4 c9 B/ Y1 [{ 6 C! ~! a8 |8 Z$ w/ _free( buf );; H, s# z0 p4 z1 t buf = NULL;$ ?; a& o, a- x2 q* J } 6 R3 Z% `- @3 zreturn(FALSE);3 g; e( T2 U i, J }* g3 E+ c8 h# A0 Z / u0 t6 ]& _2 W1 c( G ( g2 j# U8 ]! v. [) [/*( K2 v+ D2 G4 L. k& C0 S$ d * ntdll.dll * m( `3 Z4 U! u5 t*/ ) a, y% Z6 w- `1 [7 T8 v2 o! E9 gstatic BOOL LocateNtdllEntry ( void )0 S7 x; ~. K% w8 _% I% z% ?7 @ { 5 ^, s5 X7 s9 i0 `; {# [ J0 @2 \BOOL ret = FALSE; 1 v# T' f7 |, k6 b1 o3 L3 [1 n% v }char NTDLL_DLL[] = "ntdll.dll"; % F% p) e' D8 h! E' ]HMODULE ntdll_dll = NULL;% e4 o, q5 M6 A) w; _- d" D O 5 |9 c" |( ?9 R) ?# I % g" ]6 M, t% K+ a0 kif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) " m4 ^& ]/ M9 Y" }7 U' z! W! {{ ; c w3 |/ v- j2 X' ~+ L9 D/ R% Xprintf( "GetModuleHandle() failed"); # Z0 M! D: j+ F5 ?return( FALSE ); , i9 |& G+ X8 D7 X}/ u2 t& x) H/ y8 o, m, r/ V if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) ( R5 u- {" _4 _{7 ~" \% Z2 K' d- X& C goto LocateNtdllEntry_exit;0 d Q7 G( g# r+ x$ f ^! C- l } + |! d& d% G% N* w$ O1 y( jret = TRUE; / b# Q/ W2 N) Z G: |+ r' {) l5 [8 |. ELocateNtdllEntry_exit: % ]3 C9 g; b- M4 E2 x6 D/ e( p( j1 m% A7 f$ j- z( p6 v if ( FALSE == ret )$ ~: T+ A4 Y: h1 |) Z {' n2 X$ X1 }: O: ~, g$ r6 [# m printf( "GetProcAddress() failed"); * ]6 C9 T9 n7 a# J2 C}$ g9 O* H3 A; v ntdll_dll = NULL;9 @7 t# l! g5 U* o/ ^- ?& F return( ret ); , P4 f3 V; ], L! I} /* end of LocateNtdllEntry */ }4 Y, }1 ?6 p/ v/ _. ?! z V& z% @# `9 |4 h4 y) \# v" v/ R . ]) E. S0 |# \ _ wint main(int argc,char **argv) & Q" Q; v% K' a2 Z( f9 e; h5 o{* N) K7 ^0 }" t$ P0 y9 |/ i9 X " x& H, X& @# r& E: H! x LocateNtdllEntry( ); 2 z! r) S/ S2 l( p$ N! P . H C) a3 k* w//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5 0 j w" w4 ?1 R" W4 c, aOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );+ r% ~! z9 e9 C * r2 |9 E6 y4 }$ N5 iDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); + s% w e1 ~8 d2 E$ n ! B; U6 |0 ?$ P. h! Uprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); , N( d5 _# H' _, O" H! v% k; R6 Z7 H* N; a! V return TRUE;) b! T. C6 C# m! n; h2 l H9 C; V1 r }
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-6-11 05:43 , Processed in 0.407877 second(s), 52 queries .

回顶部