QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:8 D. ^" u! H6 O8 _, w -------------------------------------------------------------------------------- 6 y% i# S* K8 G# k文摘出处:http://www.xfocus.net/articles/200406/706.html% E* M8 d9 C# ^2 h( E4 {! \ 3 k9 B+ T4 F B1 ]' S& Z创建时间:2004-06-01 3 [- D% f( e( n$ n( q文章属性:原创 & @ J) Q( _) z$ H* k& P文章提交:MustBE (zf35_at_citiz.net) ; O& r0 B( C8 Q& c* @7 s/ O: n `& Y7 U By [I.T.S]SystEm32 ( L/ U' x k! B9 m8 w: f6 N, i8 ~6 \ . v8 }/ P; z6 @8 J O$ ]Welcome to our web site http://itaq.ynpc.com/itsbbs/0 R/ t5 J0 L" N$ j. q : O$ r. @3 A1 n8 e7 E thanks to SobeIt : P / o1 d/ H: [( Y---------------------------------------------------------------------------------------------8 p9 A9 p& B# S6 ^1 x ; A! G5 |5 j: E每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.1 M' z- j5 r+ M3 K # G& k0 S4 a/ d) K7 E绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 # e+ X" `. u$ J) X$ }9 Q ; g' q' j, B# K8 w- t. ^ZwQuerySystemInformation函数原形如下 + B" G& ^. l7 D) M, i' \& Q3 Z. G NTSYSAPI2 c m x( I5 r% u" c, d! M/ H5 ? NTSTATUS 8 J) x# h, g0 `& T' T) { cNTAPI. W, Z5 a# m# W s8 B ~ ZwQuerySystemInformation/ i) d$ V" q# U! T! a# z8 Q& K6 S ( 5 j: g C, _3 [: SIN SYSTEM_INFORMATION_CLASS SystemInformationClass, ' ~! d4 @) Z" l7 { IN OUT PVOID SystemInformation, 4 S( ?/ a" A" O, _+ b5 F1 d IN ULONG SystemInformationLength, 2 x1 I% U, f5 JOUT PULONG ReturnLength OPTIONAL ( _- B- g+ m* e7 B* j5 x* D );7 ]4 m" F1 w' m1 X7 {7 H " `; H3 ?" M0 B1 y7 U( K4 z参数意义如下6 o, I. g) w' F: A # a9 e: x' x$ n; M L& sSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一5 b3 U- y( P# Y# v9 x5 l" H 7 ~- j$ ^) {+ i; W/ }3 ?SystemInformation:指向一个接受系统信息的缓冲区的指针2 Y& z; f. F5 J# g# S7 G; x* `4 B 2 Z5 l+ o2 o3 j7 Z1 _3 }5 U+ r) K SystemInformationLength:缓冲区长度6 {. }, }" f) O* r! ~! k, b( L 0 {6 K r% n7 H, L: B I: i& Y# A ReturnLength:指向一个接受实际返回字节数的变量,可以为0. J( q8 r: l3 G- V 5 K$ y- y9 p" x n- Q! O ! p( Y6 ~- u) i% J% Z 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation6 s) [$ f, H+ M6 G5 r: g% X- U6 k8 p0 q ' D4 s* g% I( I, H6 HSYSTEM_INFORMATION_CLASS的结构如下 * T8 B8 r2 t: `4 u# i* O 0 b2 {/ z$ @, `- ~) h' @typedef struct _SYSTEM_HANDLE_INFORMATION . D! i0 I+ I2 `% Q{( v: Z& T: g$ x& k# z/ x! r ULONG ProcessId; 8 ~8 ?! c C4 y. ZUCHAR ObjectTypeNumber; t+ x1 ?4 z: n/ hUCHAR Flags;0 L4 X: P* A! A K$ l! y USHORT Handle; ( k) K. g& K0 z2 l. w; v: T, ]PVOID Object; 0 O3 [! c. X( N; d* l6 x( vACCESS_MASK GrantedAccess;5 |. c2 l" u* o6 b- B: ? } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;) ~* ^( V7 A# G* d( d6 t) ]7 O7 H* S$ h : }1 @' i1 m. p# n ProcessId:进程标识符 $ X( J& } ~! x6 b/ v& F 7 ?! x' M; ^) D9 \* B# y ObjectTypeNumber;打开的对象的类型 % E8 A) n2 z+ _" N 0 f* y+ f/ C4 `+ H3 f8 UFlags:句柄属性标志 ) S. d1 b+ {2 Y# Z" N% g/ l/ N; M4 c& U6 \/ }! o2 Z+ f% j; B$ n Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄2 e" ^* Y" R4 C ( e4 B: z% ?& _5 m- J$ zObject:这个就是句柄对应的EPROCESS的地址 3 X% Y: v7 u9 q$ H4 ]2 W6 _9 ~: d( y, k2 N# z5 ~4 } GrantedAccess:句柄对象的访问权限- \4 b6 J7 T. J: @ ' F) t! S5 Z/ E) k7 N 3 E2 O" Q: n, i6 M+ O4 T( W; Z下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ) 4 G5 ~, y+ ^; ^ B2 _0 K5 ~" J0 u W: ?3 g/ a( ~8 p 比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄: n2 W6 \% K1 U% U C ( H9 d4 s! n V& ^4 b, g 怎么会这样?难道程序写错了?*_* ; q+ i, q' d2 L0 N2 d; Y 9 Z( j+ K+ o# f/ K: @6 A r现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出1 D; j A9 R' @$ l2 K S( A L( R m) J; U:proc -o QQ : U6 `1 n* K, [' wProcess KPEB PID Threads Pri User Time Krnl Time Status 8 q# h, q) ], D6 X2 EQQ 827CD520 11C 2A 8 00000B90 000008D4 Ready% Q0 \/ s, l$ E- j! ^7 L 4 a% s+ ~8 m% ~& w---- Handle Table Information ---- 8 z- n0 r3 i5 m& |! y8 }$ j v% x4 I- P; r# |$ a% HHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 . n- S2 V$ W& e2 x/ s t( Y+ b ! F- R+ T7 L, s4 S- N1 rHandle Ob Hdr * Object * Type& ` S0 K5 o1 X/ w# B 0000 00000000 00000018 ? ( _# U9 l) Z! S' d0004 E2DA5E58 E2DA5E70 Section 8 W5 m! F! |! \8 O( E `; q0008 FFAB35C8 FFAB35E0 Event: u9 z3 ^1 J$ Y( j N2 W 000C FFAB3B08 FFAB3B20 Event& K) h2 i0 v7 W& k 0010 85C70188 85C701A0 Event# x, W. [! e9 v8 }6 F/ T5 D 0014 81515778 81515790 Directory * W6 R" s# y3 P/ Q( s R0018 FFAB7BB2 FFAB7BCA ?# L+ q6 s! [8 H @; V, A0 d" r 001C 814A1858 814A1870 Directory# b1 c* H, k4 T8 }+ J, @" x 0020 80288C88 80288CA0 Event! \$ [' r( j8 R$ Y5 Y* H9 m 0024 E2CFE7F9 E2CFE811 ?8 a, U ^( S4 f/ G0 C7 T1 c, W 0028 842D7B08 842D7B20 Event0 C9 N$ Y. g' H) @6 j7 N 002C 80E9B989 80E9B9A1 ?% i, N3 h* {( ^) T& a! g" p 0030 E1372198 E13721B0 Section$ u2 {2 x# b; V x# ` 0034 814602C0 814602D8 WindowStation6 W. b# y* N$ J) q6 v+ Y' H; ^8 O 0038 81455CE0 81455CF8 Desktop2 c% U2 t& q6 c! a6 `9 O9 P 003C 814602C0 814602D8 WindowStation * q" Q( b( |4 P. k, [3 H0040 E2B3C1A8 E2B3C1C0 Key2 J4 D( s# u; L; ^9 \. B( G 0044 E286D6E8 E286D700 Key0 Y9 l/ Y* ]* ~& ~. b/ B9 J* ?& ^; D3 r 0048 E2B3C0E8 E2B3C100 Key + ?% E X9 C% ?7 B- S r004C E2B3C068 E2B3C080 Key) T# Q2 e0 ?5 w% h& g 0050 E2BEE688 E2BEE6A0 Key * s9 {, e* N6 u; ^% G X2 ]3 `# c0054 8147C998 8147C9B0 Directory4 ~8 T3 k( M4 [% `1 H3 E& ?% \( ~ 0058 829D1128 829D1140 Event; _' @2 h5 k% _" Q$ f3 L- d 005C 83F991E8 83F99200 Event2 R! U; B8 Q' L2 t w5 P: Q E 0060 E2BEE608 E2BEE620 Key - c% [2 n% b- p1 q' E5 q0064 FFB07568 FFB07580 Event. `% Z2 D: ^6 t5 N 0068 801747E8 80174800 Event 4 j% e" Y# | L' Q( t+ k006C 80174828 80174840 Event$ c+ _% q, D4 h2 F 0070 845E8808 845E8820 Event 9 q$ y: V$ U9 d. e5 _. Y7 U0074 81448798 814487B0 Event: @$ c, s; ]9 Q5 `4 q1 N; @1 ~/ l 0078 E2B9A888 E2B9A8A0 Key 2 A( u8 a, [$ b1 Z5 u1 H) ^ n2 u q2 @007C 845E8648 845E8660 Event 6 H! O4 H$ m9 C% O; `4 n0080 FF9E2DB8 FF9E2DD0 Mutant6 Y7 i9 m* ?) O: `2 J) m 0084 FF9E2D58 FF9E2D70 Mutant # S$ n5 @5 D A- d9 X0088 83CFC378 83CFC390 Mutant ; t1 u+ r3 J0 {1 I008C 801749B0 801749C8 File: S4 F: u: p8 @( g 0090 E2C48668 E2C48680 Section & T7 {0 t' G+ I4 }! H. w0 ?0094 FF965168 FF965180 Event ; s/ \0 T, R' A/ N$ T2 Y1 o- z0098 FF9E7D88 FF9E7DA0 Event 4 h5 b$ C9 R1 B% ~009C FFAD3DE8 FFAD3E00 Event0 O0 r. m" k; _$ J; v 00A0 80AD63C8 80AD63E0 Event . i: E/ d! M/ `% J- j6 m4 o00A4 E28073A8 E28073C0 Key ! o2 @/ Q9 `- Y; Z% v! r- @00A8 FF955588 FF9555A0 Thread. R& v( ~4 `+ s8 v' K 00AC E2770728 E2770740 Key " A/ S% Q9 _7 {0 g: ]( P, m00B0 FF923438 FF923450 Mutant# }$ V0 P5 R) S- B4 F% e 00B4 FFAE3B38 FFAE3B50 Mutant- N! q# W) G0 D2 b 00B8 83B80728 83B80740 Event 6 J7 j C0 E5 N+ o9 |4 o, n: k00BC 83B80668 83B80680 Event 0 k+ K- }2 ?' ^9 H6 D0 w00C0 E2E3C448 E2E3C460 Section+ Y5 m0 m) z' L) i2 u* [& T 00C4 83776A08 83776A20 Thread6 G/ A- A! M0 \ 00C8 81489E48 81489E60 Event . `2 O, d# T6 K0 w00CC 83776CC8 83776CE0 Event 9 A% [3 J; u/ l# R2 q+ [# q/ i4 e00D0 83776C88 83776CA0 Event 0 Z# p$ `$ B- N00D4 83776768 83776780 Event3 ^: _5 h' u5 E2 g 00D8 E2837D88 E2837DA0 Key( } |$ O3 C7 Y {! C8 n 00DC 8146B3A8 8146B3C0 Event( z8 t' O& C1 e8 R2 t7 T 00E0 FF908308 FF908320 Event " M* T5 o8 u# P& y00E4 81494868 81494880 Event. Z+ N7 R+ R5 e0 O+ E# e* K 00E8 FF9064C8 FF9064E0 Event 0 Q5 ?" O7 m* \+ Y, K. k: ]00EC FF908FC8 FF908FE0 Event , O6 K! ], Z0 F9 `2 z* u# O00F0 FF908F88 FF908FA0 Event9 B+ s+ p+ }! G1 T( k 00F4 FF955588 FF9555A0 Thread3 W& _& L: v: s* z 00F8 FF908F48 FF908F60 Event% `8 r% p% x. n 00FC E2CB1558 E2CB1570 Port$ Q2 C& p$ c# }' Y, @ 0100 FF90A2C8 FF90A2E0 IoCompletion 9 {0 Q D2 d8 I7 U0104 E2CFE708 E2CFE720 Port ; n+ p0 a T5 I0108 FF90A2C8 FF90A2E0 IoCompletion & L/ S" q1 ^0 b010C 837762A8 837762C0 Thread ; E" g" J' K2 `0110 8103BBC8 8103BBE0 Event5 P/ S* t0 C! ^) F3 H! c" i! N1 z 0114 813DBDB8 813DBDD0 Event 7 k; `. }, a9 s/ Z0118 FF814788 FF8147A0 Event! h- z# A+ V7 x- i2 r- e 011C E1358DA8 E1358DC0 Key # W' ]2 }, l1 c1 h" L% x0120 E2CFC428 E2CFC440 Key h6 `. X% j" e6 O& w9 g, u, j 0124 8103B9C8 8103B9E0 Event 3 O9 ?! f* y' j6 D! }0128 E2C9A968 E2C9A980 Key 5 Q8 z3 C+ D9 I* r3 q- v012C 83B34E88 83B34EA0 Event 5 F% F. x9 L' J5 d6 b2 H0130 E2CFD948 E2CFD960 Key: t! l/ o: j2 e6 R& f9 D1 t 0134 83B34E08 83B34E20 Event/ O, v% M/ ]. y. c; ` .... }2 C7 k$ Z4 Q# w.....................省略 0 q" b. ~% `2 Z$ `* @8 ]7 T! b1 Y: w" X% Y 看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?, K; c! E7 Q: t ~+ ?5 e3 O: V6 \ $ L2 e2 k1 @6 I: `1 Y- r想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此7 E3 L: K1 f4 G, D9 x/ [$ f % W7 t6 u+ ^/ @6 {, E可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路0 U8 A0 f/ [2 F . |; A7 Z2 i7 T. j后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. 5 W/ W* w. w3 J# e$ V' B: o2 N1 G: n' H$ V 果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS2 |* T( y# f+ v5 c 5 M* ^% W5 |7 d* j5 r! s% N修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 1 H$ |# [. H+ O- B1 e- Y3 C D- A2 O2 n" p q; l0 @2 S1 p #include 9 U) ~6 `% g" ?; M! d x #include 8 {7 l" \" b! J1 e& P6 S#include & L# Q, l7 n2 V2 j$ e3 r& d: b#include " Y+ _+ V1 |0 J ! r) L# @/ g. D6 H- N* Y* T. I1 @ /* * c2 P) d3 J+ r7 o* you''ll find a list of NTSTATUS status codes in the DDK header* H3 r, u7 c q4 h: m; r: [ * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)$ y9 n7 b- h7 S' Y9 ^ */5 M: r8 V$ U( Z, r$ v9 n, h #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) ' A1 b" ^$ h* S7 \#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) f8 p) r* m4 e& m$ o! g#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) % z& p, e# a6 h, a1 t( G, V, l8 t. C4 { W( t- N U /* 0 K2 B9 h. x4 D) i************************************************************************* : D6 M5 E% z& N; F# X* f* ntddk.h9 n2 l t" ~. }8 W! w& L2 |+ J( x */ 4 T) M& H4 U' F: ~$ t3 ^3 }typedef LONG NTSTATUS;7 |4 q9 S* _1 G- ~4 r$ W' y% Y, X typedef ULONG ACCESS_MASK;+ @% K) w5 M5 s" o /*% \" F: l5 t( k) c- K * ntdef.h 8 O/ D5 u+ W8 S& d$ p************************************************************************* ~, P2 U9 e* v/ p */; O% Y" F' z, `$ j9 z. Q# N2 T 9 H2 D( _$ u+ C6 | /*: k( e! ^8 l: B5 c4 f2 ] *************************************************************************' h/ o" o. v8 X4 n9 E. C+ l * <> - Gary Nebbett9 q X8 y, {8 V2 [# {5 R, X( s; w */2 _1 D$ P8 e# {; r a! s * i0 w. E/ _3 i5 q2 _5 ^( Y3 Stypedef enum _SYSTEM_INFORMATION_CLASS* k, F1 F" j1 e6 e: T% j2 b' t { $ O* O; I9 p& B3 y j- c/ Y" cSystemHandleInformation = 16; }2 L' M7 w8 @9 a; U9 b8 p } SYSTEM_INFORMATION_CLASS;' B5 r7 l9 h% G8 S4 _9 g0 ]+ K + a6 h6 k: h, U& V/ ~3 N# i /* ! F% n3 k3 X, G: q5 `*Information Class 162 Q F- }3 w/ w. h1 e/ I4 ?* L */0 Q: U# c/ N' v g typedef struct _SYSTEM_HANDLE_INFORMATION & n5 `) P4 f7 z/ L0 S{5 @/ S! z3 q8 j1 ` K# d ULONG ProcessId;) C% c8 X7 B+ k1 q7 @( H j UCHAR ObjectTypeNumber;+ m1 H/ w+ o; B6 e, v5 i' o UCHAR Flags;4 i# n# U! t) T( E0 p USHORT Handle; + I+ H/ ]9 m0 i" ?PVOID Object; & [" X8 `6 U6 J o4 u% hACCESS_MASK GrantedAccess; # W8 V9 d, z' S$ S} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;( P. Y& K5 L. ?8 m7 X5 `* j 6 k* h' u! U1 U) ^, 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; } / M. H' z' ?; j: u9 W. p/*5 `7 S$ b$ w* t4 U/ I$ K: H *************************************************************************4 R3 U- V; N: {7 \. z * <> - Gary Nebbett' e, o2 X6 G! S# J ************************************************************************* 2 I7 \% Z% }* S5 \*/8 Y5 |9 J1 y" q/ ]& E typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); 7 S, N V2 \. }! ^typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); , |3 h& M7 ]- T# W/************************************************************************ * ~% `/ w0 s# i* {. V* *$ l+ s7 q! `$ v: F+ G+ O0 N0 b * Function Prototype *8 Q0 Z h! @; |0 b1 t8 @0 m * * 8 k9 q7 G! k N- p4 R* g( f3 O ^4 s************************************************************************/% |4 G1 {8 t* j8 U2 W7 l . u- L J# P/ C8 w ~2 w$ p. ?$ V static DWORD GetEprocessFromPid ( ULONG PID );% V. `/ X/ v, ^( \, k' r) f static BOOL LocateNtdllEntry ( void );, l; @: H) Z- b! T& N 5 n2 c; b! X/ r( K 7 ~2 d! C: x: |% C- j- L /************************************************************************ # g+ z: {$ O4 W$ o* D* * * E" C) D" ]" B% n; Z- Y1 V* Static Global Var *# L( t* |0 m7 E8 K * *' T* J y- x1 f+ F* Y) H ************************************************************************/( Q4 d- D$ O# D+ M; p# ], @ 6 D* C, }1 c& d: R5 a$ @+ \ static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;# L4 ^7 f- H i8 E static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;: {) I, z, m3 x- ] 6 W9 ~) c* W) Z5 i) Y" f3 |static HMODULE hModule = NULL;. N8 d% {! ]1 L. e /************************************************************************/ ! J( o3 _* k/ ~9 W # n' F1 Y' H4 K ) X2 w" g$ r$ I, ^static DWORD GetEprocessFromPid ( ULONG PID )/ V; ~% T: S9 b) @* j0 d {+ q# Q) I1 e5 y( H) G4 w5 g" f! N/ d NTSTATUS status;4 ^4 [# K8 `# f! V. E$ h" { PVOID buf = NULL;! i+ l; X9 X" g, Z9 m& N2 b% [ ULONG size = 1;6 ?; R% o% w: q2 e! n" g; e( ^, S ULONG NumOfHandle = 0;9 o) o- J$ d2 E: Y' d* d1 v ULONG i;6 O( ]" [, n3 W PSYSTEM_HANDLE_INFORMATION h_info = NULL;3 g8 P: T# ]* q8 f, T 4 G* {# `- ]) Q! V5 ofor ( size = 1; ; size *= 2 )! {! Y. u, W# ?* F {; L" B" v8 S/ Z+ b E% a if ( NULL == ( buf = calloc( size, 1 ) ) ) 9 d4 N& t- x( \2 |. j+ C7 k{: p4 @1 f: w9 l! |0 W, ^5 w fprintf( stderr, "calloc( %u, 1 ) failed\n", size );/ `; k; P2 o8 e+ O' H6 n goto GetEprocessFromPid_exit; ! l4 u" P) t: {' R* A) I} / b/ `; Q/ J3 w' D Ustatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); Y- J9 S. ] @# M4 b& Q2 W: T/ Rif ( !NT_SUCCESS( status ) ) : x% c5 z+ ]2 _6 {8 h8 k! z5 t{' N; {' M5 |/ u! ^1 ]: J% }4 ?7 j+ I if ( STATUS_INFO_LENGTH_MISMATCH == status ) # s$ u. h" w$ v# }! f2 E/ u{ . v8 }+ [/ K3 G- @6 j: x6 l' _free( buf );3 |$ `' ?7 b- a4 e; p buf = NULL; ' v5 L# R1 [8 D0 S$ N; |} : m9 T; z) H/ J& p# ^9 V3 d/ ~else : s* e3 Q$ `# V" V9 U0 @- s{ f6 u3 _% o0 p0 Q* m! Gprintf( "ZwQuerySystemInformation() failed");: S" B/ a& W" }! L9 W: k9 [( ] goto GetEprocessFromPid_exit;, T5 [# t3 j# F8 d }$ M5 G0 ?; S# }: _! p" @0 Q3 p, n }' q; @% c3 x8 G$ m, f9 ~ else & R, ~" y v0 J: N+ p3 Y{ " ~, ]0 Q; s9 ?5 @# `break;# `* o/ j$ e: Z* y* v8 ?/ o }0 N0 w& ]2 b' _6 _ } /* end of for */ 5 k* T1 b; k8 Z' i4 m! c7 s( F- R# C //返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组 7 l ?2 r N5 N4 j5 j cNumOfHandle = (ULONG)buf; / P" F" u6 ` ~* f. `8 k# C 9 V: R% I9 ^' p& T: | ih_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);: t0 u( ]. ]6 d* W# O1 c$ i$ k0 r 2 i1 ]( M1 z/ }1 Q$ e3 g, O for(i = 0; i {; Q% A( x2 d b/ V* M if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) 7 L( ? m3 O/ t+ [+ k+ U5 b# a{+ A3 i% e. s5 m' m& J printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);/ t$ `& y7 C, E/ M5 l8 t return((DWORD)(h_info.Object)); * V9 p" E! I2 ?}* b+ M2 e( w" S% s4 I# _% ?4 J } % o+ |/ _/ J( `" LGetEprocessFromPid_exit: + |7 u4 ~) F7 y v# Jif ( buf != NULL )+ N. L% M$ M% G3 Q4 e+ u {9 y: X+ r% G8 ]0 b" G free( buf );8 o+ t9 D7 H3 l Z& M# @2 ^3 S. r, V buf = NULL; ) H1 H) X6 w/ p" z} ; o3 u: l" W' V" p$ M: \$ kreturn(FALSE);2 M% B6 `6 B' A) [. x3 d } / X; N1 g; R1 n! x: r( I + j) o/ M- B1 r5 @' I: F+ j4 X8 B- a" z /*2 X$ V: w( W5 W8 k7 J' ] * ntdll.dll3 i6 ^& Y: m5 H3 ~7 d% X3 k */ $ a) ~% r# |1 I+ estatic BOOL LocateNtdllEntry ( void ) d7 i" Z$ A2 L/ x { ' h+ F7 b: k& K; X0 ^BOOL ret = FALSE; S6 n$ `4 R8 u' Hchar NTDLL_DLL[] = "ntdll.dll";. u {. o$ d3 B1 b& e7 F HMODULE ntdll_dll = NULL; 6 N( @/ W) ]' v. K7 L7 W* K0 X' ?$ k. L/ n5 c: _. m3 C - x0 b. w9 R) g. q- Sif ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) 8 O* q$ A8 s: [4 g{ - Z) V$ Z% z2 }' P. Yprintf( "GetModuleHandle() failed"); & f. i% B% u7 Y8 }: W4 C, s1 A/ y Dreturn( FALSE ); 6 l$ ]6 ]8 N+ c6 F) ?& |* x5 Z} " q8 {' U2 F1 |: S0 ]if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) F! o5 r$ z9 T# R; ~: o9 D, Y5 |{. n: v1 k& O7 r3 z- @4 s goto LocateNtdllEntry_exit; ) Y+ q5 O4 R, c! [: g} ) F! J, y; P: N4 \0 @: a3 l2 H" V- Xret = TRUE;9 D+ C5 V' |" z, R U 7 ]& u$ Q' ^/ w% {, {2 aLocateNtdllEntry_exit:. n6 _' J8 {! v% z, E * c3 Z+ ^" c2 _! y+ M- A if ( FALSE == ret ) w5 h' L8 r5 R2 P& Q{% F# V9 t1 f( R' O printf( "GetProcAddress() failed");+ @; o8 b& P5 Y1 x q }6 I/ I6 \* x! x- S% t9 { ntdll_dll = NULL; 9 t' ~$ U, B" s/ e4 B# dreturn( ret );' a+ O* v8 g$ i1 u0 r/ V! a } /* end of LocateNtdllEntry */ ; e& n! u8 } s( }8 x* R2 b2 X$ ]0 t- B* r8 C0 q7 u2 n + _8 e4 O; O- e9 Z8 F& J0 r int main(int argc,char **argv)# j7 e2 q5 G" R Q! T { . I8 D5 L% t0 V3 E n3 X, H# k7 [/ G LocateNtdllEntry( );" _% i8 N+ F- X$ m % A6 J$ D7 n# e' X1 F8 n0 Q//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5 9 z2 a; q$ v/ I8 iOpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );6 j& p9 L9 j$ v _4 u 9 f3 d$ p* M) p% r5 j: y DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );% J2 p2 w1 F! z0 A. N3 q * _/ |" F5 z/ L5 W6 ^3 E printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); ) v+ t+ `7 |! F: d% o# D ) U2 `& _ I0 S! Hreturn TRUE;! N& g: O( ^; D s8 Z1 G }
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 17:49 , Processed in 0.411114 second(s), 51 queries .

回顶部