|
7 h& \! K7 _) Q; \拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能; H6 C4 \3 d, Z# i# q5 t& L0 K& J
更加怪的是,我的win2k上本来可以取得的,后来居然不行了。) [) o7 s3 a" Q+ i
而active ports却是那样稳定,有鬼不成 靠 ,偶不信/ A% m% M6 j: f6 M7 l
搬出OllyDdg经过调试对照发现,程序不能正常显示就是函数的OpenPhysicalMemory导致不能取得信息9 h" c1 j! s7 A3 R. M6 j
下面是active ports的OpenPhysicalMemory反汇编部分
3 [* c4 p8 n6 q7 C1 |( c0040FCF2 8B1D CC124000 MOV EBX,DWORD PTR DS:[<&KERNEL32.MapViewOfFile>] ; KERNEL32.MapViewOfFile
% i$ t6 r) Y- I$ H8 \ u. k0040FCF8 C745 F8 00000A0>MOV DWORD PTR SS:[EBP-8],0A0000. ~$ g T- D/ ]* q1 ?
0040FCFF BE 00100000 MOV ESI,1000% f3 p% Z9 `- F. y7 Q8 A5 M
0040FD04 FF75 F8 PUSH DWORD PTR SS:[EBP-8]; @! V, `6 M$ l1 y: h( Q: `
0040FD07 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
2 f' C, S& m7 s% a! ]; [; s0040FD0A 57 PUSH EDI
/ u+ C( r, D6 w7 o0040FD0B 57 PUSH EDI
! Z3 n4 u, j4 z+ s0040FD0C 6A 04 PUSH 4
" V' r A7 e/ ^/ k7 p( m, s5 U" T$ ~$ n1 E0040FD0E FF30 PUSH DWORD PTR DS:[EAX]
7 u4 z+ C1 f9 l9 }+ ?2 m) }0040FD10 FFD3 CALL NEAR EBX //// MapViewOfFile(*,4,0,0,0x0a0000); 1) map3 K4 ?1 W+ q: A3 ~. s7 X0 ]
......... ///如果没map 成功 再改参数 map 因为我看到的都是一次map就ok 就不看了+ |5 k' q0 Q+ [6 Y* |8 o+ Y) k
0040FD2E 837D FC 00 CMP DWORD PTR SS:[EBP-4],0: W* l n+ y' a: @& K7 P
0040FD32 76 17 JBE SHORT aports.0040FD4B( X5 m6 r n- G* `
0040FD34 6A 67 PUSH 677 p6 z' d6 U1 ~( l9 {" W( R
0040FD36 8D88 000C0000 LEA ECX,DWORD PTR DS:[EAX+C00]& V" r e/ N6 }4 F; E6 H
0040FD3C 5A POP EDX! R* I' X3 {0 I8 U6 r
///下面这段是关键部分了,也就是取得应该映射的起始位置处7 v& p" m9 n& Z2 b2 s
0040FD3D 3911 CMP DWORD PTR DS:[ECX],EDX5 j( |: R6 z5 C7 E
0040FD3F 74 0A JE SHORT aports.0040FD4B
+ F; J8 x* U4 }" `3 J0 o& e0040FD41 47 INC EDI
7 p9 T4 X1 [/ a6 q( b3 |- e0040FD42 03CE ADD ECX,ESI
9 Z, D& E4 T: g0040FD44 03D6 ADD EDX,ESI
* [- @% j' ?# t5 U( _% y+ W3 v0040FD46 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]
u* Q2 r* J% _' J7 F- m0040FD49 72 F2 JB SHORT aports.0040FD3D
5 t# Z$ a* _' ~3 ~9 @0040FD4B 50 PUSH EAX$ q B- _( o& Z
0040FD4C FF15 D0124000 CALL NEAR DWORD PTR DS:[<&KERNEL32.UnmapViewOfFile>] ; KERNEL32.UnmapViewOfFile- m. ]* [* u& \
0040FD52 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]
9 j" y5 o, n- N/ c- P0 m* f- }0040FD55 75 03 JNZ SHORT aports.0040FD5A6 I2 w( e; Z9 a; _& ]8 j
0040FD57 6A 39 PUSH 399 d- \! c9 ]) |0 u. u
0040FD59 5F POP EDI
8 ~% s: E5 ]! S7 B, O0040FD5A 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]7 \4 E3 v1 @0 U8 C# |6 C# X
0040FD5D 56 PUSH ESI L6 F% W8 I7 E+ r: s d/ d
0040FD5E C1E7 0C SHL EDI,0C
: M# u+ j9 `" f0040FD61 57 PUSH EDI
8 e0 K# P2 B6 t. Y3 {0040FD62 6A 00 PUSH 0- x4 G9 ~. x; a
0040FD64 6A 04 PUSH 49 x1 e5 \6 ^# H- v( J
0040FD66 FF30 PUSH DWORD PTR DS:[EAX]
' z5 h; |6 n- t7 n* D, v0040FD68 FFD3 CALL NEAR EBX //MapViewOfFile(*,4,0,edi,0x1000);" h& Z) t9 B) m! B/ U: F+ N
0040FD6A 5F POP EDI9 {& j2 o3 y: |* N r( u7 N4 i
0040FD6B 5E POP ESI8 U- a r9 A! Y
0040FD6C 5B POP EBX
, [+ l1 B& _7 v0040FD6D C9 LEAVE
& P, I7 P1 B! L+ N q0 m0040FD6E C3 RETN
+ g _2 [2 ?; ?/ c% n) ~4 k看完了反汇编,接下来就是写代码了 呵呵 就在OpenPhysicalMemory加上下面这点就可以了7 m, q! O% b0 S
pMapPhysicalMemory=MapViewOfFile(pHandle,4,0,0,0x0a0000); ///第一次映射的,后面那个参数如果映射没成功的话,就需要变化。在我电脑上这个就可以了,就用这个算了 要写完善的话 自己改改+ t5 G7 ]5 z& ^ \
DWORD d_begin=0;
2 P0 ^" M' h) r& pDWORD d_edx=0x67;
F* E0 ?6 T( p# ]0 ^, |5 b% M9 g- fDWORD d_p=pMapPhysicalMemory+0xc00;
0 U3 @+ ?' ?1 xwhile(d_edx!=d_p)+ E: i; c0 [8 b: B& d# B
{0 X+ ~5 A ]% M" C" ?- l
d_begin++;! P, c1 Z* I. G( d& s& _
d_p+=0x1000;" M0 l: l" V+ U! J9 Z. W7 y
d_edx+=0x67; //// 这个0x67不知道是什么含义,请谁给个答案最好 :); M2 S4 _( A& }: R; q$ q
if(d_begin>=0xa0)break;
! S' S* O R" b, O7 G}4 G4 q6 z" ]& P5 b. K' y
Unmapviewoffile(pHandle);5 Y$ j. [% e' \
if(d_begin==0xa0)# \. e+ G2 y* w k
d_begin=0x39;0 C6 f/ A L2 r- J3 x
d_begin=d_edx<<0xc;7 F* W- P& J8 r# i0 W
MapViewOfFile(pHandle,4,0,d_edx,0x1000); 0 T8 \* H* M( f$ x, {
应该加上后就可以马上看到效果了,不会出现映射失败的情况。
- y, \, S* ~& H+ y- R6 L后话:现在xp和win2003都出来那么长时间了,也许win2k下的这个意义不是很大 :),这个偶也说不清楚了5 ?# X4 q: b4 b( X" l
如果你在做这个部分的时候遇到我同样的问题,加上上面的代码应该能解决,但如果你做的程序的稳定性要和active ports一样,建议你再仔细分析下它的反汇编。由于时间关系,我就不多写了5 c* @& h% ]# |% x& ^/ k t
在做这个的时候,偶有不少地方不明白的,比如为什么那个隐射地址要变化,是什么原因使得这个要变化呢?如果您能解释,还请告诉偶hhkkk@126.com ,偶在此先谢啦
" B% z8 d" ?9 @: k+ W 那个0x67也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :(
% n0 B( l: P, B/ z, M另外:第一次写点东西,比较乱,将就着看吧,也算作是个人的笔记吧。 |