《再谈进程与端口的映射》之狗尾续貂篇创建时间:2004-05-01 文章属性:原创 文章提交:hhhkkk (hac01_at_163.com) 《再谈进程与端口的映射》之狗尾续貂篇 日 期:2004-5-1 作 者:hhhkkk [hhkkk@126.com] 拜读了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也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :( 另外:第一次写点东西,比较乱,将就着看吧,也算作是个人的笔记吧。限于水平关系,不当之处还请指出。 以此文献给我常来索取的xfocus 如果需要转载的话,请保持文章完整性! 参考数据: aports.exe from http://www.ntutility.com/ http://www.xfocus.net/articles/200202/344.html |