QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容: e0 I" W5 W5 |4 l! l --------------------------------------------------------------------------------( U/ e0 H# D6 p& q+ } 文摘出处:http://www.xfocus.net/articles/200406/706.html 4 z& m) Y" g4 U# m1 Z% u/ d & o5 z" p1 i- D4 z创建时间:2004-06-014 @4 w, m2 o8 T- S4 C" F 文章属性:原创 # P; D( c5 }6 M% c文章提交:MustBE (zf35_at_citiz.net)' C; q! h8 m8 G/ K7 _2 v : I. }! ]$ @# O) N( W) ]' G: S6 FBy [I.T.S]SystEm327 {3 B3 n& j- Z- j5 B! } i, h3 j1 G. AWelcome to our web site http://itaq.ynpc.com/itsbbs/ 3 s0 T. J3 k6 k- |0 s , a# u- o( g9 F' ethanks to SobeIt : P' r$ b: b4 ?/ n, y9 e; V --------------------------------------------------------------------------------------------- ( K& _0 I2 }" o( j; h$ r+ Y( h& S# q, l' g 每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内. 2 e+ F6 a2 O. K3 A9 Q( k" a: Q8 p6 F1 F( x2 P2 [2 j 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 # j! w6 C& O& i% E* t+ k6 p0 ]) K: w1 p: A ]9 s6 B" p ZwQuerySystemInformation函数原形如下 " ~6 M. G# D9 |$ f- r# g+ D" e7 ?; `, J ] NTSYSAPI( l* ~- s! M: o9 E3 X1 x NTSTATUS) |, c$ o: k( W NTAPI & O: K3 p0 a9 `3 X7 v5 kZwQuerySystemInformation 2 |( i" H* F& S' A( : W; [3 w, F/ a1 ^ IN SYSTEM_INFORMATION_CLASS SystemInformationClass, 3 X6 c* t L1 y. Q% E7 @IN OUT PVOID SystemInformation, ' j1 T% s" X! w. {) V' D( vIN ULONG SystemInformationLength, 2 m$ I0 | ?; H& O$ { OUT PULONG ReturnLength OPTIONAL 9 g1 D4 J5 X) [; j/ l ); " y$ e% X( h, j8 A, k; h1 g8 R; u4 D: f4 [2 E3 K 参数意义如下 ' E: o d3 y# D9 g/ m ! O8 h2 L0 L) e7 }& z, o0 I e8 }SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 h: M5 b9 X( @: H9 O/ ~# o+ a9 Y) a 2 _# ^; Y9 R( pSystemInformation:指向一个接受系统信息的缓冲区的指针 ! m# Z1 d- ~# V$ u! ^' {9 h2 {( \0 x' v- z1 C" |! M+ {6 W SystemInformationLength:缓冲区长度) M. p) C+ q2 F; t" a1 X8 q( g $ z9 d- q/ d" \8 iReturnLength:指向一个接受实际返回字节数的变量,可以为0! d* f- D; n0 r) |4 l9 w. v/ T 4 p5 z0 o1 y* G 6 n/ E) g# c- s& q1 Q. m/ a为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation; N! g) o( \; U, g6 E+ i- ^ ! K8 _* b& [/ N3 Q9 |7 ~* q( n9 ~ SYSTEM_INFORMATION_CLASS的结构如下 2 D- A' @; h7 K3 N6 I7 G) u g5 D+ m: y8 Q5 P0 s typedef struct _SYSTEM_HANDLE_INFORMATION/ ^" b2 l0 r% V* k) |+ [9 n {8 T0 Z( j: x9 D9 r `* T ULONG ProcessId; ; d4 w9 s# P+ }7 HUCHAR ObjectTypeNumber;' G% k2 c3 @/ R7 B6 k UCHAR Flags; ~+ y( y8 f; s) A+ OUSHORT Handle; $ \' F' r b, j$ K' EPVOID Object; # P( l% I; N! F8 sACCESS_MASK GrantedAccess;: q8 p D& k' E. O( m } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;) d$ ~; ~5 x! R + y+ c2 s. S) f; P. H7 c ProcessId:进程标识符 , ]9 @# d, ^$ ~7 J# Q( i 7 x" Z6 z) e _' z: c. t6 c7 ]ObjectTypeNumber;打开的对象的类型 2 e4 @/ Q) a" ]; L, m2 ?) ~ $ o& V! i2 u4 P' F- K, C$ e! S& jFlags:句柄属性标志4 H+ d. S" D- l( P U! \& K j0 y / q" _1 z4 y3 W9 f' Q- { Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄: s4 R% P: | | D" s , V- p7 b. w9 E' E Object:这个就是句柄对应的EPROCESS的地址 / t- |: n S! K2 J! H# Z& v& L# [ S9 |5 ? GrantedAccess:句柄对象的访问权限 8 K: h% H! A0 e% G3 o & c; E) |) Z! } $ ~- x# V% [/ o- R/ p下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ) 9 L p+ e9 F9 X8 O* Z& K7 V/ L. v z) d- ?8 ~$ y 比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄1 s# ~5 P9 T8 `1 L! Y , g& v2 p! L4 V+ h* F& q! p" z+ G# _ 怎么会这样?难道程序写错了?*_* . d% `3 I' |) a9 H8 X 9 l) v, `8 I* f, s' J- ~现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出! s% o% @) U3 A$ _0 F( f, w & v. x6 s( G7 D% j3 n :proc -o QQ . M! b% I y j; ^0 F4 bProcess KPEB PID Threads Pri User Time Krnl Time Status ( b3 Q; P2 h% k' }' dQQ 827CD520 11C 2A 8 00000B90 000008D4 Ready ; G+ E2 H% p" }3 g+ f7 j+ X: Z" G% e3 S 6 E$ z5 c9 u. v- s- n0 f% N---- Handle Table Information ----( Z) M9 v6 p) } 4 @8 e) K- u5 k7 y" ?) J2 c4 VHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590- N& Q0 F$ O% {+ i" C / O4 X: |$ M6 f Handle Ob Hdr * Object * Type9 `& y( [8 u5 G 0000 00000000 00000018 ?) U/ [8 d* ?, U* D& |" L5 @5 k 0004 E2DA5E58 E2DA5E70 Section+ Y# }2 E: M9 n0 J2 b' y9 _ 0008 FFAB35C8 FFAB35E0 Event9 }( q& ?( V# |6 ~8 b1 V# K 000C FFAB3B08 FFAB3B20 Event% @2 t: X& i* B- C 0010 85C70188 85C701A0 Event " {- w5 V6 v' G" T% [- t0014 81515778 81515790 Directory * g; q7 K0 W1 x! A1 V, y0018 FFAB7BB2 FFAB7BCA ?! o) o2 B! R% H" e 001C 814A1858 814A1870 Directory % O8 b1 k7 |% z8 A3 p0020 80288C88 80288CA0 Event! Y0 m0 X. A7 u 0024 E2CFE7F9 E2CFE811 ? 9 J' F2 e$ P V% [0028 842D7B08 842D7B20 Event) P1 l" I/ I: ]' A# }2 t9 ] 002C 80E9B989 80E9B9A1 ? ' m2 S' ?" Q& l& {1 [7 ^0030 E1372198 E13721B0 Section 4 T/ J' ~& e m2 _ T; B2 ^* x+ |0034 814602C0 814602D8 WindowStation( {; n* m# Q6 `) u& l# E 0038 81455CE0 81455CF8 Desktop - L8 c4 f! [6 B7 ?( n) n003C 814602C0 814602D8 WindowStation $ n% i, H4 ~* R: P* f4 l; x0040 E2B3C1A8 E2B3C1C0 Key4 B# o9 }5 e0 l0 p 0044 E286D6E8 E286D700 Key 0 [; c# n- }% r# p' c" b0048 E2B3C0E8 E2B3C100 Key ; W! ?2 Y$ i3 u2 J: [- U, F004C E2B3C068 E2B3C080 Key - w% K$ A/ i7 p" z. N) Y# p8 I0050 E2BEE688 E2BEE6A0 Key 1 t- [0 r( Y, @0054 8147C998 8147C9B0 Directory& {" `# C' F1 o+ N7 r4 K 0058 829D1128 829D1140 Event # @; r$ ?% @1 X6 g z: N005C 83F991E8 83F99200 Event- ?1 T7 y" t) m) p2 ^) P 0060 E2BEE608 E2BEE620 Key ) d6 E) A7 t4 ]" O3 C! \" k2 O1 f0064 FFB07568 FFB07580 Event / z9 B0 ]: S$ Q0068 801747E8 80174800 Event 5 x# t; j6 K$ d1 H7 d4 T006C 80174828 80174840 Event2 t8 N* M. V; A 0070 845E8808 845E8820 Event. _7 }/ i2 i) k$ w) a! P, } 0074 81448798 814487B0 Event6 I! B, b6 @( T# B l- e 0078 E2B9A888 E2B9A8A0 Key ( d% b& h* o3 Y; _7 H2 p! v% _# c007C 845E8648 845E8660 Event$ q7 B5 M& k$ B1 m7 J% v$ @ 0080 FF9E2DB8 FF9E2DD0 Mutant $ u* g2 N/ y' M1 {9 Y0 \3 T0084 FF9E2D58 FF9E2D70 Mutant. o+ |, m4 ~- t" W( I. j& ?1 N 0088 83CFC378 83CFC390 Mutant; t/ F8 J4 M6 e 008C 801749B0 801749C8 File # D" p! \ ^) K7 e0090 E2C48668 E2C48680 Section . n5 K; r/ _5 i- W0094 FF965168 FF965180 Event, F& E0 ~" x" H8 S; ~0 z4 }: @ 0098 FF9E7D88 FF9E7DA0 Event ! q( V7 E* Y# N; e009C FFAD3DE8 FFAD3E00 Event ; H! ]; G7 q- T+ k) z9 X00A0 80AD63C8 80AD63E0 Event : T; F6 A: Z; G' {! T; Z( P00A4 E28073A8 E28073C0 Key ! U: s+ h7 y0 ]) ^5 O1 E) L00A8 FF955588 FF9555A0 Thread& P9 T0 z( K) B) ^0 ? 00AC E2770728 E2770740 Key . s* q1 b3 `2 c00B0 FF923438 FF923450 Mutant* f6 h Z8 v( w5 s" k8 G* ? 00B4 FFAE3B38 FFAE3B50 Mutant 7 r; r; I' g! M00B8 83B80728 83B80740 Event 9 A; g, O: y7 {00BC 83B80668 83B80680 Event 6 A. x$ m8 b: b+ d00C0 E2E3C448 E2E3C460 Section; ^1 z3 q$ Y( V 00C4 83776A08 83776A20 Thread5 I+ z4 }: \0 i( v1 S! @3 m( Z 00C8 81489E48 81489E60 Event 2 l' C, i5 g% n4 [' [7 ~00CC 83776CC8 83776CE0 Event + O5 }+ p) O. \! _ c/ J. w2 ]00D0 83776C88 83776CA0 Event0 W7 [2 n/ \9 x 00D4 83776768 83776780 Event V( p, b. U, F3 c, ^+ S s/ ~ 00D8 E2837D88 E2837DA0 Key 3 }, z% L- |2 {% x, \% x# a+ `: \/ I00DC 8146B3A8 8146B3C0 Event # [. e. s. B- W00E0 FF908308 FF908320 Event/ p# c) K( ?- N 00E4 81494868 81494880 Event1 W# z% M# Q' a 00E8 FF9064C8 FF9064E0 Event ! @4 f' \8 A; }00EC FF908FC8 FF908FE0 Event! c9 U3 ]0 l6 q 00F0 FF908F88 FF908FA0 Event" q/ U y* T4 o4 ]) H% Z# P 00F4 FF955588 FF9555A0 Thread/ T: D3 c' J" e1 x7 t' e. K 00F8 FF908F48 FF908F60 Event . Y0 [1 R1 e" _00FC E2CB1558 E2CB1570 Port , @/ Q. Z+ ~; g1 K0100 FF90A2C8 FF90A2E0 IoCompletion6 t5 H) _1 u2 D; n* H0 h2 I: Q 0104 E2CFE708 E2CFE720 Port ! P ~# I/ U1 e6 H5 s- p0108 FF90A2C8 FF90A2E0 IoCompletion % a6 G" R: x D+ ]! Y010C 837762A8 837762C0 Thread) e' P. B: k2 @ 0110 8103BBC8 8103BBE0 Event 5 p9 ^; ]: e# N% R3 s0114 813DBDB8 813DBDD0 Event1 |) F0 v1 m' z' s4 J6 J 0118 FF814788 FF8147A0 Event% _8 F8 K7 h+ i- z 011C E1358DA8 E1358DC0 Key$ x% k% `9 M0 K 0120 E2CFC428 E2CFC440 Key( [0 f0 D; l. ?/ e. w/ [5 z ] 0124 8103B9C8 8103B9E0 Event * m; K* D# {. o7 k/ B$ q4 v0128 E2C9A968 E2C9A980 Key' r6 B- j7 d( c 012C 83B34E88 83B34EA0 Event2 ]' [5 ?; y9 ~* s; ]* [ 0130 E2CFD948 E2CFD960 Key 6 m% ^3 r6 {3 s7 W: S; L0134 83B34E08 83B34E20 Event . b S" Q' h; L....4 r" Q: w6 T/ ]8 Q .....................省略9 C; r7 K) E" A1 [9 c 2 b {. J: }' |. T R6 {6 S看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?& ~5 L" p& Q/ F" ~7 D; o # | p' Z+ I% a# R 想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此 ; h6 g" i. D# E# `' W5 p' o ! q0 g! C4 |% Y可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 0 f* v, i/ M# l t. F9 k7 k1 W* {9 o: ^' i2 x6 }3 R2 e1 V" O' y 后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需., U/ g- X6 @& z5 x+ ^ 3 P( U; e7 P/ U果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS . [; j% Z, y* W( q# p! f; \( \- M/ r2 h% P$ P3 e8 W9 R3 ~. A9 n 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程6 _9 M7 `' f! W& T: A7 g9 `( _1 { & B1 ~$ h' ~% A' y/ D#include a1 x0 {% C% t+ l #include / c+ n1 W+ y) x s# R v' V #include 6 z0 R4 v7 I2 R. G/ ]+ o#include % T( o' S5 ~* z; [+ M% I( m& K( \ ( _- l: Y- p: ^/*0 x# z5 N- Q" ? l! s) B * you''ll find a list of NTSTATUS status codes in the DDK header1 y/ A" X+ k, s% ^( {9 Z * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)2 ^* Y- c( K2 [+ k% q" K7 p7 |4 X */, E3 G' Y+ s0 M4 O9 e9 ^$ X #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)0 o. {6 z0 s6 N! C9 Y) E u7 S #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) ' _$ G6 K' L1 C+ N9 o6 |1 h# R#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) 4 a* ?& v! c2 c6 j7 K% a* u) G# ] ' X* [. \( k G% ]8 A/* 4 R' [; h O$ w- f; m( X- @*************************************************************************5 ^8 P+ w$ T$ u* A * ntddk.h ) b3 [' `4 ]8 V+ ]) w8 l*/ / i6 v1 _0 ~3 x6 s+ P0 ~2 Ctypedef LONG NTSTATUS;7 E/ N, `7 E- D. R( \. N typedef ULONG ACCESS_MASK;8 i! q1 N& q; M0 J# K+ \ /* 3 m8 E/ s6 \6 U! O* ntdef.h 1 P2 m% R! g6 A' Y8 e) M" D, H2 w************************************************************************* ! f0 w! c! z, d$ i3 g$ T0 B) @*/. x6 P9 g. e! v" ^* J F/ ]: B M 9 P; ?7 V _2 ^ B$ |6 j. X% P C0 ?/* & M) ^, ?0 v. ~2 Z3 ^( h4 d*************************************************************************" c' ~) Y0 |- c9 k! c6 { * <> - Gary Nebbett" }% S% s1 c- Q" C */! y% E$ N$ h9 [3 b! \( p6 K : |3 m4 J! j+ k, V* j& [+ Dtypedef enum _SYSTEM_INFORMATION_CLASS* h; f% r8 O* n9 E( l { - s L* N6 a. E) g* LSystemHandleInformation = 16 1 ^: e- e( @! a} SYSTEM_INFORMATION_CLASS;) Q$ L6 M- w, Z, F) z & g& @4 A# ] P( [% z" n, d m/ ^ /* 0 l: L8 A/ \& W*Information Class 16: H- V4 I0 V/ x. { */ : {" w+ t* O* ]0 X; z/ Stypedef struct _SYSTEM_HANDLE_INFORMATION ; e' H2 X% G4 i; y{7 W9 n# h9 ^% D) v3 O) i- g9 s ULONG ProcessId; # K0 |! o( ]1 r" x0 h' \0 I, G" T iUCHAR ObjectTypeNumber;$ K# ?6 C7 x. [! Z0 m* ^. C f UCHAR Flags; % l- `9 |1 B" hUSHORT Handle; 3 ?! }' L. @1 x0 {: r7 i5 A" sPVOID Object;8 M0 N3 X' W4 Z3 q5 R ACCESS_MASK GrantedAccess; ) o) ?5 i/ B# w% j( z' y} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; 5 l7 G4 p; f r& M7 V3 Z U9 t1 \: [5 N+ E #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; } * F5 w' `6 j* i/*, [# B6 v+ |& c' K *************************************************************************" L# p) X5 Q E3 n, R6 e& U * <> - Gary Nebbett4 v% f7 I$ [ |% F4 W. [3 P" T ************************************************************************* # e' X a2 g3 H K) }* N*// i' a* E; y/ B8 k5 J typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );& u0 @. x$ e4 F* B3 ^" ]/ h typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); % J a" Q- w0 ^3 d; G/************************************************************************( w* T5 Q& Q* _5 R * * ; j* |& H7 L" ?& k4 s* Function Prototype *; R! R$ O& a; w/ m8 X. L% l * *9 A+ K5 V4 H: s ************************************************************************/# u: L6 h$ w( _7 t- j3 v+ J' J / b( H2 K" ]% k# w8 g( r, A static DWORD GetEprocessFromPid ( ULONG PID ); " E* d+ k# `$ ustatic BOOL LocateNtdllEntry ( void ); " D4 F; L3 S4 x; k$ `) a ' `9 Z+ `# x- G0 C7 h! S " j! i0 H) Y7 d( S" w, D/************************************************************************ 7 O3 \$ R4 E" u+ R+ ?. `6 S& X* *4 a; k3 w: e4 j3 ^% p4 a * Static Global Var * ' ?4 I. M* c: T' f, z* * % y% Q7 T# F+ Y/ Q1 L9 P* ?************************************************************************/! t7 E* Q7 |) Q% Q' ?, e& b% s 0 |7 Q v n9 i3 k/ `# U' R+ O/ Z static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;# W: G# a6 Y. @3 }9 a static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;/ O. k$ a7 v- b" n/ V ) o5 \9 E& ]6 @static HMODULE hModule = NULL; : k W+ h" g0 K: i8 M3 r) n7 k0 n/************************************************************************/ l9 r5 D |! |/ q* O 2 Q9 b& S) P" `- E5 \( K% T& m! C" f# Q- H2 I" ] static DWORD GetEprocessFromPid ( ULONG PID ) 1 r# r' n1 T# Z1 ^{ - @: m/ p( E7 B9 O! SNTSTATUS status;" J& ?0 X5 A2 s" T: S0 k: ^ PVOID buf = NULL;, {' s7 m9 l" `' l+ R ULONG size = 1;3 [# g0 ~* v0 f" M ULONG NumOfHandle = 0;: z* d7 U% V! n9 }8 g ULONG i; 6 E% ]; c7 V- c" Z% t2 ePSYSTEM_HANDLE_INFORMATION h_info = NULL; 9 q" Z, q3 d5 J$ f9 ]1 B9 }0 o! l: H/ e. g _0 z for ( size = 1; ; size *= 2 )9 F) _. Q. c9 ^& ~ {' Z8 U! Q' s: @ if ( NULL == ( buf = calloc( size, 1 ) ) )* X! W8 K! R" m, v( L {8 \5 [, c. ^$ J; r$ ` fprintf( stderr, "calloc( %u, 1 ) failed\n", size ); 6 h4 A. t5 H% i5 L3 W$ j" D0 k; v8 rgoto GetEprocessFromPid_exit; ! Q* j& B+ m0 D- Q& _}+ u4 X( [" H# p( n; w ^ status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); $ Y6 W+ Y# z8 U. Q/ _if ( !NT_SUCCESS( status ) ) 3 j% Y% t+ t4 M! a9 A9 y{' I/ u) @. J& `: T if ( STATUS_INFO_LENGTH_MISMATCH == status ) ) Q* P3 w! {/ u1 C( v* X{2 @# ^5 W" j$ I$ z7 I8 | j free( buf ); 4 p0 q1 r! X5 d, X- B+ Ubuf = NULL; ) W; R: J/ V% `, V8 y S} * `) L j: l5 |4 t4 N5 Y- y( helse % U- O7 d- d, t8 U, [0 [{! A" z2 d6 B; n! S printf( "ZwQuerySystemInformation() failed");* J8 ?2 n" |% V# _ goto GetEprocessFromPid_exit; [5 ~; c7 [9 d( M# a: j} 3 b$ I! p8 [8 A- k4 D* ]}% D# I6 d# ]' T6 {! V4 q$ F& U else * Z F) j! ?! x& J/ B{ ' z; \- M6 X8 E4 \break; ) e7 }6 Q: W3 W9 j: ~' k2 p& c} 2 } W3 i, K5 }. w" `1 w} /* end of for */$ E' r2 m$ u" Z0 p6 X2 _0 h . ?! p8 @* M$ d! w! O; \/ [' Z7 K//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组# ?* G, O& j! q4 x. p$ v9 r NumOfHandle = (ULONG)buf;7 c2 Y& q" ~' |- d/ A$ Y " e4 b1 _% L) l' j h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);* `+ y O0 H$ R3 S3 P $ v2 l& G7 ~7 z! V5 x for(i = 0; i { / T0 U+ E$ \$ L3 h& j* `if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) % z( E8 O9 M1 x{ 7 D& g6 s8 K) hprintf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); ) s+ x4 u( y2 d" T ~return((DWORD)(h_info.Object)); ( n1 C/ O8 K) G$ ~0 z1 C7 ~$ k}7 R7 r% G8 ?( _5 ?7 \+ z! M/ T6 v }! {; q* w0 m# ? GetEprocessFromPid_exit: % U2 I" Z2 Q; ^' hif ( buf != NULL )2 R: I- D4 V: r {( M7 ~/ Y9 k- } free( buf );7 U0 E$ d* A! g buf = NULL;2 l, H V4 z6 T! K# M }# c2 r9 q0 a( x; `& q$ @ return(FALSE); ( @* k1 z4 j: B: g. r# t: p, O} % f, l/ W" V% K0 y' g! l5 ?$ y2 R 5 J) k7 a. K3 @6 T- n/ S % K: G' e) `& V! i+ g. `/*# |! S6 _0 @% x3 X) {! B * ntdll.dll ( @, E/ o! M9 r8 C3 r# Q/ `*/ 9 Z- }. P# n/ @8 z" y; gstatic BOOL LocateNtdllEntry ( void ) + W( g/ e6 u# n5 U. ^* X; ?; O* E{ $ O5 W0 M0 U. j- H0 J e8 iBOOL ret = FALSE;- W, Y; | [% W6 |: X7 u- i6 L1 r char NTDLL_DLL[] = "ntdll.dll";* U, F: U9 [! X0 o HMODULE ntdll_dll = NULL; " A2 b" q# e) s7 n9 ~2 K' b% T9 H" ? ; J0 M3 R- `6 f: k4 X9 U if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )1 S) {, x* j w2 o# P1 E { 4 M2 |* s3 N' C: {printf( "GetModuleHandle() failed"); 5 R8 K; u& P; ]2 U' H4 x9 _9 Y. rreturn( FALSE );* ~, R$ |7 K' @7 \7 _8 o2 Q } 9 h% f: G8 r4 A& E; F; v, ]if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) )1 h1 X1 x H" Z0 u( a! } { ' S% a4 M$ Z4 |2 | ~5 K7 H6 ^goto LocateNtdllEntry_exit;2 ]! z' g t4 p: _# K) I! { }3 p& a: |! B7 j2 _3 W9 q ret = TRUE;# [% n" e+ \8 K9 g2 J" Q5 z ! c% O+ o1 B+ l+ g" T) L: m+ e/ n LocateNtdllEntry_exit: / Z) {9 L1 |: \ " V3 v4 z8 c; M# a! O# K. _if ( FALSE == ret ) - Z0 X$ S" x5 v' F1 |' J2 r5 B{& _2 B3 Q& ^( E, h$ \6 | printf( "GetProcAddress() failed"); 0 @; Q4 ^% T4 B1 w( p} , y1 C* o& f3 [3 ^, i9 ~4 W% `7 @/ j5 antdll_dll = NULL;* G H0 M! ^/ X: D3 o: { return( ret );/ g6 A1 H9 u+ |* M! t } /* end of LocateNtdllEntry */! V8 q: N2 j; r+ ^2 R8 e0 ~ 4 x* X6 K4 A* l0 T) u# ^0 M7 N! Z) B9 |( I$ R0 V! L' c) x int main(int argc,char **argv)4 H! ], E* \2 w, b { 7 F# b/ W4 T$ F% U, c _) c) r % Y5 Y5 l: T) c$ o. i( O0 W$ \LocateNtdllEntry( );9 n$ w7 U7 j5 H+ A - E1 i8 D6 i+ j//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5 ( h Q: N% }# i8 C$ ~* N5 kOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );' E5 I) T$ r: A5 E* ] * t3 ^% U) ^+ v$ ~9 I' B9 NDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); . ~) ~# q$ ` B+ M4 f" ]6 V$ S( d( G! |* b8 p1 p: H0 A6 R printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); ) m8 @ k6 j5 V# g$ R2 |" L( |+ P- U return TRUE;! `( S/ s# `4 u. [7 v }
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-8-28 19:05 , Processed in 0.361769 second(s), 51 queries .

回顶部