QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:; W' a7 T' C3 C9 r1 C -------------------------------------------------------------------------------- + U; K2 n! i$ v$ A文摘出处:http://www.xfocus.net/articles/200406/706.html 9 g4 X' W% K" f; g3 A& X+ ~/ j0 o! S) Z 创建时间:2004-06-01 ' |6 @+ C& t B) m5 J; m文章属性:原创 ( b- \, x; h' ~文章提交:MustBE (zf35_at_citiz.net)( v: K8 Q. B) L $ H6 t% _* t* `; I By [I.T.S]SystEm32) _3 g$ }& L! J " Z) m& S) \0 r3 r" E Welcome to our web site http://itaq.ynpc.com/itsbbs/7 @/ N: ]1 q" s" M8 ] * m: G$ E9 ]9 m" B1 R- Y thanks to SobeIt : P ; x5 R' R/ j5 @ ^5 J---------------------------------------------------------------------------------------------& v/ d7 {% O3 z3 L7 S8 B ! ~% M" Z5 R* P \' M5 U每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.5 H! L9 e; _: {5 G " @! k0 M4 c. u0 W7 _ 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 7 a7 G+ D' ^0 ?% a8 h: ]2 j( Y! V+ q6 c8 ? ZwQuerySystemInformation函数原形如下1 j1 {3 _6 g, g: q0 @4 ^ ! n9 s: v7 T# Q5 D0 m c+ O# J NTSYSAPI% Y& B& m! }+ P" s. X NTSTATUS & d7 ~4 h0 B! m8 _9 a# lNTAPI 2 G- ?" ]' B) {% E& X. sZwQuerySystemInformation 6 ] M. ~' w' O, _1 v& _- Z7 N7 _( $ z: g: X: c; U. `, ]IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 4 O* T4 }9 J4 i4 I7 H) pIN OUT PVOID SystemInformation, 1 x5 M2 ]% |/ a# cIN ULONG SystemInformationLength, / r! j+ h- a8 ^) g6 H OUT PULONG ReturnLength OPTIONAL 7 ]6 A6 V6 e% S, ^& g* ~7 Q) s' k); ; A q! R* F. ^$ {+ `4 S" g! D0 ]9 Q 0 B7 H9 a: L& D, U+ \ J参数意义如下 3 L* l+ z7 v2 ~& a* f$ e: j ( Z0 n6 p! u5 M4 v6 j( ^6 ^" mSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 + `1 }& H. s8 b, G( d6 v/ i0 k) F- E4 u! u: Y SystemInformation:指向一个接受系统信息的缓冲区的指针 1 i0 C3 B+ t; t6 u9 T9 F- j ' Q; {8 p9 M q7 v& TSystemInformationLength:缓冲区长度9 |) B- P4 r- u& Q7 ^: ^ 4 `, B: O, X. g. B' Y0 y) L ReturnLength:指向一个接受实际返回字节数的变量,可以为0 # {, L9 d% t* r- m. f& p * V+ |9 s: i& D$ R1 {* d9 Y$ {3 i9 A" m. P* F* J! t 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation* g' C' O2 f/ b( n6 u 3 S& b# q* u `+ ^1 ~ {8 h7 NSYSTEM_INFORMATION_CLASS的结构如下( N1 m( d( L n( {; l& [6 E % a% D! L' X" ^ }* U0 otypedef struct _SYSTEM_HANDLE_INFORMATION; ~( E/ ^, H) D" z {! d$ W: b/ e4 a9 q3 Z, _1 L ULONG ProcessId;7 ?9 f' H" d2 _, w4 ]# F UCHAR ObjectTypeNumber; h) T" u5 P: q$ l7 f) L% G/ |UCHAR Flags; $ M9 s) P7 }' i# L& gUSHORT Handle;: s2 E- t+ G. S8 Q9 u+ {% E PVOID Object;3 u, B9 x7 e" [- } ACCESS_MASK GrantedAccess;4 ?: L( S1 L% k- q2 D } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; . U( i. H- ~7 u9 F7 \ % h8 Z8 T7 v" x9 Z, X+ zProcessId:进程标识符 * m/ O& k& v" M D ' b# q, L; o2 E- J7 G0 nObjectTypeNumber;打开的对象的类型7 W: m9 ~/ ^ o* U" e0 Q t8 q4 T ) R. I! K; U( C$ R' x: h8 J Flags:句柄属性标志, v, A% t# u0 }3 n! @8 H* C& e ! W$ g9 ^6 T* r& X: Q: U$ CHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄 0 I# ^3 k' f/ ~& c! A, N1 g 9 z6 E4 ?6 e: H4 a+ FObject:这个就是句柄对应的EPROCESS的地址 . {# W9 C% Q7 ~1 r0 N8 B0 q* C1 q; z+ b( s; {: \( x! s2 | t9 \" A GrantedAccess:句柄对象的访问权限 9 k$ L' V% ~/ i% a$ I6 l ! U. \4 E, s7 j) @, H6 C; v) F- t- c+ | 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )3 J a j4 F" V& p/ ~ 3 {6 G# H6 w5 i6 f: _ 比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄9 Q) R0 v; b& v E6 w! [ 2 m6 d9 y6 a6 s7 |# F 怎么会这样?难道程序写错了?*_*5 x$ t: u, m8 R* I M3 I" | ) B, W$ J- `7 n {5 l 现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出4 l! Z' [" g/ {' J# a, i1 ~( b % V: W% R% T$ N# H:proc -o QQ . X9 s' h6 _9 \7 NProcess KPEB PID Threads Pri User Time Krnl Time Status, m2 j" J- |- T, o/ | QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready / r0 W4 R5 s" }, ~( v' S* i9 @ - l. K. ^4 Z. T- O* r---- Handle Table Information ---- - A3 j" r3 @+ l 2 m; @! s* h1 DHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 4 K) ^+ S% M1 M3 d , X% ~( B$ ?. K/ vHandle Ob Hdr * Object * Type 5 X$ g% e' P- U! }: y9 J0000 00000000 00000018 ? 5 d* o* x: l7 ?: h0004 E2DA5E58 E2DA5E70 Section 8 d. k+ w. `" E8 v; y, z% i2 Y0008 FFAB35C8 FFAB35E0 Event 1 `, J b( T, g" S& t000C FFAB3B08 FFAB3B20 Event; r% U1 V4 S% A2 v# y* \' {6 g 0010 85C70188 85C701A0 Event 2 F- E) i; E+ C: ?9 K0014 81515778 81515790 Directory w% z2 |* Q! f# H( T 0018 FFAB7BB2 FFAB7BCA ? 4 y# y( l8 x0 M$ Y0 @001C 814A1858 814A1870 Directory ) w7 C, j, i$ o' C" w0020 80288C88 80288CA0 Event% l! Y: g1 X) }* E 0024 E2CFE7F9 E2CFE811 ? 2 R2 S) L# L* c4 j0028 842D7B08 842D7B20 Event$ Z. u6 \4 b5 b: v( M( b 002C 80E9B989 80E9B9A1 ?& t& ^. C6 y c* J+ h* C5 q; ~ 0030 E1372198 E13721B0 Section 1 W( k8 P/ r4 C( E4 Q1 r0034 814602C0 814602D8 WindowStation ( y( C: y, ^! ~* q* G6 _ ~( E* C0038 81455CE0 81455CF8 Desktop% N8 l& ~# W2 X }5 k 003C 814602C0 814602D8 WindowStation5 L* H! D8 h( [3 D4 ^7 G- D5 ^$ n 0040 E2B3C1A8 E2B3C1C0 Key8 [7 T ?5 j8 K6 n4 G) \8 n! C4 |. M) ?6 R) z 0044 E286D6E8 E286D700 Key- A& A/ z5 ?5 O# q( }( V' y* ` 0048 E2B3C0E8 E2B3C100 Key+ q5 T" t3 m% }. j 004C E2B3C068 E2B3C080 Key , }; s% I- u3 G+ ~1 m$ I0050 E2BEE688 E2BEE6A0 Key5 e3 M% i2 L* Z. y 0054 8147C998 8147C9B0 Directory- a, r2 I6 v$ |/ t) { 0058 829D1128 829D1140 Event 5 a0 e3 f/ e# B/ { }, W005C 83F991E8 83F99200 Event0 I. z# E! k6 j" ^; Q8 ~" G 0060 E2BEE608 E2BEE620 Key % i: d' h$ Q8 Q; U: U! m( G0064 FFB07568 FFB07580 Event % w1 {& Q& f* [5 X0068 801747E8 80174800 Event , q( S, q" r7 B* U* K006C 80174828 80174840 Event * ^" d* U0 C$ Y1 B$ x6 H$ G0070 845E8808 845E8820 Event ( S( d7 Q& ~) m$ k. G0074 81448798 814487B0 Event * ?4 v. e) K0 F1 Y S0078 E2B9A888 E2B9A8A0 Key' y+ r4 x* ^% H0 d, S 007C 845E8648 845E8660 Event * _' T' X; g) e" O- u3 Z0080 FF9E2DB8 FF9E2DD0 Mutant + q1 u6 M) [3 U; o" V- O5 H2 X0084 FF9E2D58 FF9E2D70 Mutant * W1 H8 S% T) O0088 83CFC378 83CFC390 Mutant 2 H/ Q, A( Y1 B/ ~5 ^4 ~008C 801749B0 801749C8 File2 R5 w$ b& v2 S 0090 E2C48668 E2C48680 Section& N( \2 K# {" C6 x) N' R 0094 FF965168 FF965180 Event9 m- c9 g5 f( _% O 0098 FF9E7D88 FF9E7DA0 Event " J% M! H0 x. ?, _& O009C FFAD3DE8 FFAD3E00 Event - i) E2 c+ b! M& G! H00A0 80AD63C8 80AD63E0 Event d: k+ n/ T4 {1 v00A4 E28073A8 E28073C0 Key8 F- B/ \; ~3 b7 z1 a! u 00A8 FF955588 FF9555A0 Thread e) j7 G" q5 `( I8 B/ W00AC E2770728 E2770740 Key* p D# `# }! ?) e" ^# X+ g, K4 c 00B0 FF923438 FF923450 Mutant % H2 o9 G9 `% o2 N% a5 b+ d00B4 FFAE3B38 FFAE3B50 Mutant+ O8 W/ F! }$ Y0 f4 { 00B8 83B80728 83B80740 Event% g: }4 l. _- K( ^3 J+ q 00BC 83B80668 83B80680 Event ( ^ |. L/ x$ u4 k x& N( b* Y" s4 G& Y00C0 E2E3C448 E2E3C460 Section( r+ X( o4 y, l( k& ? 00C4 83776A08 83776A20 Thread # z' T6 t; v+ s! t00C8 81489E48 81489E60 Event( z/ L( J | `" t- L7 F 00CC 83776CC8 83776CE0 Event1 j7 m* a$ |' U% d 00D0 83776C88 83776CA0 Event ! z& I8 c: l0 Z+ C/ ^' N, n$ W( V% T00D4 83776768 83776780 Event ! J G3 x2 m+ O4 `( A00D8 E2837D88 E2837DA0 Key 3 S: J4 o5 t. {& b: m: A( i00DC 8146B3A8 8146B3C0 Event - @% z" i0 t, L4 T& ?00E0 FF908308 FF908320 Event 0 ^& \8 \6 ]! c( y5 B00E4 81494868 81494880 Event$ }) X7 I& j: L 00E8 FF9064C8 FF9064E0 Event4 X+ u" o9 ]4 X% t" O( ` 00EC FF908FC8 FF908FE0 Event: r% i/ \* U+ L$ |/ z 00F0 FF908F88 FF908FA0 Event % g/ q2 e0 X) N$ Q: {: t$ c00F4 FF955588 FF9555A0 Thread ( R. L0 J% ^' X8 ~9 l1 t w00F8 FF908F48 FF908F60 Event7 o# e! u# R' y: J7 Z! [ 00FC E2CB1558 E2CB1570 Port ; y- H6 U$ f0 T: v9 O$ ]9 @5 f8 y0100 FF90A2C8 FF90A2E0 IoCompletion: U3 ?: {: D3 v4 Q' X4 m5 ] 0104 E2CFE708 E2CFE720 Port s L. z( K- P3 y6 Z2 _4 b, G0108 FF90A2C8 FF90A2E0 IoCompletion& _5 ~ t; f9 V 010C 837762A8 837762C0 Thread ) e1 {1 i( G7 J" e- {# c9 B" Y0110 8103BBC8 8103BBE0 Event ( h& L7 G- |! \3 `9 p# [0114 813DBDB8 813DBDD0 Event " x( |6 V" v+ {; X- i3 ]7 z) r8 Q0118 FF814788 FF8147A0 Event9 }. X5 x2 B) ~7 ]; _ 011C E1358DA8 E1358DC0 Key 5 f/ B8 R! ]) u& x! g F; D' L0120 E2CFC428 E2CFC440 Key/ Q* a) D2 w E) i& ? 0124 8103B9C8 8103B9E0 Event" L4 r6 ~& ~2 [" v( X( O% A 0128 E2C9A968 E2C9A980 Key' d( S# n+ Q4 T 012C 83B34E88 83B34EA0 Event' P F ^- d# g 0130 E2CFD948 E2CFD960 Key $ C) Z! ?0 v2 j5 ]5 S0134 83B34E08 83B34E20 Event6 `( t+ \( \/ U/ S ....: I9 S- j- [, Y+ G" Q0 S0 l8 R .....................省略/ B) b2 q/ _: o y7 e: ^ 7 o- q* F$ b5 F2 M$ u2 X看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢? + W: u8 q& V2 | / \- F/ v" l& \" r1 a( `# n想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此 1 F- c2 X: O& ]6 g) r* K 4 z g0 ?( `) p0 t4 m可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 & r; b$ R. `! X% h, ~# g6 @ 7 @- C+ l, a* W8 _2 M& X: f: Q; N后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.; F c) @0 D. l3 u 8 \, x+ n( {/ I果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS + d7 h6 f: w' P3 \ ! P- D# |0 y- c: X3 z+ ]修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程' ` X# J! E6 {& `& i- P) l 8 a, W S; _0 I, a #include $ j( N% A0 K3 X: L8 ]# e3 A#include 5 w5 v( B; s/ \! ~ O' |) C# X#include , Z/ R# Y G. ?' b#include I( v. f6 R8 a$ X* i/ k; o. a Q g& r% Q* b4 D7 P) I/*% m2 i( Z: Q/ l; ^1 T * you''ll find a list of NTSTATUS status codes in the DDK header * l+ `3 Q2 \/ m! Z+ j# m* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)0 Y: Q0 w4 k8 r; O$ f. p2 \ */ " m' i9 J. |! {1 g#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)5 w$ ~: y% I6 e: A #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)9 |* g8 @; d8 w. p; v4 G7 g #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) 4 o6 r* ?. S% `% D4 l N2 a( k% J6 s$ O( ]) @+ F6 _ /*. t* x( O4 k( y( P) q ************************************************************************* % C. e3 p3 G: i* ntddk.h" L% N8 v; X; r( b8 j! @ */ - j! Z- E7 q2 Mtypedef LONG NTSTATUS; - |- S1 |) z1 Q1 [! U6 I$ k1 J5 e; vtypedef ULONG ACCESS_MASK;; A& V) V3 @2 \0 B /** c7 q+ [( D4 l2 h; H * ntdef.h$ y/ k5 s- b. D5 d: V. S ************************************************************************* : k1 D# i: h/ X% s2 a" K*/ 5 F0 [2 [% f+ z7 d1 a @6 W! _5 o: C /*$ z" w/ z7 i, s) V8 T: K+ D *************************************************************************7 f- `. ?; }3 |, D( [: d$ e * <> - Gary Nebbett7 ?6 Q+ J2 Q8 h7 m2 D6 m */3 c+ d" v4 I) U( P9 g7 f ; K$ s$ n' k3 ^: M t# S o- s typedef enum _SYSTEM_INFORMATION_CLASS 6 T0 k( W3 E+ U* I{ ! l8 i# N: n2 b! tSystemHandleInformation = 16/ N8 N+ G) h! U% u } SYSTEM_INFORMATION_CLASS; ! |2 X/ t+ G; h% ^# L& P! K' }; Y- @0 t! W& S* r7 ^$ | /* G7 X |7 L4 \9 _5 i3 n *Information Class 16 4 c1 a' M, W7 p# T2 y$ Q*/ 2 z. C+ ^/ a6 {" n( itypedef struct _SYSTEM_HANDLE_INFORMATION % u: b7 t& N+ ?" t$ {) B{ 1 K) U/ g+ y7 A2 V, S: }ULONG ProcessId;9 [$ l% w) A# J UCHAR ObjectTypeNumber;. h! E) t' j# @- J! M' Y UCHAR Flags; / I9 O* r6 j* S3 C& D& m8 E$ w$ `" d7 V/ MUSHORT Handle;4 d3 ^2 X$ }6 E, W3 |- P0 O$ i PVOID Object; , C) L% `" j0 jACCESS_MASK GrantedAccess;- V! ]8 s& Q7 Z4 J- _/ J } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; , p, N& s X# K8 ]5 I) s: e1 D3 z2 b0 E/ T6 L2 L3 s #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; } * i- t7 w f# N( h$ T/*! m* K3 E9 ?; ?$ E. c( f* f% o *************************************************************************# K. D. `7 p" i' D * <> - Gary Nebbett. S3 B7 H0 g! n- Z7 S9 w! W* Z *************************************************************************3 v; t8 q% M$ m, c */ z6 R5 u3 g9 `8 p) R typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); 1 P! O u3 O$ f9 itypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );) j7 c8 ?+ [% I( {3 B* \ /************************************************************************+ R8 N8 \/ R$ x, k9 {. n& J * *( R! _: e% G1 p7 @" L5 ]4 q a * Function Prototype *4 u8 c& _; ]' v1 {& A8 u- u * * # g/ H9 c9 I9 V4 q************************************************************************/ - X4 n' a/ \9 s2 [' z* {. E0 f. l- l! R2 u7 j& z% x7 U3 | static DWORD GetEprocessFromPid ( ULONG PID ); 4 O/ z) x6 y. {# U- dstatic BOOL LocateNtdllEntry ( void ); . H$ i0 H# y6 m9 @5 A" `5 H5 g" l 5 @% l- ]5 r. m! t" ?" T9 v* Q2 w7 G1 J1 a$ j8 [. H /************************************************************************/ A! u* X# f$ ]7 g+ f * * ; K) | m4 a3 X1 f0 {( c* Static Global Var * / n6 Y# s/ P# ^: j: ~2 S7 T% g* *7 p& g6 k( d7 `9 v( ~" Z ************************************************************************/ # L v- M$ r' V# D- b# R# N$ M& ~/ P" Z+ b8 c I. D static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL; 7 v) G6 J$ }! c: H: I$ q2 Hstatic ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL; 2 a# Q1 S8 l) Z4 }) t8 E" n! E , O2 W( X9 R8 U& Q3 l9 }static HMODULE hModule = NULL;+ ^$ Y/ b2 ~' m /************************************************************************/ 8 P" D' u' D( H5 P+ @8 r& L7 r$ S$ y- i+ f. u" ]( ? & I2 `( D4 B t: l1 ]! _# nstatic DWORD GetEprocessFromPid ( ULONG PID ) ' u3 C9 o! f, G) Q/ p1 _7 m{& {+ {+ A! x, |% j& q NTSTATUS status; . \ M$ o* f _1 Z1 }0 }PVOID buf = NULL;' o) N+ U5 c) o' ~7 {1 C; C! r: w" A5 U ULONG size = 1;( ^0 n9 H- q4 R9 k ULONG NumOfHandle = 0;, O- y2 S* _6 u3 \ ULONG i; 1 M6 n* e( c9 B2 G P9 o* K7 X ?PSYSTEM_HANDLE_INFORMATION h_info = NULL;" [6 g/ I5 O* C$ o. k + w7 p$ N7 |' c9 Y! e( k- i for ( size = 1; ; size *= 2 )% b( ~! W, W% d& G5 l( U {% u* C: j% J- w9 C( |# ?9 L' n if ( NULL == ( buf = calloc( size, 1 ) ) ) , T+ y/ S9 U( s+ ^/ S3 v{ $ X+ p* d& C4 R( _& lfprintf( stderr, "calloc( %u, 1 ) failed\n", size );" _6 F7 P' e! s1 { h; ^; k goto GetEprocessFromPid_exit; : T3 M$ x. ~9 v1 ]! E( ^* k} 3 v* B" Z5 F" k4 b7 Z+ {+ qstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); 3 `- @/ y7 a0 l8 gif ( !NT_SUCCESS( status ) ) 3 `5 w A4 J) @8 y8 v{# v: h; a# b {0 V if ( STATUS_INFO_LENGTH_MISMATCH == status )% p) F- a7 P; E* b) K { * o; ^1 b; ~1 q; q! D; k7 T7 Yfree( buf );0 E" K o# k; ?+ H( V: _5 E buf = NULL; ' x. r7 w3 g% c6 y( O X2 o" W} ! {3 L- `$ _6 j; |) T& M: h6 Nelse1 _+ f% N+ W* N7 Z+ s/ h5 J {. m3 V7 m9 t9 n4 T; r/ H% K# @ printf( "ZwQuerySystemInformation() failed");& r! `) W1 n( f3 N goto GetEprocessFromPid_exit; 6 q. e2 R) N- R" [4 X5 K& o" b}( U8 }# u+ \3 k' o& q/ z } $ L6 `1 @- P- x) G" Yelse ) _( N6 |, Y/ E8 @0 e{: [" v: E( ]" R" V& @ break; 8 \2 K( {( V$ N3 s! ~, [$ r}9 Q* d' B. V+ u+ y4 x v } /* end of for */+ b3 g3 i+ W; W: Z! P+ p4 M5 A 5 R. C% k' x D+ I2 s: f, d, a J//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组 ) e. D% }3 ]) e* B5 D! p XNumOfHandle = (ULONG)buf;; Z* \- U9 }+ y " W6 H( f/ C w# A# f" ]( } h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);4 w) Q4 u1 { y 4 U' t- V7 h* x. W8 [/ Xfor(i = 0; i { 2 q1 W& ~. r" C# [# eif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )# A& A+ q7 {9 |9 x8 Q { ( q; Y1 e- C! F' r U- Y l/ G* j gprintf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); 4 N* r2 P9 A9 G; } M8 u2 _return((DWORD)(h_info.Object)); ; A5 j2 C- R$ y} : E0 U9 l+ S5 H& [2 X1 N! k# Z}* Y+ g5 s, V, J+ W' E GetEprocessFromPid_exit: 0 N7 V6 d; L: ~, m" S; Tif ( buf != NULL ) 4 Z; p W. ~8 y# y. w x5 o{ ) F! S3 i2 R: [free( buf ); + j5 J0 Y7 ^7 K [& I ]buf = NULL;3 V! P9 J/ G) s5 S4 \. i: I( n, o }% v! ^" _0 ]$ X# j. k return(FALSE);6 {- k( ^) T! G5 \8 o } 0 N9 J, W- o0 b8 W7 p! G w% a& g+ j( D# U8 A6 [: D 0 \7 O' U: |0 F6 L4 F# m1 p) \/*2 G3 E0 T( x/ | * ntdll.dll , s5 i$ T9 Z, @/ ], A$ t8 Q*/ 4 Y$ z) `% {! V0 |static BOOL LocateNtdllEntry ( void ) " D1 N, Q) v2 q. E0 A4 n{; R6 h% I4 I8 @+ g8 G; |" ~ BOOL ret = FALSE; # O+ Q! a N( zchar NTDLL_DLL[] = "ntdll.dll";) a. y, {, V, w HMODULE ntdll_dll = NULL;2 n$ ]0 m$ w5 o! T: f 9 j3 i* @8 T4 o2 l; Y' w; n9 R3 Z if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) + u$ N/ y: }5 M6 Y4 W{. e2 l- G. \4 B! N* c& G printf( "GetModuleHandle() failed"); 9 w/ d. A, R0 ereturn( FALSE );# T9 \$ q- L u8 t } 8 C! ~6 c+ f6 x) O1 rif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) 4 s3 N) r& A/ m+ R{ X( E& H6 ]1 k, L) X( i# tgoto LocateNtdllEntry_exit;+ z! }) H( l- m* ]) b2 e* D }) Y" x2 d" v1 c: Z1 y ret = TRUE;2 O6 U8 d/ @) |( L$ M7 d 0 l; H+ B2 I2 l* ]LocateNtdllEntry_exit: 3 h# k- N9 p; Z. `+ |+ p) h) w, h, a( B if ( FALSE == ret ) ( n) M8 J- E# o8 W& C+ h+ @% N& I' J! G{" A* s9 W9 P( v4 @1 l+ S printf( "GetProcAddress() failed");1 P$ e% u1 i7 A# Z. a. }$ r* B, q }; T! t7 l6 ]5 j$ p ntdll_dll = NULL; b! G0 |& D! Q/ @9 W return( ret );$ y; T$ I6 `2 E- F; @0 U4 r# L$ N } /* end of LocateNtdllEntry */ , E8 H7 L7 F/ u S5 [3 Q9 n. {+ |/ D- \/ H- l9 I $ I0 G5 W A$ J" `6 o" E! ?int main(int argc,char **argv) 1 Y& n0 `8 O1 V) M8 j{ " E4 U$ ^7 b7 s0 j3 b6 `6 s0 v6 g; I4 [; q; o7 X9 D# z) {! j LocateNtdllEntry( );1 C, l; c0 K+ s2 m 1 g ?3 O& I3 X( z# G' Z% t0 X//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5- |3 u; D' ?1 |( P' X OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() ); # w9 [, m @9 {5 Z1 o9 A# j# F1 h* _1 e" ^- i DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); 3 |/ }9 `6 f0 g! t+ Z9 V' l" S3 S8 E. H printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);; Q5 X2 n! S) D- q4 G9 o. X9 ] ) K2 p9 L9 ~3 m q return TRUE;' @. _8 S* N9 t8 Z }
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-19 13:15 , Processed in 0.444815 second(s), 52 queries .

回顶部