QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容: ) [8 c* a- N w: i$ d# v4 K5 g-------------------------------------------------------------------------------- $ @4 l4 K2 ^: _( ^( G文摘出处:http://www.xfocus.net/articles/200406/706.html . X5 o+ b" q! N* i2 O: |: E ! K# S6 S( A8 }$ x8 r5 k! o H1 t创建时间:2004-06-01 : Z( n, G! z9 L0 [' W) M {$ T1 K文章属性:原创 2 M+ l; r5 l; F0 i文章提交:MustBE (zf35_at_citiz.net)3 E+ q& k7 L5 S9 F+ j6 t3 x & O9 M. J9 F+ ~! ?7 [By [I.T.S]SystEm32 2 N' r- \2 ~+ k2 a) ~2 ~. _5 _% X 3 }4 o3 c) o1 P6 q. |6 |0 C1 CWelcome to our web site http://itaq.ynpc.com/itsbbs/8 |% P& J, j/ H) m9 l( _ : O! k$ J( z8 o+ o, z! s G- \thanks to SobeIt : P 7 K0 h0 h% E/ e---------------------------------------------------------------------------------------------) ]% j! k4 C& @4 k0 ?& h 0 V+ p( E5 ~' Q# n) R) a7 Z每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.- K, C. W% B. a8 |; H# C + y# R& R: ?* A% P绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。4 T$ h$ w" m, B! w m+ A U9 m' Y " a1 O& {& b" W, B/ ~" j: | ZwQuerySystemInformation函数原形如下 ' j3 W- x5 @ v4 s+ S+ e9 {! s0 P$ {' |0 i NTSYSAPI $ X5 J( I( ?* [5 y+ h3 c/ [NTSTATUS 4 J# m& H/ X& Q8 fNTAPI ) Z2 W4 d5 D5 ]$ H! mZwQuerySystemInformation 5 u D4 Q# N9 o3 }( 9 q% F0 y4 N kIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 3 Y* W. I8 L) d- K0 t' V6 {7 M IN OUT PVOID SystemInformation, |! G" Y u, D, B; t5 XIN ULONG SystemInformationLength, ( \4 s- x* l6 b0 P5 ^OUT PULONG ReturnLength OPTIONAL " e) v- v# Y" f! K! I);# J7 r6 A4 y; A" k2 g, a! C 4 R) [( P4 r* l- V# i参数意义如下5 \- w0 Z& W4 i8 i3 d * y$ Y: J/ O2 S* ]# l( ~# ~/ ^SystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一 # ~+ s3 I5 w V% R. j: L# _8 I; |; C; o# g. F J3 ^' [ SystemInformation:指向一个接受系统信息的缓冲区的指针 8 M; M0 j( M' p! W0 P. w- v" n2 H) Y% Q9 U$ }* s SystemInformationLength:缓冲区长度 . n$ z: M) h/ p8 ^% v # r; U1 z' L1 `ReturnLength:指向一个接受实际返回字节数的变量,可以为0( u" {' r$ H- P2 v* Z 2 u" S! p5 R3 D. [ ' J P; ]# M; Q+ E5 O4 i为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation$ S+ ]) U: n( }7 G & w0 P9 p4 `1 z; k7 U SYSTEM_INFORMATION_CLASS的结构如下$ w4 W1 E" y- \! D 0 F( D3 h, ]: S* L5 ytypedef struct _SYSTEM_HANDLE_INFORMATION ) R1 b, e7 m6 ?1 o: x0 n4 Z{ 2 E( t# k& e! p+ H4 q) GULONG ProcessId; + }/ @1 v$ b0 U# zUCHAR ObjectTypeNumber; : H g4 x8 d9 f F0 B' k8 aUCHAR Flags; ( O* l8 v( \: {USHORT Handle; 3 s' \# b; Q9 z, fPVOID Object; U$ ^; C/ O0 G6 ]6 x ACCESS_MASK GrantedAccess; 4 f1 u% Q4 r. W$ p} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;1 x" m# z1 c; I6 u: \; K: u" Z ! B" b# @8 |' Y& T f: E5 o ProcessId:进程标识符 H0 d: p- @( L5 R5 Y7 ]+ {' l$ R$ i# l, a0 _) s ObjectTypeNumber;打开的对象的类型 & \: x. ^0 b/ i4 h9 p0 T& [' X* [- F( D. e3 T6 \3 I) O Flags:句柄属性标志9 i9 d2 H: O' K, X* f( b/ ? * c4 Z3 ^; f2 V: Z% b' J+ i0 I9 NHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄& k, c0 X* L& i+ A7 Y2 Y . ]4 q1 D3 b- g% }# c! ~ Object:这个就是句柄对应的EPROCESS的地址% F9 Q' H# n: O, U6 `8 A4 p# B) L ) _4 B3 J/ _, ~# n6 }8 k5 u0 lGrantedAccess:句柄对象的访问权限 k$ t, E/ x# U7 B4 A & c+ K6 A/ s; ^1 S, _ / ]) x+ d% Y3 Y$ I- D下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ) : Y: ~* o1 D" ]3 Q/ @* _ , o4 e7 ~: T& |! }# D5 H比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 , z8 n+ d- w# Y & f( ~) ?. c7 n; o" x怎么会这样?难道程序写错了?*_*9 a; D0 |$ r* _: T8 v ( }8 L* a7 j3 ~- ~: P$ r! l5 m 现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出$ a' ~" w$ b7 Q $ ^$ g: o" a) j- P :proc -o QQ: p2 @3 l" ~; C Process KPEB PID Threads Pri User Time Krnl Time Status ! W/ c1 I" h7 Q5 XQQ 827CD520 11C 2A 8 00000B90 000008D4 Ready . A; ]1 m+ ]& m$ ` h, r 1 n' p& J% N }( n$ P0 b---- Handle Table Information ---- / W0 \8 S* P7 v4 v5 Y* U / M+ \: s6 k5 d1 v4 ]Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 9 T z H$ x D& h$ d# e4 M " i7 q$ O; @8 W$ T; EHandle Ob Hdr * Object * Type ; l8 _- v. }/ |% J% c3 f2 h0000 00000000 00000018 ? + h# X( X/ a$ J) M- V4 m/ `2 l0004 E2DA5E58 E2DA5E70 Section 9 w8 i0 w/ V# X% M4 x/ z" s0008 FFAB35C8 FFAB35E0 Event3 K# n/ L; {0 l! s 000C FFAB3B08 FFAB3B20 Event 2 p5 E$ t# q( s+ q0010 85C70188 85C701A0 Event% j R" i' H! @8 b! M9 q 0014 81515778 81515790 Directory" }+ \/ X% _# t 0018 FFAB7BB2 FFAB7BCA ?6 a1 `5 n# V O 001C 814A1858 814A1870 Directory # c% Y; Q0 }6 {6 [( ]9 W) }2 D0020 80288C88 80288CA0 Event) J8 H/ X, X7 g& e) Z. _ 0024 E2CFE7F9 E2CFE811 ?8 I8 Q, e$ Z+ F% X6 o 0028 842D7B08 842D7B20 Event: h( b' P: ?+ Q6 E7 {3 v 002C 80E9B989 80E9B9A1 ?7 c! |) r4 J4 G- t! r/ ~ 0030 E1372198 E13721B0 Section* ~$ J2 q# V5 z8 A7 | 0034 814602C0 814602D8 WindowStation2 Q1 u" i4 n0 a \4 ^ 0038 81455CE0 81455CF8 Desktop# p1 q0 o, W' k8 B% B9 y 003C 814602C0 814602D8 WindowStation% K" }5 P( t( D 0040 E2B3C1A8 E2B3C1C0 Key 5 K% o6 M/ ~2 Z& ~+ q, C. k0044 E286D6E8 E286D700 Key9 {; w% J% u3 \9 o0 j# |- Y 0048 E2B3C0E8 E2B3C100 Key; B! U3 K @ a% G' m 004C E2B3C068 E2B3C080 Key ' g( p2 ]) {" ]3 R" \2 |0050 E2BEE688 E2BEE6A0 Key 8 ~9 x- V. D8 `( M7 A! I0054 8147C998 8147C9B0 Directory. }+ X8 M* u9 R5 }, b1 Y5 Z6 q8 N 0058 829D1128 829D1140 Event 9 ^4 j1 H$ N3 Y+ X3 I005C 83F991E8 83F99200 Event * E+ H* `/ w7 D' d$ v0060 E2BEE608 E2BEE620 Key : ~: A: }) M4 _# t$ t- {0064 FFB07568 FFB07580 Event " O5 @8 A! Q! {4 u: B) h0068 801747E8 80174800 Event; N, N1 t! e( P- U 006C 80174828 80174840 Event8 w( d3 S1 h* z z 0070 845E8808 845E8820 Event 1 H# E& L k9 x/ z# a) X7 ?0074 81448798 814487B0 Event c! n! d) t) ` 0078 E2B9A888 E2B9A8A0 Key% n6 P$ q6 c% L0 k+ u 007C 845E8648 845E8660 Event' l p3 C. z) h$ V' ~5 D; h! h1 B 0080 FF9E2DB8 FF9E2DD0 Mutant2 G. A4 J3 \; ^8 `" _: n 0084 FF9E2D58 FF9E2D70 Mutant % j+ W7 D/ x3 B" ~: b, W+ l0088 83CFC378 83CFC390 Mutant. S _1 Q+ j% ?* ~. r2 W" D 008C 801749B0 801749C8 File8 H1 m/ A7 Z; l* R# } 0090 E2C48668 E2C48680 Section9 ?9 Z" D6 D4 [ N9 G% K 0094 FF965168 FF965180 Event8 a6 T- x% N8 F: M# ?4 ` 0098 FF9E7D88 FF9E7DA0 Event7 [3 y: O, B) l5 `) ]" F 009C FFAD3DE8 FFAD3E00 Event9 x& K1 L; j4 \& n+ n6 N: |) `/ Q; } 00A0 80AD63C8 80AD63E0 Event ; K3 X" J# s& i- s, T00A4 E28073A8 E28073C0 Key * L4 C9 A+ M* ?6 K9 p" G00A8 FF955588 FF9555A0 Thread e6 N9 n* P/ }2 Y* Y5 ^$ L- z00AC E2770728 E2770740 Key" r' A5 O& M0 D6 y& R6 C1 W 00B0 FF923438 FF923450 Mutant , a0 }- B |1 R" l, _00B4 FFAE3B38 FFAE3B50 Mutant $ J7 Z2 Y+ z8 ~3 o0 h: v g00B8 83B80728 83B80740 Event . T) ]: q. r5 F" b, N5 a% R) m8 q: h00BC 83B80668 83B80680 Event5 D" r! c; W) V1 k- q/ x& F 00C0 E2E3C448 E2E3C460 Section $ L* g9 p ]1 k9 S+ U5 T00C4 83776A08 83776A20 Thread 1 K# H8 q2 }. }8 m& v00C8 81489E48 81489E60 Event! m3 g7 O7 |2 i. w* ?% ] 00CC 83776CC8 83776CE0 Event ! b9 G2 o. S' v- [) h- {3 a5 m3 e( H00D0 83776C88 83776CA0 Event: L0 Y4 m! L! E& B9 c 00D4 83776768 83776780 Event + ?# v9 w$ h$ g) x) f5 V. p, I+ B00D8 E2837D88 E2837DA0 Key 9 i2 h* c, @8 V8 f( R; i: G4 Y00DC 8146B3A8 8146B3C0 Event # `: c7 D; r- e+ g+ {' e' Z00E0 FF908308 FF908320 Event, q7 m* \% {$ c! R7 Q1 B& E; ] 00E4 81494868 81494880 Event ( e' r. [& v4 I$ Q00E8 FF9064C8 FF9064E0 Event* q/ C1 C1 m. ^ 00EC FF908FC8 FF908FE0 Event 1 C" r- l! {% Y8 ~0 d00F0 FF908F88 FF908FA0 Event V0 a- |, B# S& B8 ?00F4 FF955588 FF9555A0 Thread" F( Y% ~1 N+ s: k* o 00F8 FF908F48 FF908F60 Event# ]5 @& q7 z/ O4 x' ~ 00FC E2CB1558 E2CB1570 Port + Z+ h1 l2 E$ @# z0100 FF90A2C8 FF90A2E0 IoCompletion0 F; r! O, H& s2 [1 T 0104 E2CFE708 E2CFE720 Port w6 G+ K* o3 A1 r0108 FF90A2C8 FF90A2E0 IoCompletion( Q6 v) {$ o O& T 010C 837762A8 837762C0 Thread ; h! T) @. q( o% w. j2 C5 q0 {0110 8103BBC8 8103BBE0 Event / @( @; N7 g1 p* \" z0114 813DBDB8 813DBDD0 Event; ^, I1 W' _9 r/ v: D4 r! q2 H, R 0118 FF814788 FF8147A0 Event! U4 h# p/ n1 M& y 011C E1358DA8 E1358DC0 Key- H' `" }- o, o 0120 E2CFC428 E2CFC440 Key, C0 o" ?: ^- r! `$ Q. P 0124 8103B9C8 8103B9E0 Event ( t3 {# L. S$ Y! r+ w0128 E2C9A968 E2C9A980 Key 9 Q& {- P* h C! q4 \+ K/ C" q }) {, o2 F012C 83B34E88 83B34EA0 Event5 \. F6 v- Y: P& O' x 0130 E2CFD948 E2CFD960 Key + z, r- a' ]# H x0134 83B34E08 83B34E20 Event 8 b0 B, g9 _7 {% q8 W.... + d* U3 o$ X* D4 B.....................省略5 z( s) A# w, H- F$ ]: q X 3 e9 q# r5 |' j7 f 看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢?2 ~: w- p: o' b- B" b. r % c$ j$ g" z- z1 A' k/ m7 V想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此9 r8 i0 M/ u) F( x% Q$ s* U& S ! |. b! ?: {* T 可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路* @) f' J: {0 L4 v 6 r+ H2 R4 s% z. t G6 Z: i- n后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需.- n5 Z9 Q$ R0 a4 N 6 ^" n/ k" }* o; ?4 h9 f果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS( u. r/ \; } H9 z: L+ p5 O5 T ' s' |; A* z5 p/ ^5 |4 K9 X 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 ! i& Z* p Z7 z. H' R4 E 2 q- H: X0 j# C# q/ j" C7 {#include + ]: E9 A7 w! }' @5 m1 t5 V#include 8 p. W0 t/ Y$ B- y: o# R% X* o#include - J. U B% \8 Q #include ! H6 e( r. z) `) e + N& r/ [, |, T, @, T/* + f5 q7 b& P3 q; n7 B8 R1 C& P( Y9 i* you''ll find a list of NTSTATUS status codes in the DDK header$ ^6 X/ t/ p5 h$ Z * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\)- q, h9 O/ n) m! e- [ */) I% ]2 O9 d. g U6 a; D #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0) 3 A7 `! a A4 M5 c- ]#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L): I9 @2 W1 I- ?& T& G7 ?) J0 L #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L) # n' Y2 Q% r0 H6 r( ]- R$ @2 Y7 m! {8 s( x8 ` /* % f7 R" D$ o1 e3 `************************************************************************* O1 f1 D9 b. R2 d$ w* ntddk.h9 t( _+ h4 u/ w8 ]& ` */$ j+ V) z5 M9 P& q" i v {; D typedef LONG NTSTATUS;0 l" }' o- f% B2 o typedef ULONG ACCESS_MASK;- `! c# t/ r4 b: i1 ?$ ^/ [ F /* , T( u' g; H) d Q- a" X e; D n* ntdef.h& W p$ \+ |9 k4 s ************************************************************************* , m' a \9 ]) ?. w$ L9 [*/2 j) t T5 O- t6 p4 p/ |; o ( O3 \/ I( b0 x /*0 b8 b8 x5 s: Y' L# T *************************************************************************# f; G9 B+ p+ B* t* z3 i * <> - Gary Nebbett " k; C# z: s6 u( `! z- m2 b*/ & J/ k- Q) D# B1 e: ~% [ 9 O" ]4 t& d! F; I; Qtypedef enum _SYSTEM_INFORMATION_CLASS; \2 B& Q! ^% ?$ ~& v4 g9 _ {# p$ w2 _! P3 S5 x0 { SystemHandleInformation = 16 v( V* X& B& |6 d. c: b } SYSTEM_INFORMATION_CLASS;3 D1 Y$ }3 i2 c/ M7 u+ g4 u! b / C4 o6 k8 r4 o/* " w- D2 a2 }# f*Information Class 16) u1 F; Q2 V2 D/ s; [( S* K+ N */ 5 r d, H( `- T/ H+ U; i5 O6 mtypedef struct _SYSTEM_HANDLE_INFORMATION! [. ^7 @$ X' e( m {' F6 R% M% D k6 S. F0 m1 z ULONG ProcessId;. ?+ S/ |3 x3 ^2 d, r7 g& ~! i6 J' k0 P UCHAR ObjectTypeNumber; ( l- P, d9 t0 Y1 y. {UCHAR Flags; 6 Y5 c3 d6 H3 X. c V' |2 cUSHORT Handle; - B+ \+ w4 L! ePVOID Object; ) ~- l6 R# k r+ b' nACCESS_MASK GrantedAccess;8 D( A7 Z' _3 w( @6 Z. D: Z } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;4 K$ s2 m7 N$ f" C - E% m6 {7 A9 D1 f% D #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; } 4 a4 f5 A4 F2 x U/*& g/ M! [' Y% V0 u" ?* [ ************************************************************************* # @3 B/ c+ n5 W3 \0 R! ]* <> - Gary Nebbett. f1 d$ q! r P; l; v t ************************************************************************* # c+ M/ Q! r. K% m* I% i8 k# E*/6 J( `' Q0 y6 |" g typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status );, X' [: K) T; P( |4 D5 |* o3 h# R typedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL ); 6 [ e* _( L0 c; C0 _/************************************************************************) t+ w, Y8 r3 e- Y) n1 h * * 2 ?7 |6 |+ S/ r- O* Function Prototype *; U4 P) i8 p! o0 O& i * * + Q) E3 J3 H! {% f% e" v7 b************************************************************************/ . z3 G8 |: f8 v/ _, [0 k, ~. q9 B% M M0 `- ` L static DWORD GetEprocessFromPid ( ULONG PID );5 Z$ l0 y6 O% n4 e1 t/ U: b static BOOL LocateNtdllEntry ( void ); % s2 _+ m; j j2 P% J 1 E- x" p2 W; l. Z* @; ], y2 k" G1 V7 x! h/ n8 g /************************************************************************6 f& l: Y9 ]- \; x+ t * *0 ?8 v# \7 g1 Q3 ?5 O( d * Static Global Var *. D2 J" P7 J! v * *) S2 d" u# D, e) w7 Q ************************************************************************/ 4 G5 L/ ^/ _: r, G5 v1 s7 u6 U6 d4 b3 H" h1 A R static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;# [, A& C% y; l$ K8 E( X: M9 |* J8 P static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL; , F4 Q' F. K3 C4 z5 ]( H$ T0 D $ M( @1 i% E; ~static HMODULE hModule = NULL;2 k3 D& p! h9 @) T6 x, r- o /************************************************************************/ ) J" N% G) C# Y$ s; c 3 _$ {& P, ~3 R; L: p . ^. S, z7 V7 c/ A' |4 jstatic DWORD GetEprocessFromPid ( ULONG PID ) - g! o( `9 `# L6 q T. A) b+ {{ ' Q' H6 O% `) E" g5 M! sNTSTATUS status;9 `& g' D9 l- G2 L/ i0 w5 ] PVOID buf = NULL;$ ~6 k& I, |: ]) ?' w5 P L1 X [# v ULONG size = 1; * b9 F% B: g- ]ULONG NumOfHandle = 0; 7 Z) u( `6 i) G! G9 H6 a VULONG i;6 q: q9 H0 c# l PSYSTEM_HANDLE_INFORMATION h_info = NULL;+ E/ U! W/ T: m) {8 o8 a$ z7 x : C" b! m9 B) r* w* c4 h' S c/ }- Cfor ( size = 1; ; size *= 2 ) - x0 }) e1 [( Z$ M) V4 t0 f{ 5 E F# V. V1 t2 U& Y. N8 y5 Kif ( NULL == ( buf = calloc( size, 1 ) ) ) - N: \% t. n$ j0 S2 Z- n7 s{ 4 h! V4 f$ b' m% N5 jfprintf( stderr, "calloc( %u, 1 ) failed\n", size ); ' h! d4 b( h; e; Z' v7 F& Ngoto GetEprocessFromPid_exit;) Y3 W( |+ S Z" J+ X7 Y } 1 {) g9 X( ^& w$ `2 g9 nstatus = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); 2 P7 p5 W$ E; }, T, v( oif ( !NT_SUCCESS( status ) )9 [( G' ^8 H2 q% C# E$ {$ r( i {9 @! G1 A$ N2 L6 U1 A3 j \+ c if ( STATUS_INFO_LENGTH_MISMATCH == status )) Z0 r- ~& X3 p; e) i/ e {. x1 S. p. ]% Y' m! V/ E free( buf );. ^( Y" o& s- }" g. } buf = NULL;% t7 k) [' w0 O9 y6 N4 e* B } 9 o" r. l' k' W* E0 r% C4 Selse 8 l" m4 ]- J! g1 Q1 Q- C{$ P S# S- o8 B" _# `) A" L! } printf( "ZwQuerySystemInformation() failed"); ; q/ t* t* i! J$ o; \5 ]5 t# K& rgoto GetEprocessFromPid_exit;) I5 d- ~, ]+ O) n% p, O( \& ` } * t. L" I; ]7 x} 6 }& _, i& r R0 {/ p0 u- L( ~: Gelse0 C" P3 k# K! Q) P4 _& i' ] { , \% c, N; G5 s% t5 ~break; 2 S8 G0 E) e: r3 P8 l8 p8 N! x# [}- Z9 [" J. r: y! ] l) E } /* end of for */ " h& p$ r! s+ B! j- o0 x) f/ K9 A. h& F8 @# B3 f* `3 _" O; b //返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组( t% T5 R; X, s6 ]4 L$ f% t NumOfHandle = (ULONG)buf; 3 f4 I6 O: P+ ]1 t: t8 m8 A( [- u: M5 i h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4); 4 |1 @/ n$ C! T" b. X2 X) f1 w$ B 6 t1 t0 k5 A5 B. G3 [6 q5 ufor(i = 0; i { 2 K$ r, q' ]" s5 E2 iif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ) 8 Q2 a b! e+ }{1 i0 `6 \6 N" [$ W printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object); 6 b- J# {( p3 L) u( Y8 zreturn((DWORD)(h_info.Object)); ' Q/ |) N7 ]: G# A. N} G# a+ X f: J4 g/ |- \ }# v! ]1 g/ U3 W" g6 ~ GetEprocessFromPid_exit: * B# R' N: e T1 c. a8 ?if ( buf != NULL ) : q2 d4 A j' |$ E9 p2 A{ & L! B) e) W. ufree( buf ); 0 l" g# ?; A6 _. S: [8 xbuf = NULL;& ~' B& x8 V9 Q# k7 i } % t8 k' K ]# z2 k) s" |return(FALSE);+ Z- T) m- C2 } }! g/ J; J0 S" S: C: K # ~! O$ M. o7 Q( q$ O& `& r8 I2 K5 b! I5 M7 k) o3 ~5 O /* , s+ g+ o3 \& C2 `* ntdll.dll . u8 K+ j0 _ x, B) _' z4 a*/0 v: _9 H9 B* \2 U& J r: Z static BOOL LocateNtdllEntry ( void ) , w' F9 P( q$ _7 y8 t- r N{ % K# e+ F1 J9 d# H5 [- BBOOL ret = FALSE;; E+ m! L. ]- x B$ ^ char NTDLL_DLL[] = "ntdll.dll";: ~2 B2 u/ a# L' |0 g% U HMODULE ntdll_dll = NULL; # `7 B- B& M* X* p7 ?' m& q _. C: K1 T) {& F' x/ `; T 3 W' G$ `* P9 d+ ]- W1 f+ `if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL ) ; r; h' K+ ~5 Q U9 _& F% d9 c{4 c; e O0 Y2 V x" D printf( "GetModuleHandle() failed");2 N/ i2 |# Y! `! i& l9 [' u return( FALSE );- W9 Z* I# l* e+ E } 6 A) g% {7 B( L( Z* Z% kif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) |$ J' C" J* L' G5 D' D{ q, p; k1 b# F; ^8 _+ sgoto LocateNtdllEntry_exit;/ t1 X) K, P7 z+ p& N3 k } - }- }+ D& `4 R" v/ ^2 |( ~, |ret = TRUE; A! C2 C: P7 w+ T+ T l4 s2 x# k7 M- @0 p LocateNtdllEntry_exit:6 E/ W w) d7 p6 Y; N ( |) k' S2 R- d7 i0 m9 A9 tif ( FALSE == ret ) ) A0 j8 o: k' x3 _{ : _5 M6 I. O) K; T) Yprintf( "GetProcAddress() failed");+ K5 G2 P2 L, c+ { } 4 t- E/ c7 t" U: T' Z& sntdll_dll = NULL;8 k& y% a9 x6 N o return( ret ); ; G# ^+ q6 u. P( q$ V} /* end of LocateNtdllEntry */' n8 ]& {" {: U' ? ) b, B" V! `: {4 K( f! }# P$ i2 L7 X3 Y4 D2 N G M int main(int argc,char **argv) 9 n/ Q6 ~ S& D/ \0 }9 a( z7 C{ - F v9 s" o6 Q* I+ e ! e0 R" d! L5 R" V4 c# ZLocateNtdllEntry( );/ e; x/ r R4 g 5 Z# F( @& F# O5 H% J8 s! {, O/ a//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5" t; G- b+ L2 k OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );3 `; n* F, t5 t 6 ~4 }3 V9 `: \" H DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() );: d+ @5 g6 ^7 V * q9 X- b- b' Qprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr);4 }: {1 u* i U5 e4 W1 M1 ~ |. K! a% W0 d% c return TRUE; & k; S; k+ u. ?+ w" M7 o}
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-11 11:51 , Processed in 0.418652 second(s), 52 queries .

回顶部