QQ登录

只需要一步,快速开始

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

获得进程的EPROCESS

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-10-9 14:22 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
文摘内容:- z: T. K: C2 r9 J# ` -------------------------------------------------------------------------------- / F4 J: k6 v) S* }% H2 U. q文摘出处:http://www.xfocus.net/articles/200406/706.html+ K1 v* L! f" C( Y ; V" L; z6 P% @* p8 }' O9 c 创建时间:2004-06-01* q7 ] E, H- V* F5 _% i3 R 文章属性:原创: K+ ^0 X0 ]8 W- E- [, j: q 文章提交:MustBE (zf35_at_citiz.net)# `% w& Y( F/ U/ R 0 s4 A1 d& z% {" C2 N5 NBy [I.T.S]SystEm321 H1 t; M; }1 ~: f) x* s / {0 x) S8 V, qWelcome to our web site http://itaq.ynpc.com/itsbbs/9 H: V* Z) n# u$ D, o9 t 4 m5 G( m' s, @% n thanks to SobeIt : P: Y( q7 R7 e3 x7 w# K --------------------------------------------------------------------------------------------- ( w: y$ O$ o5 f5 C( Y$ u; y3 H* l) l 每个Windows进程都有一个相对应的执行体进程(EPROCESS,也就是KTEB),EPROCESS不仅包括了进程的许多属性,还包扩了许多指向其他数据结构的指针,其中包含了大量有用的信息.本文仅讲述如何获得特定进程对应的EPROCESS,EPROCESS的作用及数据结构不在本文讨论范围之内.& M, l% s R' g5 W * o" x/ w' e: ^+ h$ c) _# W3 E+ r- w 绿盟高手flier在他的文章中提到,使用ZwQuerySystemInformation函数获取所有核心句柄表,线性搜索到进程句柄,其指向的内核对象就是EPROCESS。 . Q* z: ~7 t4 z8 L( w J( n9 Y- V3 B# u$ F+ l- `2 YZwQuerySystemInformation函数原形如下, E# W" ]. @8 W4 w! v6 J6 f# Z9 L7 x 3 M+ |0 C/ U5 c1 z" Z NTSYSAPI ( t1 S/ R- N$ R9 I$ i0 RNTSTATUS) X6 |9 N' C* l+ P% U NTAPI 0 S2 k9 T+ Z0 ~* C: g1 f/ @ZwQuerySystemInformation/ t" w. J- @; X8 W ( / M, [2 l' k3 p3 b- o7 aIN SYSTEM_INFORMATION_CLASS SystemInformationClass, 4 L+ ~+ p/ f1 C IN OUT PVOID SystemInformation, 1 p$ `3 P; J+ _! ^* U4 B( ^ IN ULONG SystemInformationLength, - _! L6 R1 @* _% U% OOUT PULONG ReturnLength OPTIONAL 8 z( Y+ e( F) D& d8 |% S: b );- B2 B( b, P* t 8 g/ S& U" T: e 参数意义如下 0 z7 x& z* y% N7 c8 C+ l " Z; @) L7 {1 m3 }/ uSystemInformationClass:被查询的系统信息的类型,SYSTEM_INFORMATION_CLASS的枚举类型之一3 s0 Q" b8 v5 ~ x- }# c % d4 V; ?: L+ Z# P+ b$ N3 \SystemInformation:指向一个接受系统信息的缓冲区的指针 . y1 U7 C& m) W& c/ |8 }& I. _2 B: @ SystemInformationLength:缓冲区长度" t3 C O5 H0 Y6 q " T: S2 J" E7 f( ~# jReturnLength:指向一个接受实际返回字节数的变量,可以为0: }/ j9 p! i2 h& F3 l7 p ) h* V" }0 M3 F0 I- e# [ 9 J5 ~# ^, y. v- r& u ~7 M 为了获取EPROCESS,我们使用SYSTEM_HANDLE_INFORMATION作为第一参数来调用 ZwQuerySystemInformation $ ^' I" }# r1 T5 _- H% w* O" t w! \ SYSTEM_INFORMATION_CLASS的结构如下) z, V+ L* ~! A+ \. w( l% z % H. E) \4 x, s/ X8 H typedef struct _SYSTEM_HANDLE_INFORMATION 9 b: g7 E1 w4 t; q{ 6 l$ p. B" |' I& mULONG ProcessId;. j, D% ~$ ~3 ^ UCHAR ObjectTypeNumber;5 F/ d* ~+ F. w C1 \3 s* S1 k& b( t- x UCHAR Flags; b1 O% R$ ~2 ?, S6 I USHORT Handle;( d( w+ V7 v5 r0 n8 Q5 y PVOID Object; 8 k/ Q7 b6 ] S* }ACCESS_MASK GrantedAccess; 6 x4 K% A2 f5 [3 ?} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;1 v; v5 Y6 V0 R- a9 R 8 ^' F+ |$ {' g' C3 Q$ N" R ProcessId:进程标识符 * O! }& {) X$ ~" m' Y. n# n% ?1 H% b5 S" l6 ]/ V ObjectTypeNumber;打开的对象的类型 : W( M# w6 c! f% W0 z/ _; C7 l0 V! K Flags:句柄属性标志 3 T, r G' H4 _7 t9 J J % L! \6 o, b1 U8 H( @* ?+ ?! t( G' cHandle:句柄数值,在进程打开的句柄中唯一标识某个句柄 : v! ]3 e* T7 D; v" x: H2 z# G: n. W# @6 v Object:这个就是句柄对应的EPROCESS的地址- `$ O/ F) a5 ~9 ?8 }+ } $ J2 h: h/ ]# v# N GrantedAccess:句柄对象的访问权限/ P2 z$ M7 f+ X) l8 g ! S( G! Q' G9 x& n- L2 d: N d7 P6 a, l+ \0 r 下面我写了一个小程序来获得EPROCESS( GetKTEB.cpp ). g/ R, b. t1 ?/ A; o # w. D' Q) |( H6 ]1 P7 X" X( s0 O比较faint的是程序写好后发现并未如预期般获得EPROCESS,通过调试发现ZwQuerySystemInformation()返回的进程的句柄中并没有进程本身的句柄 ( |+ O- H4 D( O- P f3 V, Q# t; Z8 o" f' h 怎么会这样?难道程序写错了?*_* ) `4 {, Z- `* Z) }+ {1 \# w 5 U* B' G- s& G- L现在只好靠SoftICE给出答案了,CTRL+D唤出SoftICE,随便选了个进程--QQ,让我们来看看SoftICE的输出 1 I( {6 ], v F4 O. `) | R2 k4 X4 y! \. k6 T, x1 Q! t4 ]4 T :proc -o QQ 5 t' l3 S8 P5 F% s$ ~Process KPEB PID Threads Pri User Time Krnl Time Status( d& X$ V, _* G% O5 l, h$ G! d QQ 827CD520 11C 2A 8 00000B90 000008D4 Ready ( |$ L9 w( m! w" \- Q) ]+ v5 x$ z- f" H. T ---- Handle Table Information ----5 p. n" w/ f! Q1 b 7 E& |& C- r5 {- h Handle Table: FFAD93C8 Handle Array: E2BEB000 Entries: 590 # B8 Q2 x0 k0 x% z& |2 ]% o2 A6 S( ^/ }0 x( |" B Handle Ob Hdr * Object * Type % h0 J' Y3 o" @9 q2 @0 [0000 00000000 00000018 ? E: N/ J2 ~( { 0004 E2DA5E58 E2DA5E70 Section ! Q6 i: y0 ~+ }* W0008 FFAB35C8 FFAB35E0 Event7 q4 L6 @, ~9 q 000C FFAB3B08 FFAB3B20 Event / S# q8 f3 G3 O" M- ?! b S' z0010 85C70188 85C701A0 Event - |* _0 W! p& e4 Y$ B0014 81515778 81515790 Directory 2 T- B% K: @" B3 L: C% C# W0018 FFAB7BB2 FFAB7BCA ?1 O6 S% a. ^ @8 v3 p) Z+ ^: U 001C 814A1858 814A1870 Directory ! ~! M- `0 S, a" o/ x0020 80288C88 80288CA0 Event8 k: o5 {4 K) {. Q# o) l2 \5 K 0024 E2CFE7F9 E2CFE811 ? 1 d1 a1 O2 E7 z0 l& k( ~ K- i0028 842D7B08 842D7B20 Event9 |8 j3 C" H) ?; v4 {. x( [ 002C 80E9B989 80E9B9A1 ? 4 Z& T3 a7 c! ]0030 E1372198 E13721B0 Section* G& t( M4 z) K- s3 X* {% i i( Y 0034 814602C0 814602D8 WindowStation * D. _/ `0 v6 N0038 81455CE0 81455CF8 Desktop! N7 t9 k" L& H1 M3 i' Z( c* p 003C 814602C0 814602D8 WindowStation " o% j, m' o1 F: z+ Z4 g6 H0040 E2B3C1A8 E2B3C1C0 Key" T5 f* }7 P: S6 F( W 0044 E286D6E8 E286D700 Key" x, r# ?7 V& ^9 a) `5 A8 y- s2 _ 0048 E2B3C0E8 E2B3C100 Key ' P2 e; J3 n# S, h# @004C E2B3C068 E2B3C080 Key4 ], w- B3 r+ k) v 0050 E2BEE688 E2BEE6A0 Key. ?" Z$ x: G3 R O: D 0054 8147C998 8147C9B0 Directory% P$ i; r& ~# A. }- D/ w5 ` 0058 829D1128 829D1140 Event 5 I; ~3 }7 Q' j3 a005C 83F991E8 83F99200 Event $ a V$ S5 ~) J4 j0060 E2BEE608 E2BEE620 Key( r H3 X8 D5 x' f! R 0064 FFB07568 FFB07580 Event : _5 P& P3 ~8 i% J% e' y0 H0068 801747E8 80174800 Event5 g) l2 t5 a" U% a* v3 Y" q, M4 k 006C 80174828 80174840 Event3 Y k* B f3 x# O$ b 0070 845E8808 845E8820 Event) ]( s+ w$ w8 x- U- H5 g5 q( u 0074 81448798 814487B0 Event4 m" c p3 B* }- B- S* w s) @ 0078 E2B9A888 E2B9A8A0 Key8 r; L/ u; x0 F9 Y 007C 845E8648 845E8660 Event % b4 X1 O# R6 j0080 FF9E2DB8 FF9E2DD0 Mutant 9 t6 G# ?5 J* ?9 n; o0084 FF9E2D58 FF9E2D70 Mutant2 @# e6 V1 x" t( ^* t 0088 83CFC378 83CFC390 Mutant / _/ s1 Y8 |5 h& Y' J5 K008C 801749B0 801749C8 File+ w% V3 g% u/ j, y# d6 w: ^ 0090 E2C48668 E2C48680 Section ! o4 r, L9 ~+ l* f) C0 l4 {! W! O/ t0094 FF965168 FF965180 Event a) s7 }& ?7 P$ L: t 0098 FF9E7D88 FF9E7DA0 Event ( N, {6 v& b- {9 o/ l009C FFAD3DE8 FFAD3E00 Event2 U+ T- v: Q; R5 ~ 00A0 80AD63C8 80AD63E0 Event , c/ @' [. E Q5 X; M00A4 E28073A8 E28073C0 Key' `5 J3 P; u, z7 `+ D- K 00A8 FF955588 FF9555A0 Thread # r, H4 @ r6 [, g+ V5 m6 R00AC E2770728 E2770740 Key 0 R# o* h) O& M/ T! s6 T0 d00B0 FF923438 FF923450 Mutant3 e& u4 j9 s/ h! x1 g! X7 ^+ H# @ 00B4 FFAE3B38 FFAE3B50 Mutant2 D4 G& d+ ~% o2 t* `# M* U 00B8 83B80728 83B80740 Event0 o; f9 \; {- u9 t0 S8 P/ L 00BC 83B80668 83B80680 Event& r( \3 n z8 u3 P$ ]) r% B$ r! X6 ~ 00C0 E2E3C448 E2E3C460 Section9 K8 W7 v( _7 t( S. ~# r 00C4 83776A08 83776A20 Thread, \. C' a1 y' w9 }$ I' L 00C8 81489E48 81489E60 Event: h* k4 `+ z6 Z) T) V" {$ H ~4 P" E+ I 00CC 83776CC8 83776CE0 Event % F8 }4 [/ g& B' w9 U# w00D0 83776C88 83776CA0 Event, `5 o- l- F( ]% R6 o& l* L 00D4 83776768 83776780 Event / R; i7 {: j1 r+ E, l- L00D8 E2837D88 E2837DA0 Key" }. ?4 B' t1 | h, O: Z! C( w 00DC 8146B3A8 8146B3C0 Event) k" q% ?. X# J+ r- A 00E0 FF908308 FF908320 Event / I6 N4 ~3 j0 M3 T; I! F( k00E4 81494868 81494880 Event 8 w! w) x% ^( S9 \00E8 FF9064C8 FF9064E0 Event$ C0 W5 {2 A- {$ K9 o, g) { 00EC FF908FC8 FF908FE0 Event 6 z" Q6 s- r/ ~( a: G$ w ^00F0 FF908F88 FF908FA0 Event3 \1 A5 ~/ C' Q2 {1 ] 00F4 FF955588 FF9555A0 Thread7 q$ V4 y% A) X 00F8 FF908F48 FF908F60 Event" [1 B; I" z; r- ] 00FC E2CB1558 E2CB1570 Port * N$ h9 u9 y1 m$ m9 [% U) A! ]1 d0100 FF90A2C8 FF90A2E0 IoCompletion( p X* \+ E* p( [: |5 Y8 G, U 0104 E2CFE708 E2CFE720 Port8 Y. a- A: g% q% \% y& d 0108 FF90A2C8 FF90A2E0 IoCompletion6 Y% j: h$ N+ l3 g" H: K& a1 E 010C 837762A8 837762C0 Thread: D2 \( |2 U; v6 `- A8 I/ @5 [+ E 0110 8103BBC8 8103BBE0 Event , G5 D5 S: J0 x; n3 n0114 813DBDB8 813DBDD0 Event - Z# b- i# K1 W; J4 }0118 FF814788 FF8147A0 Event1 |0 ^; Z& E" g- ]4 K5 p9 U 011C E1358DA8 E1358DC0 Key) E& x' J" f0 ]9 _; @, Z+ v) R- a9 c0 T 0120 E2CFC428 E2CFC440 Key : j; ]. z, {5 g8 k( i, [7 j7 i0124 8103B9C8 8103B9E0 Event e s5 V( `+ X' \4 K0128 E2C9A968 E2C9A980 Key # t, t, D& |+ d% N012C 83B34E88 83B34EA0 Event& b6 L1 o2 R0 R9 n1 O 0130 E2CFD948 E2CFD960 Key( h( f/ Q7 b- h& W7 i; ? 0134 83B34E08 83B34E20 Event ; a# h4 t3 A( s% B4 k( G.... ; j1 I s# f% F1 u* T9 c( D& W.....................省略3 w' I! t3 b0 m9 X 2 N- m' a; T" J8 X& \ 看了一阵,确实没有QQ本身进程的Handle,那么怎么办呢? 6 B5 k# i9 k2 A; u" N% F' n/ V) o& C0 U 想了一会儿...既然Win32子系统是由CSRSS.EXE来管理的,那么用户创建的进程的句柄应该在CSRSS.EXE里面找得到,用SoftICE验证后发现确实如此! _% E4 P0 Q: Y- N& h* `7 ] ! V5 w3 D w: Y/ C可是这没办法得到指定进程的句柄,和我所需相去甚远,只有另选它路# y+ z; X& T( V( l 6 T# r" F) W* }: e后来总算想到解决办法,既然没有进程的句柄,那就创建一个吧,OpenProcess()这个函数可以打开一个进程的句柄,正合所需. / I7 J: d# ^" ~, M }2 D! @+ ?# m* o' N j# i" Q6 M5 i 果然加上这么一句后,ZwQuerySystemInformation()获得了EPROCESS+ v: w" x* r0 P& z 6 ]( g! e4 g! L% n4 d; d 修改好的程序代码如下,获得本身进程的EPROCESS地址,稍作修改可获取任意进程 # k, M* u7 a3 I: W0 z( o: p3 H8 I: r% b7 _" X #include 7 y4 K! |0 E4 p0 k, i& R4 r/ s1 F o: c#include 1 p- b* n% M/ z" T#include & e4 S5 a/ r6 r1 B+ K3 K1 H #include , L- t' U$ A0 D& ?8 [* k R0 H& G' t+ S( v' k; {' g' O /*! g: [" l1 n' Z: E% v5 b" m * you''ll find a list of NTSTATUS status codes in the DDK header7 c- h; C6 C0 b3 [' C' L * ntstatus.h (\WINDDK\2600.1106\inc\ddk\wxp\) - ^+ f1 Q7 l& E o _- W*/4 O. d8 s* r6 z. ^7 l #define NT_SUCCESS(status) ((NTSTATUS)(status)>=0)- O9 ^- e& v& c #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)0 j: E8 C5 C4 J8 F; P #define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)% U0 x+ k, m, \. k) m # f" [2 F% o% D/* 8 X* g ]# q3 R8 T% c************************************************************************* - Z8 p8 y! |- x2 P* ntddk.h O% ~! a" X' v! [4 H7 j; ] */ 6 d0 C. r! M: g1 ]) e k" b5 Htypedef LONG NTSTATUS; 6 Q [7 D" P4 j; }% utypedef ULONG ACCESS_MASK;3 o6 O7 ~, R% c$ R$ G /*" O* o, d' ]" Y5 o6 w * ntdef.h/ S0 k) i# M W: `1 t5 |- s( A ************************************************************************* 6 Y8 M6 A+ Y" J3 X4 s2 W; B" W*/ * _' D. ?! N6 n1 z0 |7 {; D- s$ @/ G4 g /*# v- N9 o6 `8 n *************************************************************************/ I; c, P7 v0 y( G8 y * <> - Gary Nebbett 7 M N7 r& Z1 P; W! N* L*/6 E) @, y0 w) ^. D3 d) y6 ]3 c * n# a% T/ N( s( U( R% L" T$ ~8 s typedef enum _SYSTEM_INFORMATION_CLASS $ }" w8 }' t* n, A. e! a. T{( z, Y7 C$ h% T; M6 y7 y6 G; ` SystemHandleInformation = 16# j5 a- X6 l5 [+ e } SYSTEM_INFORMATION_CLASS; 1 v# h2 h" |! i 4 n+ V, O" j ?2 w/*, P: h" a2 U( u6 c9 E, @# l# W% m/ [ *Information Class 16 ; {' K2 D' v: i! B*/. U% X; e. }5 c% [ typedef struct _SYSTEM_HANDLE_INFORMATION & b5 L0 T* B1 l, o" y( ^{ 8 `( i( ]9 \- Z9 I% K9 b1 G9 w; g2 rULONG ProcessId; 7 y4 V) p$ @* j+ L5 m9 KUCHAR ObjectTypeNumber;$ O8 v1 v0 n' r: B$ J UCHAR Flags;. S; X& e: Q2 i# r( m5 ^" E; B USHORT Handle; # _8 r* g6 S9 c1 \PVOID Object;- c4 H0 W# B( S6 W5 z* A2 }+ h: y' e ACCESS_MASK GrantedAccess; % ~- T% b6 T) H" G} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION; 0 [3 t' [. y' M; n- _- n- O& ]1 ~ ?9 l; ?" R #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; }9 Q& d j t9 t, Y# t /*; k5 h3 k# D0 P( u' w9 N' W *************************************************************************1 R& i) A. K) V * <> - Gary Nebbett ) a" T5 {4 \0 o. b& i9 T; o************************************************************************* 0 I, t4 U9 `, i9 Y1 ~5 f6 _*/" m8 p2 H! s5 w" J; F: w$ ?3 L typedef ULONG ( __stdcall *RTLNTSTATUSTODOSERROR ) ( IN NTSTATUS Status ); 2 z2 I/ ]9 X8 g1 ?8 htypedef NTSTATUS ( __stdcall *ZWQUERYSYSTEMINFORMATION ) ( IN SYSTEM_INFORMATION_CLASS SystemInformationClass, IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength OPTIONAL );& e1 j2 x/ |+ G3 Y /************************************************************************ " t! \1 r5 t) L+ |# A2 p }* *# J. u3 f* O! t, y; i * Function Prototype * 9 A2 c4 f6 Q3 {7 f+ o* *7 S. d+ j! N5 J: A" i) P ************************************************************************/1 {% e( J8 u t/ c / u7 o: [: L& U: p I. Y; `static DWORD GetEprocessFromPid ( ULONG PID ); . u- E' c5 z: W+ P" Ustatic BOOL LocateNtdllEntry ( void );' E0 p3 L' H) n ~ - n& t2 U) j* k. C1 K $ e. T' I8 ^3 a f1 b /************************************************************************ 2 ]$ n' x, @( @* *7 B& p1 L5 r1 k * Static Global Var *' e5 M! r8 \. t2 E+ b, ? * *" k8 \8 p1 p9 M) Y- a: H$ ?' f ************************************************************************/ , k2 {2 x6 ?: v) r4 ]8 ] R- h! n! U, [4 A% K% K static RTLNTSTATUSTODOSERROR RtlNtStatusToDosError = NULL;5 U8 [* }. W5 |3 @5 {9 G static ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = NULL;. V8 X1 L$ d! D: p- V& f 2 }- z9 W1 Y6 f8 m2 [$ p+ i static HMODULE hModule = NULL;; }) x8 N" W1 Z8 \ /************************************************************************/+ k' F: F2 m7 m1 d o 9 N& r: S* }: ^5 `' i: H: G % z9 d; _" X5 ]( j2 `2 Y5 ystatic DWORD GetEprocessFromPid ( ULONG PID ) 0 W9 G6 g, N1 P% m7 X! b0 k1 G! Q{9 C, J! g$ Q2 |. D8 e2 G NTSTATUS status;) v+ ]4 p: O' r; ~8 g7 S PVOID buf = NULL; / P3 u& ]0 Y% g' {2 n. J' X& p, ]ULONG size = 1;& Y2 }# [6 [* m5 a6 [7 v ULONG NumOfHandle = 0; 0 k9 \$ ]+ U rULONG i; ( a/ a5 d* E: M3 _) d GPSYSTEM_HANDLE_INFORMATION h_info = NULL; ' {7 E; t" [9 u2 m( s1 h y( C. `; {5 E% h& C6 b for ( size = 1; ; size *= 2 ) * {8 f4 b! |( H' L* t5 S' a0 H{ / s" n5 C( i" ~, ?/ yif ( NULL == ( buf = calloc( size, 1 ) ) ) ( K, l, t z( U- y# V/ ~{ 6 q& O( s4 q1 } T! A+ P mfprintf( stderr, "calloc( %u, 1 ) failed\n", size );' C9 T- d) a( o% e5 K goto GetEprocessFromPid_exit;0 v+ T1 @1 V* p' A% ^+ b0 ^ K }% ^ F$ C: l' v% `7 l% | status = ZwQuerySystemInformation( SystemHandleInformation, buf, size, NULL ); ; z3 s3 Z* `, c, N% y/ Eif ( !NT_SUCCESS( status ) )3 J3 Y/ w/ x& R, ?% M- h# ] {. z' d6 G) d8 s4 Y$ n4 \ n/ a if ( STATUS_INFO_LENGTH_MISMATCH == status ) - U( c- Q6 O* T n{: {2 r; q9 K. \6 Q! Q5 r4 h! W1 ^ free( buf ); + `. q; R0 w, A' xbuf = NULL; . e1 j" r/ h6 S5 E' I( a' N1 y} ) Z9 h& }' x7 k. k3 ^9 velse5 H8 e$ h2 R3 Y' k- n- p t { ; @3 x W( o* Hprintf( "ZwQuerySystemInformation() failed");% K$ S' g& o0 t goto GetEprocessFromPid_exit;& V# h3 I' b( ]7 i6 g6 U! X5 n } / M' A0 c% I/ r9 e& R Q. P! y} 0 Q6 K; l$ X5 N3 selse . t4 D: T5 d8 k% a1 W; Q6 p! ^{ / J5 v# U V2 Lbreak;! l- r; x, J! [6 i' k& T. B }) K- ]% h9 Q: {' N4 ` } /* end of for */6 X/ F# v. y5 u" p& C. v7 c 7 E; h" o% r+ r$ J& T//返回到缓冲区的首先是一个ULONG类型的数据,表示有多少数组 ! y" `" k1 f" \NumOfHandle = (ULONG)buf;. `. S& N6 L9 @! U. a& l/ h , k, q9 m: I' \ h_info = ( PSYSTEM_HANDLE_INFORMATION )((ULONG)buf+4);5 i8 |6 w+ o- Y) c , ^! S- M7 Y: l# d5 b# m3 D for(i = 0; i { + i: @- ^% M/ Aif( ( h_info.ProcessId == PID )&&( h_info.ObjectTypeNumber == 5 ))//&&( h_info.Handle==0x3d8 ) ); _4 N2 F7 R3 }8 ?* P {* G. P+ [# B" l5 b/ P7 K0 D5 { printf("Handle:0x%x,OBJECT 0x%x\n\r",h_info.Handle,h_info.Object);$ Q" |$ R3 L `" x- x. g2 Y7 V return((DWORD)(h_info.Object));5 n0 R$ s3 t8 h } * G. A; M9 z8 u( P+ w}( e- m: H9 A3 t' @( N4 } GetEprocessFromPid_exit:! u" n* |. n# K% R& d if ( buf != NULL ) 5 `1 u7 k( n* t9 e3 S{. d {& H& x8 W. p free( buf );9 F% q" O* Y6 g' |4 \. J; ?* E buf = NULL;4 o! Y7 B7 z; |2 g+ { }3 L8 Z' D3 ]7 d, @' t return(FALSE); 9 w1 G) m$ p5 j6 ]% _! f}7 R+ W" A+ O5 i6 o% ^ ( e, S$ m! {" Y 2 L5 M0 ]& m1 e9 _+ i, h* d/*# d' @3 |% M& o! S2 b * ntdll.dll ; k0 u0 e& J9 P+ u$ a- y! ]*/% M" I9 f5 Z# u: r. S0 U1 \: T static BOOL LocateNtdllEntry ( void ) ( }5 g3 s3 o( y4 e0 L{ ! {$ E2 ~# e r; _BOOL ret = FALSE;. t; Y) Z3 r# d0 g& \$ m char NTDLL_DLL[] = "ntdll.dll"; 3 u+ Q) A; }7 k# A0 u' [HMODULE ntdll_dll = NULL; ' b9 m- _+ Y* _/ a+ z- s1 ~) w; M7 x/ B 4 \" G! v! Q9 ]/ r J, H( i if ( ( ntdll_dll = GetModuleHandle( NTDLL_DLL ) ) == NULL )$ [+ m1 O% m `3 T4 W { 1 ^9 g3 N0 ?* }1 E5 \5 ^9 V; iprintf( "GetModuleHandle() failed"); % G2 Z8 F _+ R! W/ |0 V7 t0 X3 ureturn( FALSE );% D4 P2 J& o5 m } o; R5 ?. P3 l% R3 jif ( !( ZwQuerySystemInformation = ( ZWQUERYSYSTEMINFORMATION )GetProcAddress( ntdll_dll, "ZwQuerySystemInformation" ) ) ) + g5 M3 D# R. F3 M- u{5 ]( G/ a& q4 Q& O% x0 q! Y goto LocateNtdllEntry_exit;2 P. Z s! R. ~2 b3 l2 V7 g; f8 W! o } + E0 Y2 K. u9 d& T& B4 @ret = TRUE; & B+ h1 n& ^9 l \ 8 g7 P* u& |5 J! E! @LocateNtdllEntry_exit: " N: s4 V) x9 h 2 k. v5 ]% Z: y& ~$ `( Mif ( FALSE == ret ) , g2 H Z' }6 Z0 D9 v2 z{0 z; v+ v5 p+ u+ I5 |) t% E- S0 Y printf( "GetProcAddress() failed"); 8 v9 _7 x+ x5 Q' w5 J" W" p} . k. g) D. w( g6 x( c9 Jntdll_dll = NULL;0 p; y! ^* v: H9 d; n: @ return( ret );: M: x" m/ m! Z% E4 P+ W! G' m } /* end of LocateNtdllEntry */ 4 r% O; D) |( k# Z! R8 A9 @9 S8 q+ N0 Q Y. T; q' ?. }4 \ 1 D1 k6 @! l4 ]1 Sint main(int argc,char **argv) 7 Y) e/ O- ]+ `; Q$ F7 N9 F/ O{4 b) I) l1 H8 A& N0 o5 t( q5 N 9 T1 i* L v3 V0 r: ~ H* _ LocateNtdllEntry( );; \1 q& p$ c* v% U* ?; J- M4 \ ! T ?3 l$ ]( Y7 z+ I' N//打开自身句柄,这样才能在handle列表中找到自己,PROCESS 对应 ObjectTypeNum 为5+ `4 h+ L5 u+ _5 p0 V2 G" Z4 N OpenProcess( PROCESS_ALL_ACCESS,FALSE,GetCurrentProcessId() );( d1 y/ n# N( K% I( Z 9 ]) e5 x7 E' N. ?" I DWORD Addr = GetEprocessFromPid( (DWORD)GetCurrentProcessId() ); 8 K2 d9 y# q6 o: B* z " L2 u/ a* ~6 b( {: Gprintf("result: Current EPROCESS''s Address is 0x%x \n\r",Addr); . k! s& W) m, n0 q& X" M, ]* J/ y. D2 h4 P: S# a$ E6 ~) J return TRUE;/ {( j+ o* H2 N( r3 Q }
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 00:37 , Processed in 0.411604 second(s), 51 queries .

回顶部