QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:5 n* {- W; d( U# e$ N9 o: f4 }! c --------------------------------------------------------------------------------; w0 C, i `) Y6 @ 文摘出处:http://www.xfocus.net/articles/200406/706.html% B0 v9 z1 j% u6 y5 n : _8 O0 Q" p: M8 U 创建时间:2004-06-01 3 X; O' A4 U& y4 h: s6 y文章属性:原创1 q. v! b: V9 i7 N0 \* ?: E 文章提交:MustBE (zf35_at_citiz.net)( `4 E) K, e2 y* G / Y. b* N% n3 L$ h5 \, [/ a% ~ By [I.T.S]SystEm32. F* ]7 |( \6 L0 s( n $ b4 }7 h4 U1 { Welcome to our web site http://itaq.ynpc.com/itsbbs/ 1 t0 b$ W$ a- n; M - [' t: u8 e4 f* Kthanks to SobeIt : P ' ^9 }" f2 D" S: j--------------------------------------------------------------------------------------------- , Q: A* c4 B3 Q5 ?1 @, v2 \; j/ c- ?: L" u 每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.9 K2 K3 Z0 U9 z A. m4 V4 q % \5 ~( @5 [2 `9 T( `绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。9 f. \4 Z% O* b8 d; [ $ i* L6 n) P! y* [% |; f. O0 R- y5 _ ZwQuerySystemInformation函数原形如下+ U8 G; K1 x- n4 G$ c* X! d8 ^ 2 t! O: v+ j! t NTSYSAPI ! {6 j! m$ n, \2 T. s8 s( ZNTSTATUS ' f6 Z, m5 u9 U' l+ c/ yNTAPI1 A/ O9 z# ~8 A ZwQuerySystemInformation$ s% {+ N1 f6 B2 C9 J3 B) g+ n) f* ? ( ; ^* m- B# q! L2 D/ h) R( H IN SYSTEM_INFORMATION_CLASS SystemInformationClass, " @/ }& ?+ z6 i# j IN OUT PVOID SystemInformation, ) x3 Y- N) v, ^/ u8 U: u8 L9 bIN ULONG SystemInformationLength, ) v, E8 s0 u7 e7 O2 B8 iOUT PULONG ReturnLength OPTIONAL ( l' ^7 D9 A. T3 E1 ]& z! T );& A+ U4 V: m0 S! ^& s- f+ P+ Z ! H) X9 b% U: x5 E7 T1 z; k 参数意义如下 + G1 |4 q$ K* F3 J1 o7 U; t e# O5 F5 o' ^ I+ b0 J4 K SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一8 I' S V s1 J7 f2 {+ ]9 ` ' ^7 w( _2 P- {& B# x* o, [" d$ W! [% g SystemInformation:指向一个接受系统信息的缓冲区的指针 ! |# i$ o5 c) Y5 Q9 w 4 f8 R3 A# Z4 W, H3 U* @* {" q0 d/ o2 fSystemInformationLength:缓冲区长度- I$ V9 O9 o! p& T , Y% b$ l6 N% O$ a4 fReturnLength:指向一个接受实际返回字节数的变量,可以为05 _/ w- h& E; _9 m! k ) j* u8 J+ M& {' k$ ` 5 X: A H( A' V/ m: T9 T' k/ J; E0 [1 N为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation! Y& y0 t& t" { & T6 U1 M5 l4 E0 H% V7 z9 hSYSTEM_INFORMATION_CLASS的结构如下 ) t: n2 y; [% P* T7 j$ U/ u- r6 v# x+ q typedef struct _SYSTEM_HANDLE_INFORMATION % J- L& `' \5 t, {: s& x% j' k{ @$ `# ^7 F0 X ULONG ProcessId;9 ^8 n4 T( X9 I) X/ M* } UCHAR ObjectTypeNumber;" t: k3 g3 m7 [! J: ]/ | UCHAR Flags; " b" o0 D# c/ g, |USHORT Handle;& d3 u7 d" k7 m2 H4 y+ I) { PVOID Object;2 T5 X1 x, o f: k ACCESS_MASK GrantedAccess;; J3 Z5 B+ k! V& o5 G } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;1 d6 x& I% V9 }; r 5 J" D% A* l/ Y4 q4 }2 { ProcessId:进程标识符 # J$ h7 x- H+ @0 _6 R" a. o1 n% n5 U2 C, i3 b* C ObjectTypeNumber;打开的对象的类型 1 k+ `2 h* X9 v5 Z5 K/ l3 I% M1 h- B Flags:句柄属性标志 5 _$ ^* j# b4 J2 q% l % M/ V9 C7 N% ?" I6 m; {! [ VHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄; z2 g# y. G5 \& ^ 3 W `" _' c7 ~# N& v0 x- r Object:这个就是句柄对应的EPROCESS的地址 |9 Q1 ?3 e# k* r$ E4 m ; l2 x) r7 l0 R, A$ B GrantedAccess:句柄对象的访问权限- G n d J3 o h' A" e5 [ \( f$ Q8 f1 `0 v& x- X5 z 5 G. Z" D5 R/ T. V% Y/ m2 p下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )1 a& e0 V5 ], G3 y9 p* X; P ) C' v. J( W N1 e( S" F 比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄0 }0 o& c Q$ m ) g: J6 D8 I; l& q6 } Z% k怎么会这样?难道程序写错了?*_*, Y# a' f% e4 _% J( p2 S; F " x: C# E( t6 s& s# ?5 ? 现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出 * P7 ]- n6 [: t( o2 l% u# o2 R" g. n+ a :proc -o QQ - \0 H# T4 b. N& }Process KPEB PID Threads Pri User Time Krnl Time Status8 r) k9 ?0 w8 D7 s! [ QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready / f7 t- z2 {$ Z: E1 D# u2 M4 u) `7 t9 u0 H; N4 _ g O$ m2 @ ---- Handle Table Information ---- 3 u8 }$ h. [- Q% D: y( h 8 W$ }# x) \4 o# a* S1 i# H! MHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 1 d% y& _/ E& `7 P; a/ H6 f' I# p/ E5 R0 }4 C Handle Ob Hdr * Object * Type % p q; |5 Z1 I6 e* F0000 00000000 00000018 ? K/ ?# f: G9 v7 U& B3 W0004 E2DA5E58 E2DA5E70 Section+ F& W) G5 H( H0 F! t; t' v3 j 0008 FFAB35C8 FFAB35E0 Event ' {2 `. F& q# n000C FFAB3B08 FFAB3B20 Event ! n! k% G" s1 l5 t, T2 u( W0010 85C70188 85C701A0 Event 9 Q! ]1 g4 d; d0014 81515778 81515790 Directory : E$ i4 ]( d. L: r+ d( h" G8 q* q0018 FFAB7BB2 FFAB7BCA ? ) z1 I% D( m# j: {001C 814A1858 814A1870 Directory {7 ~% Y, N1 n7 R 0020 80288C88 80288CA0 Event( R2 _9 L# Z9 G2 o 0024 E2CFE7F9 E2CFE811 ?2 y. e& }% a1 u+ V 0028 842D7B08 842D7B20 Event/ n3 F( P! p9 C( @ 002C 80E9B989 80E9B9A1 ? ) B W: b1 n% _7 \; ?0030 E1372198 E13721B0 Section ' q1 w" w* A2 W; w+ I) w; N6 V3 s' W0034 814602C0 814602D8 WindowStation ) M2 t8 k2 c/ Q: Y! o& f0038 81455CE0 81455CF8 Desktop 8 S6 k* Q9 O9 y( G" N: g6 s k003C 814602C0 814602D8 WindowStation 0 ~9 t+ |2 t: S: `& g0040 E2B3C1A8 E2B3C1C0 Key$ ]6 z! b& ~; |$ b; I3 [) m2 h w 0044 E286D6E8 E286D700 Key0 s- B5 f0 u2 d" m 0048 E2B3C0E8 E2B3C100 Key6 }2 z" i. J$ k 004C E2B3C068 E2B3C080 Key8 Q! q3 e( P/ o) q+ f H. @ 0050 E2BEE688 E2BEE6A0 Key 5 ^' ]; @% R! h! `$ i0054 8147C998 8147C9B0 Directory, ]' {8 B5 g+ Y7 y" [1 ~ 0058 829D1128 829D1140 Event 0 T4 m( \0 Z9 x4 d; n0 ]005C 83F991E8 83F99200 Event! i/ L# d* ]. t, X M% B1 j 0060 E2BEE608 E2BEE620 Key: A; d3 B; b, h1 b \' f- s; [ 0064 FFB07568 FFB07580 Event J" b( h2 g6 D0068 801747E8 80174800 Event 2 y5 F0 L& i& X, x$ w; b0 ]: L006C 80174828 80174840 Event- \) D: |6 i. g8 Z 0070 845E8808 845E8820 Event - m, o" ?4 Y% K7 C$ K6 k) B4 h0074 81448798 814487B0 Event' i, S" s* j' J) t$ J 0078 E2B9A888 E2B9A8A0 Key3 I6 G! H7 F& u1 ^- n9 B- _ 007C 845E8648 845E8660 Event1 d& m# a! R8 Y) r, h4 u 0080 FF9E2DB8 FF9E2DD0 Mutant6 m- n) W, ]5 P h/ J- J: b+ p 0084 FF9E2D58 FF9E2D70 Mutant0 ^8 G! r" z& ~8 J7 h; ? 0088 83CFC378 83CFC390 Mutant + [3 W+ c; }! r008C 801749B0 801749C8 File 8 G0 A" k$ O! g' v& y3 C1 v0090 E2C48668 E2C48680 Section' d& Q% ~. M) w) ?* P8 C 0094 FF965168 FF965180 Event * }! I( p4 ~% y0098 FF9E7D88 FF9E7DA0 Event 7 |9 _5 V/ V+ Y7 Y+ W/ i" W009C FFAD3DE8 FFAD3E00 Event2 l( _0 b$ P) m4 m 00A0 80AD63C8 80AD63E0 Event$ {/ y. h6 f n1 R& p9 h; _ 00A4 E28073A8 E28073C0 Key ) |" Z# k1 `4 A2 ]2 W) w00A8 FF955588 FF9555A0 Thread4 U: j2 j! g# E& J/ X6 i% ^7 S" Q 00AC E2770728 E2770740 Key 6 a4 i+ L0 o/ T$ K$ }# L0 u& q5 r00B0 FF923438 FF923450 Mutant W: {5 G+ @5 O' R1 F9 a4 A 00B4 FFAE3B38 FFAE3B50 Mutant 0 j# n. }7 v1 W* ?00B8 83B80728 83B80740 Event & A2 c- Y) F5 v+ A7 c$ H9 u00BC 83B80668 83B80680 Event 8 _& v/ l3 n5 K* v' Y00C0 E2E3C448 E2E3C460 Section' v/ q# I9 C4 ~, g5 U: j# r 00C4 83776A08 83776A20 Thread8 @- S d5 X$ d3 m# w( x 00C8 81489E48 81489E60 Event / k5 h/ _. h# i K" P; N/ M00CC 83776CC8 83776CE0 Event, s/ Z3 D7 }/ O 00D0 83776C88 83776CA0 Event * W: _' F5 b% d/ t2 V7 x, v3 B1 X! i- P00D4 83776768 83776780 Event: R' g' b! j/ H7 w {" U3 ~1 I% A 00D8 E2837D88 E2837DA0 Key) V% ^1 q% \ h+ |6 t 00DC 8146B3A8 8146B3C0 Event 4 A* D0 L: {" k00E0 FF908308 FF908320 Event + F# m7 X3 y; }0 P00E4 81494868 81494880 Event 2 T9 I$ U. ~9 }0 [$ K$ a00E8 FF9064C8 FF9064E0 Event 6 h; i" ^2 [# O( v00EC FF908FC8 FF908FE0 Event : Y! \5 E# u- r. g; k& _00F0 FF908F88 FF908FA0 Event, I/ ~$ r+ p3 r+ F 00F4 FF955588 FF9555A0 Thread' H# W% m2 ? o! C 00F8 FF908F48 FF908F60 Event 1 n) C, r v; t6 \8 w9 c! r00FC E2CB1558 E2CB1570 Port ' A+ p, V9 Z. D/ ~) F; E* O3 m0100 FF90A2C8 FF90A2E0 IoCompletion- D! ~' ?+ L5 }7 h5 o/ ` 0104 E2CFE708 E2CFE720 Port * b5 W+ n; r6 Y0108 FF90A2C8 FF90A2E0 IoCompletion& _" r1 L( p) {# y% Z5 ?. L7 @$ s: O; ^ 010C 837762A8 837762C0 Thread- N% F* \# }3 R# r" a1 I 0110 8103BBC8 8103BBE0 Event. U: ~7 D- k1 F$ Z; l 0114 813DBDB8 813DBDD0 Event2 N7 H6 Y/ Q) I4 f) W' ^, _+ b9 |8 i 0118 FF814788 FF8147A0 Event. A0 X1 h% U8 u K. K" b 011C E1358DA8 E1358DC0 Key + m+ G" A: U8 V0 y; M" F0120 E2CFC428 E2CFC440 Key % ]4 {8 |/ ?! P9 d0124 8103B9C8 8103B9E0 Event% F1 i5 p5 z( O6 o' l- H& O0 b 0128 E2C9A968 E2C9A980 Key 9 i4 C v/ o! ^* T2 Z012C 83B34E88 83B34EA0 Event , P+ x. n5 n% ?" c! T: k0130 E2CFD948 E2CFD960 Key % ]; M# {. v; p. V0134 83B34E08 83B34E20 Event 4 F c+ P4 U$ \% j2 n& k ]. }.... 9 h- O3 p$ N+ L Q; e+ T.....................省略" r) |- U5 [& h3 O1 D7 ^ $ e$ t+ R: ~$ G8 R# M& d看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?2 ~% d; \+ P! S+ d4 k; U2 S' Z1 P ( ?+ M) ^2 r' B2 Q想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此. O; s/ {, V. }8 U6 u9 U( z) G 3 r; ?/ p/ r% K% v 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 . {1 k) T2 c) ~6 s i6 t! G4 `4 x1 [; d 后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. 3 [2 Z' H% W7 R $ l& ~+ W9 B8 v/ `" \3 G/ L" v, Z果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS + Y7 ]7 e, N Y. q4 b' M3 b ' ~; C* X4 W) u修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程7 b# _7 i, }, R6 c * j) f# s' s) p0 [ #include $ H8 |7 ]6 M4 _4 M#include 2 W$ e+ |+ j- y& g/ \, g/ m #include - p* i' G5 Z* t0 d0 ~1 S #include 1 P7 B$ r" D2 \2 m" U& } , k* @# j# y8 F3 o) Z$ L. X2 K/*4 U" L1 ]1 U7 G! k3 |% L * you''ll find a list of NTSTATUS status codes in the DDK header ! ?/ a+ @' d# X9 C% j0 X% L1 w* ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\) D3 g6 v8 H& H*/6 D5 t# l1 V2 ? #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) & `8 E9 \6 j* |4 S9 v& N- A( X& e#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) . m) y( ?$ L3 u, e- P7 |0 b#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) # Y" s; C0 r5 l V k* w' k) U4 M3 Q- c* G/*9 c( {; v! G! l6 F: X9 K- s ************************************************************************* 7 G' r; q; r2 k% n( D1 W* ntddk.h + Q6 v( Z9 i& m*/: \! O3 J, I+ K5 y+ j0 L1 y0 I typedef LONG NTSTATUS;$ w1 n/ [$ a1 z6 N) ^3 [ typedef ULONG ACCESS_MASK;' X# `; }0 R( U* @5 n' m6 [' z /*" Y9 f2 v- q2 ~! t1 [! u: l * ntdef.h 7 J$ F" Y% k! V************************************************************************* 8 }( Q& l' x/ k- y* z C*/4 y5 h/ v2 Y/ R' J8 s5 [& G $ w; ?+ q3 e4 c) }% y R \/* % J3 o" |( v) M+ C8 m) J5 I# v************************************************************************* & u E0 x- k7 j- M6 O# ~- F) r* <> - Gary Nebbett " H9 C4 O% _0 B0 {( X5 V& b4 X- w*/ ; f$ d( N. M; x i2 A4 b " o, B" O% W2 y2 mtypedef enum _SYSTEM_INFORMATION_CLASS& ?( } l m: ]1 } { 2 y I" k+ k9 L/ vSystemHandleInformation = 16 * n2 }# u" d8 {& q} SYSTEM_INFORMATION_CLASS; 2 ^2 g8 C# N1 I* b0 `: ? | + w' A: y! v5 ^# t! e8 Z/* , z( _: j" Z6 f- U9 t& f/ O4 v*Information Class 16 * u9 o% D, X. X$ S% t1 o. k% i*/ * Q3 N% {4 g* K2 m9 L- Q4 ltypedef struct _SYSTEM_HANDLE_INFORMATION) d# `: {0 y2 `: R {) o8 L6 E5 d4 i2 T* c: R% K ULONG ProcessId;( K# Z7 ]5 v9 _0 u; p# E( z UCHAR ObjectTypeNumber;( r/ K, f0 N$ P6 t UCHAR Flags; ; Y3 {8 Y( E+ D- H4 \USHORT Handle; ; |# t% C* Z+ K, ZPVOID Object;' f6 F: {7 l: A( T5 t5 t! w" F ACCESS_MASK GrantedAccess; / w0 W, s: h( f} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; & b) R- M: u& B. ?! Y# A% X" ?( I- ^# | z9 {- @ #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; }7 g) P1 `* U' X /* / t& h6 L, y( ^1 Y*************************************************************************: Q; l0 p z- g/ a! Y# I: [* A, e * <> - Gary Nebbett: k5 t# v- Y; w+ I+ M0 r ************************************************************************* : }6 F( U% Y4 ], `*/ 4 }& \* p: Y! F% `8 Otypedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); 1 }- q6 v* z9 G& H% }' Ztypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );; N' O$ l# z, J2 D ] /************************************************************************' F; T! [& s! P * *" S/ V/ f6 K1 y4 l1 Z- ~8 o: I4 F; u * Function Prototype *- Q% _* Z% \7 h8 ^- n * * / |/ S+ R7 h, _' Q+ r************************************************************************/, P+ @# k/ G. p/ T0 [0 x 8 f6 w$ g1 t9 ~; S# \+ _- S' A( J ]static DWORD GetEprocessFromPid ( ULONG PID ); ) }1 W3 s$ d2 kstatic BOOL LocateNtdllEntry ( void ); * ^3 _2 H6 P9 @( x1 }6 U % o6 p: x* t3 A) a$ `3 p1 { % O; ]7 Z1 w$ k& h/************************************************************************- @' |; Q7 ~6 F" i7 t6 l * * % ]& y' f3 _1 `! ~' M* Static Global Var * ! D4 \% n5 S9 N+ p* * ; u9 y+ S; Y& C) C) m' R; k************************************************************************/ # R m( ~+ ?& y. j3 a6 a 1 A: Y! r5 d) |2 R4 \static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;5 G" ?- Y* I. ~$ V0 M static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;7 O, c3 c5 I6 U$ ^ x5 D: c; i1 ?; h: `6 S% R5 hstatic HMODULE hModule = NULL;! k8 [; C! i! X9 G7 F9 ` /************************************************************************/' ~- ?2 p! a! R6 X1 `/ p9 q! _ % p5 A3 @* E/ { 1 `3 y m+ _% |9 O7 b! f6 x9 J5 Vstatic DWORD GetEprocessFromPid ( ULONG PID ) 2 h3 \/ d, S- p' A{ ' R3 A/ a) N/ p" K0 M; fNTSTATUS status; , y- O$ @' T1 U5 VPVOID buf = NULL;) J/ H3 }& F+ l8 R ULONG size = 1;6 P0 o, K2 H$ S" B$ g$ c7 o ULONG NumOfHandle = 0; 3 @ S' u' L J P6 D% ^% x8 V, PULONG i;* C6 ~3 g4 k* o& [ PSYSTEM_HANDLE_INFORMATION h_info = NULL;6 N: n# G1 [: `6 A& z% K- e. E2 e , }, p" I% X3 }/ E8 o1 Y! O; }for ( size = 1; ; size *= 2 )% Q6 B) @, |+ O) g5 w {! ]- Z& `1 \) ]- f& ?4 y& {' F+ x if ( NULL == ( buf = calloc( size, 1 ) ) ) & ]& h3 F: i' O, c m* S{" x# e7 y! N. h4 \/ R: k6 {- F fprintf( stderr, "calloc( %u, 1 ) failed\n", size ); - [% F w K2 W4 D, rgoto GetEprocessFromPid_exit; % y4 ^ E6 @- {( M1 r# J" r% O}7 M6 o) T% M: z7 b status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL );/ p0 Q n. m7 g5 Z# i: \6 i if ( !NT_SUCCESS( status ) ) ; f3 C3 P- k; f{1 H$ v( x1 c$ w6 v$ W* e) A8 c, e if ( STATUS_INFO_LENGTH_MISMATCH == status ) 4 g( x" A5 s( |7 B9 P. S# ^{ : W* ~( z9 i2 I. ^2 P1 p' H# tfree( buf ); # C$ _# e3 f: q9 ?1 l5 vbuf = NULL; + y z7 k$ y. |* M}& \7 \/ f* D/ ?* S else H$ v& N% f% l/ F, {; z { O6 F# R0 D$ `& A( tprintf( "ZwQuerySystemInformation() failed");1 y2 }4 X. \1 R4 M8 ]3 z) h% [ goto GetEprocessFromPid_exit;- a$ @3 V2 Q9 a! @ } . r3 n8 k" i) \5 Q2 J8 A$ N}0 O7 ^# Z6 G/ C; }. E* e- A! E else 5 m8 {! q0 P, S' F6 J) f{' f4 ]% R0 s& O3 q: I0 h! q break; : |1 U+ i- l* V S/ M, e}' @( q3 L( R- U4 z } /* end of for */! m3 z3 ]1 Y& N+ } & n* v' M; R% \# ] //返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组, f- t$ K: D# g6 C7 F0 A NumOfHandle = (ULONG)buf; & _" d4 Z. O6 V1 k1 ? 0 U* m' t( r* g1 O- sh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4); 1 X/ X( [( N" v6 d7 H1 P) {8 Y8 h4 B' Y% E0 B# @ for(i = 0; i {8 E+ F; f6 E0 Z0 | if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ), A+ f* _% j. |5 g @ { / ~' T9 ]: H! e$ D* e1 R+ y' sprintf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); M. K# F5 S: E return((DWORD)(h_info.Object));! M+ [, r, |( X, b } - ~, t1 |$ ? `4 K z} / K+ B1 V. `; pGetEprocessFromPid_exit: 9 W l7 r2 Y; ]) vif ( buf != NULL ) E& l1 k9 W. m+ l8 K$ T { H! r+ V2 d# F& W7 mfree( buf );% Y3 C) O* C) i" L* f5 Q buf = NULL;" J' k' ]3 r- Y3 v" X+ ] }7 q$ ?: @. f& i4 ~8 F! i return(FALSE);- {5 h. h/ J* w. F5 C+ u }! c6 C% t* G1 d . o7 g9 S9 m% S# `2 g 1 i( ?. w; E% m- V' M" G; V/* 5 D$ O: A8 d5 R6 @% C6 V* ntdll.dll , H* k- W) u* W1 u9 ~*/ 8 x* _! w3 n1 p2 A7 y4 o6 ostatic BOOL LocateNtdllEntry ( void ) 8 w3 W! P! D& |{7 N6 Q2 m. e% _! W+ s v$ e- D4 g& T BOOL ret = FALSE; 6 C1 X6 \; Q# R; ?char NTDLL_DLL[] = "ntdll.dll"; ! b. o' B3 U' E2 m" }3 J& L& {HMODULE ntdll_dll = NULL;- j/ c& _. k8 s7 t, ^" m / x2 e) [( p7 B9 N" ~ t) z" }2 h0 b4 d7 A- k2 }if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ); e1 X4 i% W. V6 W$ h {) p/ u/ [2 x8 q7 h printf( "GetModuleHandle() failed"); 8 L( ^4 E* j( A8 w7 t/ p, Z) ]return( FALSE );; n! R, ^" Z# V1 [ } 7 p6 W c' h" `* l4 e: Z9 Oif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ). }4 L( _; }- U( d! b& t, ]( j, b9 D8 a { / r5 `) q& s: K8 rgoto LocateNtdllEntry_exit; ( S4 q7 Z7 n2 i2 n}' V" i+ o$ _2 n# v R ret = TRUE;0 D; F# U2 J- g, A+ B4 O, E7 O0 |6 ~ X* A- q4 I& ~. A5 E% MLocateNtdllEntry_exit: % H8 x( V. W' L , t1 b! N0 @% z7 b/ x. rif ( FALSE == ret ) / d3 J& l( o- H5 z0 i: R' J{2 T6 G6 \/ T% N; ` printf( "GetProcAddress() failed");% p/ ^( z0 {6 ~ }) }% m( c$ K5 C' f! H ntdll_dll = NULL; 5 j3 C2 p, T. P; _% Q$ oreturn( ret ); % m6 z3 A/ [% B4 k% \" T% v& {} /* end of LocateNtdllEntry */ & H0 I" d" d3 U+ [* e! n( Z q% I! j8 m& ] j' I( F6 J! @# K+ Z/ r0 ] int main(int argc,char **argv)1 o/ F3 D0 |' f( y- A: V6 w2 c { ' [7 l: W" A* ?( ?$ f' h9 h" R ' e# W. q& m# `* {# xLocateNtdllEntry( );! c& r I; B. j) { + y! t5 b. h- Q//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5 * @: ]/ b( @) G: {$ M1 |OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );2 F+ N Y4 f0 a1 a& A8 K9 j * s* k' t# S* y" i- f3 F; t DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); 4 Z( U% y, s7 |3 O6 o% @- O8 ?- x' Q, F printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);7 N. N8 n, ~# }/ t% p $ S9 L7 I/ d+ u0 g1 y* Xreturn TRUE;" f2 B' D9 B% U+ f }
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 16:07 , Processed in 0.424668 second(s), 52 queries .

回顶部