|
! [( Q# ~& D% H. p8 W( _
拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能& j2 Q K2 z) w( P* n7 [4 P& a6 V
更加怪的是,我的win2k上本来可以取得的,后来居然不行了。
) Z7 U0 ]# s" i( K- Y0 j. g而active ports却是那样稳定,有鬼不成 靠 ,偶不信
a. f$ f0 L Y: J) g$ |% E p搬出OllyDdg经过调试对照发现,程序不能正常显示就是函数的OpenPhysicalMemory导致不能取得信息
5 l2 W, `+ N, d2 p' G+ _下面是active ports的OpenPhysicalMemory反汇编部分% `& y* g5 W9 F$ V7 R% E
0040FCF2 8B1D CC124000 MOV EBX,DWORD PTR DS:[<&KERNEL32.MapViewOfFile>] ; KERNEL32.MapViewOfFile8 g O) q7 j+ d( E' w- W
0040FCF8 C745 F8 00000A0>MOV DWORD PTR SS:[EBP-8],0A0000
, O% A. ~! F9 h/ Q0 V) _* Y: ^+ d2 ^0040FCFF BE 00100000 MOV ESI,1000- v! i; f. w; ]+ E7 C- J, I
0040FD04 FF75 F8 PUSH DWORD PTR SS:[EBP-8]" W: R& X0 t* S' q3 g
0040FD07 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]$ s% ^' W0 ?" V) `. H. x
0040FD0A 57 PUSH EDI. d* y$ z5 ~4 `0 ?7 A
0040FD0B 57 PUSH EDI3 [8 S+ Q7 A" L, ]) D
0040FD0C 6A 04 PUSH 4
1 r6 e; j2 @7 q( b6 l! m W: a% v0040FD0E FF30 PUSH DWORD PTR DS:[EAX]6 c' `& `. b+ _6 C" L6 B
0040FD10 FFD3 CALL NEAR EBX //// MapViewOfFile(*,4,0,0,0x0a0000); 1) map
) |! u) b N1 a3 P& v......... ///如果没map 成功 再改参数 map 因为我看到的都是一次map就ok 就不看了9 V3 U. k$ S! b: P. H; P; W' h
0040FD2E 837D FC 00 CMP DWORD PTR SS:[EBP-4],0- m5 m. E( |0 w
0040FD32 76 17 JBE SHORT aports.0040FD4B" ]3 e$ N& F: w( b2 _6 j4 a: V
0040FD34 6A 67 PUSH 67
7 B1 `% j$ w& }4 G: K6 Q$ I- m6 [0040FD36 8D88 000C0000 LEA ECX,DWORD PTR DS:[EAX+C00]1 W7 s& t) t- H; [
0040FD3C 5A POP EDX2 b. ~& a% Q0 C: \
///下面这段是关键部分了,也就是取得应该映射的起始位置处1 o( t d: x( w$ z$ H( ]6 h$ b
0040FD3D 3911 CMP DWORD PTR DS:[ECX],EDX
( E/ e/ F; B8 g6 a# ~/ h9 g0040FD3F 74 0A JE SHORT aports.0040FD4B
/ |4 q% Z* x- F3 d0040FD41 47 INC EDI% F5 E# r) {, X& G5 l
0040FD42 03CE ADD ECX,ESI! \( j: K% m" p% L2 n, B/ s" P4 `
0040FD44 03D6 ADD EDX,ESI
( X; s& y( Y3 s$ D/ V; ], _, S0040FD46 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]
1 U8 K9 V$ w$ J0040FD49 72 F2 JB SHORT aports.0040FD3D
% ]1 P( f0 ?" b, U0 l' g' e0040FD4B 50 PUSH EAX
: [2 s# y" u7 y7 k; l' ^3 a: E0040FD4C FF15 D0124000 CALL NEAR DWORD PTR DS:[<&KERNEL32.UnmapViewOfFile>] ; KERNEL32.UnmapViewOfFile! A1 s% @5 c* q2 H7 n4 h
0040FD52 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]; Y1 C0 h: D" S* e
0040FD55 75 03 JNZ SHORT aports.0040FD5A
* r+ p* _2 }4 _0040FD57 6A 39 PUSH 39
7 y1 d* A/ y/ i$ h* v& E0040FD59 5F POP EDI
) H- Y/ v2 ^# I% ~2 H0040FD5A 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]/ W# t- }8 @8 F X' W
0040FD5D 56 PUSH ESI
- F/ R" P* O: d1 n; X5 ^0040FD5E C1E7 0C SHL EDI,0C3 Q) x. s N" b, [8 x7 Z
0040FD61 57 PUSH EDI
! X& m$ ?* q! G0040FD62 6A 00 PUSH 0
! A2 C" G" g$ w0040FD64 6A 04 PUSH 4! d" @9 |" @4 n& \6 x8 `- |: I% W9 J
0040FD66 FF30 PUSH DWORD PTR DS:[EAX]
_, ?$ N/ Q; @% @/ @' X0040FD68 FFD3 CALL NEAR EBX //MapViewOfFile(*,4,0,edi,0x1000);
; j6 a+ J* ~8 u5 }: E) u0040FD6A 5F POP EDI
2 @$ D. `+ W8 W7 N0040FD6B 5E POP ESI
, }: f, p5 n. p- e! }; t0040FD6C 5B POP EBX6 w$ A& g9 x6 g$ r. d, n" ^7 e
0040FD6D C9 LEAVE3 |: F( t3 y8 O% l" T
0040FD6E C3 RETN + M1 D" l7 h2 F2 R
看完了反汇编,接下来就是写代码了 呵呵 就在OpenPhysicalMemory加上下面这点就可以了
% M4 z3 v K. {/ T/ JpMapPhysicalMemory=MapViewOfFile(pHandle,4,0,0,0x0a0000); ///第一次映射的,后面那个参数如果映射没成功的话,就需要变化。在我电脑上这个就可以了,就用这个算了 要写完善的话 自己改改
: u9 D% P* \& R$ |; vDWORD d_begin=0;
0 [, q3 x; v+ Y6 w' O5 Y+ x/ c. [DWORD d_edx=0x67;
( c& q( o* T' P8 K+ A; [DWORD d_p=pMapPhysicalMemory+0xc00;
$ ^0 N" i$ _- Mwhile(d_edx!=d_p)* l! o1 \+ {" K' @
{+ J+ Q7 _+ K! b
d_begin++;5 }3 }. `, _, K* t6 R
d_p+=0x1000;
" w; q! t+ ~! }d_edx+=0x67; //// 这个0x67不知道是什么含义,请谁给个答案最好 :)0 R* M$ z8 b9 w7 F9 k b1 x
if(d_begin>=0xa0)break;
5 ?4 Y/ f) c, i& K, h% B}
3 o8 \' F* J/ K! FUnmapviewoffile(pHandle);
( T/ E- u1 x; C5 Jif(d_begin==0xa0)
- o3 k5 ?- A. z. u1 g2 [; hd_begin=0x39;
$ } B# H0 L8 h3 @) A! Q/ k8 Rd_begin=d_edx<<0xc;
9 H; G! m L$ J/ C1 e XMapViewOfFile(pHandle,4,0,d_edx,0x1000); ' D w7 w4 B* {: o5 _3 K% n
应该加上后就可以马上看到效果了,不会出现映射失败的情况。
. M" Q5 r9 X$ [% G! @后话:现在xp和win2003都出来那么长时间了,也许win2k下的这个意义不是很大 :),这个偶也说不清楚了
7 O0 u$ h2 H3 c7 Y, G, G9 O5 I 如果你在做这个部分的时候遇到我同样的问题,加上上面的代码应该能解决,但如果你做的程序的稳定性要和active ports一样,建议你再仔细分析下它的反汇编。由于时间关系,我就不多写了0 T& M/ e4 [5 u
在做这个的时候,偶有不少地方不明白的,比如为什么那个隐射地址要变化,是什么原因使得这个要变化呢?如果您能解释,还请告诉偶hhkkk@126.com ,偶在此先谢啦! M: I. O* l9 X8 B
那个0x67也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :(6 y* D; X" ~3 j+ s6 Q
另外:第一次写点东西,比较乱,将就着看吧,也算作是个人的笔记吧。 |