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一样,建议你再仔细分析下它的反汇编。在做这个的时候,偶有不少地方不明白的,比如为什么那个隐射地址要变化,是什么原因使得这个要变化呢?
那个0x67也是个古怪的数据,不知道是为什么用那个数据,因为偶只是从破解的角度来分析的,对内核不熟悉 :(