QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:/ a0 E0 h; ]+ m- ` K -------------------------------------------------------------------------------- ' P0 p0 L8 J4 T/ L/ y- W% C' \' [( j文摘出处:http://www.xfocus.net/articles/200406/706.html! `, [, ]3 A. \6 U, p 7 P2 v0 b5 u0 \+ v% X; M( i创建时间:2004-06-01# {- X) O7 z! r1 O/ W3 |6 H# f( P 文章属性:原创6 k1 D- F8 j5 [( y( `$ T 文章提交:MustBE (zf35_at_citiz.net)6 Z. @+ i+ H7 a- g N# l5 c1 F) b: c+ f7 T9 ~ By [I.T.S]SystEm32 - s( k& ~# |5 E. O4 M1 I& |8 X0 P ) T6 H7 h; H! U8 m' C0 CWelcome to our web site http://itaq.ynpc.com/itsbbs/ ' P( N/ c' A/ y! u1 A3 V1 J5 `# a [; A) b thanks to SobeIt : P : _1 n) ?* S& c& B--------------------------------------------------------------------------------------------- 9 N" @2 k. `6 a- W2 u# e h0 f# R4 k4 r/ B/ T; q: p2 ] 每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.2 ^9 T9 E. v1 @ " O: b1 k6 H P4 o& ]5 Y( ]绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。4 }& r- ]: _1 X: h: F5 J) X$ S ; q$ I; i5 E5 ?+ Q3 X, U$ NZwQuerySystemInformation函数原形如下! [7 V, I$ _, h# u$ }% x$ s5 A . H @* \" C" @1 [3 t2 i NTSYSAPI+ }- {& ]1 }: X5 R _ NTSTATUS 8 Q9 \( E, b6 z% ^' KNTAPI" l. u. U. b+ H5 ~" x2 x ZwQuerySystemInformation! t8 c- f; E: v6 E ( ! L$ D* o* u7 i) x, t# z6 f& ]1 SIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 4 B) k9 z9 Y/ M IN OUT PVOID SystemInformation, & L6 L! R6 g. a! y2 O I2 Z IN ULONG SystemInformationLength, 0 |; b1 X6 p2 n5 g5 m& H% v OUT PULONG ReturnLength OPTIONAL % _: L8 I5 d' U3 \! @ );; b! ^# d* ^* T9 Z) i$ E % ~4 d7 B2 P- h3 [+ G! I" i 参数意义如下 & ^, f( y( T7 B. w9 W$ n7 `: l$ ^: k8 [1 D( P- i SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 + U2 J R! D9 t' l: a; W ; O8 ~/ m t( hSystemInformation:指向一个接受系统信息的缓冲区的指针 5 t8 Z4 b6 n4 N+ K- d6 i5 k8 G% V5 G% k- Q% V' Y, Z SystemInformationLength:缓冲区长度 ' l4 n( a( M! e2 x, J( Q) n. u$ o) u" J' n3 p e1 ^ ReturnLength:指向一个接受实际返回字节数的变量,可以为0 , l/ ]6 d/ H, \9 t, s2 S 6 N# S- C& x4 N; V% `/ ^) ?. t 1 J" _, r( e" x9 ]. e为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation- f/ I9 X( h' P5 O. V 5 C) v- N9 v5 U SYSTEM_INFORMATION_CLASS的结构如下$ c" K/ {- k+ y' w# {7 n; m4 v5 u3 p # f3 J2 g5 o4 g6 ]* c* a2 z typedef struct _SYSTEM_HANDLE_INFORMATION" U2 c+ x: m: j2 S3 ~4 ^ { : F6 M9 T$ ^0 W$ N6 [ULONG ProcessId;* }- T) \' Y) {$ k9 b5 }4 e4 J6 | UCHAR ObjectTypeNumber; 7 \2 U: h. ?: U. XUCHAR Flags; * q1 F' Y3 [8 a/ z& VUSHORT Handle; - I/ b# O4 c3 _PVOID Object; ; s$ f+ G3 V. k" V' B+ G. UACCESS_MASK GrantedAccess;6 w! l) x. K$ C' } B' z7 E# G' N1 e } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; ' _) F1 U1 N/ D# V/ M/ _" ? : I2 S4 N8 w9 @, {: PProcessId:进程标识符 & m: B% }! a5 s% d& W" B5 C+ _ , E( @4 D4 F/ SObjectTypeNumber;打开的对象的类型 . ^! }9 z5 _8 [* L$ G6 w- q, D5 I$ V9 V7 N3 s Flags:句柄属性标志 # F% m' o; u* N1 Z6 `/ r! v. L6 { Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄 3 u* {% H1 R+ V7 I. A7 A" s; U4 O% Z$ G5 A7 k6 ?+ e Object:这个就是句柄对应的EPROCESS的地址 0 }6 ~/ J) g& i* u6 O; A6 E - h& y' \) k6 ?! k- E, U4 ZGrantedAccess:句柄对象的访问权限 " D+ N4 X( ^3 I$ _/ i7 o ; l. V( f/ P4 j& N; h! l5 l, r6 e0 t- m1 t 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )$ f/ t. O6 `: b " W8 Z8 i* F6 Q9 f) c7 K# V3 D1 N 比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 ' d i; Q! c* b. f9 G 8 b" Y' o+ {* h0 s0 z+ a' {怎么会这样?难道程序写错了?*_*3 i% I2 D) B0 z* d # m& n2 B, x K, P. n( v; a现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出 * Z! a5 K$ A+ ]* e$ U- u( Y" O: Z% | :proc -o QQ ' ?- e8 B, u6 t2 u! FProcess KPEB PID Threads Pri User Time Krnl Time Status 9 E8 u i! ^& \QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready & m& G8 ?8 _& C6 N7 o1 O$ K% x* g / H) g3 m. x, g, Z---- Handle Table Information ----% Y. |) _, o! F; \' T& H % z2 Z' R0 V0 z3 o$ W Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 5 y0 L4 L% Q/ B$ @/ U2 C9 l' p& O5 u: @5 v- c- B Handle Ob Hdr * Object * Type' a- A: N: |0 t6 [, h% _# y 0000 00000000 00000018 ?5 w" q; C7 t" J2 m- h! V* ^" ?/ V 0004 E2DA5E58 E2DA5E70 Section R7 P; @0 M8 G v/ e- Q5 ? j 0008 FFAB35C8 FFAB35E0 Event6 a: n+ b9 [9 s 000C FFAB3B08 FFAB3B20 Event& E2 r9 t9 J# |8 M# H6 B9 x8 R. {4 f 0010 85C70188 85C701A0 Event + S( P) l. u- N( P$ o7 O0014 81515778 81515790 Directory 9 {! c) |7 [- M( Q t) a0018 FFAB7BB2 FFAB7BCA ?8 ?# r; V: P, i) T4 r/ D2 [ 001C 814A1858 814A1870 Directory+ W% L' ?; u) M' e# [9 h; f% e 0020 80288C88 80288CA0 Event3 F2 O: c/ d# R 0024 E2CFE7F9 E2CFE811 ? 6 M) W3 |# q" K: F& W0028 842D7B08 842D7B20 Event , g) X% z1 H7 d7 _! w' Q* e002C 80E9B989 80E9B9A1 ? 7 M* J$ e& v4 A( u% r0030 E1372198 E13721B0 Section ( Y. v+ o X" j0034 814602C0 814602D8 WindowStation 2 r' b! Y* Q* [$ u: m& Q0038 81455CE0 81455CF8 Desktop, J4 f; l1 p3 n9 x+ [! _) I 003C 814602C0 814602D8 WindowStation / z/ d! f# @/ d1 \0040 E2B3C1A8 E2B3C1C0 Key . _. _8 m* W- y4 ]$ U' E* k5 F0044 E286D6E8 E286D700 Key ' x" Q) D, c) P' J* e3 y" Z! \# u0048 E2B3C0E8 E2B3C100 Key/ t8 f# Y/ Q k- t5 G 004C E2B3C068 E2B3C080 Key & F( D N' C/ N. |* ]0050 E2BEE688 E2BEE6A0 Key, c" v+ s7 p4 y$ |. q& u8 o 0054 8147C998 8147C9B0 Directory$ G, f9 @# W* D' c' l 0058 829D1128 829D1140 Event* h& H! C' d( J 005C 83F991E8 83F99200 Event2 r2 O2 l: k2 ?2 ]4 b5 a 0060 E2BEE608 E2BEE620 Key 2 C2 ~7 G# c. Z' B0064 FFB07568 FFB07580 Event 5 C" {) V! U! n" N0068 801747E8 80174800 Event + w. Q4 b2 k V* v# k8 V006C 80174828 80174840 Event ' u5 y: ]" }2 x) W# M8 E A. p0070 845E8808 845E8820 Event. r, d' A; t, Z$ G' l& U4 I" c* ~; [4 M3 T 0074 81448798 814487B0 Event ( c3 r/ e" O, s. l+ H& q9 Y0078 E2B9A888 E2B9A8A0 Key % t z* m3 F' [+ p! X' Q% R, B007C 845E8648 845E8660 Event- h8 P6 b% G8 T: ?; u7 M7 S 0080 FF9E2DB8 FF9E2DD0 Mutant+ B" y6 W1 y7 d' O 0084 FF9E2D58 FF9E2D70 Mutant8 |: \1 x! W0 x- p$ [* j 0088 83CFC378 83CFC390 Mutant * _0 Q* h% ]0 E; E008C 801749B0 801749C8 File , G% W+ x m5 a7 r, x; X! x0090 E2C48668 E2C48680 Section- ?9 T3 f1 ]; E0 q 0094 FF965168 FF965180 Event9 w! E* O( r+ K6 m" b 0098 FF9E7D88 FF9E7DA0 Event# U, H5 t2 X: G* r# b$ ?+ t 009C FFAD3DE8 FFAD3E00 Event 9 U! ^+ ?) N0 j6 f00A0 80AD63C8 80AD63E0 Event7 g! d$ ]5 A+ V 00A4 E28073A8 E28073C0 Key; A9 @( k5 W$ t2 r; |1 v 00A8 FF955588 FF9555A0 Thread 3 g2 N2 G, V d& e' O00AC E2770728 E2770740 Key 5 }, z7 E9 z" Q- [ i& V00B0 FF923438 FF923450 Mutant L3 D& O. o' j2 f 00B4 FFAE3B38 FFAE3B50 Mutant " n$ |( c' T7 \, m00B8 83B80728 83B80740 Event 2 O! A' C' D+ c3 S00BC 83B80668 83B80680 Event " }; r' X+ X1 X3 @) a6 @% _0 `- h0 D7 ~00C0 E2E3C448 E2E3C460 Section % V9 I- \4 d# E' E00C4 83776A08 83776A20 Thread ( }# C" N8 I* o5 @00C8 81489E48 81489E60 Event + x) x, V) r+ K% e! d4 w5 }: N5 c00CC 83776CC8 83776CE0 Event2 r# D$ k0 p% h! o 00D0 83776C88 83776CA0 Event V1 Q0 o% v; R- Z- {' X00D4 83776768 83776780 Event. i; O7 B' u* t8 F. Q! w l 00D8 E2837D88 E2837DA0 Key 3 ?, ?/ ^0 U- E00DC 8146B3A8 8146B3C0 Event ' b9 o& k, I n3 O: c# F: N00E0 FF908308 FF908320 Event- c& y* g- N2 t( ^6 U0 w+ i: B, Z' m 00E4 81494868 81494880 Event: k+ y1 R" G: D0 D1 n. v 00E8 FF9064C8 FF9064E0 Event ' b' Y7 F; i# \9 T3 f {# U00EC FF908FC8 FF908FE0 Event " T' a, _+ m$ r* k00F0 FF908F88 FF908FA0 Event; x" s- J2 r z6 Y1 h& f5 G! ? 00F4 FF955588 FF9555A0 Thread - \9 v: \" O9 l; P# F7 O00F8 FF908F48 FF908F60 Event1 h/ c3 L" {- O0 ` N& x9 q 00FC E2CB1558 E2CB1570 Port; H6 m. q6 n5 M9 l6 \ 0100 FF90A2C8 FF90A2E0 IoCompletion $ S9 A' [: ^* ]3 ]- G0104 E2CFE708 E2CFE720 Port " M% C9 s$ f% O# Z0108 FF90A2C8 FF90A2E0 IoCompletion ; @& i7 H8 \$ H010C 837762A8 837762C0 Thread2 g0 f% P( N o6 ?* C: f# g; j3 Y 0110 8103BBC8 8103BBE0 Event$ k4 U9 b, U# r 0114 813DBDB8 813DBDD0 Event: s$ ?* V4 p! r0 e4 ?7 w) t 0118 FF814788 FF8147A0 Event- X+ m& D- i- f( n0 w4 f4 J$ B- T 011C E1358DA8 E1358DC0 Key 4 N" v% [8 `1 v8 q0120 E2CFC428 E2CFC440 Key / P1 \1 i7 T( q; F3 n0124 8103B9C8 8103B9E0 Event9 {% {! \2 H# e/ Z2 I# V: L 0128 E2C9A968 E2C9A980 Key $ v. u9 x! o$ T- p3 x0 y" f012C 83B34E88 83B34EA0 Event 4 a4 D4 N: n+ P0130 E2CFD948 E2CFD960 Key 3 m, @3 D; n% p1 z0 P0134 83B34E08 83B34E20 Event ( X, \+ W# Q0 b6 [7 a4 J, n4 P.... + M9 T3 n5 I9 Q9 L/ b.....................省略) m6 t/ p% ^/ P 7 T, E% F% |* n, p/ |看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢? - E" |7 r. K3 r o7 m) `) `" k5 ~ / O4 e7 j/ L3 Z$ H" `2 R8 w. Z) z+ P6 g想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此4 D7 \) \0 L4 m$ Q; @3 q& @" E 4 ]8 ?/ \7 t6 u: W. L 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路& ]' p# m7 y, ` . h' B1 C8 }' X0 g后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.5 A& y3 _ N+ ^, o5 z% F . H5 Z) b2 ^! ?9 f. m5 B: s果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS8 c/ D; d4 v7 L: N* o) A ' R/ ]- }% D/ Y1 U# U8 V 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程' ]' s# q* s: F m2 z# k, P7 n # n @1 {- R x# L# L #include - X- D0 x; k, _6 A* i" h e2 s #include 5 Q) ]5 {' d9 m2 J6 c #include 6 v# T! W& u9 o6 z3 b- n7 H/ O#include # V& I! a% ]( a+ _% b5 T5 {" ^3 Q / T6 m! l% F9 P) s6 ~/** D2 G" j2 u, o7 ]% T, p. \ * you''ll find a list of NTSTATUS status codes in the DDK header : M9 {( y9 h+ F) T# m8 |* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\) 2 J. I! ?7 ~$ [*/) D9 z! ?9 ^ w% l) n# I' |, u #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) 2 K4 X3 Y3 B6 s# w; K#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) 0 m2 u3 m- i% K/ l3 c3 m#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) ( r8 D7 u N0 O7 V 3 R8 \+ R. Y5 T6 ^* ~+ _1 b' _/*& ^* H: }! O! s, @ ************************************************************************* 4 t6 L- O# }9 k. v+ Y: a* ntddk.h " d/ x" g+ }. _( n; c*/7 H e/ [( ]( ?9 U; Z typedef LONG NTSTATUS; , B, y5 X n: S. {, r$ mtypedef ULONG ACCESS_MASK;6 W3 p; i W* c /* # f! X6 v1 h% X$ k, x B- W5 l* ntdef.h V+ i5 [3 a! Y *************************************************************************' y4 @+ y; c' S5 q* g2 o: B */+ w4 V2 U! `2 W* v! p: o2 y l W7 W # f1 ], R2 F' R/ n0 Z/* 7 }) b: }: F0 @; u' ]$ F1 D************************************************************************* ' R& t! g0 ]; g- @4 h* w* <> - Gary Nebbett! E, Q0 K' P4 Y% [. Y! K6 o/ S */ 2 f' j7 A# C7 |! u8 B: V2 z Q+ d+ N/ i' V; w- F. E, R typedef enum _SYSTEM_INFORMATION_CLASS! [4 r7 _; A3 z2 \ {5 S& N, A, H! H r7 z: j6 m SystemHandleInformation = 16% w0 y6 I- n% R+ W+ h } SYSTEM_INFORMATION_CLASS; ' R$ i+ J/ J% K5 k3 l$ a8 K* b+ o, Z5 V9 m& O6 \7 n8 d9 f /*" C# j' X- z. x d- X3 |5 V8 c *Information Class 16 / v: I4 V! }( b% Z* ^*/8 ]. t7 ]# A" x6 ] typedef struct _SYSTEM_HANDLE_INFORMATION . k1 u: U- k9 u# j' i8 Y/ {2 @{ . q7 j' ~$ F9 MULONG ProcessId; . N( R! ]+ @1 N GUCHAR ObjectTypeNumber; ~. }/ M. D4 n UCHAR Flags;) k# v6 R3 o& G- ^" O& | USHORT Handle; : C4 Z0 Q' k% F. D5 IPVOID Object;: x. L M7 L2 p0 l8 z" s+ s ACCESS_MASK GrantedAccess; + {+ I. S4 `) Q2 ]) w/ ~1 L} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;! Q! e+ F. O8 t' q 1 Q, t0 Z% a$ R' @) `( @7 d6 R#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; }, ]7 X' R/ {$ B. M /* " K$ z! R5 L; U! M' P*************************************************************************8 ?, ^6 D1 s# y * <> - Gary Nebbett# C f9 W# v2 V# [8 z" I1 ]; _. }( M ************************************************************************* * ?# [) D7 M9 S, i: N9 d7 I*/ 1 C. Y4 R$ @+ _" N2 @3 ?6 Ttypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); & d) g% Y0 I$ a/ Ztypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );1 j" S- H7 t3 ^4 m2 w3 s- G X /************************************************************************/ x( s# C8 M- Q1 z" f, Y * *- L: c K' [ u9 m& M3 T0 R4 z * Function Prototype * : C) Q8 H* Y0 L% H; b( [7 M2 f, k* * ( `+ @5 E4 q$ y3 {************************************************************************/4 L1 N0 b& u% ]1 ~$ i / |0 o5 F) s* M1 `3 c static DWORD GetEprocessFromPid ( ULONG PID );4 `- S& c3 ~1 R- S static BOOL LocateNtdllEntry ( void );: ~: m7 _* t6 I8 w$ W- ~! ] % `# n3 o' I; d& P- b* J3 ^0 @# Z( F! y, Q* k5 d+ ?0 y /************************************************************************ , _- y# _' U) [* S# x* *0 s: j. U3 g2 U * Static Global Var * / ^ h; W5 B. C3 N B1 H* * , t3 m5 v" A. y4 A* y9 q************************************************************************/7 }$ F5 y: m7 T6 P 7 G- w0 r1 u/ \+ S( e static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL; ! h2 |; _6 I7 b7 E- D9 Y6 ?1 d7 Dstatic ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;4 j5 }$ a% s1 [1 e7 w. u3 L) d' S! W + [) L9 C2 @1 @" astatic HMODULE hModule = NULL;: c- N, C M" U. n/ {$ y. Z+ u) Q1 x /************************************************************************/ 0 v" E% [0 U3 q+ i3 |, [1 s. ^ D1 ^- `( w" `" n. T# N8 ~$ ` , z7 ~. m4 Y: V7 L/ A' }. f static DWORD GetEprocessFromPid ( ULONG PID )4 Q3 b* d. Q# F* a1 S) @ {: _ U* u! b& n9 G7 E @' E& @+ X NTSTATUS status; ; ~& E4 C" z. l: EPVOID buf = NULL; L% M0 j& T8 P* b' {0 B# G) A: y# C ULONG size = 1; ) x& T7 g% J7 I" J/ j# ~ULONG NumOfHandle = 0; 3 B3 G' L6 O9 U2 \; I% I4 BULONG i; 9 C" ]* ?# n8 w. ?9 y3 LPSYSTEM_HANDLE_INFORMATION h_info = NULL;7 d( M, |2 L. A8 { . y: ^, T5 ^# Y ]( F I( Z3 X; Z2 [- ufor ( size = 1; ; size *= 2 ) 3 f9 L( G3 z9 V. g; _8 ~; @{ 0 F! e, f9 Q5 O2 |3 Qif ( NULL == ( buf = calloc( size, 1 ) ) ) 7 B4 w+ A& {9 N {{1 N1 S8 e) p Q `: ^ fprintf( stderr, "calloc( %u, 1 ) failed\n", size ); # J4 C7 M! K2 n$ X1 pgoto GetEprocessFromPid_exit;+ [ d( F: [, | } ( r$ a& X. Y' w6 ]% K6 _status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); 8 D. `7 I" w! h3 A( v& Vif ( !NT_SUCCESS( status ) )2 \) m+ \1 U4 Q9 { { , r6 w/ ?) q9 }% Q7 a. Fif ( STATUS_INFO_LENGTH_MISMATCH == status ). k* ~9 p {6 C2 Q# N1 E { 6 _; n2 l6 s1 g4 Ufree( buf ); . {: |* I D7 |; I% r* }- D" a; Xbuf = NULL;) T9 Y/ m; I# C$ \" [9 \ }& b$ b$ [8 [9 x else # R% B w A6 w8 s3 v. s- h{ 8 E- N3 T/ r7 E7 r b$ Qprintf( "ZwQuerySystemInformation() failed"); & l% X T& M( G% Q" Kgoto GetEprocessFromPid_exit;% ]' M; y; r- Y9 u+ h1 R. K }( a$ y+ ]$ E. y* S3 r; E7 n } * _! |8 C% J! lelse/ L- x$ f' L7 L, P5 | { 4 s4 y- \ B1 r' t6 G/ ^break;( n* n+ |& A% }! } }7 K& j8 z3 X: o3 m8 F- F& L } /* end of for */, F0 C! f) X, A$ [6 C1 A/ U 0 u0 w5 X k* I7 r! m: x5 \//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组* w% o. ]0 J8 j6 s0 z! W1 W NumOfHandle = (ULONG)buf; # Y2 P2 P% z* U2 ^3 v: Q* r. `- Q3 O: ` h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4); 0 ~( `: `" O; @# o; y2 |+ `$ \- W5 U3 u+ R# K6 I4 j for(i = 0; i {& y M$ s; {$ s" D, { if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) 3 }: _" E* D- X& W) m{3 H; b0 b5 K9 e printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); H" A2 M4 z7 v4 D# z, ? n1 ~" E# f return((DWORD)(h_info.Object)); 4 Q- t, x* C r3 L} * m4 `8 Y/ Y9 Q$ S. M}4 S& j6 u' B; N) m' V GetEprocessFromPid_exit:. B8 J7 e4 G, L2 N# o: g7 x% W: R$ s if ( buf != NULL ) 8 v8 i8 I' k1 d. `; }; B{4 W$ g# N$ G# t# u7 q" D free( buf ); 5 U; @7 e D2 D! j' }8 Dbuf = NULL; \6 n9 m6 d- z9 C4 u1 \& S}9 E0 _- b2 E" t4 r- b* J return(FALSE);( H5 m& b4 q8 b4 d" I \- d }% S! g3 [9 s3 |! c, [) m$ W 3 ~5 d% Z% K2 U* N# F+ d% w 0 c/ p0 M# R/ Z* t- s /*8 o8 U. K% i/ c * ntdll.dll- w! Y0 j1 i, S */ E- p. |+ ]; @( D5 P& G3 A' p static BOOL LocateNtdllEntry ( void ) 5 `( V" `: D! J2 @( i1 Q{ + S: M# D, w) f7 x1 g' p% ABOOL ret = FALSE; 6 i8 E$ k z+ {5 y$ z" O+ Bchar NTDLL_DLL[] = "ntdll.dll";$ H" u/ U/ {7 G( W# w& U HMODULE ntdll_dll = NULL;9 P' k5 @1 } Y9 P! `* T- [! E 0 f1 J. l! ?3 u; y: ] # A# {- n& a; N; o6 |6 Q% Nif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) * g; @: H1 Q7 ?5 }, |6 ]& z{' ?, V0 o8 ?3 G ^; S printf( "GetModuleHandle() failed"); 6 w! O2 Q9 [6 c1 h2 Oreturn( FALSE );( C/ T% X7 \# j5 u |# ^3 N+ N- s } 3 S. \+ y) j5 }' u4 i' t4 Yif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) 8 I; t% ]5 R# K% ^{ 6 j- z5 L7 P' k# {goto LocateNtdllEntry_exit;" S# m8 `3 s( f3 Y) v* v }5 f$ H; r: ] y* X+ O9 y) H ret = TRUE; / y* D" R, q4 b0 } ` # ?' w# Q# ]+ Q/ \3 [6 \! }LocateNtdllEntry_exit: ; q* c' U' x# W M# I% C* E! K' J & E% i; `) S! ]- oif ( FALSE == ret ). \7 S) t& {) B" M' A$ R5 l" l4 P {4 y8 M- ~- J" V* x' y/ w printf( "GetProcAddress() failed");) g& Q% |. S8 D! b' R } 8 D; ^$ O8 u( x1 Y4 Yntdll_dll = NULL; 4 r0 Y" q* f# I! X+ u" `% l. t0 B# rreturn( ret ); 8 x6 y' B8 |( d6 |7 m- V} /* end of LocateNtdllEntry */+ C! I$ }$ u0 c! T2 Q6 j' l f* a, i ! |& ]& N+ g& _# R& _) n# N9 m( X+ W$ }# B( C: x6 G) [ int main(int argc,char **argv)2 s: z- t7 H7 @2 L8 |! o { 1 ?( s/ ?1 G/ B, y3 ^1 ~ 7 Y8 v" [1 I; X0 N7 ZLocateNtdllEntry( );' S K# Q. i7 B* G 6 s0 B- e9 V3 Z //打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5/ K0 b9 `& `6 F4 H OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() ); 3 Q* I. ^4 J$ [* [8 r) m& I$ B6 M, ^# F) r. V DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );. _0 o9 s8 F" h* u+ d* u- {: |1 H $ d2 e+ H3 L$ r* m+ S- ~- n% u printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);; d, k2 n) Y' }: ~0 R 8 l f+ j2 ~. y9 v return TRUE; 2 N, K$ E6 b: R; d: t}
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 17:51 , Processed in 0.623326 second(s), 51 queries .

回顶部