QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |正序浏览
|招呼Ta 关注Ta
文摘内容: 5 \( u8 Z c- u! H) c- K3 t; v--------------------------------------------------------------------------------; a! y9 t. S# K5 C! { 文摘出处:http://www.xfocus.net/articles/200406/706.html* x4 x v9 M# j+ l) L - `* W0 ]3 K9 K 创建时间:2004-06-01: X5 |2 U _: \/ o, m0 B 文章属性:原创 1 s" n1 H! r! Q7 n7 ] P文章提交:MustBE (zf35_at_citiz.net)% e7 k! i* R& P7 _ - i7 Z9 G" I9 F' v. n# j& W4 xBy [I.T.S]SystEm32, I4 V _% g% i% c0 S ( M/ t! w$ v6 D5 n& G5 m5 p- X, fWelcome to our web site http://itaq.ynpc.com/itsbbs/# y3 `0 q g/ P0 X8 X; v6 A S, K/ ^/ S8 H% @6 l3 m6 zthanks to SobeIt : P 8 t& f) H& ?. @1 G' }: L---------------------------------------------------------------------------------------------' g+ d) H) R6 i/ s ! U6 S; D& y0 z/ e- C5 [5 k6 Q每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.: N3 |- O1 c8 @( ?8 h - f9 K$ v: Y) W6 F 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 ! \2 O' Q7 t: ^5 v8 y / e7 f( p7 \5 X% xZwQuerySystemInformation函数原形如下 + u0 ]* A0 y. D, n/ G4 L& b & i1 n* H) S- j/ Z6 G. ANTSYSAPI + H+ F, M7 S: h7 @: K( D0 P0 INTSTATUS6 L+ }4 W. X$ f' F& o- u4 _+ w NTAPI % M4 F( h! o! R G* }+ ?ZwQuerySystemInformation 9 C: p/ E8 P1 e2 l6 X0 a( & ~+ O5 i5 `4 _: wIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 4 {* B' t; {9 x! T. H& z IN OUT PVOID SystemInformation, 6 u$ I. z- f( m8 k IN ULONG SystemInformationLength, 6 u6 L. z4 l& M$ M5 i9 s. c& Q2 UOUT PULONG ReturnLength OPTIONAL 9 G2 n4 h- {( Y+ m7 ^) m); 6 I2 v" T" X$ ] Q! r + W6 k, ?7 [$ M% i参数意义如下 . ` e1 T/ h. t 4 E& q2 @5 i5 `1 [5 M qSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 7 ^" C, h/ o& U& r9 _ x9 ?4 @. J SystemInformation:指向一个接受系统信息的缓冲区的指针" T e# W+ G6 P & ?9 x0 l- T+ A3 t: c" f! q SystemInformationLength:缓冲区长度 6 g* q! H' W/ V0 d% s X . t* U* t. @) r1 s/ G! X' MReturnLength:指向一个接受实际返回字节数的变量,可以为0 , p" k( f k$ |* Y- ]6 f* t / r# b# U$ b5 W+ e7 r8 g9 r( H( T$ K 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation - I# t p. O2 b6 l' h: i 1 c( a6 c& l3 NSYSTEM_INFORMATION_CLASS的结构如下3 f6 Y% q9 B) F " b7 X/ M5 I8 o G0 V8 Htypedef struct _SYSTEM_HANDLE_INFORMATION, }9 F) w6 G0 M4 f% I {$ f# D& w4 |$ b! y0 K* L ULONG ProcessId;5 A0 G2 P- D9 J6 A UCHAR ObjectTypeNumber;! X4 w& `: r& T2 A/ u7 \8 B7 @ UCHAR Flags; ! m* x0 m4 [3 p0 ]USHORT Handle;4 ^: d* d( g' p" _/ M- } PVOID Object; # B2 x: M, W" ?5 O7 YACCESS_MASK GrantedAccess; " E1 f: z( B# x# M! t6 N* f, n} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; 7 E" J" O9 H' U , w7 r& I; J9 |, HProcessId:进程标识符 0 A$ h% @( {- ?0 _$ g$ a: ? ' A* V/ b3 B( ]6 e5 L( v9 N% KObjectTypeNumber;打开的对象的类型# |7 R' T3 ]$ w r3 G : G' P2 w$ e# P i8 u$ \! iFlags:句柄属性标志 2 B; T; K3 K2 }. ?9 ^+ U: C5 T, V% A! l v7 P Handle:句柄数值,在进程打开的句柄中唯一标识某个句柄) g. R0 _ s! h1 Q" h, C$ _ % K' l1 y* P: E/ A- @4 o4 q Object:这个就是句柄对应的EPROCESS的地址 0 g( K" B7 P5 V/ I 5 o, s1 m9 r. t$ U2 \( y1 o& \5 MGrantedAccess:句柄对象的访问权限 4 m' p% O4 n5 U$ f) | 4 B/ t& q' C" q6 P, _ - I" j7 [9 Z# ? s; _下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp )' d: K5 _! \+ W# e7 w. d$ ^5 N" L/ B 2 A+ i6 m8 ]! _- W比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 / z, y: Y2 Z- s, O$ `6 `) [, h* U ( Q5 o5 w( X6 z" O! _怎么会这样?难道程序写错了?*_* 8 l: `; R( E0 V) S0 \! b2 ] & H/ L" R0 P' a1 x# f; E: S现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出3 F N7 W a$ t) \# ^ " G4 L4 n/ q. n! e7 P8 H:proc -o QQ * G' n/ m( P& S; `' P6 qProcess KPEB PID Threads Pri User Time Krnl Time Status! S9 C. C8 n6 y5 R QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready2 A' T- b4 J5 q; |- E/ [ # ^" x( L4 K/ y1 e& v---- Handle Table Information ----7 d& p1 _/ ?& [: r + [5 t" C" s( W) sHandle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 * P4 s% a' X, u) o q1 T2 d % N* L5 O4 Z- i) \; ]1 NHandle Ob Hdr * Object * Type & r, V# {$ a$ ^% N4 U& P' c- R0000 00000000 00000018 ? , b/ a' E- h% }: }' O6 Z0004 E2DA5E58 E2DA5E70 Section/ p$ ~; \& W2 `9 C' H) | 0008 FFAB35C8 FFAB35E0 Event ! p9 L7 d \0 ]/ H5 v000C FFAB3B08 FFAB3B20 Event/ C0 c1 I' \; [ 0010 85C70188 85C701A0 Event , E1 L* [, J \" v- O0014 81515778 81515790 Directory. p/ W* v5 N/ \ [& e 0018 FFAB7BB2 FFAB7BCA ?. c+ F3 c$ A8 V% [4 h 001C 814A1858 814A1870 Directory . u$ j! z% \+ ^, R6 [3 Y' e U0020 80288C88 80288CA0 Event " S* a1 i% G0 h- v* O/ q/ l! B0024 E2CFE7F9 E2CFE811 ?; Z& h k! Y, K5 n2 { 0028 842D7B08 842D7B20 Event * w% r; g5 a# L+ {6 L% O2 Y002C 80E9B989 80E9B9A1 ? ! L2 h7 J1 A5 m8 ~& E& o/ v: [( v0030 E1372198 E13721B0 Section . C+ t {7 u5 ^3 t/ B6 m6 s0034 814602C0 814602D8 WindowStation4 @. k1 D; j: A. h" y 0038 81455CE0 81455CF8 Desktop4 R+ a7 _( ~/ b) | 003C 814602C0 814602D8 WindowStation 7 B+ @* G! c" W ~0040 E2B3C1A8 E2B3C1C0 Key1 z9 X8 g J& ~ _# T 0044 E286D6E8 E286D700 Key$ S, w9 H1 O, \/ _+ f" W 0048 E2B3C0E8 E2B3C100 Key6 X; O4 x) j8 u- S, J [ 004C E2B3C068 E2B3C080 Key , m p' z8 V# i5 F1 G) S0050 E2BEE688 E2BEE6A0 Key % Q0 }1 I$ _ R* T0054 8147C998 8147C9B0 Directory" q9 ^7 O2 m ?# R 0058 829D1128 829D1140 Event. B5 ~1 }. t% R% I) k 005C 83F991E8 83F99200 Event4 e: t7 X2 _$ b8 H$ Y2 m 0060 E2BEE608 E2BEE620 Key ( z/ Q/ Y9 g- s5 s0064 FFB07568 FFB07580 Event ; o B, m5 K/ W0068 801747E8 80174800 Event 1 d$ e7 s5 Y: A, ?, a' u006C 80174828 80174840 Event: g* N% K3 i7 E: Z, G: ?$ ?+ ] 0070 845E8808 845E8820 Event . [5 q* _' J: O! F0074 81448798 814487B0 Event0 [5 {) [# {- _: ?# S6 A% Y6 k 0078 E2B9A888 E2B9A8A0 Key3 _4 ~! _- q! X2 J 007C 845E8648 845E8660 Event5 }3 }% N, b6 f# X 0080 FF9E2DB8 FF9E2DD0 Mutant* L( }' y. u' z5 [1 U 0084 FF9E2D58 FF9E2D70 Mutant8 r3 A$ P& v' A8 y. M* { 0088 83CFC378 83CFC390 Mutant, i6 k' V$ u0 |- R' i# s 008C 801749B0 801749C8 File, d7 s; x& ~7 j% ]2 J! v 0090 E2C48668 E2C48680 Section1 r1 i0 A+ q5 z' m( w1 Y 0094 FF965168 FF965180 Event- p2 P2 Z; [( K4 @7 } 0098 FF9E7D88 FF9E7DA0 Event & u$ T( `! p$ H009C FFAD3DE8 FFAD3E00 Event' H* ~/ z, O1 g8 r/ i9 W0 g 00A0 80AD63C8 80AD63E0 Event $ w* i; B% U& S% j! T* F6 [00A4 E28073A8 E28073C0 Key$ a$ O% q% ^9 z" J' D' V ~8 L 00A8 FF955588 FF9555A0 Thread & W, s }3 ]# @00AC E2770728 E2770740 Key ) D8 q, M5 f% T: e00B0 FF923438 FF923450 Mutant% O, m/ y: d# z4 _ 00B4 FFAE3B38 FFAE3B50 Mutant # ]$ L% P( n+ E) v. V. v00B8 83B80728 83B80740 Event , |+ h- ?7 N2 B. O00BC 83B80668 83B80680 Event : s/ l4 p" b$ G5 I+ l- N1 x2 t5 K00C0 E2E3C448 E2E3C460 Section- A. _& h8 J- S% C- g 00C4 83776A08 83776A20 Thread : b4 ]8 B: m* |) Z$ @+ Y$ h00C8 81489E48 81489E60 Event 0 y; P$ `: [; a Y6 j( {5 x00CC 83776CC8 83776CE0 Event 0 h* N( {& y/ ?0 p% c00D0 83776C88 83776CA0 Event7 q$ q1 \2 G- |* _ 00D4 83776768 83776780 Event 2 ]& q& h& M. ?: d. Q00D8 E2837D88 E2837DA0 Key + g7 D! k/ ] }+ ~6 u! G00DC 8146B3A8 8146B3C0 Event- v6 B+ I4 e3 w4 i4 E6 } 00E0 FF908308 FF908320 Event! W- t. r4 K/ o, q G 00E4 81494868 81494880 Event( p# t! b. h6 D7 j# [. |; |' C: l 00E8 FF9064C8 FF9064E0 Event" `2 v9 ~- \; j- H 00EC FF908FC8 FF908FE0 Event3 o' Q3 z$ r1 Z7 n; d 00F0 FF908F88 FF908FA0 Event , \+ X0 u3 a' \7 v! R* T( `00F4 FF955588 FF9555A0 Thread" s+ A* t3 J5 w K# B! c: Q 00F8 FF908F48 FF908F60 Event 4 y5 K" m. L$ R- \. x; R00FC E2CB1558 E2CB1570 Port , j& T9 ?+ Z+ \1 U/ L% ~0100 FF90A2C8 FF90A2E0 IoCompletion 8 J0 U" U* _0 M2 o! g- N1 C+ B0104 E2CFE708 E2CFE720 Port3 V" y3 W6 \" p/ _! v$ U) q5 v. I- I9 b 0108 FF90A2C8 FF90A2E0 IoCompletion* Y1 S- e' E$ D7 t" y 010C 837762A8 837762C0 Thread/ J$ I* c% x: |1 N3 m/ ? 0110 8103BBC8 8103BBE0 Event4 @' _" q0 n* G/ t 0114 813DBDB8 813DBDD0 Event* a1 P) S; q7 o& ?4 N 0118 FF814788 FF8147A0 Event 0 M( h% t+ [- N011C E1358DA8 E1358DC0 Key . w, G6 Z% ?' y0 d0120 E2CFC428 E2CFC440 Key# }' p. Z! s+ R! }; C. A4 N! u 0124 8103B9C8 8103B9E0 Event' x4 T1 j$ P. Z0 C 0128 E2C9A968 E2C9A980 Key 1 U& i* Q" v: }. u" ^7 n012C 83B34E88 83B34EA0 Event 2 P: E7 f8 m# c i0130 E2CFD948 E2CFD960 Key . p# z+ ~3 k% b0134 83B34E08 83B34E20 Event( |' [3 h" ~( _1 L( j .... ' Z/ R: M: E; r2 I% C9 i/ O.....................省略* l8 }( }0 y. {/ _ : G' y9 R; N+ o) K看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢? . d% X( ]5 D. \; D9 e# t1 w( R) i% T- a( V" m% N7 g1 p2 a 想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此2 [8 b; Z/ {8 q# V. } # x* X7 Z! U$ N' {) f可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路 ^9 k6 B* n' e5 ~ 8 ], S' p+ ^6 w* H1 `后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. % B+ }) ?9 @/ H2 O( g+ Z* a 6 ]7 {+ o& m) g H果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS ; {: Z5 N. X0 n( \# d, \3 M+ A2 M' P+ o3 q/ r* Z, b( `. { 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 " ]. @' C/ y8 F" ^. n3 _ : K2 N8 D8 |# m#include 7 @ m! {7 _8 G- l* u9 y$ i) F #include 4 K" a. i9 I$ w, t/ q; }. S: A #include . i" i0 l0 E y r7 ?7 e" K#include 0 C% ~ s6 s* U/ k ( q% V$ N. ^0 w2 |) k/*: l4 L' ]' D% D" F * you''ll find a list of NTSTATUS status codes in the DDK header' ]3 j; ~ G+ M4 R3 R! t, d9 p/ v * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)8 _8 }& T. U4 u */" {3 I# ?9 z% y #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) 4 f% Y! Q6 E2 C% n# ]#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) 9 h/ L; K/ c4 Q, M. L" m1 H#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L); ?' u! P$ R# A v ( L: @* k1 o, p. q/ B0 o /* 6 b% X, k3 b- g8 d/ E3 ^************************************************************************* 9 ?8 q0 x9 V+ Y% P* ntddk.h 8 w$ V+ D' A4 a*/ ! j! J1 H% \8 ] L* a2 Wtypedef LONG NTSTATUS; 3 E3 k0 M" G u7 w5 ?: H. Ntypedef ULONG ACCESS_MASK;1 J/ U/ O+ J* q4 ]; P& H0 w /* 3 R3 _1 y/ i/ _( L0 S* ntdef.h$ C, N8 G6 e% P t# Z! v0 n *************************************************************************& j8 V9 \1 g# P */' b6 d, _* Y# @3 l4 H6 a v ' j& o4 O+ d/ @1 s: j /* % ^; H% Y) K/ Q0 z6 P# H7 j************************************************************************* 3 T6 O3 G' C( ^/ i4 Z8 r* <> - Gary Nebbett) S, e4 S8 }% K+ g3 W! u( }) H8 k */ ! U5 \. l+ }4 L$ f c) H+ k$ M/ B% j& H typedef enum _SYSTEM_INFORMATION_CLASS2 N3 D/ a! |$ }6 k {5 k+ U$ F/ f: I. t) s' ?0 h! J SystemHandleInformation = 16 4 }; D9 }; b6 @+ q# t} SYSTEM_INFORMATION_CLASS;- h/ I( h8 i1 N1 E # M( I2 _& k6 w" L9 h/* $ d8 Z7 Q1 t( ^; j3 N*Information Class 16& Q7 a( D& N' P: h0 m0 N/ ? */( |1 r8 M6 [) _8 M' W typedef struct _SYSTEM_HANDLE_INFORMATION' J$ b& U- o' ]# Z { 1 w# F4 T5 m* @5 sULONG ProcessId; , m* @3 {* ?) H4 q! nUCHAR ObjectTypeNumber; 0 L9 N/ y/ X. I; l5 n7 {UCHAR Flags;3 c1 o7 c4 W8 ]' N' M! U; Z, M \ USHORT Handle; a6 X. h6 x% l$ z9 X9 k" TPVOID Object;" b# d' ~. X4 J9 l3 j3 |% v+ Y$ k ACCESS_MASK GrantedAccess;" S- X, r, }$ F7 X$ t } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; / v1 |# N6 c4 }$ b, ~! y& i" \4 K$ B8 m# F+ p+ N: 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; } 8 \, [" [; U" H% h( w% ]' W) N/** B0 J' B4 ~( n0 r' E ************************************************************************* " a* k. ?- I' U/ \# U. e* <> - Gary Nebbett ! _$ j; T6 ^( `2 L' q9 o*************************************************************************5 f3 e6 K8 }5 h2 a7 C5 x& \! y */$ V M$ w; W. n# R" Z0 t% o2 f) ? typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); 0 z' W! p9 `& C& a: [) Q6 E" v1 ztypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); 2 z( P% e5 m4 m/ ^# [6 J8 t; r0 S/************************************************************************+ G i0 g. Y& o7 S/ r/ x * *8 s9 y4 c2 \* N9 o9 K: Y * Function Prototype *' e" `, g( _+ h/ L * *5 O0 Y8 `( F/ Z+ n+ d. ? ************************************************************************/4 w( W2 }3 M7 u 0 E% e; x6 b& Y static DWORD GetEprocessFromPid ( ULONG PID );8 E4 K5 b9 y" o5 i" S! K% B8 f static BOOL LocateNtdllEntry ( void ); ( z8 Y! ^0 W5 m( T# k2 p2 H' J. L % n0 _% u" V. J4 |- ^+ l ( [( d8 X* c# T; R% ]* p/************************************************************************ - N: r$ J: R e; d0 W; N* * / g1 m% k+ z, L( @3 l5 x: Y1 D* Static Global Var *7 j5 k# A9 ]$ Y$ U' `$ f * * . e1 b% E7 T4 N' G6 j5 u************************************************************************/ ) n! V4 S' o9 X/ U0 j5 W) ~7 h0 ]6 |7 |' q- x0 s! g- o. m7 X static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL; 7 ]- U7 i. A6 I0 g* }, @- s6 ?static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;3 } J( s! o8 E ! }: T/ L# u% B7 [% U, v- _ static HMODULE hModule = NULL; 6 p. }/ D6 z# ~1 ^5 m7 y/************************************************************************/ ! A2 _& F% n8 L% f+ G* Y # z- V) Y0 Q! C: q % y: r- T: T7 a: D6 [- astatic DWORD GetEprocessFromPid ( ULONG PID ) % S- L4 j1 X6 ]& ~- u4 G{ 1 V7 x( v- x$ E+ HNTSTATUS status;) j! M+ ?7 L; |9 Q r9 F. F PVOID buf = NULL;; @% a, [) @ s4 m( T6 L ULONG size = 1; # y" o: ^+ Y& o: Y/ IULONG NumOfHandle = 0;1 o% V3 H4 L6 z, F- H2 P ULONG i;" c2 ?6 A3 O8 z% U PSYSTEM_HANDLE_INFORMATION h_info = NULL;. g: O$ u, G7 C4 t3 ^4 G% u - U1 C( Z: @2 x' y for ( size = 1; ; size *= 2 ) " Q, @ ?0 M" y9 ~' P" v9 l{ & ]1 `* G( {9 i+ t2 m3 l; Pif ( NULL == ( buf = calloc( size, 1 ) ) ) ; W! N5 l& \3 h% m" ?: L{ ) ?2 }' ]( |: jfprintf( stderr, "calloc( %u, 1 ) failed\n", size ); 4 V/ t# k* e0 x7 e% {- Ggoto GetEprocessFromPid_exit; " c; K6 D/ a6 H' n) I}0 t O7 v1 U' x& l8 X status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); 0 T3 T) a. l" b. h3 ~if ( !NT_SUCCESS( status ) ) 0 E- o2 w& v4 p) o{! ^2 W9 k, i2 L if ( STATUS_INFO_LENGTH_MISMATCH == status ) # h; K. k# V2 V1 E, K/ p{- A5 i) h1 A8 q$ v$ s5 T/ d free( buf );: L, `* q; u" i# ~6 O/ G, r, l. K buf = NULL; % o( O/ S5 t' X$ d' K& q. n2 j} ) o- i* e( m; X$ T; e8 Y. R/ `else# U* d9 y% B/ f! o8 [; C { ; [1 X1 {6 _/ `& bprintf( "ZwQuerySystemInformation() failed");/ Z) e F4 T% r( a7 T C goto GetEprocessFromPid_exit; " C3 }0 U% s Y} h5 e/ b/ u' s8 h4 V4 D }, n' L$ N/ m1 [- {2 j/ \ else) v) E- J) \8 _. ~: F { . U3 X7 m5 k$ w5 b" c) }break; ) e x6 Q+ e! z8 u$ e}+ h" E- I. C& y } /* end of for */ - Z% I- O q) o* t) C# R8 x7 _: n: x: f ?9 m. X J //返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组( q+ Q1 M- V: ^4 g/ B7 t NumOfHandle = (ULONG)buf;5 K; G* M- e4 l0 F4 m) c4 O( a ' c q0 |2 Q2 K# I9 `- gh_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);' c) k3 l. ?/ { ; c/ N# P2 m6 M' G# E' X: ?! a7 @for(i = 0; i {( P' `- O5 M. d* o if( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) ]1 @/ v! K+ x" b3 H( J( E {& y# n+ r5 d- C% ^' d printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); % B- s" x6 w/ b, n$ ]return((DWORD)(h_info.Object));6 L( F% A0 d" _8 [2 N' b# u }9 d7 m8 {, {6 A. M; r. H* X# C }3 A7 Q. I- {; L7 D GetEprocessFromPid_exit: : g# \) w) ~: O9 h% O& Dif ( buf != NULL )% x7 n' Q4 k7 `( v, A { k( o3 ?& @6 Dfree( buf ); % F9 r( K7 K) n+ V- B9 E( z% N9 g @buf = NULL; 9 M1 p. Q0 c4 W( H& e) [5 P1 L. q}: r4 B; b' c P+ o! \ return(FALSE); + m8 o; O+ x$ L( _- u% F s8 r}# h0 p! o' Y1 f: J& K' i * k0 I' x$ Q! J7 g$ d7 c& `4 ?3 d5 H3 ` /*6 I! e% e3 z7 R * ntdll.dll7 E$ R; h1 V; q- x$ ~ */$ P o a* |5 q static BOOL LocateNtdllEntry ( void ) ' R3 M3 i2 ~3 [ x$ j2 i+ U{ 2 A8 y D, V$ U" N1 ~5 }7 T1 q; oBOOL ret = FALSE;" A9 a* W* S, ?7 T char NTDLL_DLL[] = "ntdll.dll";; z% `# ~; e7 o$ j0 q+ @* X HMODULE ntdll_dll = NULL; : a- w4 j& y6 j( v% b* e3 f$ i7 u$ G6 L% s& _& k 6 d9 ]* i) ~. j9 V+ x1 E if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) 1 W% Z3 Q- }; q6 K{ R2 K8 E5 j- ?' i printf( "GetModuleHandle() failed");1 B; f6 ]; P6 \$ L$ k# R3 d: S) T return( FALSE );4 d+ M/ z7 W$ `% P/ _0 g: P. A }( u, A- n0 E+ P$ C: E3 e, X if ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) , X2 M1 W$ T( k4 Q4 O" t+ Y; P{2 ^ R/ j' Q6 ~1 V9 B goto LocateNtdllEntry_exit; C4 ~- ?# g( ^, l( ^} ) t3 j+ x# F9 H& S1 Wret = TRUE; 5 X) o) g6 }* r& g8 \: c4 H) j: @6 A0 Q ! T, _) M6 l- F4 r5 Q) ^5 iLocateNtdllEntry_exit:0 v( \8 `! J9 H" X( z7 @ 8 d. k* U; D$ R# A' L# Nif ( FALSE == ret )# ?& y& \# |! w+ z) V- P& j7 X9 b { h( m. n' C$ ~ printf( "GetProcAddress() failed");, d" K' K, k. V5 L } : {6 f! G8 D. _ntdll_dll = NULL; , o$ j5 L- ?$ {/ ?2 s; creturn( ret ); 3 e. Q5 ]) {4 V% W( N. w} /* end of LocateNtdllEntry */ ; K4 O9 h$ P8 i' j4 q [( @+ Y$ _! }+ q# C( V: M 1 L _* {. \: L. _% |5 Z( e x* P: z2 t int main(int argc,char **argv)0 l0 [# _+ z7 G3 z! P2 k {3 M7 k O& a$ `; j+ c7 z( _ 1 g+ G6 w Y9 f. }0 `$ @LocateNtdllEntry( );, x% U$ U Q% a6 y9 c9 ~ ; G/ A; u; U, c8 x+ p. r+ L, D2 \//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为59 \3 y' E) B3 B4 ? OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() ); : L5 d1 v4 ?' P( h " B! l. F8 ]+ Q/ f X E" HDWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); $ V: E5 N7 Z- n6 ?- S2 ~/ { * d; m5 ^/ u0 z# d* @printf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); : I$ O7 p! S- \. V: B* u) X" X1 v4 [9 {9 d, i8 ] return TRUE;! |2 W# W4 d" c3 R) @6 } }
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 12:10 , Processed in 0.416410 second(s), 52 queries .

回顶部