QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:- w' K8 K$ Z1 g+ c0 w --------------------------------------------------------------------------------: d2 n+ v- f3 a! ?5 J 文摘出处:http://www.xfocus.net/articles/200406/706.html( {* e) [6 q& i5 ~) b5 p' r / [+ [+ x! z* I# u& N* R3 H创建时间:2004-06-01: K2 l$ b4 p; k8 V( a 文章属性:原创 ( {9 J9 x: z( L; }/ |9 _0 D V+ K文章提交:MustBE (zf35_at_citiz.net)2 B" B5 W( P6 K2 J6 Z4 ` 1 s& i! q2 \; p( F5 D By [I.T.S]SystEm32 2 ^& l. F7 }9 L* H) ^4 c4 p- S1 ]4 p/ X2 Y" X9 P3 O, i Welcome to our web site http://itaq.ynpc.com/itsbbs/ ( J# R( v5 d. x/ h' {7 A2 H5 J+ x# c- }) _1 H3 [ thanks to SobeIt : P 8 H3 @* y# u1 a0 f---------------------------------------------------------------------------------------------+ |+ H! A. [- D3 N. H* X' T 4 a% N* H9 r! Y) [' s# X" \ 每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内." A1 h4 {- i Z 3 }5 g5 ]$ v2 @- c! o: Z; ~绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 ) t" V+ j* c1 T2 n/ ?; ~* ^. T ) ]' I" O: O" U0 M+ e( U+ `9 YZwQuerySystemInformation函数原形如下 - }2 _2 I0 z v! E " K( u. Z+ ?5 m; D. oNTSYSAPI: G( J2 E2 J# T* A1 S; l8 i: c NTSTATUS* K* s. J/ l5 H" }7 T/ [7 w- R$ b NTAPI" b, j) w* \$ a! K ZwQuerySystemInformation / G* V m" D* v, l- t( * e6 Z+ b& e! v$ Y4 ~4 w% T- i; rIN SYSTEM_INFORMATION_CLASS SystemInformationClass, / l+ B& i5 _0 U6 Z) ?IN OUT PVOID SystemInformation, : L+ O$ `. s$ ^* yIN ULONG SystemInformationLength, " ]3 { u4 B' l# J S) LOUT PULONG ReturnLength OPTIONAL : o4 U. g: X: p8 l) h ); 6 R4 z! M7 v3 R7 z, @! A + y/ L0 |: ^3 P2 @* d% ]参数意义如下2 U5 T, I+ T' I& r1 s- Y 9 s6 f: A2 n4 Z2 ?$ N" O8 Z3 h SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一9 {2 ?& b- O6 R: a8 n! J+ m. d 0 F: Y3 d; q0 b! Y# {4 J7 O SystemInformation:指向一个接受系统信息的缓冲区的指针 L/ k7 j4 V* h * B5 y3 u8 \5 ], N" t5 |5 j6 j1 w/ r5 E SystemInformationLength:缓冲区长度 , a7 M2 H8 o' m1 ]7 q: o; B' @ 2 `+ q) N2 ~0 W# O0 _ReturnLength:指向一个接受实际返回字节数的变量,可以为08 ]: B+ h: {' \ 2 c- }$ r" i* K( |( ]4 _2 S 5 y6 J0 P$ T2 _( B+ P2 b 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation * f' a+ s `* S0 v U( O8 z: C4 m3 p' {7 g7 D& c; w2 L SYSTEM_INFORMATION_CLASS的结构如下. i2 u3 p& M$ o5 c4 m) k , Q. W M" D2 l+ x typedef struct _SYSTEM_HANDLE_INFORMATION 7 T) R& l+ S+ N+ P8 p, R{ ; f- P) v+ O/ c9 K9 q+ PULONG ProcessId; g) b$ P2 O2 K' ^6 d/ BUCHAR ObjectTypeNumber;! P# b$ y! r2 H9 {7 N, b UCHAR Flags;7 G* |' O* ?0 O+ ~- K4 q ?5 Q USHORT Handle; & U4 \ r, b# r/ W4 i" J5 W5 XPVOID Object;# P* `2 t- q P9 O ACCESS_MASK GrantedAccess; + R5 p* Y- M: n& E3 Y} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;' c2 U/ G- _! h% r 7 x2 h4 z6 p# Z0 F8 o; sProcessId:进程标识符 " t" {6 K0 U& l) u' H" V+ f* g: D 2 w9 G9 d C: o" q9 @, ` ObjectTypeNumber;打开的对象的类型; O! ]2 W+ I( k 6 a5 b% X* W* d& Z Flags:句柄属性标志 , v3 }' G2 J: U& v, Q : I( N) E! l2 N1 X" ?Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄 9 ]5 C5 k' s$ y8 F5 l/ j. k' Q! u9 y2 G5 [( [! f8 I. d. B2 | Object:这个就是句柄对应的EPROCESS的地址: b( o- _7 I$ U8 o+ l q ; \- k, S7 p& P& g GrantedAccess:句柄对象的访问权限, n1 |% g6 a+ o7 K3 ^ % o6 d' ?% A Q/ u5 h7 T. ~2 L% u _- [, V% C 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ) ! Y3 n1 X6 @: u' K8 M* o \+ d1 c L+ h1 f" x 比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 - Q, s* x' X; ?) }5 {0 _9 K* f) u) R6 R! E+ j4 D* }! K. R3 P 怎么会这样?难道程序写错了?*_* / ~+ Z( a1 i# v# `# y ) I% Z3 i0 Y( O3 q! T现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出8 Q q# P$ Q' R7 z- x 9 T' `: n) e3 z* F :proc -o QQ- Y. M7 s, D+ Y5 } Process KPEB PID Threads Pri User Time Krnl Time Status9 W A7 u% i, n% d) i QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready: A! B9 r* i* K5 d7 |% y1 N ) y: I0 m! m8 A7 l& ?& |( u ---- Handle Table Information ----- D& ?# X% |# T- v4 i4 S k # H: v2 c& M) B Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 . s9 ~& ]2 Z5 O * [+ }$ p: I# o: m1 [. RHandle Ob Hdr * Object * Type- A5 P2 f2 D3 Z. ~5 s4 `3 A 0000 00000000 00000018 ?3 V' u3 I: Q& C, W; {5 L& U 0004 E2DA5E58 E2DA5E70 Section) J9 ?0 B! C" N8 @- c9 j 0008 FFAB35C8 FFAB35E0 Event% ?" ?$ P+ P3 P! j& c 000C FFAB3B08 FFAB3B20 Event0 a6 F! F* _; m$ x& f 0010 85C70188 85C701A0 Event8 E1 F( M" G2 ?, _5 z3 V 0014 81515778 81515790 Directory0 a9 m. d/ P% | ?2 h6 y. [* z 0018 FFAB7BB2 FFAB7BCA ? " n9 y' t1 G, |6 d) ]4 D7 g001C 814A1858 814A1870 Directory 3 {+ d! a* N* n7 L0020 80288C88 80288CA0 Event / I% I( Z$ Q% P0024 E2CFE7F9 E2CFE811 ? J4 b* O2 n& `% D! V 0028 842D7B08 842D7B20 Event' a* T/ j/ @- d( Z; t3 g 002C 80E9B989 80E9B9A1 ? . g% ?9 R. C: T9 s# K0030 E1372198 E13721B0 Section% o6 |0 P$ Y& M* S( d1 O/ _8 n" { 0034 814602C0 814602D8 WindowStation2 ~) v& b: r. B8 T5 r9 v/ Z% T4 l! [ 0038 81455CE0 81455CF8 Desktop# ~; R# d$ Z0 y$ r6 [7 c& R 003C 814602C0 814602D8 WindowStation ( E$ H* P4 B- P! K* K/ Z$ E0040 E2B3C1A8 E2B3C1C0 Key- x& N6 J/ F, p) {6 q0 { 0044 E286D6E8 E286D700 Key& l5 y3 K5 f/ r6 n7 x0 c 0048 E2B3C0E8 E2B3C100 Key) S) X3 k. t5 h! z/ q 004C E2B3C068 E2B3C080 Key1 R% p& \& U$ g! q7 V 0050 E2BEE688 E2BEE6A0 Key m! Y; N( p6 F% s 0054 8147C998 8147C9B0 Directory 6 f P9 B2 a6 t3 z/ K) \5 ^8 B6 b0058 829D1128 829D1140 Event8 `) b! N! ~! L# U- d 005C 83F991E8 83F99200 Event ' l/ z. w! w% [- T# A0060 E2BEE608 E2BEE620 Key6 O7 ~' _& A1 o8 P 0064 FFB07568 FFB07580 Event 0 {, P& |# O, s, u. Q& W! M. g% I0068 801747E8 80174800 Event7 K* j- |9 g9 E7 O 006C 80174828 80174840 Event0 `: M; G" S0 x9 y- R. _2 x 0070 845E8808 845E8820 Event6 @. @' t) _$ P, P5 G 0074 81448798 814487B0 Event ! P% v6 H/ F* O! L0078 E2B9A888 E2B9A8A0 Key0 Q9 W* V8 H: F$ Z 007C 845E8648 845E8660 Event 9 p u) {& F U' r! ]0080 FF9E2DB8 FF9E2DD0 Mutant$ f7 b0 R9 }( \6 N. ] 0084 FF9E2D58 FF9E2D70 Mutant- [) i+ j6 Y% L 0088 83CFC378 83CFC390 Mutant ' e5 K- D e. k0 ?6 g6 H008C 801749B0 801749C8 File6 P! T: J; |2 _5 n0 G: R! r 0090 E2C48668 E2C48680 Section4 k. |- N8 ]: F8 y# V- U" E 0094 FF965168 FF965180 Event 9 y- [) } i1 q* R4 `9 c& \* B0098 FF9E7D88 FF9E7DA0 Event3 L$ p% @6 |0 k; A' b5 Q1 q 009C FFAD3DE8 FFAD3E00 Event 3 h8 B7 S" [# d( ]$ B00A0 80AD63C8 80AD63E0 Event $ C4 ^. J* t S( `, P2 f00A4 E28073A8 E28073C0 Key a9 D: @+ c+ w0 X# r/ j/ G00A8 FF955588 FF9555A0 Thread5 ~* @5 D* s0 k9 o z8 l 00AC E2770728 E2770740 Key % O" t, p2 |3 k9 x, M$ O' K- g/ ~00B0 FF923438 FF923450 Mutant- P; k) G e* b. }, `; s2 Y) N 00B4 FFAE3B38 FFAE3B50 Mutant8 G- |+ }/ ^' X; N 00B8 83B80728 83B80740 Event' i& N: Z3 d2 [# s- e0 ?( k 00BC 83B80668 83B80680 Event 0 f( C9 c1 j# k1 P$ N$ Y00C0 E2E3C448 E2E3C460 Section% H( I/ u# C* ~' R+ K 00C4 83776A08 83776A20 Thread B+ _0 K7 F$ H: |1 a( g00C8 81489E48 81489E60 Event ; L3 U. r% F+ i( s) f00CC 83776CC8 83776CE0 Event7 y" ]7 T" j7 U) \8 x: u" ]7 [ 00D0 83776C88 83776CA0 Event+ x( v1 l0 u7 N, j- b 00D4 83776768 83776780 Event; R. h( Z# t( x2 d) m- X1 g1 Y" d J 00D8 E2837D88 E2837DA0 Key 9 ^9 i+ w+ O0 M) g2 I f' Q00DC 8146B3A8 8146B3C0 Event M1 B- Q8 ?2 k 00E0 FF908308 FF908320 Event 6 s5 C) S" n6 y00E4 81494868 81494880 Event & B( \: ~' |* J7 X" [00E8 FF9064C8 FF9064E0 Event' J9 g5 ?7 L) s' [' D 00EC FF908FC8 FF908FE0 Event( _& f9 f5 L; f# f4 |6 A! [1 l 00F0 FF908F88 FF908FA0 Event $ C1 a- }* a6 @8 ~4 O- ?00F4 FF955588 FF9555A0 Thread q7 a- b4 J) k$ {) ]$ O2 s. C00F8 FF908F48 FF908F60 Event' Z4 u2 N# d) a% i+ C 00FC E2CB1558 E2CB1570 Port t# C: v0 g2 d8 o$ K) l 0100 FF90A2C8 FF90A2E0 IoCompletion 9 g$ B k9 o# N: S5 ~- ?, e2 I0 c0104 E2CFE708 E2CFE720 Port7 i2 x ~- Z* `/ \7 Z/ G 0108 FF90A2C8 FF90A2E0 IoCompletion8 t# I8 L# {- B 010C 837762A8 837762C0 Thread" K6 a6 }1 w9 f" ~- f% E7 ^ 0110 8103BBC8 8103BBE0 Event! w6 |, ]( T8 G# | 0114 813DBDB8 813DBDD0 Event 5 O6 l9 E2 J [: q( `0118 FF814788 FF8147A0 Event 6 x3 i$ ^5 _: H9 `" m3 i" h011C E1358DA8 E1358DC0 Key : t& d2 |/ n: J% c m0120 E2CFC428 E2CFC440 Key9 L. v/ z4 F, F9 O% ?7 r 0124 8103B9C8 8103B9E0 Event 2 q' ^* J. H: I7 J3 y# F8 d: M. C4 f0128 E2C9A968 E2C9A980 Key " t; p% l+ Z' g9 `$ A* \012C 83B34E88 83B34EA0 Event" D( I) f; n' s! j* ]1 N( a 0130 E2CFD948 E2CFD960 Key" i" R0 o" m4 z& m( { 0134 83B34E08 83B34E20 Event ' U5 ]6 `' a0 I4 a$ P, @% }) d....: q( c3 | ^1 F0 z .....................省略 }0 t$ O* M$ K9 K+ A2 E . R8 D. V, b3 D% Y0 {9 [9 }看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢? 9 u& B! h, K# J+ l1 y& u' F' i* W$ G3 M 想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此9 `! c- u2 m4 |5 r. D % c9 p* a7 C$ Y0 o5 m# l5 d 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 4 h& S5 X7 S$ z# J: \8 W7 i. w; \1 a& y 后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.. Q+ b% p5 `! A A' j) R. W5 r6 A2 g, f: `" @6 h 果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS / y2 Q: X! ^- N6 |' M 0 B* y0 ^# p) R- N$ j+ w* h& q5 p修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 . `8 `/ H& O5 j5 G2 K0 Z2 y: L8 K3 ]" C# v, Y3 F' U0 ] #include ! J- t9 \0 c! H) t i#include ; v5 l' B, ^5 `% E7 @ #include - |2 s5 L$ r S% j& Z6 {: i, } #include + o; }5 b/ a) r+ `' @ ' H( n3 M% `$ G/ Z+ T+ W( e/* $ X& k8 _: g% L7 C M* you''ll find a list of NTSTATUS status codes in the DDK header! |) f$ }, H% ` * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\) ; C( ~3 Y' h4 c9 d5 B*/ 3 y/ ~$ l& Q4 Z( o6 A6 f/ V#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0); A/ i6 t7 R& L" F& q; }+ C #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)9 h; j. n8 B6 Y4 M5 |& b9 l" B4 i0 U #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) 0 p ?7 n9 P7 v# w( _; B6 t7 i& F4 b! I- h+ t& h /* " N7 m ~2 l, ~8 x3 \*************************************************************************& T2 u- Z7 g6 W K8 }% q Q: m * ntddk.h 1 [) H+ G# g1 T8 U. z*/ - k0 m$ Y+ T) t/ Itypedef LONG NTSTATUS;: U& t2 c2 u+ H4 [0 I typedef ULONG ACCESS_MASK; 9 {" Q# v+ P8 X5 Y/ I; A/*) K1 h! T2 u" f) ` X * ntdef.h; @# \0 s3 {- b( i$ T *************************************************************************' c! v3 @5 e6 ~1 l0 a) |9 } */, F6 g/ B( Y1 r* Q / V% F7 \# l7 G9 G& W4 c /*( }: ~5 ^$ y' E ************************************************************************* ! h( M- `" y# N* u T. @; ]* <> - Gary Nebbett; a# g' m* p/ r9 p) |' X, j */5 o2 o3 x. d# [" ~8 J + Z" ^9 Q4 [ P0 x: P- Mtypedef enum _SYSTEM_INFORMATION_CLASS6 Z7 ]8 v) P3 D. d% a4 t; \ {( B5 p& }1 H% u% [+ F4 P/ R+ ^ SystemHandleInformation = 16 , p+ V. u$ |- @} SYSTEM_INFORMATION_CLASS; + g; ^4 b" m- w( S/ E2 q, F % z# q7 A$ x ]/* 4 p% J$ A4 Z9 \+ y* T& q*Information Class 16 6 w, G) ~; G/ ]5 [- B* Q7 I! g( D*/) H( }0 ~0 h' q3 n9 ]# x typedef struct _SYSTEM_HANDLE_INFORMATION4 h3 ?. E' x- v: Y. S {* k* ?! z/ Y- _# K ULONG ProcessId; ! e c9 }. J. k* \. e' a0 ?1 kUCHAR ObjectTypeNumber; - ?( |: d- R1 L. |! E; @, l5 P; E& YUCHAR Flags;$ c8 _$ d8 l) p" X3 z1 O0 O- x USHORT Handle; ) `+ E8 g& \" M) p+ K" w+ r- j; L$ dPVOID Object;: Z, |# F. t2 n u O ACCESS_MASK GrantedAccess;* @5 A7 ~% N# f: ^# A } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; 1 T" z) \, O' @/ k e, ?+ u8 Z- d- v$ V! \#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; } # v- v4 q5 w- P9 u/*( w9 D) T- f5 ]0 r8 u } *************************************************************************9 W: C' H. `2 r6 ` * <> - Gary Nebbett * s3 i) @7 q `*************************************************************************$ n# ]& \; K4 z$ x V% L4 X- B */ ( E6 \$ |; {& z: L9 d( ^% g4 k0 Mtypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );: b e5 N1 R3 g+ l typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); * L! u; m( B4 G. i/************************************************************************, R: C8 @* E H) X2 i * *) A& P* j2 o2 D; Q7 N! O' L * Function Prototype * 0 M! h7 ]: u" p4 w5 o5 M* *! m- H/ d/ ?! k* Y2 ^: V5 k ************************************************************************/" g d% E1 \8 R" r 6 h, }/ s4 I$ O) S& u" r9 e. g% ]+ ^/ Q' S8 c static DWORD GetEprocessFromPid ( ULONG PID );" i4 H1 i$ }' N- P static BOOL LocateNtdllEntry ( void );7 _4 x9 `5 Z; O3 n c- S3 E9 z! D/ {. w1 Q 4 z; b+ E" U- e: F- [' _/************************************************************************ & r6 D* M/ A _1 U8 v3 O* * 0 K" R8 V* X% A% B* Static Global Var */ U- U) W0 ]: [# Y/ u * * 4 [& [4 ]) |. D7 C( n+ {************************************************************************/2 M* b+ ?" o9 h. K + z/ |+ d6 A2 X static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;, |% k7 F; @: A6 M3 A8 w; I static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;" X$ X+ u$ Z) G0 D# _' g6 E7 r0 c 1 Q* H0 S) g4 Q2 ]! T' i static HMODULE hModule = NULL;, T. r+ [3 M/ @2 p% \ /************************************************************************/2 j+ B5 c& w# y. ?& |! M* c 4 X: J$ [& l6 C6 d L' K6 w2 {3 @$ x" m9 c! A* P static DWORD GetEprocessFromPid ( ULONG PID )) _6 q" A- ?2 r* {" I {& K+ b) @( W% ~2 A0 j" S NTSTATUS status; 8 f9 `( C1 x' o0 XPVOID buf = NULL; / ^7 k+ ?% e1 G. Z; s W( D4 AULONG size = 1;% {8 P* P" {5 w" b" P' w2 b6 c ULONG NumOfHandle = 0;4 m" u& N/ N+ R( G1 c) e2 t ULONG i; 7 `( G- t! u3 u! g, H. KPSYSTEM_HANDLE_INFORMATION h_info = NULL;4 U/ u) ^- F$ f, i1 q3 F' }1 ~; m0 G 0 D- I, K& t6 L, n# O for ( size = 1; ; size *= 2 ); A% N# p3 a/ h( E, p* K" z4 p { ! D. ~7 }; {' y: mif ( NULL == ( buf = calloc( size, 1 ) ) )3 q9 U# g$ f3 k* M( `" ? { 9 ?0 Q% r7 V- ^7 N: D. gfprintf( stderr, "calloc( %u, 1 ) failed\n", size ); : ?5 d7 [, i! o& l. jgoto GetEprocessFromPid_exit;. Z$ [6 [! V1 w- X+ X }9 q" z2 G/ b+ ]5 o/ V3 [/ ~ status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); . z7 N. b; M; z9 |2 |2 p. iif ( !NT_SUCCESS( status ) )8 R- M" `2 w6 T5 [' D9 b4 C4 n" ] { 3 w; C* V' f3 |% Y0 q. Z# A3 |- R7 qif ( STATUS_INFO_LENGTH_MISMATCH == status )8 `, m1 E& |" e3 f) m! ] D& K' L {! W' e( n* E, R5 U# k( E1 Z3 d free( buf );, h) U9 g" @1 v6 e& _ buf = NULL; . k2 q; `" l+ U3 n& _} " b6 K; D4 y0 g- melse * x! A- i& e/ s{ 4 T, y9 w% \. b1 \7 C0 Dprintf( "ZwQuerySystemInformation() failed");5 r# G! k' B. g; y goto GetEprocessFromPid_exit;2 A: l+ A3 y4 Q7 U, r2 q }, q6 s3 P% Y! n* Y7 ]7 n8 R }6 H+ ?, H3 `. Q( g0 s else+ D# O V$ i1 y: H0 h# g+ h {1 x: A9 _% ]4 r W& w# a break; 2 I& _( G3 L2 {7 S' c2 W& r3 J}! | h5 X# g& n8 y } /* end of for */ * D: s7 @5 K7 ^8 e9 _! L ' j5 q" }, F" ]# B# @5 u& p9 z//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组6 f3 v- G9 r5 q8 C" ^1 v2 m* n NumOfHandle = (ULONG)buf;9 | q# |/ U+ F' m( E9 m. Y ; }0 m5 Z2 M# _5 Eh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);, Y; t! \' Z! y! v {& L4 | 7 g& x6 C0 \4 u r6 q# hfor(i = 0; i { ( {( j3 Z8 }, N, V9 V, j4 @if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )5 w, n/ \# [. W) Q8 k& ^/ n! B* E {, U: H$ x4 O; a# Z, U printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);1 f% }7 D! \8 a# Z: m1 T return((DWORD)(h_info.Object));5 A |, g8 f8 v F1 { } 8 \. w" K2 q6 b5 K" R3 r. p}- {6 [0 ]8 s& j, P8 D; ^, C8 a! D GetEprocessFromPid_exit: 5 ?" G/ U6 }; P- I/ ~0 G& Mif ( buf != NULL ) . e4 U ]1 v5 _- [. s+ N. L$ I{" U$ @, b* v/ v5 J# | free( buf ); " U+ p) |/ O* P+ a s) Ubuf = NULL; * Y* X- W% M% V6 ]3 G# I} 5 ~! r% z6 L$ }& @" E+ wreturn(FALSE);7 t+ H% o8 I% H) `. W } - h3 w+ Y1 [( {9 ? % K T( _. \( I Z2 v7 |! N6 A! v4 K& N4 p% |; M1 ^; Q/ m /*' o) c- S+ M& ?, Y * ntdll.dll7 a5 E1 H( U+ I, V */ / k) U' N$ ^6 z: Zstatic BOOL LocateNtdllEntry ( void )1 p/ d; q* O$ c9 r {- w9 c* s; v) X* S# S3 b BOOL ret = FALSE;. Q. D3 m1 }$ E8 B char NTDLL_DLL[] = "ntdll.dll";' J+ Y4 W9 |" y HMODULE ntdll_dll = NULL; + j. ~! x4 B3 H( w1 H: M* P% ~8 l3 {! f; c. \1 ]% R % A: C: m% k% b# ~4 d if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) 9 t9 X4 G$ |2 c7 w9 V. \6 c{ # u8 r: S& |: I* k! @) kprintf( "GetModuleHandle() failed"); $ N2 D, ?! p; |. {5 q* Jreturn( FALSE ); ' z' c' b2 c* ]0 q7 f} 7 `/ U- ^+ k! |: ~) N/ V8 N$ Qif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )4 ?3 Y( I( S* M- u$ F, h8 M4 | {% L$ B! C# W0 K' Z/ T# N6 x# U6 A g2 N goto LocateNtdllEntry_exit; * N' Y8 s5 R e/ t' ` Y9 [1 ?}& u4 B; T$ a' P ret = TRUE; + u( }3 K4 P& h2 S G8 l1 S* A) g$ j! ~# @) b/ i+ B LocateNtdllEntry_exit:& O2 O3 P, G5 E. |8 I( L" j 7 [! }6 Q4 q0 { if ( FALSE == ret ) 7 T4 @$ S V3 {2 {! a4 j" J{2 x6 f4 j4 q! I) e) |; }8 U2 _ printf( "GetProcAddress() failed");2 p4 f2 I: r( b' O& b& w- I } % `6 q' a/ `: i; E6 B9 x, C4 lntdll_dll = NULL; 4 e9 _3 h. ^: g! rreturn( ret );- C4 W: B; H3 k1 u" ?5 ? } /* end of LocateNtdllEntry */ $ _+ p6 w8 w3 w9 g, y# D- u0 M7 g " R4 X2 \3 y6 F E1 g3 ]- d/ c8 e ! N/ Z: a6 m* H3 q2 [* tint main(int argc,char **argv)% R% a, L5 y2 u8 o" {# I {7 H7 u4 g0 i& {: ^5 X8 r6 j 5 l7 s4 l- @: f0 X& P Q* u LocateNtdllEntry( );& K; _2 i- ^9 K / W' ^! z2 v" y7 B //打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为57 x R/ a4 z% m( c2 }& m1 _ OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() ); $ q- a a3 l9 ?# J2 d/ G; x" p( i0 E/ z$ A" {' l8 a: _$ C3 C DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );) p' e; ~6 w0 U # m' g- a' \5 M& Y9 Fprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);0 i' s8 T/ G* h: F% K - l2 Y6 `% B4 h$ S7 G4 J5 R% xreturn TRUE; % k0 A8 @" ^( V) a+ C}
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 02:55 , Processed in 0.585066 second(s), 51 queries .

回顶部