|
7 ]- Z+ X7 A) o" X9 d a拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能7 x5 e0 P6 {/ Z l
更加怪的是,我的win2k上本来可以取得的,后来居然不行了。
/ s; q" c) ?: q* S h; A) e& t而active ports却是那样稳定,有鬼不成 靠 ,偶不信! h. T. o' A O5 J8 ]& ?
搬出OllyDdg经过调试对照发现,程序不能正常显示就是函数的OpenPhysicalMemory导致不能取得信息* Y( I$ j# V/ ^. m. M8 R
下面是active ports的OpenPhysicalMemory反汇编部分
7 X+ d- t# S( U( q' Q) |- x0040FCF2 8B1D CC124000 MOV EBX,DWORD PTR DS:[<&KERNEL32.MapViewOfFile>] ; KERNEL32.MapViewOfFile- R+ q, {: M, r7 A ?/ o
0040FCF8 C745 F8 00000A0>MOV DWORD PTR SS:[EBP-8],0A0000
$ y+ g: K; n- p2 X1 }" G( X0040FCFF BE 00100000 MOV ESI,1000
! A/ q, y4 o1 m9 c: c0 ?, c8 S& Y1 V0040FD04 FF75 F8 PUSH DWORD PTR SS:[EBP-8]7 g6 p9 M& j- v+ ^7 ], U; i
0040FD07 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]: n- ~( n: N, N
0040FD0A 57 PUSH EDI
" j# E1 a0 C3 w \1 O0040FD0B 57 PUSH EDI: `3 a$ E+ I) t. T) r# S
0040FD0C 6A 04 PUSH 4
# a4 b; P4 j- n* {2 t. D; p0040FD0E FF30 PUSH DWORD PTR DS:[EAX]! z( Z. ^$ O1 r
0040FD10 FFD3 CALL NEAR EBX //// MapViewOfFile(*,4,0,0,0x0a0000); 1) map8 N+ k4 Q5 j% N7 z' N8 `
......... ///如果没map 成功 再改参数 map 因为我看到的都是一次map就ok 就不看了$ g3 I6 L+ a* J, X9 B
0040FD2E 837D FC 00 CMP DWORD PTR SS:[EBP-4],0& @- D" K) h% N i; a; o$ h, U
0040FD32 76 17 JBE SHORT aports.0040FD4B6 C. U3 J) k. \$ y7 _/ [: c* j
0040FD34 6A 67 PUSH 67
0 Z3 K! D# _2 C' F0040FD36 8D88 000C0000 LEA ECX,DWORD PTR DS:[EAX+C00]
: _. @' s: ?2 ]3 c) B. k: l0040FD3C 5A POP EDX
1 U% i; _+ T* n( e& x///下面这段是关键部分了,也就是取得应该映射的起始位置处
6 `' x0 z1 O5 F5 Q4 t0040FD3D 3911 CMP DWORD PTR DS:[ECX],EDX
/ z6 \( U# F; c$ s3 w: e9 }) S0040FD3F 74 0A JE SHORT aports.0040FD4B
8 h2 o" V. W0 d* E* c0040FD41 47 INC EDI
/ l% V; `0 @/ S/ E' x: `0040FD42 03CE ADD ECX,ESI0 V$ i( e! } l" _5 L
0040FD44 03D6 ADD EDX,ESI
2 _4 ]( h# x' X3 Y9 f0040FD46 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]' E& r( p) O7 Q% y
0040FD49 72 F2 JB SHORT aports.0040FD3D
) q5 o5 E/ G5 S7 J0040FD4B 50 PUSH EAX
8 X' ~5 L- D& W; K( a6 X0040FD4C FF15 D0124000 CALL NEAR DWORD PTR DS:[<&KERNEL32.UnmapViewOfFile>] ; KERNEL32.UnmapViewOfFile
7 T" M# ^/ Z' b) l$ Z0040FD52 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]* |) M$ k& Y/ A8 m5 a7 R0 c
0040FD55 75 03 JNZ SHORT aports.0040FD5A
$ j1 k% w) T3 a0040FD57 6A 39 PUSH 39+ n& o4 n( A' r% ?" c! ]" B
0040FD59 5F POP EDI
- S' {8 {4 P% c" q6 H0040FD5A 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
$ A v9 \1 P4 D( W6 f& U+ }7 x0040FD5D 56 PUSH ESI7 m) [' s+ u1 E9 S* ]6 x) Z K. _( Q1 f
0040FD5E C1E7 0C SHL EDI,0C
5 S4 \ u1 O; r+ r0 Z0040FD61 57 PUSH EDI# q5 H- f3 O0 _2 A
0040FD62 6A 00 PUSH 0
9 D& }, o: K, p. @, a' c6 w# @% E, V0040FD64 6A 04 PUSH 48 T' |0 E0 z4 s& ^6 \
0040FD66 FF30 PUSH DWORD PTR DS:[EAX]9 M2 j% ~; m( w: g! `' a" h
0040FD68 FFD3 CALL NEAR EBX //MapViewOfFile(*,4,0,edi,0x1000);
; C) J8 J/ G' K. o2 l0040FD6A 5F POP EDI
& T" [) C% X4 p- W6 f& }" i x0040FD6B 5E POP ESI
% s4 |& P8 v4 a0 l0040FD6C 5B POP EBX
8 m& J$ \; ]( A( j3 D0040FD6D C9 LEAVE
$ G' R; t9 ? e1 v. z# A0040FD6E C3 RETN
5 i, _3 [0 r! o# u& P W" l& R看完了反汇编,接下来就是写代码了 呵呵 就在OpenPhysicalMemory加上下面这点就可以了2 L+ J7 ^) _* O, Y1 e& o+ j1 H
pMapPhysicalMemory=MapViewOfFile(pHandle,4,0,0,0x0a0000); ///第一次映射的,后面那个参数如果映射没成功的话,就需要变化。在我电脑上这个就可以了,就用这个算了 要写完善的话 自己改改% t! l7 M+ h# h8 {! c% s* C
DWORD d_begin=0;6 m) f# U# T1 K2 X8 c8 x6 r
DWORD d_edx=0x67;7 D1 ]) x/ D( A& D' \% I
DWORD d_p=pMapPhysicalMemory+0xc00;* ~7 ~! [: N; l
while(d_edx!=d_p)
8 z3 { D. q* e" m2 g{! q7 p( L/ K, U1 p8 R! T
d_begin++;
$ D6 { U& y8 L, r& I, d* U. X+ Ud_p+=0x1000;
8 _1 W1 S; A" o* b! U Wd_edx+=0x67; //// 这个0x67不知道是什么含义,请谁给个答案最好 :)6 m& O y I: s! P$ p" z
if(d_begin>=0xa0)break;! D; ]& t6 e# ]6 ?
}" Q7 m' f6 A6 @
Unmapviewoffile(pHandle);+ ]1 P, G# h' \" Q" k2 C# g# G
if(d_begin==0xa0)
; E7 `- o z) M, [" H( zd_begin=0x39;& B3 p4 n: ?9 T, }, m" b/ x
d_begin=d_edx<<0xc;" ]8 R0 n. Y' M; B" X; d( i
MapViewOfFile(pHandle,4,0,d_edx,0x1000);
, a4 @* g' H% I& `应该加上后就可以马上看到效果了,不会出现映射失败的情况。
3 t1 {; |6 G( z* e% F" ]后话:现在xp和win2003都出来那么长时间了,也许win2k下的这个意义不是很大 :),这个偶也说不清楚了
+ D% s: I! k `' t 如果你在做这个部分的时候遇到我同样的问题,加上上面的代码应该能解决,但如果你做的程序的稳定性要和active ports一样,建议你再仔细分析下它的反汇编。由于时间关系,我就不多写了
8 @7 i) y) E2 L/ ]$ ^ 在做这个的时候,偶有不少地方不明白的,比如为什么那个隐射地址要变化,是什么原因使得这个要变化呢?如果您能解释,还请告诉偶hhkkk@126.com ,偶在此先谢啦9 ^1 x' R+ M5 _9 H$ i7 O' S2 Y
那个0x67也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :(
9 {+ A* x% c0 V$ \6 ~7 @ @另外:第一次写点东西,比较乱,将就着看吧,也算作是个人的笔记吧。 |