QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:0 @: a* ?! \: r1 c' j; W |) t --------------------------------------------------------------------------------7 q1 ^& E/ C& v" C 文摘出处:http://www.xfocus.net/articles/200406/706.html 1 L8 ~9 F7 E2 _7 x6 w) r& b: g 7 m {% `% G* u9 ]" Z创建时间:2004-06-01 4 M) b/ o4 p7 d5 |文章属性:原创 9 a9 G- ^1 A g& U文章提交:MustBE (zf35_at_citiz.net) + d0 [- p3 W5 J2 e/ {3 A5 Z5 s$ D1 B/ @2 I! \7 p By [I.T.S]SystEm32 2 F/ {. n+ s% \, _* R# {( o7 H( m7 a' i: j+ A8 _: A' X Welcome to our web site http://itaq.ynpc.com/itsbbs/ 1 G+ p( f+ v2 k2 [' u' z- v6 `# ~- E/ E3 s thanks to SobeIt : P ! x) v( ]3 n/ l s--------------------------------------------------------------------------------------------- 4 j4 {' O' P- l/ F( D ( Z- x' }" ?/ L: T( B每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.1 c% e' Z+ E0 ~5 F, c: U $ _8 b& X: M& n4 f3 A Q 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 ( e% |- a5 R5 }- H , n# p) i- ~; ~, I5 O, S% vZwQuerySystemInformation函数原形如下8 ]9 ~2 s$ _7 Q- M+ i # R3 v# B2 D; ?: Y" Q NTSYSAPI ; R2 ^! t3 H) |NTSTATUS- C/ w+ T9 }; Y3 F, e8 y* S3 i NTAPI( \ ~5 G% M7 T# r6 R( j ZwQuerySystemInformation , e% T9 i# R8 |: f1 T z9 Y( % J z* b1 ~. v& A1 q IN SYSTEM_INFORMATION_CLASS SystemInformationClass, / n+ l8 X) O/ ~ IN OUT PVOID SystemInformation, 8 i, S6 n4 F1 ]* I9 b3 EIN ULONG SystemInformationLength, : V* ]9 E' Y7 \" }6 d OUT PULONG ReturnLength OPTIONAL ' i1 j/ W. @8 a$ ^4 H: _) l); : y3 ]7 x1 Y0 Z: E ( x; p3 q/ B% D8 Y参数意义如下 # v/ v( y8 E- j- R. ]. A4 g" A1 S J4 K5 I SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一& L6 m6 T1 q2 d, O& } + B$ }' J, ^+ B7 m+ X6 aSystemInformation:指向一个接受系统信息的缓冲区的指针" r$ q( S! Y6 m. f3 x! j 3 Q; ~9 c0 h9 P) R1 W SystemInformationLength:缓冲区长度& e8 [/ c' ^* e9 ^0 {# u 1 r6 ?4 g8 P3 ~4 N+ ]! t5 nReturnLength:指向一个接受实际返回字节数的变量,可以为0 / H9 v( X) x4 i+ Q+ O9 u' k- `2 f: {% S# M% k4 c& V ) m7 @$ ]! N6 ] 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation # z* V! d' {( C7 ^5 @4 c6 v5 h0 @4 y/ Z7 g1 O8 | SYSTEM_INFORMATION_CLASS的结构如下: a2 X% u9 b1 m, | 8 f, t( w& A+ P' \) c5 G$ T typedef struct _SYSTEM_HANDLE_INFORMATION2 t# P u* [' n9 K {& Z+ q* Q; [8 x& O5 I ULONG ProcessId;" f6 |7 U& a, ^& z& _! r5 V UCHAR ObjectTypeNumber;0 I3 |0 V) \) Q$ f2 {7 S# I UCHAR Flags;3 m$ l$ E1 y$ G- Q. F' a5 ] USHORT Handle;+ O) E9 y6 S+ _1 U9 ]: d PVOID Object; i1 B. G s& C2 F8 M# c# m# S0 Y) _ ACCESS_MASK GrantedAccess; ; G$ I# ]+ c3 b1 ^" K3 s} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;* b( ?3 e, ^$ z& n& u 0 b9 w8 x4 ]- S# C+ z; Y8 L ProcessId:进程标识符 3 L/ n7 |0 F9 s- f9 G) c& R& m. t1 q- K. a. Z+ H& C) m7 F ObjectTypeNumber;打开的对象的类型 / w& t; W! E7 n- n b O8 b 3 ]- Q4 Z9 P, `8 r! K0 ^Flags:句柄属性标志 - L1 C: R! l9 Z/ B( {7 @( [6 M: ]" J% X( y+ v- ^; C3 { Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄! B. E& F9 z& j$ }6 D0 m" t% p % A% v7 R, n1 w# |8 aObject:这个就是句柄对应的EPROCESS的地址 4 n7 \: l8 B* G8 K' @9 p0 J/ h! U, `; ^( N GrantedAccess:句柄对象的访问权限. T4 ]/ ^4 p0 N% K, H% W7 S6 y$ B u9 Y% z" y2 Q& c8 C# @3 Z5 {. T8 ]7 l: J 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )' c: `$ i6 c2 p) h ! K$ b3 Y1 d0 c比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄; T, ]5 C8 f: F3 l4 Z 2 b- X! q, q) A" R怎么会这样?难道程序写错了?*_*+ z! o$ \( N! x 9 t4 J9 a3 S$ H9 w现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出' g/ t5 j6 j4 s" S ; S9 q. C, `( | h :proc -o QQ0 H/ c9 x! N$ `7 x* d Process KPEB PID Threads Pri User Time Krnl Time Status & ]6 C6 X9 f4 c5 N! ?QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready3 M/ y9 r0 m7 J7 i8 V6 D% } ( n& G- j$ w8 I/ w' ]' K9 `---- Handle Table Information ----* j/ g8 Z$ @& |* A . g6 J* }* |+ q) k Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 0 V. z3 J9 `. P) }) s3 Y+ l% c 4 D6 F8 B- b; b7 _9 ?0 X( SHandle Ob Hdr * Object * Type ; m2 Z6 z/ U: j5 \8 g3 M6 C0000 00000000 00000018 ?8 K z+ z7 V, b1 N8 x% E 0004 E2DA5E58 E2DA5E70 Section 7 p% h3 E: T& j6 `- R# W' ^1 i0008 FFAB35C8 FFAB35E0 Event; I: w( q9 a: R 000C FFAB3B08 FFAB3B20 Event+ ?& _( C5 T# D 0010 85C70188 85C701A0 Event & S& `! K- b1 B4 j+ M0 \( H r z/ e0014 81515778 81515790 Directory$ ^% L, |2 C" x& M1 P 0018 FFAB7BB2 FFAB7BCA ? 0 b0 P1 d2 `( n001C 814A1858 814A1870 Directory 4 T& i$ a5 T3 Q3 y4 _0020 80288C88 80288CA0 Event 7 _9 s# Q& G% x: I5 o0 J8 ^6 ?+ d0 k0024 E2CFE7F9 E2CFE811 ? + P4 ?. Q7 q$ Q. f& X( j0028 842D7B08 842D7B20 Event ; K9 i: o/ _: l3 }$ M) v002C 80E9B989 80E9B9A1 ? ; E8 O4 K Z! D0030 E1372198 E13721B0 Section 7 t' z! _. t" B; M7 X0034 814602C0 814602D8 WindowStation $ G8 Z: R0 k2 x0038 81455CE0 81455CF8 Desktop% X5 n* j' |* {! K 003C 814602C0 814602D8 WindowStation 8 t: U+ j' m" G" O) d9 q% P8 U0040 E2B3C1A8 E2B3C1C0 Key. `, Y# z- y6 C2 y7 K# d# g 0044 E286D6E8 E286D700 Key; P1 \. e5 F7 r1 S+ l 0048 E2B3C0E8 E2B3C100 Key ( X, o3 \0 g3 O0 ~/ d004C E2B3C068 E2B3C080 Key ' F& E! B# N V: \. \" X! u* C0050 E2BEE688 E2BEE6A0 Key5 I4 y: i/ U" l! i" O 0054 8147C998 8147C9B0 Directory # n/ G: }7 _4 U# x! o/ ^. f4 h% w0058 829D1128 829D1140 Event J# P1 W8 U7 a, d5 M 005C 83F991E8 83F99200 Event# Y/ Q$ \5 K5 b9 `# u 0060 E2BEE608 E2BEE620 Key. q# l( q; {6 C" r l 0064 FFB07568 FFB07580 Event# W+ ?; r2 l4 o6 @7 B c% l( e 0068 801747E8 80174800 Event 3 R: N# `* L- ]* S h! @006C 80174828 80174840 Event : P) k7 m4 D+ V/ m( V( g. ^; T0 |0070 845E8808 845E8820 Event ' e2 p2 U9 B' R! O0074 81448798 814487B0 Event% v1 |) F p" b 0078 E2B9A888 E2B9A8A0 Key q& v) V3 j" g% L) ?+ E$ ^007C 845E8648 845E8660 Event) Z* |) r/ J0 I, ^( ?; R 0080 FF9E2DB8 FF9E2DD0 Mutant/ l: j5 S6 Z4 S8 W! e5 t! I) T 0084 FF9E2D58 FF9E2D70 Mutant ! w8 I* \- a) {# C! G- X# ~5 Q0088 83CFC378 83CFC390 Mutant( x, S: J" |6 K {! `4 V1 F 008C 801749B0 801749C8 File d0 f. C4 p* M7 k1 D9 q2 ^ 0090 E2C48668 E2C48680 Section 2 r4 j0 x) `" X6 w& n0094 FF965168 FF965180 Event 3 e' x w0 z5 a0098 FF9E7D88 FF9E7DA0 Event4 ?5 i, Y- X9 @0 \0 t7 d7 ] 009C FFAD3DE8 FFAD3E00 Event . U0 B% S! K* Y" K, ^% X00A0 80AD63C8 80AD63E0 Event) Q( M6 b( f) s. F. G: C( M 00A4 E28073A8 E28073C0 Key . p) g2 o, `5 w# P* L! l; k8 M00A8 FF955588 FF9555A0 Thread 2 J) Q3 P9 p3 p8 Y* ?00AC E2770728 E2770740 Key/ q( ]- C* d. D/ M( }# v 00B0 FF923438 FF923450 Mutant* l; ]1 }) z/ X( F! @' a$ F) ? 00B4 FFAE3B38 FFAE3B50 Mutant3 K/ ?0 [" u2 Z: r: ]4 V* x/ ^5 A 00B8 83B80728 83B80740 Event 0 e0 L* f5 b9 z00BC 83B80668 83B80680 Event 7 l, S: E4 j2 n3 x- h6 x7 B00C0 E2E3C448 E2E3C460 Section 6 ]7 R7 {9 I7 R) w) E00C4 83776A08 83776A20 Thread - e9 D- a6 _6 o9 N8 l% s00C8 81489E48 81489E60 Event e+ b* l( f% m8 l 00CC 83776CC8 83776CE0 Event; H' l: m) O, }& W3 C 00D0 83776C88 83776CA0 Event! @1 \* G% y8 Y; @% \ 00D4 83776768 83776780 Event ' j9 m( Y5 `0 C( ?7 ?' R' c, b% X00D8 E2837D88 E2837DA0 Key2 z. {7 N. F, k' s( \9 k 00DC 8146B3A8 8146B3C0 Event 9 I9 i" w" @: e' }00E0 FF908308 FF908320 Event8 ?7 \6 H7 @8 R- ?2 b, s' t, s 00E4 81494868 81494880 Event% ^! O* Z* [* Q3 m3 C+ Y1 c% q 00E8 FF9064C8 FF9064E0 Event: g8 l* N+ \6 v' Z 00EC FF908FC8 FF908FE0 Event: Z% |4 g. h+ x; Y# R9 X' [: D 00F0 FF908F88 FF908FA0 Event ) b& }, q( w6 c! n/ X+ J3 q8 O" }00F4 FF955588 FF9555A0 Thread& v) {& K) w! Y 00F8 FF908F48 FF908F60 Event ( V$ x/ }2 }7 y# K00FC E2CB1558 E2CB1570 Port q6 p$ S7 H9 B# L7 w: r0100 FF90A2C8 FF90A2E0 IoCompletion / t% f" m0 [' v5 u2 v' o/ E0104 E2CFE708 E2CFE720 Port 5 x- U/ D) \' j7 L P( ?0108 FF90A2C8 FF90A2E0 IoCompletion 6 H$ r& ]& L/ [010C 837762A8 837762C0 Thread ! c0 W& K5 W! j0 n: V0110 8103BBC8 8103BBE0 Event ! T2 L0 v l" ~+ S% u( N5 i4 h1 r0114 813DBDB8 813DBDD0 Event; ~. n4 A$ R3 ^5 |4 M5 S$ W 0118 FF814788 FF8147A0 Event/ E l) m0 D, e 011C E1358DA8 E1358DC0 Key 7 i5 l& M3 U- w0120 E2CFC428 E2CFC440 Key ) U4 R$ q5 y7 f2 M u, O0124 8103B9C8 8103B9E0 Event 1 P0 a$ @, z, M3 i0128 E2C9A968 E2C9A980 Key $ u' t( E) p: i4 }012C 83B34E88 83B34EA0 Event 8 }, f% } h' F& l( p4 }0130 E2CFD948 E2CFD960 Key2 ]% b& ?# o/ ^0 \0 F v2 P 0134 83B34E08 83B34E20 Event: s. n# ~& A ]& o .... & {, k3 _1 D1 w7 F% _. _/ \) L2 E5 Z.....................省略 * F" k+ l7 p$ q8 h4 C. p3 F( K9 t' U; c9 m% }9 F& I& ?- o: k 看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?0 b$ t( |1 B6 _1 K4 N " S8 h/ B+ T& Q6 S: L! E3 Y& v 想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此 1 z! N' O: B0 _. Z# ] e, l8 @& u& W; u 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 6 q, k3 E: H! q# L+ H2 ?3 x1 F ( n7 D3 D1 I7 H2 B, L. [( `后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.$ M! W6 Y7 J7 e& U0 Z! D - Q- b$ ?7 O6 ^, E: u果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS9 |" {# Q" E8 V9 G! @' C- e3 z 5 G1 `: p+ ^1 u6 D9 k4 }/ [修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 % j. t4 n6 s# F" l, u$ i) Y# L, ~) ? % L( p- I$ a3 ^$ q+ l#include 4 y" f$ f7 Y/ S2 G #include 5 s$ d) \8 U5 a- @% X #include : b* z. I: f% C: t! d#include ( ~3 Q. c2 H9 N; i- `, t' F& l! u! Y' D! I9 k /*: H( N( I4 T' K9 z/ A, o$ B * you''ll find a list of NTSTATUS status codes in the DDK header0 ?8 D$ Q" M3 X; L: @/ v$ l * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\), h7 E" a. B$ {! E: K! ^4 Y3 A/ ] */ 7 W Q, `& l+ k1 e% v7 q#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) ( i* U. a& O9 Y9 \% K1 B- f+ ?( @#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)( I% S2 c0 y c #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)' o8 |6 e* e# y3 |. n& M+ F ' |% q' I0 Z$ f4 ~8 A3 r /*2 D3 n" M3 v& `& G# l *************************************************************************: V; b' I3 p l+ G# o( Z$ A$ q * ntddk.h' M P: s/ w3 A! \4 j' Z */9 h8 Z: U b( L/ r+ N1 I typedef LONG NTSTATUS; 8 F. w4 C% d8 r5 ytypedef ULONG ACCESS_MASK;! h: _' a; N2 l- z: Z9 b /* * I9 z9 O/ \/ M3 s* ntdef.h$ F. f4 P0 N a$ v' Z2 L! } ************************************************************************* O3 X; T/ O, o8 B */9 o& z- P! c/ k: x. a 4 t' q. O `- T: Q /*0 X+ E, I* L/ R. a0 L *************************************************************************9 L5 |% N( x) |; J * <> - Gary Nebbett% H- t& w; e6 j+ S* c7 ^7 A; @ */* ?) ~: e) B* I6 p% s + G8 L# X& E& H+ } typedef enum _SYSTEM_INFORMATION_CLASS+ r4 _0 l* [( P# m {- X/ m/ \1 V2 E2 G4 q SystemHandleInformation = 162 j7 ^% h7 P6 R* |1 @1 | } SYSTEM_INFORMATION_CLASS; $ K; j2 D) B1 v6 Y# f: h2 Q N/ J; Q. F /*+ D' N" t* r, g% B7 u *Information Class 16 7 E8 T4 g) D+ o% j3 s( {*/ e/ ]. ~ ?: Y: G' [: D. x4 }typedef struct _SYSTEM_HANDLE_INFORMATION * | \; J# J1 n{% I, n* R! ~0 j ULONG ProcessId; ; }7 c/ B9 K- x' hUCHAR ObjectTypeNumber; ! J# d* m. ~; @UCHAR Flags;3 {3 C% T! [, n5 M USHORT Handle; # W( y1 e8 ^) M6 X \' _$ pPVOID Object; , o6 ?8 U6 i/ G& i) zACCESS_MASK GrantedAccess; # W# J" p0 B4 @8 H* @& v+ B} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; % C3 x, [* c- G d# _( j/ s" I0 N: 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; } W! p& ^, W, s7 I4 B /*: T8 F* G! q4 \/ M; p *************************************************************************, ]" b6 k4 C$ H * <> - Gary Nebbett. C$ A6 l' [5 V7 S: B *************************************************************************, e0 Z. I( {6 e; q */1 k& J# h2 A; A0 z. |$ c: u. y typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );8 G$ f E# F8 r* j) r; r) Q typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); 8 G$ y* \* e- ~/ a7 ` U" t P; G/************************************************************************7 F( l$ V. c: W& O( v * *& V5 S) {7 I9 _ * Function Prototype * 3 V% j3 U' Z9 e( b z- I* * 9 d( v! `) j9 w3 P! N************************************************************************/ ( F& x& b9 F4 i/ }7 R 0 u% `7 r: H5 H+ tstatic DWORD GetEprocessFromPid ( ULONG PID ); % |& S/ M% e B$ K3 k5 Ustatic BOOL LocateNtdllEntry ( void ); 1 F6 O6 ^1 `# O" Z' {) u ! k3 f' l, K9 u' Z8 ^) h # E* b' A1 S6 Z f w/************************************************************************ 7 H! q0 p& J7 G* * ) K* y# w' |; `$ a' `7 N' ^* Static Global Var * : y) |- `* i* L. q* k1 q$ D* *4 c* V6 l6 b& Z ************************************************************************/9 @; e3 ^" n4 j+ L2 d, v % N8 T: X/ d n- Hstatic RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL; O7 f( u: B$ ^" D static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL; & O# R- h/ j& V. y6 U; o8 U8 l f: O: d* f) _) I# V Nstatic HMODULE hModule = NULL; / N% E5 N7 t8 g; I/************************************************************************/ y- s+ o: J. |( b+ X+ y& J8 A# R/ T9 }1 p2 A: E ; h/ k! N9 \( Y s static DWORD GetEprocessFromPid ( ULONG PID )* X7 D4 W$ K* j5 A7 Y0 x { & n/ J2 t, Y" ?1 b5 yNTSTATUS status;5 ]* n' L/ d9 |% U0 [' S PVOID buf = NULL;, `# s3 C! H7 G( o) P, [9 w ULONG size = 1; . N v1 b6 \) p3 o3 A4 ^ULONG NumOfHandle = 0; & d1 y, ~; \- RULONG i;& D6 `& w6 t; n) y PSYSTEM_HANDLE_INFORMATION h_info = NULL; 5 n' {7 p% b, L2 Q! Z' t & G; z6 s' e/ _' Qfor ( size = 1; ; size *= 2 )# R3 H d$ f4 p9 \) T% {8 l$ J% m {7 f( F4 P4 N1 [- s! s- _8 \ if ( NULL == ( buf = calloc( size, 1 ) ) )% Z0 M, g- V& c { 0 a& ~3 R- C9 g8 Y9 I' {fprintf( stderr, "calloc( %u, 1 ) failed\n", size );2 G0 N/ [" |3 t6 H7 ^ goto GetEprocessFromPid_exit;) _9 \" j' E7 a- @ }2 M& d5 q1 f0 s4 B) l7 e& a: @ status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); ( G2 ~1 D/ }9 S- U* A- }2 vif ( !NT_SUCCESS( status ) ) 7 L8 l1 V* @6 t8 x( j: R{5 Z% v+ G* J# U if ( STATUS_INFO_LENGTH_MISMATCH == status ) : f; E4 {- z c; ^7 Z1 [ L{+ O( b& ~# S3 r/ N# S free( buf );+ ]& y. W2 [) `1 t- g }5 ^ buf = NULL; 2 A( b, Q5 @/ F! ~# d}- l, S$ [; ^5 U, n* c else8 q+ U) [9 r- A% K P7 [ { 7 T: Y7 L) Z( k6 |' Jprintf( "ZwQuerySystemInformation() failed");9 u$ ]+ X7 |! y4 J t& C: B9 Q. l+ s goto GetEprocessFromPid_exit;) |0 z* Z, l! ?' | } * @$ [& T- D4 X4 U: Z}% | Q( j2 U5 j B2 L else, _6 f4 f# m1 L* E* j {: h: G# p, S" t# [* K break;, R+ c$ S* U2 g# K! U$ a' ]& b } # V; s7 O- z$ t' u5 i$ c/ ~} /* end of for */ 6 H: w s5 J- S # S \3 @ k6 R! q& y$ d1 B2 x//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组 1 `7 T& a- t; D& s3 f, CNumOfHandle = (ULONG)buf;1 r/ `, U( b- y& K, b. k1 S " h* Z, M p$ b/ ^h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);* D* j% C/ H; J" E6 ~ - O! g- ~, u! N$ Y- r6 f' yfor(i = 0; i { ! v+ u1 @" z, x2 Y4 Y$ iif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) + y' Y L" p5 |4 K! F{+ M/ V7 s( X+ k, ~' n# Y- ~" a printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);: m0 `; x% }% E1 i( M, h return((DWORD)(h_info.Object)); : \: w C) F, o& a: G; g5 O7 T}( h+ d# @( p/ S0 H; `! Q }4 [2 ]: r8 t8 u0 j5 P2 R" b GetEprocessFromPid_exit:2 X' V) w0 A+ H+ ~" o" K if ( buf != NULL ): t' M3 U# ?. ?& y3 k' B8 I { 3 t, X1 h( p3 Q8 q+ gfree( buf );8 U3 I% w/ ` k( q! a' F buf = NULL; ; x% _! m; K4 \: d, b1 m% r} # N2 Y5 g# x& L8 preturn(FALSE); / c! A+ x8 u' |$ g}+ h6 v% E. l) ]9 [! I. j ! P6 D- q: h" k9 P( A; Q$ T ( ]) O9 J' V( ?* y; a) b, B" ^ /*6 G, `+ M2 t. o; p3 b4 n1 s * ntdll.dll5 x: Z/ c0 J: x3 h; z; v- m */3 `1 q* h$ ^/ L" Z+ E% h: ?; x) Q J static BOOL LocateNtdllEntry ( void ) N, a% ~- o G: |* }0 s0 Q8 F{ / K# z/ Z0 I- h5 |8 v6 rBOOL ret = FALSE;! T% C! N0 E. Q3 [ char NTDLL_DLL[] = "ntdll.dll";, ], M: s% M0 Z HMODULE ntdll_dll = NULL; $ R; Y& y; X0 ?2 N9 y! x3 s0 M1 J/ }, E( }( I $ |6 R; N2 I7 _# K6 V6 P2 h+ Y if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )& x+ M |- N( R1 ~ { ! e. l& W- O* }7 a$ \printf( "GetModuleHandle() failed");4 y! J- i" j% Q6 f { return( FALSE ); ! }. }$ ~* J9 X6 r- G% b} * R% v" s5 e5 \5 _8 ]( x iif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )' l5 N. I6 _: u! d4 [" s; @1 A { ( t$ \2 t( u/ A0 e. L# M i4 {goto LocateNtdllEntry_exit; * e9 i% h5 ^$ T4 R" R% P}6 o) ?5 e7 o1 n* @3 i; y ret = TRUE; - ]4 {8 z; K8 l2 W5 k2 T & K3 U/ t2 G0 F! y" M5 U; ?. u' t: ELocateNtdllEntry_exit:1 n3 O4 h8 K$ O8 l# c0 c8 l2 w 7 _2 j8 k8 c5 Sif ( FALSE == ret )1 j* c5 v& b. R/ m# n {' p, u# l. _) E% S printf( "GetProcAddress() failed");3 I% @9 c9 n/ x9 S } 3 b0 J' x5 `9 kntdll_dll = NULL; ) z' z7 {- U/ Ereturn( ret ); 6 K# M2 r; z1 q* Q" a6 f7 R" c} /* end of LocateNtdllEntry */ ; h j2 L3 E5 ~* b# E8 D2 h |+ s* F. u" u1 q, ? u! ]6 F' Q/ c6 c, e, Z4 M3 c int main(int argc,char **argv)8 l7 [& d2 \& X- U# g { 7 V* I1 [' [ y/ }+ I. k0 [- E( m6 |1 J* w; e2 W; ^; u LocateNtdllEntry( );1 o2 \& E S! _6 t. q2 q . F* [7 r% `1 M' Y, v//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5 & P g. i7 ^/ } v+ S% I- S+ pOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() ); 4 }: M; _( A* C3 d$ w) i 2 A, U$ C; I/ f/ D( y. |) S2 \# \" c# PDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); 2 `7 O" s1 Y* u7 V * o; S" U6 H6 \- m, l3 dprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);( e" p$ K5 f' {" z 7 Z" G6 ~( x. O: I0 G1 \ y return TRUE;, M0 P1 L9 F% W9 n }
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 18:07 , Processed in 0.427578 second(s), 52 queries .

回顶部