数学建模社区-数学中国

标题: 《再谈进程与端口的映射》之续篇 [打印本页]

作者: 韩冰    时间: 2004-10-6 12:18
标题: 《再谈进程与端口的映射》之续篇

$ r( L3 j% U4 x9 u; v' l/ w 拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能 2 h i1 V' D; N5 b# S更加怪的是,我的win2k上本来可以取得的,后来居然不行了。 " F! v1 E# r/ M0 H7 R6 i而active ports却是那样稳定,有鬼不成 靠 ,偶不信 9 p z6 |; W( a; G. S- S5 Y搬出OllyDdg经过调试对照发现,程序不能正常显示就是函数的OpenPhysicalMemory导致不能取得信息* ?7 J7 E, E; c9 t+ |% R' c 下面是active ports的OpenPhysicalMemory反汇编部分, o" `; j" ]2 w 0040FCF2 8B1D CC124000 MOV EBX,DWORD PTR DS:[<&KERNEL32.MapViewOfFile>] ; KERNEL32.MapViewOfFile7 D" V) |( _% v6 M$ k6 ~ 0040FCF8 C745 F8 00000A0>MOV DWORD PTR SS:[EBP-8],0A0000 " [* }2 e3 Q6 z4 h0 a/ w4 X+ j0040FCFF BE 00100000 MOV ESI,1000 6 C) o8 j( U% w& x, R0040FD04 FF75 F8 PUSH DWORD PTR SS:[EBP-8]8 a0 C: f! s; I4 L/ W* W 0040FD07 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] " f! w& t+ G' [# E0 N6 p; q0040FD0A 57 PUSH EDI $ s1 G( R( R/ p, J, A$ B0040FD0B 57 PUSH EDI 8 j! I% n) m4 x, `0040FD0C 6A 04 PUSH 4 ; s, X& B% g7 q* l1 U2 t2 S0040FD0E FF30 PUSH DWORD PTR DS:[EAX]: |: a0 T. D: S7 o 0040FD10 FFD3 CALL NEAR EBX //// MapViewOfFile(*,4,0,0,0x0a0000); 1) map! D1 Z8 V, i6 @2 [ ......... ///如果没map 成功 再改参数 map 因为我看到的都是一次map就ok 就不看了 L \) i* v7 O/ \0040FD2E 837D FC 00 CMP DWORD PTR SS:[EBP-4],0" M' `' ]% f$ i& M2 F 0040FD32 76 17 JBE SHORT aports.0040FD4B 4 B+ V! i! K2 v5 M- Z7 U+ R/ Q0040FD34 6A 67 PUSH 67 0 P N+ P8 `9 z3 z8 T. T0040FD36 8D88 000C0000 LEA ECX,DWORD PTR DS:[EAX+C00]. @: X' M1 j) }; P 0040FD3C 5A POP EDX / D, b; O! y4 k4 s///下面这段是关键部分了,也就是取得应该映射的起始位置处 * W9 f; `9 Y6 T$ T1 W8 l7 D+ R; v7 m0040FD3D 3911 CMP DWORD PTR DS:[ECX],EDX O. Z( c- \# e( S3 x3 f M- Z0040FD3F 74 0A JE SHORT aports.0040FD4B 9 x/ V' M4 b& W/ ~0040FD41 47 INC EDI8 A9 ]" `, B/ Y6 v/ A2 T 0040FD42 03CE ADD ECX,ESI+ N, D" }% u9 G! T8 I% j 0040FD44 03D6 ADD EDX,ESI9 Z/ j' ?( r0 S$ q& X 0040FD46 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4] 1 R, _" [4 S9 p* J' e) F+ ~2 R3 q0040FD49 72 F2 JB SHORT aports.0040FD3D

9 J2 }. q' o! d$ l/ f4 p

