网络安全 频道

《再谈进程与端口的映射》之续篇

《再谈进程与端口的映射》之续篇


拜读了ILSY 的大作《再谈进程与端口的映射》后,觉得很不错,用vc在电脑上调试,发现有些地方能取得信息 有些地方不能
更加怪的是,我的win2k上本来可以取得的,后来居然不行了。
而active ports却是那样稳定,有鬼不成 靠 ,偶不信
搬出OllyDdg经过调试对照发现,程序不能正常显示就是函数的OpenPhysicalMemory导致不能取得信息
下面是active ports的OpenPhysicalMemory反汇编部分
0040FCF2    8B1D CC124000   MOV     EBX,DWORD PTR DS:[<&KERNEL32.MapViewOfFile>]           ; KERNEL32.MapViewOfFile
0040FCF8    C745 F8 00000A0>MOV     DWORD PTR SS:[EBP-8],0A0000
0040FCFF    BE 00100000     MOV     ESI,1000
0040FD04    FF75 F8         PUSH    DWORD PTR SS:[EBP-8]
0040FD07    8B45 08         MOV     EAX,DWORD PTR SS:[EBP+8]
0040FD0A    57              PUSH    EDI
0040FD0B    57              PUSH    EDI
0040FD0C    6A 04           PUSH    4
0040FD0E    FF30            PUSH    DWORD PTR DS:[EAX]
0040FD10    FFD3            CALL    NEAR EBX                //// MapViewOfFile(*,4,0,0,0x0a0000); 1) map
.........    ///如果没map 成功 再改参数 map 因为我看到的都是一次map就ok 就不看了
0040FD2E    837D FC 00      CMP     DWORD PTR SS:[EBP-4],0
0040FD32    76 17           JBE     SHORT aports.0040FD4B
0040FD34    6A 67           PUSH    67
0040FD36    8D88 000C0000   LEA     ECX,DWORD PTR DS:[EAX+C00]
0040FD3C    5A              POP     EDX
///下面这段是关键部分了,也就是取得应该映射的起始位置处
0040FD3D    3911            CMP     DWORD PTR DS:[ECX],EDX
0040FD3F    74 0A           JE      SHORT aports.0040FD4B
0040FD41    47              INC     EDI
0040FD42    03CE            ADD     ECX,ESI
0040FD44    03D6            ADD     EDX,ESI
0040FD46    3B7D FC         CMP     EDI,DWORD PTR SS:[EBP-4]
0040FD49    72 F2           JB      SHORT aports.0040FD3D

0040FD4B    50              PUSH    EAX
0040FD4C    FF15 D0124000   CALL    NEAR DWORD PTR DS:[<&KERNEL32.UnmapViewOfFile>]        ; KERNEL32.UnmapViewOfFile
0040FD52    3B7D FC         CMP     EDI,DWORD PTR SS:[EBP-4]
0040FD55    75 03           JNZ     SHORT aports.0040FD5A
0040FD57    6A 39           PUSH    39
0040FD59    5F              POP     EDI
0040FD5A    8B45 08         MOV     EAX,DWORD PTR SS:[EBP+8]
0040FD5D    56              PUSH    ESI
0040FD5E    C1E7 0C         SHL     EDI,0C
0040FD61    57              PUSH    EDI
0040FD62    6A 00           PUSH    0
0040FD64    6A 04           PUSH    4
0040FD66    FF30            PUSH    DWORD PTR DS:[EAX]
0040FD68    FFD3            CALL    NEAR EBX                //MapViewOfFile(*,4,0,edi,0x1000);
0040FD6A    5F              POP     EDI
0040FD6B    5E              POP     ESI
0040FD6C    5B              POP     EBX
0040FD6D    C9              LEAVE
0040FD6E    C3              RETN

看完了反汇编,接下来就是写代码了 呵呵 就在OpenPhysicalMemory加上下面这点就可以了
pMapPhysicalMemory=MapViewOfFile(pHandle,4,0,0,0x0a0000);  ///第一次映射的,后面那个参数如果映射没成功的话,就需要变化。在我电脑上这个就可以了,就用这个算了 要写完善的话  自己改改
DWORD d_begin=0;
DWORD d_edx=0x67;
DWORD d_p=pMapPhysicalMemory+0xc00;
while(d_edx!=d_p)
{
d_begin++;
d_p+=0x1000;
d_edx+=0x67;           //// 这个0x67不知道是什么含义,请谁给个答案最好 :)
if(d_begin>=0xa0)break;
}
Unmapviewoffile(pHandle);
if(d_begin==0xa0)
d_begin=0x39;
d_begin=d_edx<<0xc;
MapViewOfFile(pHandle,4,0,d_edx,0x1000);

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

后话:现在xp和win2003都出来那么长时间了,也许win2k下的这个意义不是很大 :),这个偶也说不清楚了
      如果你在做这个部分的时候遇到我同样的问题,加上上面的代码应该能解决,但如果你做的程序的稳定性要和active ports一样,建议你再仔细分析下它的反汇编。由于时间关系,我就不多写了
      在做这个的时候,偶有不少地方不明白的,比如为什么那个隐射地址要变化,是什么原因使得这个要变化呢?如果您能解释,还请告诉偶hhkkk@126.com ,偶在此先谢啦
       那个0x67也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :(
另外:第一次写点东西,比较乱,将就着看吧,也算作是个人的笔记吧。http://hackbase.com/tech/2004-09-29/62731.html

0
相关文章