QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容: # Z) m+ ~8 m* {2 d0 y6 d6 O-------------------------------------------------------------------------------- 7 v! i' |+ V a0 }/ Q( Q文摘出处:http://www.xfocus.net/articles/200406/706.html ; N& g% }( w! M& E2 S8 U( [( ?* c' X% L4 h+ \; V! L$ V 创建时间:2004-06-01 - R# \4 b. J% b. n' _文章属性:原创: p; f+ O4 B8 W9 h# o% D 文章提交:MustBE (zf35_at_citiz.net). q; s( f7 \) ~6 s4 h" Y# `/ t 8 W3 Y( w$ X+ e/ e9 R7 r By [I.T.S]SystEm32* ~; B1 p. j& z: l % d, G$ B+ o; G7 K) T Welcome to our web site http://itaq.ynpc.com/itsbbs/ " G1 u: G0 P. t* M: G ; p j; I1 `- w% S0 sthanks to SobeIt : P9 E0 E9 f4 T5 ?/ B% q$ r --------------------------------------------------------------------------------------------- ( e, j5 p+ A0 s. G0 m p 2 J( [' r5 l9 y9 e3 E每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内. ; j1 w% c; t6 [. g. ?) s0 g* X- C3 X/ A& \ 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 4 F, O, C, |2 m, \6 S * Y. ^6 m; Y* k8 k" B) vZwQuerySystemInformation函数原形如下" V& o0 J+ m0 G9 u6 B 6 h- s; P( ?5 f6 I! G7 ?NTSYSAPI 8 K# \( D7 l2 w* [' _7 ]' k. zNTSTATUS* q( i9 p3 s$ V NTAPI$ z2 Z9 n/ N) l/ A0 j ZwQuerySystemInformation # P9 v; p; V# F+ `3 D3 q6 @& [9 ]( 3 U b2 h. X" m IN SYSTEM_INFORMATION_CLASS SystemInformationClass, : |5 j, k) Q1 E3 b+ o2 c3 l9 HIN OUT PVOID SystemInformation, 0 B( s7 \1 v/ A- t, o. VIN ULONG SystemInformationLength, 0 W& ^! K: v4 h' j# W& u( ROUT PULONG ReturnLength OPTIONAL - q- v8 L) A1 K& t# L9 ~);/ `/ W; W# q# S9 t; a# d1 a 7 z, h; |& u( _6 w" C 参数意义如下 . Y, `/ m$ g2 d6 o! @: j& Y; I1 m: G8 d. R- N5 S SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 6 d! Z" w. n' n" @ R# f, z$ i- l% o1 hSystemInformation:指向一个接受系统信息的缓冲区的指针 4 K0 x. Y7 k4 O * O4 ~" w2 G7 f) P" H6 H6 qSystemInformationLength:缓冲区长度 0 r1 X* M$ x. Y' W8 {/ Y! c" R) H! ~7 X/ h2 |" h4 X9 W ReturnLength:指向一个接受实际返回字节数的变量,可以为0 1 U4 L- j5 R8 Q # T$ |+ a/ D! B) _1 W9 M3 S - J# L! I( N% I" Y3 `( V8 t为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation 0 f. `# F' s- n7 ^ " t: p, c6 ~& B3 R) r# M$ @2 vSYSTEM_INFORMATION_CLASS的结构如下 8 F' m# H. r$ s& {, N" G8 Z4 t0 d/ E! X' a- p7 b+ l typedef struct _SYSTEM_HANDLE_INFORMATION' Q1 p! V6 `% ~% e/ Y$ ^ { 8 A x/ O9 f. ]% a5 sULONG ProcessId; 0 @' A7 X4 w" s% eUCHAR ObjectTypeNumber; 9 k+ |/ P7 O% t0 HUCHAR Flags;: g6 i4 h) J/ V" y2 P, Z USHORT Handle;2 w1 h) e ^% h7 P, w PVOID Object;" l+ R, a6 A/ J g) O ACCESS_MASK GrantedAccess; / j" P" z4 R" o& w+ [} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;8 L* v: S. X% S 3 p( e; a6 ^8 C$ k9 l3 W9 K% J/ N ProcessId:进程标识符 ) G9 h' I) ^) T; w, P. t 6 m! a% }0 J: {0 |- ]* e$ J7 g ObjectTypeNumber;打开的对象的类型9 ?9 t# m- |( K( ~& [* w $ Y1 H2 P. h. u7 x& @- ?Flags:句柄属性标志& f* j1 s6 P( a$ T8 f 7 K8 y2 J9 C2 x& B: QHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄3 O) m* T5 l& A7 W 7 f5 _* G* U. E& ~+ E; o% \2 yObject:这个就是句柄对应的EPROCESS的地址% Q7 K) W3 j# c2 A2 v6 K1 i ; F3 r2 E; D* \, y+ K. S# YGrantedAccess:句柄对象的访问权限9 D! L$ h. ?3 @; x$ X 1 H" ?4 \4 v4 T" Q2 P! ~# k 6 F5 D6 v- Y; A" Q/ B' k下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ) + \* X% o" W; H' R' X/ B+ k5 n' _9 D- M0 ?3 W, } 比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄8 V6 c7 X0 |3 D# ?- K ! w) X" B; B. J% M2 X) |. b) e 怎么会这样?难道程序写错了?*_*! L- d7 J; K" }3 S/ ` + N/ A# I$ z4 @* M6 L. z/ J4 Q现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出 " }& A) m9 {: A% w' f+ R! L g2 _5 p. ?8 B) _9 Z% i :proc -o QQ% z& G% r, D1 e+ L: P' H Process KPEB PID Threads Pri User Time Krnl Time Status; b: t4 i8 b' ^0 q5 m QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready4 I" _2 s% j# e/ }* Z + @4 v# P( d3 u& y. |---- Handle Table Information ---- ( R# v$ ~' ^! Q$ d ' s* t- I! }. I# z0 r/ GHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 2 O9 a0 O$ Q, x1 D" a . z0 ]* U- H- m" w0 x! Q- X% QHandle Ob Hdr * Object * Type, i* N# q% o3 T8 s1 L* t 0000 00000000 00000018 ? , Y1 W t6 b7 |% S0 q8 Y) K# @0004 E2DA5E58 E2DA5E70 Section W9 @+ _3 I4 J 0008 FFAB35C8 FFAB35E0 Event 7 Z- W3 U1 @9 }; O000C FFAB3B08 FFAB3B20 Event 1 _4 F0 j5 F% R" z" }7 Y0010 85C70188 85C701A0 Event - W: [3 {; t+ M0 ~) t3 k8 d- d0014 81515778 81515790 Directory ! U4 }, F0 S$ Y& ]- E0018 FFAB7BB2 FFAB7BCA ? 2 f- o: W' Z/ D9 g001C 814A1858 814A1870 Directory' {4 M P' S8 }% n$ ]8 K! Z 0020 80288C88 80288CA0 Event2 K# e, p( D, d+ K2 U 0024 E2CFE7F9 E2CFE811 ? : [6 e/ J, P: y- \5 O" ^: z0028 842D7B08 842D7B20 Event 4 @5 ~0 \8 M5 ]2 r& f3 R& J002C 80E9B989 80E9B9A1 ? - R9 E$ }' n" M9 y0030 E1372198 E13721B0 Section * P& Y* ~' J$ } V$ C4 a& d, H. J2 Y0034 814602C0 814602D8 WindowStation , t+ M# S- T- `+ _$ q0038 81455CE0 81455CF8 Desktop ) ^; t+ Q/ A/ R$ v003C 814602C0 814602D8 WindowStation ( c2 Z1 ]; b/ h0040 E2B3C1A8 E2B3C1C0 Key3 q/ r' v8 L* ~1 U 0044 E286D6E8 E286D700 Key ( ^9 \8 a2 F2 C0 }8 B& {( k6 a" k0048 E2B3C0E8 E2B3C100 Key 0 N$ w2 h, t7 ?4 r' b004C E2B3C068 E2B3C080 Key 6 ?/ H; S* m; m9 q/ l P. g. ~9 s. L( Z0050 E2BEE688 E2BEE6A0 Key , c2 V' E* B, W, x% t7 }0054 8147C998 8147C9B0 Directory2 _0 H( N; w2 B- i4 H 0058 829D1128 829D1140 Event8 h8 q/ W8 W- m1 s0 O5 X 005C 83F991E8 83F99200 Event) {0 z4 \/ h$ N% u( t, {( x, f 0060 E2BEE608 E2BEE620 Key " z, Z* }" \5 Y u" b M5 Z! N& V! i* _0064 FFB07568 FFB07580 Event - L+ R! E$ }6 C9 |- z/ F: L; `0068 801747E8 80174800 Event # m( Z) B o! v4 J, m006C 80174828 80174840 Event ( k- a1 ?5 U8 q* o4 s' z, v+ N: @0070 845E8808 845E8820 Event, G6 R) k; @% d5 H+ l, A* G2 d 0074 81448798 814487B0 Event$ N( a( [4 L& B' o2 W7 \ 0078 E2B9A888 E2B9A8A0 Key6 l: ^" z5 G% _: ]. x' [1 n% _ 007C 845E8648 845E8660 Event % ^+ K( w6 a0 Y0 T( D0080 FF9E2DB8 FF9E2DD0 Mutant 2 |: X |* y. t4 G" d! i5 T0084 FF9E2D58 FF9E2D70 Mutant# B* d- \4 Y! A) r' Z 0088 83CFC378 83CFC390 Mutant7 I! p U( f; D 008C 801749B0 801749C8 File " Q! n Q7 Z1 O; G/ A0090 E2C48668 E2C48680 Section- j+ p8 f9 u, L' u$ ~ 0094 FF965168 FF965180 Event9 ?0 ^7 R8 [' P. F8 f 0098 FF9E7D88 FF9E7DA0 Event" h$ ?1 f3 {, S 009C FFAD3DE8 FFAD3E00 Event6 X F" w4 p1 K+ }0 o( b 00A0 80AD63C8 80AD63E0 Event : m( ^+ f7 b! Y' _% h00A4 E28073A8 E28073C0 Key r! a4 w8 ^1 J4 o+ L# I00A8 FF955588 FF9555A0 Thread # [% w( b9 c# y S$ E00AC E2770728 E2770740 Key* B# @ \! ~3 l- U9 J9 ? 00B0 FF923438 FF923450 Mutant* @4 B, Q# H B3 X3 _7 O# s 00B4 FFAE3B38 FFAE3B50 Mutant2 Q8 I7 U7 n2 l2 E: }6 V! w 00B8 83B80728 83B80740 Event! y1 l5 j L2 K4 C; h 00BC 83B80668 83B80680 Event / G* j$ T1 U1 g( N7 j00C0 E2E3C448 E2E3C460 Section / H- C% x8 D* a, Q5 P7 L p$ t/ r00C4 83776A08 83776A20 Thread 3 {2 j! J- [0 h4 T* Q, d: T00C8 81489E48 81489E60 Event $ D6 M/ t( |$ p C7 d4 H. G00CC 83776CC8 83776CE0 Event 0 }' s; b: k- [+ S! {" H2 T; k% p3 @00D0 83776C88 83776CA0 Event" ^7 Z# }1 \! `& }% M 00D4 83776768 83776780 Event# i. g( f* u; u. k% B" k4 s+ B 00D8 E2837D88 E2837DA0 Key% b' v' Z u% l' x- j/ k 00DC 8146B3A8 8146B3C0 Event; P/ h" Y. i* s+ K' j% r6 G+ H. R 00E0 FF908308 FF908320 Event ; u! |7 N3 ]4 F) w00E4 81494868 81494880 Event : P$ L( F2 a( x/ C00E8 FF9064C8 FF9064E0 Event 4 z$ V9 w, n0 f0 t: p00EC FF908FC8 FF908FE0 Event ; G; S" y' n7 Q8 ~9 C3 e x00F0 FF908F88 FF908FA0 Event / t# l1 E4 {0 Z \1 r( R4 T- F00F4 FF955588 FF9555A0 Thread ( h/ u* `8 u l+ o' Z& Y00F8 FF908F48 FF908F60 Event ( R+ V1 A* g' R3 `) }% F5 W/ g00FC E2CB1558 E2CB1570 Port * }% {$ N h, `( F& P0100 FF90A2C8 FF90A2E0 IoCompletion* `9 L- u7 `0 M) f 0104 E2CFE708 E2CFE720 Port , h/ V8 N- s2 Q7 v- a0108 FF90A2C8 FF90A2E0 IoCompletion' u( p4 l+ M \/ q! l; `3 a 010C 837762A8 837762C0 Thread$ e' b7 V$ U4 s, E, c. ^ 0110 8103BBC8 8103BBE0 Event4 S' e ]3 r# {% r; W* K ] 0114 813DBDB8 813DBDD0 Event0 n' B) t$ p4 M 0118 FF814788 FF8147A0 Event; v, X% D. _2 _3 N1 v& o) K9 L% v 011C E1358DA8 E1358DC0 Key1 x( \8 d: x" i k" M8 F/ S 0120 E2CFC428 E2CFC440 Key8 v0 j, Y% ~! a; M$ c$ V/ C6 ] 0124 8103B9C8 8103B9E0 Event 4 m6 l% ~! D8 `3 l3 r8 u8 s! Y0128 E2C9A968 E2C9A980 Key 4 t8 J. J* R, U# W012C 83B34E88 83B34EA0 Event5 I/ u8 K; }) w 0130 E2CFD948 E2CFD960 Key# T8 {! O: c0 q" l. K3 J 0134 83B34E08 83B34E20 Event 1 q- g$ R# R/ t# g) l....9 k4 _4 z5 Y8 o; S$ E. Z9 V, n .....................省略 2 k& L* W# v, Y& a; w: G- X6 b* x8 d/ ^( { 看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?2 a- |, I1 K8 a- [' \( i ; V t! ^4 W I4 o想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此 5 u: \8 L0 F p- d' @- }) o Z$ K2 ^. h( \/ _ 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 1 e& @% l+ {" P ; m$ b! i! V. e4 [& {3 x后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.& Q- x9 A) D% j1 V# | $ M. ~1 h, x9 f1 C" t 果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS ! b" P0 x5 m O# d7 l, Y: x! t( |6 c1 ]7 I 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程3 w9 z9 _) o0 ` + P" [8 E2 _* b9 I#include ; q# J- X2 x1 Z. T( p#include ; |$ L+ _8 e7 H& @ #include : m8 c3 a. \" f9 C2 I" K#include 5 ^1 P2 s: |4 O F. J& k # C0 W; G- f% Q" Y- u7 L8 B) e+ }+ A/* 5 M h# T3 f% P6 }1 j" T: I* you''ll find a list of NTSTATUS status codes in the DDK header $ S' P; p& z. K* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)6 I8 o' y, J: U% i/ Z& |8 X" N$ h- e( X */ : [& y: p6 |5 c% Q, e: o5 d) d#define NT_SUCCESS(status) ((NTSTATUS)(status)>=0). `; g% R3 K/ U1 B( N #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) 0 A( h: x7 h& B6 z; U#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) ( o6 o. F4 T' f) `8 P h! ^- v p# |& x+ `7 G8 f /* 4 B7 ~' z4 U! O' c, T: G*************************************************************************; {8 r7 T9 i9 N/ I * ntddk.h& N2 B/ ?8 j3 B7 R# ~' W */ , Y8 J5 M6 e& Q) F1 |+ E: V; ]6 a0 Ktypedef LONG NTSTATUS;: z& H, z4 `. o8 E typedef ULONG ACCESS_MASK;" V9 P' `$ g5 L- d5 I/ z! } /*. |& B2 \2 T x! V: B+ r * ntdef.h ( `: x; p! c7 u7 z8 |************************************************************************* $ E6 B2 e! \1 ]( z' x9 M*/3 a8 `3 H; e, @' D ; H0 J. ^) T5 K+ k, a# g; k* h# s/* ' p$ u6 h3 C3 D* A6 H*************************************************************************7 s1 O! l/ h8 U * <> - Gary Nebbett $ B3 z7 K0 {7 g9 w# t1 W*/ $ j8 Z5 a$ D0 P% L9 R+ I4 b/ m/ l9 N; @2 ~8 s, E typedef enum _SYSTEM_INFORMATION_CLASS 5 E8 W. F2 |& m( `3 k+ Q{ ' Z8 A8 R/ g+ |( R6 C. vSystemHandleInformation = 160 C. M- d) r; p+ ?, x3 w } SYSTEM_INFORMATION_CLASS;. D' g e# V1 D' }6 P5 u$ p 1 j# C7 p5 d$ ?" K, _7 X/*3 M3 s& r6 l, ?5 ?# c *Information Class 16 ( P5 |+ t. i0 o v5 `2 j*/ , \. X. \! Q# [; Atypedef struct _SYSTEM_HANDLE_INFORMATION8 w5 W8 K9 |3 j" W, j; Y { ; s- |& s7 E2 o3 Z5 ]# u% QULONG ProcessId;( x7 O2 L0 g/ }7 @ UCHAR ObjectTypeNumber;. {+ _0 e9 }* k( t# C$ c UCHAR Flags; ' @4 F& A( Q% l! ^! b: kUSHORT Handle; + R0 x1 j9 i8 L! ~9 LPVOID Object; * d8 f2 U8 ^7 f! R4 f; s) e0 L( uACCESS_MASK GrantedAccess; ) O- v+ f3 I4 S* ~' E% ?& \} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; ' i! c8 f* x0 x- y0 d# X; A* L$ @& h #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; } / c2 {( N8 ]5 E1 ~0 t1 K1 h. K7 g/*5 L( r% a6 K! E) k *************************************************************************9 J; T" j) d) D. {+ o * <> - Gary Nebbett ( @; Y3 G( z1 K% h/ M% g*************************************************************************, Q- Q7 K+ l* T3 A$ q */ G/ D6 y! M2 W0 c typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );9 A, n) w% G& Z- F! j8 E) M typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );, y4 i0 c( j/ V" p% h- O9 [. y /************************************************************************ $ E% | g; u# g% J! y. N/ F* * 4 [1 `! C* W) |: V* Function Prototype * . A: P$ J/ c: i8 x S! q1 Q) A* * - Z r& t8 h# a# T/ ~% ~+ R% k************************************************************************/ ( f0 [3 P" }7 t8 d" Y: g) m ) u" O3 |1 y. g' Ostatic DWORD GetEprocessFromPid ( ULONG PID );* `4 H: p# o8 F7 b. Q static BOOL LocateNtdllEntry ( void );2 G3 |/ C. n% D/ h. E; V . g& v( E, B& n 2 ^4 P- ^" X5 H. y/************************************************************************ 2 t2 L" h' f$ A1 k! j- c* *' G5 U8 x6 o+ c/ e7 T! x * Static Global Var *, K2 K# e% F8 A- d) u * *1 [2 J& q/ G# K ************************************************************************/* G. {3 }! O' ~- o/ G+ s, y ! q) D J, D; b: j) l static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;3 k3 R k5 y% C& S static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;" ]) W! X& H1 R: x : o6 N# `8 v9 P5 D% F1 F% E8 n static HMODULE hModule = NULL; ) ^# S4 {4 F& j( y% P* J' U/************************************************************************/ 5 x4 k% e/ k% P! W, N" j ; G7 J$ T% o$ M& U% g! _, Q5 d# k% s) M ?& f static DWORD GetEprocessFromPid ( ULONG PID ) ; v9 o0 X' D, t- h+ b8 n$ i4 ?8 C{ , A. d& x. x1 P: @NTSTATUS status; , P7 g5 }7 ^, e6 U2 gPVOID buf = NULL;) e4 o$ N3 w% n4 i( r5 v ULONG size = 1; }) w. _2 v" {: { ULONG NumOfHandle = 0;' {2 Q; {# n% H ^, ] ULONG i;% b& G- {. P6 M PSYSTEM_HANDLE_INFORMATION h_info = NULL; r$ u# M( s* P( [. Y4 X. V . w2 n* R7 x" F! a/ Zfor ( size = 1; ; size *= 2 ) 0 D# {0 w. t0 d{ 9 r. g# j0 L$ _' B6 F7 Bif ( NULL == ( buf = calloc( size, 1 ) ) ) 9 h) ~* s) y; Z* h{% v/ n- u' B* A" [# [4 z) Y fprintf( stderr, "calloc( %u, 1 ) failed\n", size );5 n: x# i4 Z# S5 } goto GetEprocessFromPid_exit;* q& \# D+ a8 t% m } ! d/ `1 c0 R5 i: `% L5 S2 d. qstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); ; z! b V% M5 H" D3 H2 sif ( !NT_SUCCESS( status ) )+ X6 C; C9 O$ B3 n; g2 m { z g* G+ S0 k* x) T if ( STATUS_INFO_LENGTH_MISMATCH == status )& r" \5 p# u3 U, |9 S8 B { $ S3 n* M8 c+ @0 L- Bfree( buf );6 }9 {: o; _% n+ r buf = NULL; , b/ j% M. S3 A" n9 r# |}8 `# a$ p+ \) b( @ else' p- d0 q! m* }. I5 \3 k; S { " k% O I9 ?1 g/ V7 aprintf( "ZwQuerySystemInformation() failed");% E4 ~" ]! R1 b% l goto GetEprocessFromPid_exit;5 { E" G) u8 n; D" A }4 b @& j/ w! }! ?3 }; r: e3 l1 e } # z4 c, K4 a$ g: H8 Relse8 S L* V3 c4 b) }) H5 F2 \' F { S' m x) R1 d$ Q# n; _3 Ubreak;% W& X8 q6 q: X a6 y7 p* ]( } }; M& A u' y; r0 x$ Q ^8 n } /* end of for */ ! B- T( p/ X! o9 z( ]/ i3 a% H" _2 ]! _$ P( e+ ]0 e$ W0 n //返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组 , W6 a3 G0 s9 _NumOfHandle = (ULONG)buf; & @- e6 }% A, e9 }* [9 I7 n& J1 v5 p/ N+ n h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4); ! U. ~* K) f, U& ]3 h3 P7 T8 Z6 E % l. P( E {) S% _# E- {" o3 Cfor(i = 0; i { S: }; D+ ]$ e/ r if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) $ U; L2 e7 C. i f5 B( a/ w{. I8 G. V, n# s L printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); $ U" n: D. S7 w. t6 creturn((DWORD)(h_info.Object));: `1 p+ F: A7 B' Z1 \ } ) u* v# {/ `% n7 t/ R* I/ K} @3 k' Q, ~) y8 Y4 S6 m3 g( T GetEprocessFromPid_exit:% N! i$ |( k2 _+ \2 l2 d& g if ( buf != NULL ); n; o% ~- @; m) q, N {7 p: L! i( C9 ? free( buf );0 C4 W* x2 n+ b' D7 n! j buf = NULL;) k6 `0 N& v( k8 \+ w }" b) V% F3 v y) N, \. U3 s return(FALSE);' ?1 w/ z) Q! n }* v" i* t0 i% S" V; G l& N; l 1 L% f# l' V8 H5 n+ P8 P2 s , _8 z E9 ?$ [/ D/* $ u3 T* O. V$ [: ^; c( m' \7 a* ntdll.dll , c5 T1 U0 K7 b4 n. _*/ , P; H7 a* y7 ~# Z3 |3 r) Xstatic BOOL LocateNtdllEntry ( void ) : L' q. `3 f% b' A{6 ?- e( t. |3 C8 L! a BOOL ret = FALSE;. h7 S- y( N! K% H char NTDLL_DLL[] = "ntdll.dll";* ~$ M7 n; L6 S- L1 M _ HMODULE ntdll_dll = NULL; % V) D$ z" i: p5 A; e8 V& B2 Z8 r) \ C 8 H3 }# W) W) \1 U2 ?* ~# b* pif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )6 K+ O) P/ Y0 W+ K3 b7 x5 Y {2 w1 u6 V$ o- n; k printf( "GetModuleHandle() failed"); 8 w, T1 [7 U+ n) L* Creturn( FALSE ); ! x; a* g1 Q: [' C& M: z; K, |6 i}" s( w" h* `& p, J ~* ? if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )2 k. R8 s6 T7 } \ {& k7 q5 V. N. t; f, l! s; ^+ J* q goto LocateNtdllEntry_exit; . z' l) { t$ N}; y- E" n# J4 K' ?% I ret = TRUE;7 S: _$ V/ Z$ D( Q0 S. s( Q 4 G2 R( ], E3 dLocateNtdllEntry_exit:% f: z3 X; b2 L" M( W9 h( x 8 v1 [7 P% H- Q0 A( ` if ( FALSE == ret ) 1 i3 V8 A; A5 q, y' O: [7 V# ^{! x: ]+ j O9 Y. A printf( "GetProcAddress() failed"); ' u4 z2 ?+ y! J2 t! d5 M}( B" U% f9 U) z& a" V' [ ntdll_dll = NULL;8 Q$ y- t/ ]* p/ F1 v return( ret ); 2 `" U* O- f* P r} /* end of LocateNtdllEntry */' F/ v3 h- E) g" R3 @- s! T 5 N* ]+ D3 x$ B8 l1 U9 @# @4 ^ . i$ t, H, {1 @+ Y" dint main(int argc,char **argv) , n/ ~* V+ d( `. I9 \{6 N! s+ ^7 ]* Y8 k l8 U- i7 T; \& X1 L) K k) @LocateNtdllEntry( ); & R/ e7 y; a! e7 ^9 B4 m# k9 M) n, e5 {8 e //打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5) t [- A& m0 N- k; q+ K x OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() ); 1 ^- D# d- N4 `6 x8 G1 f# ] & T/ |& B1 v+ F7 ~0 J% S" WDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );- F; m* V- b+ I 9 F( n3 _% ?, a8 S/ I( V/ D3 O printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); / |) L+ {* f8 n- `2 U 1 H5 o$ H' A V/ s5 }6 ureturn TRUE; 3 i0 b6 l2 j/ c: 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-14 03:31 , Processed in 0.417773 second(s), 52 queries .

回顶部