QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:4 @0 l* N6 H+ `( P8 b3 n -------------------------------------------------------------------------------- 1 b" G+ A- n8 q& q' Q- A文摘出处:http://www.xfocus.net/articles/200406/706.html 5 ~6 ]9 H: G' }& F) r5 b" V% P# z5 k( ^+ _: \. Z6 l! J, } 创建时间:2004-06-01( t4 y4 [* V( X! ~. u8 k7 M 文章属性:原创: S0 P+ b6 G- N) h2 p4 U {- E9 S 文章提交:MustBE (zf35_at_citiz.net) 9 y6 K( l% y; b& z4 v. f! ^( k% G6 ]3 T0 A) a2 V, x By [I.T.S]SystEm32- J- D; k/ ^+ S5 F1 h / G! d$ b0 b7 P L4 {% N2 a R Welcome to our web site http://itaq.ynpc.com/itsbbs/ " K9 W/ {5 j. H, _6 X1 w/ Y; c% _6 u# u3 ~3 j thanks to SobeIt : P3 w* m4 I) S; a. Q# ~ --------------------------------------------------------------------------------------------- : r+ Q" f" n! s; t W : {, [' e& [5 n, e1 M1 Y- }每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.$ H; s" [8 Y4 B5 t ! }5 A8 D1 j8 Y/ U) O5 e绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 ! }. y! e9 A' ?& s) _3 n 2 i2 s- @& [! XZwQuerySystemInformation函数原形如下) A i) ]. a# o1 }* P5 ^0 c 8 ?5 R1 Y& L* I2 R" G NTSYSAPI# f* t, y+ ]- w( u' Y# ~8 G3 _ NTSTATUS" X9 g2 a% P) e, s* Y; E$ J% ? NTAPI 8 W5 V) G. @. L* k- h, U1 [; TZwQuerySystemInformation. r* {$ Q [3 ?; z9 K2 [ ( , t7 z) m1 j, F: J IN SYSTEM_INFORMATION_CLASS SystemInformationClass, ' Z' X! F/ x# K; u; \; ]/ T% { IN OUT PVOID SystemInformation, ! e1 d- n- U, O+ G1 C. g IN ULONG SystemInformationLength, : B6 j, Z, Z" ?5 L6 l1 @ OUT PULONG ReturnLength OPTIONAL , t, e- @: L$ R( t) e ^; R8 G );: n+ y; ]2 ~0 U+ C, V* i0 b4 C$ Y " O0 B/ X" g$ Q2 Q 参数意义如下0 b. ]+ [1 o* C7 v1 n$ {$ O8 L * I I* U& t3 E9 ^0 | G9 BSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一' u5 U6 q# n' I0 K+ V0 F" N5 V# A2 Z/ C 9 i$ Q9 a+ K$ v, d! y4 M SystemInformation:指向一个接受系统信息的缓冲区的指针 / O9 Q7 a2 V) v1 f; F+ o9 N 7 v5 `' O0 B3 B' BSystemInformationLength:缓冲区长度" b" B' a6 w# _7 F/ e, q, s3 E) X 3 ]4 ]6 s4 H8 P& \9 b& gReturnLength:指向一个接受实际返回字节数的变量,可以为04 @1 b9 N1 T7 \3 m# T4 z& p; i* H ( f* H& F' Y2 H, A3 s1 }8 I$ e. z+ H0 h 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation* ?2 j3 X* C- c+ ?( n- o+ E# j 5 ^7 M) m' G9 } SYSTEM_INFORMATION_CLASS的结构如下 ' C5 _# k1 E8 A3 b! D, S" v+ A- i. ?3 K. ~, G9 [ ~' v; m, x typedef struct _SYSTEM_HANDLE_INFORMATION 6 P) T* @( p) F{ % K3 n& B# _* d6 Q* O: JULONG ProcessId;9 u7 B7 m1 K: \3 `- y' ? UCHAR ObjectTypeNumber; ! A5 f! h2 Y" I h" H6 j( {5 F( sUCHAR Flags;; l8 i/ }" Q$ r USHORT Handle;$ |7 Y- I% ?6 z PVOID Object; 7 D- R* U6 y5 E1 {! UACCESS_MASK GrantedAccess; 2 m* D: v3 ^: _" C8 D} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; ; `+ _- o9 z* y 2 j7 z# _9 i6 [ ~1 H D) Z! YProcessId:进程标识符 % D: {- n4 Q# a3 Q1 O" f$ k" ]8 w - y( E1 C2 S9 t, X* rObjectTypeNumber;打开的对象的类型 " ?, r* z7 T- Q, N6 i' a2 t - b% _# R6 b" R2 g! k. _Flags:句柄属性标志 7 O% X$ h+ A# X" F ( S5 r5 b" p+ |* o6 QHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄2 H" e& p* H4 K: \7 } - S' G2 m; ?$ b9 ]/ | Object:这个就是句柄对应的EPROCESS的地址 0 \; ?2 U( A( A' c2 j6 h6 w/ K, z! [) N( O0 h2 l5 I GrantedAccess:句柄对象的访问权限' l' ]: z7 P8 T' G. E, N V$ C0 o; v/ D& L 6 E2 h9 E' X8 [7 ~4 V下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )( z% B( {/ q1 r8 d! o* \ . j1 Z+ C# P* G( a3 l& b. h比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 5 t8 y g6 w4 P6 a F* r2 ?) ^3 R# W8 W8 ~! o; H0 ~ 怎么会这样?难道程序写错了?*_*6 v S8 w( R+ `# ]6 w, @3 _( _ 6 o+ r3 c% P4 g现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出4 c! d/ u4 H2 a5 @- ~ # @/ ?1 y5 O+ |( f* g; J4 g; \ :proc -o QQ 7 N1 N8 A0 ^2 `( H* m: g& XProcess KPEB PID Threads Pri User Time Krnl Time Status2 t! c9 W. j7 v QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready6 [( ~: {+ Q9 ]& ~4 A/ |. U' A5 Z ( q& f) Q. p) I% E# u: A2 ?---- Handle Table Information ---- 0 }( w" ?# `' o- e% ~) R# o/ I0 v8 k; e" x% ^/ G Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 0 k- ^- a: Y1 O" T( E7 @ ' R# r" o2 G& d$ MHandle Ob Hdr * Object * Type. p7 O- s6 h- _& q3 F, m2 _ 0000 00000000 00000018 ? ; c! R1 k+ s, n, h/ j, N2 ]0004 E2DA5E58 E2DA5E70 Section3 P Y) G$ i! e$ u6 l7 R. U: L 0008 FFAB35C8 FFAB35E0 Event + ~6 v5 r7 G* ?% }3 ] d000C FFAB3B08 FFAB3B20 Event$ Q# x7 u- ^" ~' R" a$ c; T 0010 85C70188 85C701A0 Event/ L. L/ [5 t& w. m 0014 81515778 81515790 Directory C% r# b9 a6 }; p 0018 FFAB7BB2 FFAB7BCA ? 8 B6 k" s% i: Y$ s5 _001C 814A1858 814A1870 Directory" b+ K3 \) J3 z 0020 80288C88 80288CA0 Event 2 T' l7 W$ X( M0024 E2CFE7F9 E2CFE811 ? " o) Y1 t" i3 S4 I0 H8 z! Q0028 842D7B08 842D7B20 Event # D: |5 A5 z! k: _8 x- n* |002C 80E9B989 80E9B9A1 ?/ S! T3 P. {9 f8 F N% b 0030 E1372198 E13721B0 Section. W8 }8 L% u6 d0 D 0034 814602C0 814602D8 WindowStation 7 S# h/ Z4 }4 w& Y) A0038 81455CE0 81455CF8 Desktop 1 P" }& V" H% K3 f003C 814602C0 814602D8 WindowStation$ i2 P# ~3 q9 {7 v! E/ p# B 0040 E2B3C1A8 E2B3C1C0 Key 9 p+ Y9 |, c6 B) `0 S( U5 p0044 E286D6E8 E286D700 Key/ m% B* j$ {2 e2 i7 H) Q# D 0048 E2B3C0E8 E2B3C100 Key3 X4 O+ N6 u2 E9 e) y) h7 j 004C E2B3C068 E2B3C080 Key : c/ B( n0 e" Z0050 E2BEE688 E2BEE6A0 Key4 [7 e- f3 m* n" b 0054 8147C998 8147C9B0 Directory5 x2 k: [) S- t- g+ ]( \ ^5 A$ K 0058 829D1128 829D1140 Event 7 [' [& O" y$ h( r+ C+ V u005C 83F991E8 83F99200 Event* M* G) _& u% H. N. J8 ~; U 0060 E2BEE608 E2BEE620 Key4 t0 C0 Y; v; p# c% s: B( M 0064 FFB07568 FFB07580 Event! ~. R9 I- r7 { 0068 801747E8 80174800 Event + H" S! Q6 y. F* E( S) J" \006C 80174828 80174840 Event ! R% p$ c5 q# t. t" d: x$ D0070 845E8808 845E8820 Event# V! n+ w4 z- m 0074 81448798 814487B0 Event ' ]4 S: O5 V+ m4 H, U' _/ Q0078 E2B9A888 E2B9A8A0 Key* D5 A" W* @6 s, Z 007C 845E8648 845E8660 Event # f% o2 [+ X$ {" ~/ |0080 FF9E2DB8 FF9E2DD0 Mutant4 J; j* m8 X/ z. N5 ^ 0084 FF9E2D58 FF9E2D70 Mutant + h- W6 a! S1 |7 }* M h, m' v0088 83CFC378 83CFC390 Mutant+ f* U( }/ M: ]! y: a* v5 \ 008C 801749B0 801749C8 File 7 [9 W8 x0 v' v9 L% A0090 E2C48668 E2C48680 Section 1 @! h* u" U1 ]6 A: R$ M& ?3 ]$ R. D0094 FF965168 FF965180 Event! _, _' t/ \, \: X# f3 w 0098 FF9E7D88 FF9E7DA0 Event9 D8 D- ^9 {/ j9 T J 009C FFAD3DE8 FFAD3E00 Event ! A9 m. o I$ J" D7 D D2 i00A0 80AD63C8 80AD63E0 Event 4 m x% f$ o( a- z; |% t' w2 C* B00A4 E28073A8 E28073C0 Key # @9 h4 a& i+ l9 q7 H) U# M00A8 FF955588 FF9555A0 Thread5 @) m. ]" w# O2 |+ S$ d% h- e' x2 ?/ Y 00AC E2770728 E2770740 Key4 e# ]0 u" `- w- T" j, ~ 00B0 FF923438 FF923450 Mutant+ d7 C4 v9 J2 N/ f. ] 00B4 FFAE3B38 FFAE3B50 Mutant , C8 L# G: u" M$ {) i% a' ]00B8 83B80728 83B80740 Event 5 ]# R8 g3 j* S* y5 L3 F0 R00BC 83B80668 83B80680 Event6 v/ E* b; B8 ^ 00C0 E2E3C448 E2E3C460 Section 5 l0 i" R1 f/ n w1 ~8 @' P5 B00C4 83776A08 83776A20 Thread5 l1 D f& L A5 A: e( u 00C8 81489E48 81489E60 Event- I/ N3 I! P7 a 00CC 83776CC8 83776CE0 Event $ f" m7 w# S; W00D0 83776C88 83776CA0 Event + E8 R3 ~' \% i" T p) b00D4 83776768 83776780 Event7 I& p2 a( ~; p6 I- h- R 00D8 E2837D88 E2837DA0 Key0 _7 G+ w) D Q7 _" S' \8 ?" M 00DC 8146B3A8 8146B3C0 Event ; @' W) n9 Y C# d: _$ p% R8 t00E0 FF908308 FF908320 Event3 z$ v" W7 k/ Z/ M" ^( s+ \: P$ { 00E4 81494868 81494880 Event. B `, k$ C9 A8 o: M 00E8 FF9064C8 FF9064E0 Event 8 |. K- k3 X0 J F# ~4 D* n00EC FF908FC8 FF908FE0 Event5 L3 P; o" Q; D7 m+ O' D: _+ P 00F0 FF908F88 FF908FA0 Event " n6 F. H3 f3 n# D8 W$ T2 a00F4 FF955588 FF9555A0 Thread 5 X* y+ c! z2 } m/ Q00F8 FF908F48 FF908F60 Event: j, i' f W1 k$ t+ r/ z 00FC E2CB1558 E2CB1570 Port1 H- d6 m/ M2 W 0100 FF90A2C8 FF90A2E0 IoCompletion 8 p# `4 Y8 I: J$ [3 O( @' E0104 E2CFE708 E2CFE720 Port- X; d, a& R6 L- [% k9 }3 j$ j$ b 0108 FF90A2C8 FF90A2E0 IoCompletion 0 W0 H! L# U( u- z010C 837762A8 837762C0 Thread N3 R- u! k9 h% t7 l1 A$ Y0110 8103BBC8 8103BBE0 Event 8 }; b- l! h1 P$ V5 n0114 813DBDB8 813DBDD0 Event: `* n# y1 x; R7 { 0118 FF814788 FF8147A0 Event; A# M4 Q7 S0 J) m; V 011C E1358DA8 E1358DC0 Key . o+ y& d( p" X1 N T# g: T0120 E2CFC428 E2CFC440 Key" N3 n |7 w4 G; @$ L* `+ I 0124 8103B9C8 8103B9E0 Event2 _' A# W5 |) U 0128 E2C9A968 E2C9A980 Key0 Q2 Q; J1 c; x- z5 p+ | 012C 83B34E88 83B34EA0 Event; f/ J& i9 N9 `. i! {3 {8 l, G7 D 0130 E2CFD948 E2CFD960 Key$ q! D; \2 U) a+ U: Z 0134 83B34E08 83B34E20 Event ! W4 l) _% r0 T.... : V) N5 H: q( s: s! E.....................省略6 @; Y+ k9 q/ Y) p 9 Z6 r: }: q5 B" q) p7 V看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢? ( V5 q7 W' c0 m9 ? 6 ?- r8 f5 w0 w1 y$ D/ o; D! Z: C想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此0 [4 o- b( T) _& G# }, G H) s5 r! r2 H, } 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 6 z7 ^) S7 D2 C; E+ x3 {( k# E, z7 b! N4 H" x* t" X" v' G, ]7 y D9 ? 后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. $ t6 V! {( n) p% }" Q1 x# C: H7 c- z8 @, K 果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS 2 T, J/ N1 e! r6 t( x+ N6 Y$ G " K0 M8 i. T1 {! s1 t8 Y修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程: B) x2 ]- Q; y6 ]( f- N - ~$ b% y0 Q6 b #include ! m3 r x8 D+ }1 q* F6 ]#include 7 N4 D, k6 W n | #include \ l$ [) a, J0 h3 B #include , T* P6 j4 ]+ S0 m0 ~0 W 6 v% i" l/ C# U3 }! v2 b* P/* " P/ m( x0 u* W. [8 I# z; |* you''ll find a list of NTSTATUS status codes in the DDK header0 I* i. ?! C$ l3 ? * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\) 7 s8 ^ h: T1 q9 `' V* k*/' @0 O6 Q: m9 a) a- X6 [5 F #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) 6 b& M" n; ^5 c. `& g5 E; g1 \- ^#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)$ M/ o0 X% v7 a, D% C# Z# O #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)" f# P8 g$ _7 S : K/ q( \9 ]1 E$ E /*/ S F# T/ J& ^. V; \ *************************************************************************7 W4 D' M" `4 Q * ntddk.h, L: T9 q9 |$ T c0 v9 x+ _ */ 7 c3 Q3 ~ a- V* p, X/ ^$ E9 b& Ktypedef LONG NTSTATUS; * B! p# B' d Q5 T% Itypedef ULONG ACCESS_MASK;. T* q& L U3 y5 U+ X5 G /* ! ?% G- C+ C9 H; ?5 `6 [; O4 f* ntdef.h , D9 V, h7 [* @9 |*************************************************************************5 v) U7 Q: I8 Z9 n. o */ - `( C. b$ ^2 h) e+ _; Q3 |) N$ r1 Q: L( u /*& C' u+ _0 }& S7 h *************************************************************************5 O( i% U( b6 a3 p. N k6 e# }: e, i * <> - Gary Nebbett 2 D" @( I) h$ }; f& y! p. ~1 e*/ $ \# ^& g A% z8 s " r# ^' A) M8 c) R& B: N: J8 xtypedef enum _SYSTEM_INFORMATION_CLASS+ P. j t$ ?2 Y) ~* p" { {6 ^# q z9 n7 K8 L! J& R SystemHandleInformation = 16 4 z/ f6 g: c' r3 [/ W+ Q0 R$ {} SYSTEM_INFORMATION_CLASS; ) y! }" r& p8 h' ~ l L2 l6 a- @' ~ /* ! Z# N7 ?9 R3 o* `6 c8 {2 ^6 b*Information Class 16% P* k. }1 l' q( R% ^- J( Y */ @0 M! L; T1 X) Ztypedef struct _SYSTEM_HANDLE_INFORMATION! z6 }$ I( L5 }( `$ T {& g/ K1 y F5 |: X7 a ULONG ProcessId;! a% b+ b) ~! A0 @5 @, { UCHAR ObjectTypeNumber;4 y6 i+ k+ w- [+ O | UCHAR Flags; 7 O- d$ {/ Z. KUSHORT Handle; 2 z3 A% B5 `- y) N* Z$ |+ \$ nPVOID Object;+ U: A' b- m$ } ACCESS_MASK GrantedAccess;6 s7 D0 C2 S, a9 F: ? } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;5 X G. g! f% l& k% d 2 P! C5 X. g9 Y #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; }9 t2 `# }; o# d& k( J. ]8 T C- ~# O /* 4 V7 L: Q4 Z7 n, _ s% W*************************************************************************- l. Q3 H7 R! C9 j * <> - Gary Nebbett ( L, s/ {0 k& ?4 K$ |2 o************************************************************************* * b& W7 w7 R! m1 F; J8 C/ v*/0 L2 [! @( T% u typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );# }0 A. E0 c3 X& z: B, T typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );% _0 z9 R& g* E9 X9 I8 Y /************************************************************************ 6 |4 k- ~4 d6 H+ t( b. F5 e0 L* *( `9 A# M+ N$ p4 `8 P. e * Function Prototype *; q( g# E3 u: a8 ~; a5 q& P * * ; Y1 `, v2 V. a% J& t/ F$ G! f* P************************************************************************/ * j& \. h$ G ]! v; ]) S' p) m 9 ]" ?! C2 K/ e1 w5 ]: ~8 Cstatic DWORD GetEprocessFromPid ( ULONG PID );7 A: [9 t$ d- n2 ^" R static BOOL LocateNtdllEntry ( void );! N8 n* r9 m* ?! f3 G 0 M( [! f" e4 \* [ 8 ~" F6 g. k& G* _ /************************************************************************ % T* A" ~% a4 m# Q- d- `( {* *$ d, C- g# ?9 @ * Static Global Var *. K, T2 O7 S: E+ n1 P6 z# C C3 b * *0 z& q1 Z. x3 n* N7 }- r ************************************************************************/: v* F& u# n4 h) z" o/ e; c 5 ]# S5 e; q% y static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;3 R6 V" L( k8 G2 i# m- _. `, o7 ?4 J/ o static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;8 i9 R1 A, k9 g; H3 M 3 r6 d9 G; B: ?# Z( X; x. E/ l1 ], Dstatic HMODULE hModule = NULL;: Y6 M2 q$ a" c, q4 ~* D /************************************************************************/- ?, R% \7 t# F& w: H4 l 7 i8 d4 a, w7 A9 \7 K6 E1 v M - y4 W" O' y) i6 {8 j- F+ V6 h static DWORD GetEprocessFromPid ( ULONG PID ) m; Y6 n. l0 H3 t4 h6 l# z: c. Q{1 c* u7 L8 [5 ^& |' `. ~ NTSTATUS status;1 l2 A; \, n9 |8 m1 d. U, E* g PVOID buf = NULL;6 [+ z9 F) v- ?$ Z& x' U9 W ULONG size = 1;% O$ j" Q. N5 u2 l8 Y" k# z ULONG NumOfHandle = 0;) v6 o) Z- L( v# i' |0 j1 Z/ I ULONG i; ) a* D3 L7 S1 P/ A' FPSYSTEM_HANDLE_INFORMATION h_info = NULL; : c3 F, X" W7 a+ j N$ x2 o! l8 O; k6 F% B' s+ d for ( size = 1; ; size *= 2 )0 \4 w0 ?( t+ D6 `, i) { { * f6 d. M- i( K# g2 ^2 a3 X1 Pif ( NULL == ( buf = calloc( size, 1 ) ) ) - `9 j& e% k% v$ R7 y: M; L{ # Y8 X; ?3 Q; K: jfprintf( stderr, "calloc( %u, 1 ) failed\n", size );4 z* ~- a1 |0 |6 f goto GetEprocessFromPid_exit;$ n7 i) e$ W* j# H5 g% R. h }7 f) ? g7 _, U2 t7 L+ G4 W$ S5 O status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );4 Z$ w2 b2 B- E$ { if ( !NT_SUCCESS( status ) ) + n/ ^" ~* N# W6 o+ h{: Z6 Y: Q' m+ S. V if ( STATUS_INFO_LENGTH_MISMATCH == status ) & }/ W+ I3 g# T: a* W{ $ J. T4 l( p2 p; u; e6 wfree( buf ); & |) o0 H. s/ b# v0 Lbuf = NULL; * i0 S6 h, q( }} : v: x7 h- T! N, c+ Eelse" m8 d: @: |3 b# p/ D {/ E, a( `* }: \ printf( "ZwQuerySystemInformation() failed"); 9 K: W ~# n. o3 D+ ?" |. |goto GetEprocessFromPid_exit;: k+ @; O5 h3 B2 f7 l; w0 ? } i5 I) N( p9 J: Z% t; N4 h3 D}! A; b! E/ }* k) M+ D else , c& A- b- p0 L$ q) V; `{# e3 _+ S) ?3 p/ X; v; I break;1 U) \$ @1 N: j" u2 K } / s5 s P: t5 ?5 |6 X} /* end of for */ & x# ~( O" I/ j6 d! ?" r7 F 8 K% ?0 c" d+ V* b//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组. x1 V( E. R& v( n$ Y NumOfHandle = (ULONG)buf;% z3 J2 m1 ]2 Q+ t& A $ w3 s( {, [1 Y; d" ^4 Dh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);: x8 ?( _5 V6 w8 _, u$ t + r9 }# M0 j1 Y$ y for(i = 0; i { : E. W& g) Y3 W) ]- \" p- G2 [9 ~* F. nif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) )" H$ @% Q# Q5 b2 W { , P- q: a$ t; V1 Aprintf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);$ \! W% }, X2 I8 M' o* b return((DWORD)(h_info.Object)); 6 d7 V( b; G2 v0 z} 9 C( y0 z5 k9 ]2 b7 B} ! o' E* p' C' c: q1 AGetEprocessFromPid_exit:% h( Q. ]2 ?- W, n6 |8 X- B if ( buf != NULL )/ @3 y3 J9 M& A( f {; X" w/ J# V' L- U B+ v2 R6 @ free( buf ); - @$ b/ a. z a0 g" ubuf = NULL; ( {; d" x2 d( ?}: d/ |* j+ |, K! J$ v' O return(FALSE);" T; n" b7 @' [ ` } ' R D0 n1 p7 B( R7 z# g s" {4 ?8 N! q8 J& c9 V# M0 m& D j1 @- u7 C /*& r3 h' g. c: Y* ^; h8 m * ntdll.dll ; j2 { g' c- I/ ^6 ~6 f*/ # b6 A% Z' F! {3 h/ i* N; t+ dstatic BOOL LocateNtdllEntry ( void )! B4 g" T- O3 o6 _- S! v { 7 R- p7 W% S5 W1 I, F$ |. \/ p. b& |BOOL ret = FALSE; ) X0 f9 u) C6 U) a% }7 x8 G: Ychar NTDLL_DLL[] = "ntdll.dll";! k5 b) P w7 W7 [( D0 k HMODULE ntdll_dll = NULL;' G: z5 K7 } ]% `( \8 m) [/ } 5 _8 {, m' r2 I5 u( c . b6 U2 S. ?! [' m. W% Qif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) Q% \. k5 X) v{ u$ D; }7 O/ B/ n printf( "GetModuleHandle() failed"); 0 G$ X! A4 F3 _return( FALSE );! T* S% `3 u+ M8 d+ R6 w } / H7 ~, C: H3 a! s$ X3 y" iif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) . N9 N) Q) p& y4 s; J{0 ?% }2 ~2 p! w K: s; F2 L; w goto LocateNtdllEntry_exit;8 _' Y6 g* F7 O) d- \ }7 h; M/ T) z9 W ret = TRUE;* R% _: ~) Z! C q; K, b" J, K2 T6 i9 ALocateNtdllEntry_exit:! l, F8 W2 L' l # h! C3 b1 S; @9 \! {' b9 @5 v1 hif ( FALSE == ret ) 8 w T5 G/ w) P1 A8 V8 B{ 5 `/ f; D- [/ Z8 Aprintf( "GetProcAddress() failed"); 0 R% C: D# E0 P}2 {0 `# H" h2 O/ e ntdll_dll = NULL; # w6 e3 s6 {& V: w/ y/ w4 N4 nreturn( ret );" Z6 @. _5 P' t+ ?, d& I0 J2 b } /* end of LocateNtdllEntry */ ) V% w+ ?9 S I6 v ( N2 ~; M+ M4 C( o8 T9 G8 P0 K. h ' f5 z% b9 A; r; {! U/ b5 B. m7 a- xint main(int argc,char **argv)4 y0 m/ }7 a* _4 a$ O1 |( P: I1 [+ U { 0 _1 d3 W: V2 Z* Z; q. b g0 W& X @ LocateNtdllEntry( );6 B/ X/ {: \" A8 b1 g3 t; J! \5 E % O8 ?9 b4 a0 F//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5! j, V$ }- r! G4 c# f* V; q OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );2 M) ?1 u4 q) P) Q4 ^+ p' R8 _ 9 _, n' ^ y# |; m% j# u DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); & [, F: A6 S; ~) ^/ V* x0 a/ ]& [1 A% y" D2 X# k9 I6 h1 C* t printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); i& s% i9 m5 d! e# g* y. U 3 ~; i) L" `7 a6 L5 u) N, Wreturn TRUE; 9 Y# D* ?2 u$ s' K' Y- ~( Z- u9 ^% m}
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 01:50 , Processed in 0.441141 second(s), 52 queries .

回顶部