0040FD4B 50 PUSH EAX \$ s" p Z2 m5 t- u; \0040FD4C FF15 D0124000 CALL NEAR DWORD PTR DS:[<&KERNEL32.UnmapViewOfFile>] ; KERNEL32.UnmapViewOfFile7 }2 E" f' D' s8 d8 Y 0040FD52 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]' y' m/ Z1 Z6 i; E$ }9 c8 X% M! h% H8 h 0040FD55 75 03 JNZ SHORT aports.0040FD5A + c0 K* i1 x/ r( \: Y0040FD57 6A 39 PUSH 399 e! ^0 _8 e: U+ Y+ w# I" n' I' e 0040FD59 5F POP EDI / r5 M3 r7 {) E* _: r) P9 ?0040FD5A 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] O- J. Q0 g3 r ` 0040FD5D 56 PUSH ESI & Z! u! k, G; J, f" ^+ l4 j0040FD5E C1E7 0C SHL EDI,0C V( Q3 N" U6 N 0040FD61 57 PUSH EDI # z3 \& J) c/ w. Q' i2 x x% R0040FD62 6A 00 PUSH 0( Q B) J/ _+ t, X 0040FD64 6A 04 PUSH 45 M! D, }' L0 ]2 O: R 0040FD66 FF30 PUSH DWORD PTR DS:[EAX] ' u$ ?7 z' B9 B v0040FD68 FFD3 CALL NEAR EBX //MapViewOfFile(*,4,0,edi,0x1000); 6 n9 B/ k+ s- ]$ W0040FD6A 5F POP EDI* x0 b* ?* }/ l8 e: J& {! u 0040FD6B 5E POP ESI / S$ z+ b4 \: h! t4 R6 k0040FD6C 5B POP EBX& ^1 J8 P! D% @" d5 l 0040FD6D C9 LEAVE 9 E3 R. ]2 P' t. D, }% C* S2 D0040FD6E C3 RETN

6 A' J+ y6 F# X! l2 R: q

看完了反汇编,接下来就是写代码了 呵呵 就在OpenPhysicalMemory加上下面这点就可以了7 n! P5 j$ |" O( N0 J pMapPhysicalMemory=MapViewOfFile(pHandle,4,0,0,0x0a0000); ///第一次映射的,后面那个参数如果映射没成功的话,就需要变化。在我电脑上这个就可以了,就用这个算了 要写完善的话 自己改改! E- M5 s$ ?, m) a+ h) i DWORD d_begin=0; |- e& V0 @. D DWORD d_edx=0x67; , s7 q' [2 d$ @DWORD d_p=pMapPhysicalMemory+0xc00; * g2 ^1 W) s# G$ f* v; ~2 J: Swhile(d_edx!=d_p) 8 ` x/ J5 [' F: r1 {) _' t{ 3 z; C4 ^7 V% T! i/ a. Td_begin++; 0 s. r6 p5 m# @1 fd_p+=0x1000;6 I& w6 y2 E# n( [0 { d_edx+=0x67; //// 这个0x67不知道是什么含义,请谁给个答案最好 :)( i8 R& Q' o1 h0 W if(d_begin>=0xa0)break; & D c% {+ b- u* N( N}7 V$ Z' ]/ U7 [' k, ~$ H% n) { Unmapviewoffile(pHandle);- @: L3 n, t1 |) F( g/ b8 |; A$ J if(d_begin==0xa0) a6 z4 e0 y) }0 _; Ed_begin=0x39; ; d0 l0 Y" E: _# t- b3 f& w5 Y1 kd_begin=d_edx<<0xc;" f4 x- [* U) j' X) q( z( a MapViewOfFile(pHandle,4,0,d_edx,0x1000);

9 |6 Z5 e8 ^8 |; I h

应该加上后就可以马上看到效果了,不会出现映射失败的情况。

: @' o& n+ Q. q0 l* O& k9 F1 s! D

后话:现在xp和win2003都出来那么长时间了,也许win2k下的这个意义不是很大 :),这个偶也说不清楚了 7 k% C1 R. }6 y, p8 w; b 如果你在做这个部分的时候遇到我同样的问题,加上上面的代码应该能解决,但如果你做的程序的稳定性要和active ports一样,建议你再仔细分析下它的反汇编。由于时间关系,我就不多写了, b. e& T D8 i2 I: `* z 在做这个的时候,偶有不少地方不明白的,比如为什么那个隐射地址要变化,是什么原因使得这个要变化呢?如果您能解释,还请告诉偶hhkkk@126.com ,偶在此先谢啦# k3 Q$ D, `9 P: m [& m2 e 那个0x67也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :(8 u* j8 D+ x7 J( \; x3 q 另外:第一次写点东西,比较乱,将就着看吧,也算作是个人的笔记吧。






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5