|
' R8 g3 n+ o4 o! ?1 N6 v1 g, n拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能3 e, f4 o W* p- q% j# ~5 ]% Y
更加怪的是,我的win2k上本来可以取得的,后来居然不行了。
3 d, i$ |. G; r) d! p" X+ g( M而active ports却是那样稳定,有鬼不成 靠 ,偶不信
+ s9 W( L. `" \0 ]6 ?1 m1 T3 \$ u- B搬出OllyDdg经过调试对照发现,程序不能正常显示就是函数的OpenPhysicalMemory导致不能取得信息' g8 f" v3 P+ s) ^" Q7 W. K
下面是active ports的OpenPhysicalMemory反汇编部分
: N' t, v7 l: k& t6 {0040FCF2 8B1D CC124000 MOV EBX,DWORD PTR DS:[<&KERNEL32.MapViewOfFile>] ; KERNEL32.MapViewOfFile0 H _5 Z8 l' W% ?) Y6 q6 M
0040FCF8 C745 F8 00000A0>MOV DWORD PTR SS:[EBP-8],0A0000
- R( J! n y- K0 T0040FCFF BE 00100000 MOV ESI,10007 e5 x! Q- s) B) d- w# r* O5 I
0040FD04 FF75 F8 PUSH DWORD PTR SS:[EBP-8]
- ?, g; w' _" \$ i$ p' l5 @2 g0040FD07 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]9 k. D W3 h/ C3 z/ C( p
0040FD0A 57 PUSH EDI
( g0 i& q; h" @) w* {- i0040FD0B 57 PUSH EDI$ _' r6 X( R2 `' ~: Q, T9 V6 `
0040FD0C 6A 04 PUSH 4
% a. q( Q& ?# {6 Z6 W0040FD0E FF30 PUSH DWORD PTR DS:[EAX] J* m0 b$ g+ Z4 o+ V1 f
0040FD10 FFD3 CALL NEAR EBX //// MapViewOfFile(*,4,0,0,0x0a0000); 1) map6 u: b" p9 y& s) g+ y
......... ///如果没map 成功 再改参数 map 因为我看到的都是一次map就ok 就不看了1 _+ w, F. `/ `8 n" J
0040FD2E 837D FC 00 CMP DWORD PTR SS:[EBP-4],0
7 N2 Z1 ~0 H2 v2 {" B6 G6 C! z3 a0040FD32 76 17 JBE SHORT aports.0040FD4B) }% ~3 u' h. F$ ]9 \
0040FD34 6A 67 PUSH 67
& ^- S- ^2 y( e9 U0040FD36 8D88 000C0000 LEA ECX,DWORD PTR DS:[EAX+C00]
9 ? C& r) L5 o. \0040FD3C 5A POP EDX9 s+ l& T" A& k3 A: T0 h$ p
///下面这段是关键部分了,也就是取得应该映射的起始位置处
. M! R% c- q4 d7 l) `0040FD3D 3911 CMP DWORD PTR DS:[ECX],EDX
2 r2 \ h% K+ b6 P% b$ ~/ F! v4 b1 g0040FD3F 74 0A JE SHORT aports.0040FD4B
1 I/ f5 T1 s7 z4 }0040FD41 47 INC EDI
0 z3 \& L& p8 Z% z0040FD42 03CE ADD ECX,ESI
+ x+ z* J) k5 H, k0040FD44 03D6 ADD EDX,ESI
9 m- X' c. k3 r9 d- j+ O2 _0040FD46 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]
5 k# O0 m/ d) ]# n% F0040FD49 72 F2 JB SHORT aports.0040FD3D $ l8 |- m) A8 R: a& a
0040FD4B 50 PUSH EAX2 K' \$ ?' x2 ?2 @7 P
0040FD4C FF15 D0124000 CALL NEAR DWORD PTR DS:[<&KERNEL32.UnmapViewOfFile>] ; KERNEL32.UnmapViewOfFile
; r: I/ m% o- s+ D& i0040FD52 3B7D FC CMP EDI,DWORD PTR SS:[EBP-4]) Y0 O5 J5 o' f' T; @: A2 ?
0040FD55 75 03 JNZ SHORT aports.0040FD5A, u0 U& X( V7 l- Q/ r
0040FD57 6A 39 PUSH 39& Y9 A% D4 `4 U+ S7 v
0040FD59 5F POP EDI( B2 L6 J# K& m/ w2 A9 a
0040FD5A 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]& E0 T5 q8 N |, g
0040FD5D 56 PUSH ESI
6 _, L9 _8 H. C+ z% A. Z0040FD5E C1E7 0C SHL EDI,0C
- F2 f' a: k% t0040FD61 57 PUSH EDI8 g# g; ~2 [1 n F8 e# L
0040FD62 6A 00 PUSH 0
$ [- ^* n( g4 X% U0040FD64 6A 04 PUSH 4
1 D' T; S! Q# n; J: j& M0040FD66 FF30 PUSH DWORD PTR DS:[EAX]" u$ z! w0 h( b& X' g
0040FD68 FFD3 CALL NEAR EBX //MapViewOfFile(*,4,0,edi,0x1000);+ U' u! a. y2 e: j* ?* `
0040FD6A 5F POP EDI/ w7 S7 M5 C! U- ]1 l8 z
0040FD6B 5E POP ESI4 ?2 ~$ ^. r k! j1 W: `9 x
0040FD6C 5B POP EBX
" \7 X! G1 {- s" N( a% V9 ]) Q. d, H0040FD6D C9 LEAVE
( C0 b; l9 }* ^- c# i/ r0040FD6E C3 RETN
8 m& ]! D r! F看完了反汇编,接下来就是写代码了 呵呵 就在OpenPhysicalMemory加上下面这点就可以了
5 P; j2 }0 ? {% H; `; V4 }pMapPhysicalMemory=MapViewOfFile(pHandle,4,0,0,0x0a0000); ///第一次映射的,后面那个参数如果映射没成功的话,就需要变化。在我电脑上这个就可以了,就用这个算了 要写完善的话 自己改改
" d5 L! m& U/ v6 ZDWORD d_begin=0;' V) x; k# Y# E) N5 h( U8 f, y q
DWORD d_edx=0x67;, A0 h2 r7 I4 x/ W
DWORD d_p=pMapPhysicalMemory+0xc00;9 B: x2 K! [2 ~
while(d_edx!=d_p)7 ~8 q, m6 x; i; H8 x4 D( x
{% t( N* \4 Z/ ^# n8 w# f
d_begin++;
( C# e- o& Z' H+ D$ Y% G5 A- td_p+=0x1000;! `/ o1 k3 }) B1 b3 H! W
d_edx+=0x67; //// 这个0x67不知道是什么含义,请谁给个答案最好 :)) f1 ~6 Y# B2 o/ v6 U
if(d_begin>=0xa0)break;: B5 l) c$ d$ [" C' D! q3 P3 e: C; i
}" D2 i2 T4 x7 v6 Z3 r; T
Unmapviewoffile(pHandle);* T9 u; }5 y/ l e4 g
if(d_begin==0xa0)$ }2 Y% h3 _/ m
d_begin=0x39;2 P4 P0 n1 B7 r0 ?4 Q
d_begin=d_edx<<0xc;
) y9 ~# Q/ C; rMapViewOfFile(pHandle,4,0,d_edx,0x1000); ( i, v& r' z8 f8 B9 B
应该加上后就可以马上看到效果了,不会出现映射失败的情况。 $ @% N! S! x4 c( W( s4 o. Q, ~. Y2 F) x
后话:现在xp和win2003都出来那么长时间了,也许win2k下的这个意义不是很大 :),这个偶也说不清楚了
# M( T0 e7 e7 {4 U; I 如果你在做这个部分的时候遇到我同样的问题,加上上面的代码应该能解决,但如果你做的程序的稳定性要和active ports一样,建议你再仔细分析下它的反汇编。由于时间关系,我就不多写了
& o2 _: R9 G3 X, [ 在做这个的时候,偶有不少地方不明白的,比如为什么那个隐射地址要变化,是什么原因使得这个要变化呢?如果您能解释,还请告诉偶hhkkk@126.com ,偶在此先谢啦! P- d( S( {! m8 L3 _
那个0x67也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :(
# P1 V/ [" ]: Q5 A4 t另外:第一次写点东西,比较乱,将就着看吧,也算作是个人的笔记吧。 |