|
7 I# {" X V9 t2 @9 o. F
拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能
h6 Z4 z! Z J更加怪的是,我的win2k上本来可以取得的,后来居然不行了。
0 ~* B* O! {6 y; o# I; A而active ports却是那样稳定,有鬼不成 靠 ,偶不信! n6 x# {% q# q7 ?7 H3 V
搬出OllyDdg经过调试对照发现,程序不能正常显示就是函数的OpenPhysicalMemory导致不能取得信息5 M6 ]/ u( ~2 U% }1 |* Y
下面是active ports的OpenPhysicalMemory反汇编部分. q$ P: e" W# {' N( v5 U0 T
0040FCF2 8B1D CC124000 MOV EBX,DWORD PTR DS:[<&KERNEL32.MapViewOfFile>] ; KERNEL32.MapViewOfFile1 ^4 m9 k# a4 E1 h
0040FCF8 C745 F8 00000A0>MOV DWORD PTR SS:[EBP-8],0A00005 M7 f: s' ?$ ~/ Y3 E
0040FCFF BE 00100000 MOV ESI,1000& l/ ?$ D, C5 y
0040FD04 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
' b c4 w/ S I6 S9 u8 v) y F0040FD07 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
% V8 l) x) P; I* d0040FD0A 57 PUSH EDI
' y* g7 {9 }$ \' Q7 A, g6 x0040FD0B 57 PUSH EDI6 F" _) r% K/ ]
0040FD0C 6A 04 PUSH 40 @4 X3 s' y8 l' p+ U3 @
0040FD0E FF30 PUSH DWORD PTR DS:[EAX]' J2 d4 F. x" Q" q
0040FD10 FFD3 CALL NEAR EBX //// MapViewOfFile(*,4,0,0,0x0a0000); 1) map
4 _. e, S% R2 p1 d......... ///如果没map 成功 再改参数 map 因为我看到的都是一次map就ok 就不看了
& U6 \- p8 R7 F7 O* A! ?% U% b0040FD2E 837D FC 00 CMP DWORD PTR SS:[EBP-4],0
0 d6 T5 _4 w, o5 d o$ ~0040FD32 76 17 JBE SHORT aports.0040FD4B: q5 v6 k+ p/ @. Z- b- g/ ]: h# V
0040FD34 6A 67 PUSH 67
# x4 h2 c8 `0 m3 F3 c8 ` J0 D0040FD36 8D88 000C0000 LEA ECX,DWORD PTR DS:[EAX+C00]
. r) q k0 z2 M) ?- {/ B& L0040FD3C 5A POP EDX* }5 p& s' Y: M6 k8 a
///下面这段是关键部分了,也就是取得应该映射的起始位置处
& `7 M4 L* ~2 W0 q0040FD3D 3911 CMP DWORD PTR DS:[ECX],EDX$ t, g( L! n$ z8 V( r* n
0040FD3F 74 0A JE SHORT aports.0040FD4B
- ]$ E$ u1 W: t2 G0040FD41 47 INC EDI
. a# X& ]0 {5 @1 j" m- P0040FD42 03CE ADD ECX,ESI
2 y) R3 ]) B7 U0 ~: N2 f$ Q0040FD44 03D6 ADD EDX,ESI
4 W! `! y. u2 H8 Y% m$ ]9 }0040FD46 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]: i( Z$ J; a" N# W' e
0040FD49 72 F2 JB SHORT aports.0040FD3D
: s: Z1 y9 b, j$ L% K0040FD4B 50 PUSH EAX* L/ e2 ?; s' J
0040FD4C FF15 D0124000 CALL NEAR DWORD PTR DS:[<&KERNEL32.UnmapViewOfFile>] ; KERNEL32.UnmapViewOfFile
9 ?& s5 i ~0 v7 l8 e) ^) l0040FD52 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]. J% w! h8 J* C) U9 f
0040FD55 75 03 JNZ SHORT aports.0040FD5A+ U7 Q0 M: Q/ E) `
0040FD57 6A 39 PUSH 39
2 [6 N! l* \1 ^/ Y6 Q0040FD59 5F POP EDI
& N3 J8 L4 o' e+ u( f% V8 n; v0040FD5A 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]1 j( K( g' g& G! |. \* ]
0040FD5D 56 PUSH ESI
3 o- X* w) Y5 w- g& k" Z, i0040FD5E C1E7 0C SHL EDI,0C
5 S8 ]8 ` R& c4 B4 j; a/ e( G* o0040FD61 57 PUSH EDI
8 N' Q0 D @+ j1 q0040FD62 6A 00 PUSH 0 D" {9 h! ^4 b. w) I+ Z: D
0040FD64 6A 04 PUSH 4
, y: e* ` ~( Y0040FD66 FF30 PUSH DWORD PTR DS:[EAX]# m* n n/ l7 Z; W' m6 J0 j- F
0040FD68 FFD3 CALL NEAR EBX //MapViewOfFile(*,4,0,edi,0x1000);* d9 x- P$ R$ N; S, w
0040FD6A 5F POP EDI; f1 P6 o& v& Q% b7 _0 O% Z* k
0040FD6B 5E POP ESI/ S6 _' N4 C7 \' W+ m
0040FD6C 5B POP EBX9 i$ Z$ ?; z) d- Y! [
0040FD6D C9 LEAVE1 r+ U0 V$ X( ^, D
0040FD6E C3 RETN 9 ~' ~# G9 } n& h' {5 U
看完了反汇编,接下来就是写代码了 呵呵 就在OpenPhysicalMemory加上下面这点就可以了
8 x" M; s9 u, _' \; i: x: X- ]pMapPhysicalMemory=MapViewOfFile(pHandle,4,0,0,0x0a0000); ///第一次映射的,后面那个参数如果映射没成功的话,就需要变化。在我电脑上这个就可以了,就用这个算了 要写完善的话 自己改改
; M& N+ d# n4 a# A+ iDWORD d_begin=0;1 T) N+ [! U. B* T7 S$ u' K1 \7 Y
DWORD d_edx=0x67;
6 W1 V- l% n: P4 ~" j9 i2 t3 eDWORD d_p=pMapPhysicalMemory+0xc00;
: V- v& }) e Y" [while(d_edx!=d_p)! l( E$ I+ V" D6 |3 \
{
. m7 T5 x% ?6 C9 p' b* w+ Rd_begin++;. A6 j- ^3 x- Z+ N! v, [) }
d_p+=0x1000;
% K" o" n; w g$ m! h Zd_edx+=0x67; //// 这个0x67不知道是什么含义,请谁给个答案最好 :) Z' D- {: N8 Y; S
if(d_begin>=0xa0)break;( g) Y" s) [4 }; }
}
6 a' n" R% H+ q% vUnmapviewoffile(pHandle);8 e) J8 s4 D/ b8 H! D: @1 z' ~
if(d_begin==0xa0)2 |* t/ _; c$ L! ]; E
d_begin=0x39;$ n2 j, f t- ?* A. }
d_begin=d_edx<<0xc;& h( n' S) k/ v$ U, j
MapViewOfFile(pHandle,4,0,d_edx,0x1000); ) N% M7 j& Q& }+ w9 L
应该加上后就可以马上看到效果了,不会出现映射失败的情况。 $ g O" f* ~' ^/ G6 y
后话:现在xp和win2003都出来那么长时间了,也许win2k下的这个意义不是很大 :),这个偶也说不清楚了
' O! `* x7 J( h 如果你在做这个部分的时候遇到我同样的问题,加上上面的代码应该能解决,但如果你做的程序的稳定性要和active ports一样,建议你再仔细分析下它的反汇编。由于时间关系,我就不多写了
) C @* {; s$ C# m! I& ]# ] 在做这个的时候,偶有不少地方不明白的,比如为什么那个隐射地址要变化,是什么原因使得这个要变化呢?如果您能解释,还请告诉偶hhkkk@126.com ,偶在此先谢啦
; b# h# r# Z/ p% n8 n& W 那个0x67也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :(- c; Y9 W1 ^ s& R6 e# N
另外:第一次写点东西,比较乱,将就着看吧,也算作是个人的笔记吧。 |