QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |正序浏览
|招呼Ta 关注Ta
文摘内容:- Q" S# X2 T& P9 [* w4 U- c -------------------------------------------------------------------------------- & I9 _! B9 G) {! o文摘出处:http://www.xfocus.net/articles/200406/706.html $ I& i! H T5 Q( r& c / u: r6 s/ k( L( L, j) ?3 {创建时间:2004-06-01& e+ x6 b2 u% u7 t 文章属性:原创" h# K9 A3 F g$ d+ h 文章提交:MustBE (zf35_at_citiz.net). H8 E) g m9 v/ w2 y- C ( }5 t9 ] b* o+ p- X* B$ ~ By [I.T.S]SystEm32; W6 ~" h2 k4 j$ D * L. `2 O( E5 o0 sWelcome to our web site http://itaq.ynpc.com/itsbbs/ 4 J$ e5 _% }% R' O" h: {" h2 W d" q# a' ]8 ]. f+ k thanks to SobeIt : P/ G7 K0 k" ~; h9 F% Z5 u8 } --------------------------------------------------------------------------------------------- 9 d3 \. P6 x& d- w& b+ v8 W# ~ ( K- c7 Z1 R5 B7 }$ E* u2 ~每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.5 G+ V' I. w; n1 m. |. Z 5 I2 z* i# y) s% V6 e7 r 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。1 `# o" D+ q$ d ! b; q" N4 J; m4 \% q ZwQuerySystemInformation函数原形如下 ; l) |4 p& m- u* I # Y$ B3 x- s- s# T# cNTSYSAPI0 y v4 l+ ]/ _. Y NTSTATUS 6 D: J; `+ r1 G. z$ R$ SNTAPI 0 Y, b c( m( V; {( QZwQuerySystemInformation % s8 W# r3 f T) M: g4 x* J( 4 u. o) m1 L# aIN SYSTEM_INFORMATION_CLASS SystemInformationClass, # c# M4 I% }$ H: f/ m4 t- y+ @+ F IN OUT PVOID SystemInformation, $ A, \7 O. T: P2 eIN ULONG SystemInformationLength, " g* a: S" [. U; q6 e8 I OUT PULONG ReturnLength OPTIONAL ' l* E& }7 [7 P4 X# F9 ^); ) D6 X7 b. V" L1 D" B ( s& Z* I/ e# d3 [参数意义如下 9 O+ @, s" O7 V/ J3 |' p: w8 [ ; E. x( a) R6 S4 Z6 e! ~SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 ' }! Q8 F8 ^* H6 h9 i: H' |, X) ]3 ~5 |" ? SystemInformation:指向一个接受系统信息的缓冲区的指针$ K N! e- o" |3 | ! Y6 y# s- {& J" X7 D, P; Q4 f SystemInformationLength:缓冲区长度' Z& R) l0 }) C1 o7 C( h! A+ x 3 X4 r) @0 w3 e- HReturnLength:指向一个接受实际返回字节数的变量,可以为0 $ N2 \# R- G% W' b( n& n " T, Q1 J( ^1 r8 v: s1 W% X, M) `1 J* N% I3 _% } 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation % ]# @0 d1 K( C& M; c7 } % M$ s; ^! U2 y# O3 g* S% ^SYSTEM_INFORMATION_CLASS的结构如下8 F: i4 Z* ~0 }- _9 F( y. J8 \ 5 U/ |% u" J: T) otypedef struct _SYSTEM_HANDLE_INFORMATION * h9 o( c- V3 O6 A{3 I s, t K$ w" E% V ULONG ProcessId; " u& x# D* |( s2 R* C$ g; oUCHAR ObjectTypeNumber; 6 s( M% i! A, S1 {; f4 Q( L) OUCHAR Flags; 8 F; d4 N6 W" V( z2 }USHORT Handle; : P* p; Q. D; \" i1 w5 KPVOID Object;# }/ U! z5 ~: a( |" w: N6 V ACCESS_MASK GrantedAccess;5 I5 ^( K4 m1 I' E# U5 W } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; , W6 @% f& b# `! t9 P7 V. f+ q & ^* [: |* c6 \* W6 U9 lProcessId:进程标识符 ' f: D! B: f" u8 T9 t J5 l I 8 d% T+ g; c* r' B8 Q7 D4 c6 [% f$ P ObjectTypeNumber;打开的对象的类型 1 x$ L: Q9 C& t1 |( a! k4 Q" X' M * `5 M. h" ^5 u1 E# A; y! ~" R7 HFlags:句柄属性标志0 K8 n2 W4 q" j( c0 t / i* J' H \- _6 I: B Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄4 O8 o( b) m# n5 {( b" L1 v% | " L5 \' \1 }# ~4 Z s) E. ^Object:这个就是句柄对应的EPROCESS的地址 E; r U' @! z q8 V# t' B" n$ e' c $ H0 K; T3 ~) OGrantedAccess:句柄对象的访问权限. L+ k/ \, y+ ~4 _* Q) B( | 5 Z8 n1 v( F5 J/ N: Q i; R" N( j6 ~ R- X8 C, J 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )" m: Q* @8 N3 o' B% J 2 L% q9 ?6 Q! x/ \比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄! @ q; V. g. P9 ] 3 y' p2 G, K! f" _8 X+ y" r( E+ |怎么会这样?难道程序写错了?*_*& t( q# l- ^4 W( _: C7 g ; f( Z$ E2 x( {7 Q J& L+ l. U 现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出2 f, ]) M" P, p$ [3 r / ^% F2 c6 Q/ {5 M:proc -o QQ . {; t% ]1 U+ Z% c8 RProcess KPEB PID Threads Pri User Time Krnl Time Status; n! H7 y; ]. \ G, M QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready 5 T8 p: E+ X' W: r . A4 z- I6 A) r3 r( d W---- Handle Table Information ----2 i& G* o7 g2 C$ _ v( L# R % P/ E* v* b) P7 h0 XHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 & ?* R: z9 N& T$ U9 ^+ M+ ^/ _! v% B: `+ b) q# D" z2 s Handle Ob Hdr * Object * Type 5 `$ S" a, W4 V7 j0000 00000000 00000018 ? ; |6 `8 |$ @* _! ^" Y) V8 O0004 E2DA5E58 E2DA5E70 Section( o9 Z8 a- W, b* W4 d8 B# n 0008 FFAB35C8 FFAB35E0 Event 1 i1 v# Y3 u( S' q: H3 ]000C FFAB3B08 FFAB3B20 Event$ g8 L2 r x/ [5 H- S5 W 0010 85C70188 85C701A0 Event # g% ?" f/ S6 Z! c& T0014 81515778 81515790 Directory3 ?: {1 y9 q5 r4 r+ K 0018 FFAB7BB2 FFAB7BCA ? * |/ ^# C* s4 \) X: d8 p) l001C 814A1858 814A1870 Directory# t6 [( c9 \3 d' g' j, v }$ @ 0020 80288C88 80288CA0 Event ' D5 P# `' {" _3 k+ q! O1 X; t0024 E2CFE7F9 E2CFE811 ?1 M2 Y1 V0 W# }) ]$ X 0028 842D7B08 842D7B20 Event; k! X0 Y9 D0 F* p; L: g/ @ e! K 002C 80E9B989 80E9B9A1 ? ]( M" v3 z5 I9 s* ^% C% D" ?0030 E1372198 E13721B0 Section 7 ? L' b; r; W/ f- L y2 h0034 814602C0 814602D8 WindowStation 4 {. D) c- I( c# a% L1 ?1 C, K1 ^4 q0038 81455CE0 81455CF8 Desktop$ }$ G4 ]% @7 \/ m 003C 814602C0 814602D8 WindowStation * U7 F% x- P: ~ E& @0040 E2B3C1A8 E2B3C1C0 Key, a8 p; @- T; a0 ~ i% S 0044 E286D6E8 E286D700 Key 9 G. s! |4 Z- n' P2 K0048 E2B3C0E8 E2B3C100 Key- [& w+ S6 ~% y% T2 I) j/ s" F$ l& r/ b) X 004C E2B3C068 E2B3C080 Key$ W4 P# L+ T% Z 0050 E2BEE688 E2BEE6A0 Key0 s1 U) q* i/ @; h: K2 Z0 w 0054 8147C998 8147C9B0 Directory0 a7 ]' w+ B" |: S% o6 n 0058 829D1128 829D1140 Event* U+ ?4 m; d: w) e8 B) h 005C 83F991E8 83F99200 Event+ j0 Z" P1 v+ \: c, ]- {8 J' c 0060 E2BEE608 E2BEE620 Key 5 @: O+ U% g3 {0 s+ Z0064 FFB07568 FFB07580 Event% A3 Q6 _8 n7 r0 V4 v5 w0 k& {4 A4 W 0068 801747E8 80174800 Event 5 f$ S5 L5 ~& S006C 80174828 80174840 Event & _0 `$ e+ P. |2 ?1 Y5 t0070 845E8808 845E8820 Event/ p% c; U4 v' S! c B 0074 81448798 814487B0 Event : y3 E" G* u8 Z9 v" N0078 E2B9A888 E2B9A8A0 Key: C- x* P# S& \$ G- B5 ]4 Z0 y 007C 845E8648 845E8660 Event& @. c/ ?1 `' R" d 0080 FF9E2DB8 FF9E2DD0 Mutant$ y6 m& | x5 J& y# P4 E& u' V 0084 FF9E2D58 FF9E2D70 Mutant 5 _5 r& q( H8 U9 P; @: z0088 83CFC378 83CFC390 Mutant ; I( Y* e! w7 v6 ~* b O/ X/ B3 ?008C 801749B0 801749C8 File& U& y3 ~/ T# k- @6 R4 ^ 0090 E2C48668 E2C48680 Section 9 Z p s5 V# L& h% ` d5 s0094 FF965168 FF965180 Event : \. q6 H5 C9 U; z4 k* Y9 k1 U0098 FF9E7D88 FF9E7DA0 Event3 M( S8 U! ]* O 009C FFAD3DE8 FFAD3E00 Event 8 W4 q! A1 O1 b9 o9 o( H. Y* _ X00A0 80AD63C8 80AD63E0 Event/ v" t7 r1 j$ B$ O 00A4 E28073A8 E28073C0 Key - ?/ G, E, f2 J6 V* c00A8 FF955588 FF9555A0 Thread & W) @2 F% e5 T; |- }00AC E2770728 E2770740 Key, K; I# d+ M' x- g- a) K 00B0 FF923438 FF923450 Mutant $ O. a" U4 e, Z( R9 O( C00B4 FFAE3B38 FFAE3B50 Mutant# k4 a/ o0 g! c) ^) o 00B8 83B80728 83B80740 Event0 i7 S- z# K% g3 c5 y3 h: _( ? 00BC 83B80668 83B80680 Event ( J, W- N# z# | L. r8 H$ b00C0 E2E3C448 E2E3C460 Section - L1 I- Z z, t. ~, U$ P- {00C4 83776A08 83776A20 Thread & u1 [: c" f7 `8 _, F00C8 81489E48 81489E60 Event 5 Y$ C8 t4 D, m1 Z, c9 O. _00CC 83776CC8 83776CE0 Event $ }8 F( t* n% a6 T0 F00D0 83776C88 83776CA0 Event- z. {% t) j" v' E- m 00D4 83776768 83776780 Event m) j- z' Q% K, O# P. t3 w$ W00D8 E2837D88 E2837DA0 Key & q, M! t9 [/ S E6 q" x% Z00DC 8146B3A8 8146B3C0 Event' k0 S3 P' @: [6 b$ G 00E0 FF908308 FF908320 Event 2 h8 Z$ D$ y$ T3 x00E4 81494868 81494880 Event / Z: W' w$ T$ K00E8 FF9064C8 FF9064E0 Event 2 _$ K7 |, j5 H4 V- b& ?: V. I# B00EC FF908FC8 FF908FE0 Event7 W0 W' ]! y5 ^! e( U& C 00F0 FF908F88 FF908FA0 Event ; D7 O7 P4 e% F6 @( Q00F4 FF955588 FF9555A0 Thread 0 t/ C7 E- G+ X0 I+ R00F8 FF908F48 FF908F60 Event ) ~2 q3 z# A% J5 y00FC E2CB1558 E2CB1570 Port ' d0 s5 Y8 Q5 X* _0100 FF90A2C8 FF90A2E0 IoCompletion/ R, f4 q$ y8 v* M1 u 0104 E2CFE708 E2CFE720 Port* ~$ \: ~ V4 X/ v) ~" Y _ 0108 FF90A2C8 FF90A2E0 IoCompletion/ t+ b/ Y& ~( b 010C 837762A8 837762C0 Thread . ?7 _, L2 A- a/ _1 t- x. }* R: Z0110 8103BBC8 8103BBE0 Event $ J; j( q4 T! Y0114 813DBDB8 813DBDD0 Event # N4 E" N8 G0 P. @0118 FF814788 FF8147A0 Event 6 A& E# }5 U$ X. ~. s# }6 x5 L% Y011C E1358DA8 E1358DC0 Key" C8 C$ O4 s. p6 `' e$ H0 x: H/ Q 0120 E2CFC428 E2CFC440 Key% Y4 ^% W. U+ S. L9 F( X 0124 8103B9C8 8103B9E0 Event 5 F+ z8 e9 u, U9 m0128 E2C9A968 E2C9A980 Key - o3 ^, l+ Q: H& U2 C: f4 s012C 83B34E88 83B34EA0 Event1 {9 `; M& W$ M) W- q 0130 E2CFD948 E2CFD960 Key6 S- U' D9 Y) M, S 0134 83B34E08 83B34E20 Event , S+ L. |' w1 y.... _8 a+ o- Q w7 r) a* [$ H.....................省略0 j. Y* t; X9 x$ f 4 i$ O9 F' L! {+ ~ 看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?: a# F# r& }" Y6 K0 C1 ` 8 T/ @& V- L; V* u* h5 `& k& }+ ~ 想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此 3 m+ t, R3 J5 N4 [1 Z6 E + |3 o6 M) y: |8 F" b可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路" H% n4 b* {9 m7 b$ H 5 e1 W; C5 [7 s+ p4 l6 \# s( s 后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. ; J$ B0 ], I* `" h2 }( l! D ; H1 \* s8 B0 j果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS+ L( p" I( o2 t) g - e8 n( y0 L4 U, r修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程( T2 t( n) c% _* w# k1 i / D; \8 D' k& |) F #include / d$ m& [- h& O1 {* U7 Y& m" o#include - d1 r( A. N* T# ?6 e/ Z3 @#include + i b9 `6 p( S0 C" _( w# a9 s #include ' G9 j/ g- B& q/ Y, n" i: Y! C- g' U6 _8 x% }# A& P /* , |% N$ N$ I2 W5 @$ S! ]* you''ll find a list of NTSTATUS status codes in the DDK header # [! p1 n: g. L! `) s* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)5 ]$ w7 o, J4 p7 n( r) ? */ * ?% {" t( x/ [( R#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) " |6 O$ s7 Z: I1 ]" ~( J: J#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) , l! X: A0 b9 b" c- M. Y' X#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)& y8 N# i5 t8 k. N0 E. Q8 w 2 W; R* _& P! S/*% T- L- `* m7 q7 ~$ ^" F) f *************************************************************************4 [" y6 g+ \# J" `+ A( J! R * ntddk.h - f7 M$ u7 M) C% L+ ^' Q- {! v3 A*/- c4 K0 T8 b% s; ? typedef LONG NTSTATUS;) \# {, h, k, B typedef ULONG ACCESS_MASK;5 o+ R: B! _0 b5 T /* & p9 v- v: D! N* W( |+ U* ntdef.h 4 D& A; ^+ c7 {8 e; _************************************************************************* 0 i9 I$ n$ V0 W# j1 d2 S) G9 @*/7 w) {$ n+ W C0 | m3 O 8 B0 S+ N: i. H5 O, |/* 9 ^! ]' s% d3 g' A& i*************************************************************************+ A) o1 G1 z: @2 U3 f4 U3 r2 D * <> - Gary Nebbett% R w# \( a9 Q2 j9 C */4 q" R' X; _5 G4 \ 6 [6 z$ y+ g3 ? T6 L6 |) f$ etypedef enum _SYSTEM_INFORMATION_CLASS 1 e2 q4 k% \! f. G" D{& ]) M4 [( G0 s: B' {8 v SystemHandleInformation = 16- {& e2 E; K5 }7 k; W! ~ } SYSTEM_INFORMATION_CLASS; ! d6 @' f1 E8 N) ?+ g# o, ? + Q$ c" O# H9 ], T% w( G/*" X9 U( s+ p3 X, ^( b *Information Class 16 ) h/ v7 c" O! u E0 x! Q*/ 4 \1 m6 B. M4 G" i* k2 wtypedef struct _SYSTEM_HANDLE_INFORMATION 9 m) C5 F3 K. w/ u/ D{ : `4 r9 a6 O+ }' iULONG ProcessId; 5 T; w- i6 A/ W# dUCHAR ObjectTypeNumber; 7 H1 V; _! M. QUCHAR Flags; 4 G; b$ z) Y c& VUSHORT Handle;, F+ o5 J5 V7 D; B PVOID Object; ; G$ b5 g0 C5 _, a* A; j) \. JACCESS_MASK GrantedAccess;1 ^6 A- V+ [2 h6 G- a } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; 7 K4 ?5 W2 G! k! y, M8 e$ |' y 3 c# i! f! x. E) k3 d! K#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; } 3 R! N8 N# f8 I/* 4 A7 m, T9 l! O2 `1 X9 I# k************************************************************************* / r0 D( v) G) d* <> - Gary Nebbett, I1 M' u' l, J" J6 J1 U# M& k ************************************************************************* % _, f* a# Y) E1 o* r0 W- @1 X*/ + u) Y! c9 y, x/ U+ f6 h! N/ Ntypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );& \( R* v$ h8 E typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );9 T* X) g" o( t3 J+ O9 P2 X/ H0 j /************************************************************************ * \) M) ^3 } X2 \+ r* * ?; }% m, n, | * Function Prototype *9 k3 p/ Q3 x9 _9 ] * * ! R# @: d) y) t9 Q************************************************************************// n6 s5 F: ~- h2 Q 4 k3 H- a- P& Q, ^% d$ C+ e static DWORD GetEprocessFromPid ( ULONG PID ); ' W; O! M5 h9 ?static BOOL LocateNtdllEntry ( void );7 N9 k e ]: a1 ]0 x( \. A 6 q& {0 A" f. `7 s. B9 {# n$ ]- b/ P( \) D Y /************************************************************************3 p, u; C: C- C! ~: g) d$ f * *6 z' C* R1 a0 @3 m* T * Static Global Var * & l4 r/ H. D" q0 u* *4 [1 a5 }. G1 Y, D% b ************************************************************************/ # o+ \3 m8 D$ I 2 g! `+ \' e& Z4 w* [# a1 ^+ P. sstatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;* F2 V- O) O, A9 H static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL; 5 x. F; {, G m" _9 @4 B- P6 i" d5 P& r* A8 n2 c static HMODULE hModule = NULL;0 y: u$ C; W2 w /************************************************************************/5 n# h, ~9 x. o$ U1 t; [ Q : i- B# p3 \6 g: F6 z% h3 \) q% I+ R9 w3 g% P# M static DWORD GetEprocessFromPid ( ULONG PID ) - |% K o# [- O7 C4 f{ ! |" Y' m' [& Y' sNTSTATUS status;6 n1 `" d' c* x1 r8 G PVOID buf = NULL; ! x. E2 g+ D& lULONG size = 1;9 \: W8 K2 ]5 D1 C: T+ y/ z4 X! j ULONG NumOfHandle = 0; 6 a. v' V, Z3 N! ~: {ULONG i;% @ ~$ i! a: A8 w w8 ?7 l7 { PSYSTEM_HANDLE_INFORMATION h_info = NULL;; i& W" Y$ U6 n/ w6 E8 z. @. y* C 8 A7 E/ h5 G2 \+ g9 A for ( size = 1; ; size *= 2 )% W2 P# q! o" z" q { ( S$ m, o8 X- g; A0 a5 `/ fif ( NULL == ( buf = calloc( size, 1 ) ) ) 1 X! `9 n: V5 g9 C% h1 ]1 j{ 0 o3 Q9 ]# u0 u3 I4 lfprintf( stderr, "calloc( %u, 1 ) failed\n", size ); $ ~) e( b7 B( A' ?+ mgoto GetEprocessFromPid_exit; 1 x. N' Y" i/ X' ^( u}9 N5 N: i3 B: Q3 M status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); / z4 b6 K0 \8 n _3 _3 d' mif ( !NT_SUCCESS( status ) )( ~ @" k3 H; [! _ {9 j/ Y1 e P' {. V3 \' N if ( STATUS_INFO_LENGTH_MISMATCH == status )" C; f7 c9 S2 l0 {! [3 @: \( m {4 N9 u. s- Y* Q4 ? free( buf );- o2 K- ?- |. |6 Y* E' T buf = NULL; % y4 B9 g, d( D+ w. R A}) ?. E- X! y+ y5 f! f else# K3 r8 q' }( k' e: | {/ B- k0 ]' ^/ Y. y+ l' H- `: e printf( "ZwQuerySystemInformation() failed"); 3 }9 r. T `: b0 ~; v- Tgoto GetEprocessFromPid_exit;' K9 y1 X X+ {& R/ p: s$ {; ] }# g0 ~- s( Y( o9 |$ N! P$ s }1 W9 v7 t, y' f1 N6 Y! N8 g else - c6 M" E- W9 S& J. W, w! C{0 b. I$ r+ ` Y break; ) c! k& y5 _% [6 i} ' p- i# N5 d- w C( H9 K$ |8 s! L} /* end of for */ 2 ^) _5 M* e" V* H, L+ ?6 a 8 E: C; B# |& ]/ F, b//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组! m. ?* y6 k9 g i' {+ y* Y' Q NumOfHandle = (ULONG)buf; 0 L8 c) \1 N' x3 Q; p; @3 E8 o# @2 [# @6 [ h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4); 0 Y5 z" Y$ S# m4 U3 @) ^" E5 [6 g8 J# o5 Y6 J& }- M2 C for(i = 0; i {$ T7 K9 l& h0 N. H* d if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )# S3 k+ c. v9 p$ Y { / c+ n% T: B+ Y$ S1 F( p- E6 J2 [printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); $ W* G8 E" `* ~$ \. Y, d# j. Yreturn((DWORD)(h_info.Object)); # F9 K0 b6 O3 Z& X$ T- |7 P( c}4 n4 R% g5 M0 m0 ] }( ~6 b( j `: H/ w: e GetEprocessFromPid_exit:; M4 c. e8 t" T# o# T4 Q* Y; t if ( buf != NULL )/ I: O1 }" y6 r+ D% r! W {; w& E, O* l3 C3 C free( buf );0 M5 h1 ]0 M8 Z( P' O1 K buf = NULL; * U( E) d, M8 j9 M- Z- t$ f+ c} 5 s8 Y# D: p& y+ ]' L1 mreturn(FALSE); % l) l- Y Q- D} ; L$ J0 L: ^* J: q3 o% S+ y& L+ g+ X( X7 _9 n 6 a* Q' t$ P, u3 y /*% h4 R2 Y" ~2 W( |) u% D0 [/ ]( W * ntdll.dll, J" _6 F6 n4 e9 j' C% a */ 5 r5 ?( C! {. F% _, \9 _6 `static BOOL LocateNtdllEntry ( void ), f% f% W n7 h% A4 K4 X$ Z { + m. v( U# H2 z3 |BOOL ret = FALSE; # @3 L% a8 W0 |4 cchar NTDLL_DLL[] = "ntdll.dll"; 9 {% S' Y; X) @* M5 N7 iHMODULE ntdll_dll = NULL; " [0 P9 o n' X) ?3 G+ @2 i. K9 O* U $ m' K/ P K, s( g! w" Q O& L* i( C& X: u V w2 ?1 m. Y if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) 4 N. n; b2 S/ X. Y8 D/ `/ k: P{ - b5 J) F- d( r' g2 uprintf( "GetModuleHandle() failed"); . k. o( |: N4 Treturn( FALSE ); . x8 u$ p% l4 A; M) g2 Z0 v9 h}$ r6 I( t4 Z0 p) n! _* q+ G8 b if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )' y% d6 b4 {8 t9 d: l+ y { ! ^7 U" e. R6 ?3 P+ I! b5 ]# ]! H9 Kgoto LocateNtdllEntry_exit;/ @* S' q5 {& Q+ P }6 p. u1 \4 u/ F1 O0 k ret = TRUE;& T! E. Y1 s0 A* h9 N 3 L- x; d/ y# p5 n2 V LocateNtdllEntry_exit:* c% s$ h) H& d: H/ X / _3 R* k$ M6 s1 P" v. Y' i, T! Dif ( FALSE == ret )8 f& N7 y: e0 l7 o {' o0 P G {8 [9 Q* h9 q' e printf( "GetProcAddress() failed"); z4 W t- Z" ^1 L- U4 ^ }0 r& U9 h9 {' w4 b# o; O! G1 } ntdll_dll = NULL; 4 j$ [% w- Q2 d; N$ `3 Areturn( ret );' ]% v+ G& ?. {1 x# J5 p ^1 v } /* end of LocateNtdllEntry */ $ w8 H3 W$ k0 c0 Y& o8 L0 z7 Z% r" Q- j# p0 N2 `3 A 5 P" b$ ^) ?$ c( P8 F int main(int argc,char **argv)% G" ]$ z1 n# f {: d: g( `3 l, ]6 a : D" }! I- e" n7 ^0 g- t3 D3 \& DLocateNtdllEntry( );6 {# i9 h# n+ c h. z _( w " Y( n3 J" i& n+ H/ X# A$ V //打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5 ( V/ d5 Q$ R. V& S, AOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() ); + \5 Y3 K, _( r& `; d* w8 q6 z) y5 g+ n DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); ' g% w( V# C4 g9 ~3 Z: F3 X ' g) ~3 C \2 j: c6 Yprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);/ Z$ a" l. M4 U# z 9 ~% L7 m' m: N( S" areturn TRUE; 4 T0 T5 [4 C# Z9 Q% R2 o}
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 10:19 , Processed in 0.408756 second(s), 52 queries .

回顶部