首页
社区
课程
招聘
[原创]突破Windows XP 4G内存限制续
发表于: 2011-11-14 14:12 230442

[原创]突破Windows XP 4G内存限制续

2011-11-14 14:12
230442

上次经过一段时间的研究后,发现了通过修改ntkrnlpa.exe可以突破Windows XP 4G内存限制,完全使用4G以上物理内存(http://bbs.pediy.com/showthread.php?t=137830),但是在测试过程中发现使用USB存储设备时会出现蓝屏等问题,后来因为太忙,也没能继续研究。最近难得短暂清闲,功夫不负有心人,花了一个多星期终于找到问题所在了,下面谈谈在探索过程中的一些心得。
1.首先替换usb相关驱动
既然一插U盘就蓝屏,而使用USB鼠标、摄像头等都没有问题,那么首先怀疑是usbstor.sys的问题。Windows 2003可以支持4G以上物理内存,那么我们将Windows 2003的USB驱动替换到XP上来,首先替换usbstor.sys,现象依旧。那么全部替换usb相关驱动,包括usbstor.sys、usbport.sys、usbhub.sys、usbehci.sys等,XP可以正常启动,USB设备也能使用,但经反复测试,发现使用U盘时有时还是会蓝屏。
2.是谁造成了内存访问越界?
种种蓝屏迹象表明,很可能是因为内存读写越界造成的。破解4G限制后,虽然物理地址扩展到32位以上,但是虚拟地址依然是32位的啊,使用虚拟地址的程序不可能造成内存访问越界啊。那么有哪些代码用到了物理地址呢? 
首先想到的是内存分页管理,负责映射物理地址到虚拟地址空间,维护了一个物理内存的页帧数据库MmPfnDatabase,会不会是因为物理地址空间扩大后,这个页帧数据库并没有扩大,而导致映射4G以上物理内存时发生错误呢?
一番折腾,在MiInitMachineDependent函数中找到了如下代码

MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[MmHighestPossiblePhysicalPage + 1];
lkd> dd MmPfnDatabase
8088b0c8  818c6000 0000ff00 00000006 0000003f
lkd> dd MmHighestPossiblePhysicalPage
8088b120  00137fff 00137fff 000f7379 00000040
lkd> dt _MMPFN
nt!_MMPFN
   +0x000 u1               : __unnamed
   +0x004 PteAddress       : Ptr32 _MMPTE
   +0x008 u2               : __unnamed
   +0x00c u3               : __unnamed
   +0x010 OriginalPte      : _MMPTE
   +0x018 u4               : __unnamed
lkd> ?818c6000+(137fff+1)*1c
Evaluate expression: -2085724160 = 83ae6000
lkd> dd MmFreePagesByColor
80886388  83ae6000 83ae6300 c0883000 f77fffff
b82540e0 f805a042 81fc29dc 81840c80 817e88f4 usbehci!EHCI_SubmitTransfer+0x53
b8254128 f805a74a 81fc2028 81840b08 804e3ec4 USBPORT!USBPORT_DmaEndpointActive+0x1f0
b8254154 f805cb7c 81fc2028 00000000 804e3ec4 USBPORT!USBPORT_DmaEndpointWorker+0x140
b825417c f805e4c3 81fc2028 00000003 00000001 USBPORT!USBPORT_CoreEndpointWorker+0x6d2
b82541f0 806f2a98 81fc2028 00000000 413e504d USBPORT!USBPORT_MapTransfer+0x76f
b825421c 8052e551 821c7788 81fc205c 00000001 hal!HalAllocateAdapterChannel+0x126
b8254234 f805e6df 821c7788 81fc2028 00000001 nt!IoAllocateAdapterChannel+0x2a
b8254278 f805f4d9 81fc2028 817adad0 804e3ec4 USBPORT!USBPORT_FlushMapTransferList+0x1b1
signed int __stdcall USBPORT_MapTransfer(PDEVICE_OBJECT DeviceObject, PIRP CurrentIrp, PVOID MapRegisterBase, PTRANSFER pTransfer)
typedef struct _TRANSLATION_ENTRY {
    PVOID VirtualAddress;
    ULONG PhysicalAddress;
    ULONG Index;
} TRANSLATION_ENTRY, *PTRANSLATION_ENTRY;
__int64 __stdcall IoMapTransfer(PADAPTER_OBJECT AdapterObject, PMDL Mdl, PVOID MapRegisterBase, PVOID CurrentVa, PULONG Length, BOOLEAN WriteToDevice)
if ( MapRegisterBase )
{
    result = HalpMapTransfer(AdapterObject, Mdl, MapRegisterBase, CurrentVa, Length, WriteToDevice);
}
else
{
计算缓冲区Mdl中的连续物理内存块,返回64位物理基址
}
  return result;
}
PHYSICAL_ADDRESS
HalpMapTransfer(
    IN PADAPTER_OBJECT AdapterObject,
    IN PMDL Mdl,
    IN PVOID MapRegisterBase,
    IN PVOID CurrentVa,
    IN OUT PULONG Length,
    IN BOOLEAN WriteToDevice
)
{
if ((ULONG) MapRegisterBase & NO_SCATTER_GATHER
                && transferLength < *Length) {

        logicalAddress = translationEntry->PhysicalAddress + pageOffset;
        translationEntry->Index = COPY_BUFFER;
        index = 0;
        transferLength = *Length;
        useBuffer = TRUE;
    }
if (useBuffer  &&  WriteToDevice) {
        HalpCopyBufferMap(
            Mdl,
            translationEntry + index,
            CurrentVa,
            *Length,
            WriteToDevice
            );
    }
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 6
支持
分享
最新回复 (176)
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发,前排留名,要加精了嘿嘿
2011-11-14 14:19
0
雪    币: 276
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
沙发嘛,楼主牛啊,有4G内存的赶紧试一下。
2011-11-14 14:20
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
2G内存的无情撸过
2011-11-14 14:30
0
雪    币: 188
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
5
有个问题不明白, 32位程序最典型的指针操作
mov eax, [0x0f0f0f0f] 指针是固定的32位
如何能寻址到4GB以后的内存呢?
2011-11-14 14:34
0
雪    币: 90
活跃值: (143)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=levizhou;1019599]有个问题不明白, 32位程序最典型的指针操作
mov eax, [0x0f0f0f0f] 指针是固定的32位
如何能寻址到4GB以后的内存呢?[/QUOTE]
你所说的32位地址是虚拟地址空间,操作系统通过分页机制将物理内存映射虚拟地址空间,现在通过PAE技术,CPU已经能够寻址36位的物理地址空间,但每个应用程序还是只能使用32位虚拟地址空间,建议你看看关于讲“分页机制”方面的书
2011-11-14 14:43
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
大大有研究,看看这个
<求鉴定:《终于知道ramdisk 4g是如何使用4G以上内存了,慎用!》_辅助工具讨论区_反病毒区 卡饭论坛>
http://bbs.kafan.cn/thread-1127521-1-1.html
2011-11-14 15:33
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个太强大了啊.....

钻研精神值得钦佩啊....
2011-11-14 15:54
0
雪    币: 107
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我昨天刚好把我的XP 虚拟了一个3.7G的虚拟磁盘用做页面文件...

用了2天了.挺爽的..没啥问题啊...速度确实飞一般的感觉啊..
2011-11-14 15:55
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
10
2003 可以支持 4 G 以上内存,何解?
2011-11-14 15:59
0
雪    币: 304
活跃值: (507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
膜拜楼主~~~~~~~~~~~~~~~~
楼主是我的偶像~~~~
2011-11-14 17:22
0
雪    币: 527
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
牛,支持楼主
2011-11-14 17:23
0
雪    币: 8724
活跃值: (18475)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
膜拜,支持。
2011-11-14 17:53
0
雪    币: 90
活跃值: (143)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
文中所说的第一个问题确实存在,不过我相信ramdisk作为一款成熟稳定地软件,会有更巧妙地方法解决。第二个问题没有谈的意义,作为已经加载进内核的驱动程序,随便改几个字节就能导致系统崩溃,正规厂商在写驱动时不敢这么放肆去写系统不允许访问的内存,如果你碰到恶意驱动那就只有认栽了。
ramdisk虚拟出来的磁盘本就是掉电即消失的内存,用来放放临时文件还可以,放重要文件一定要慎重
2011-11-14 19:27
0
雪    币: 30
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持!大牛!!
2011-11-14 21:24
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
16
二话不说,一个字:顶!
2011-11-14 21:24
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
好深奥收下!
2011-11-14 22:23
0
雪    币: 826
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
刚看到,希望实用,感谢分享及原创精神~
2011-11-14 22:48
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
如果xp 4G内存可良好运行 为什么微软不直接支持呢?
2011-11-14 23:16
0
雪    币: 122
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
大牛,沙发。。。
2011-11-14 23:33
0
雪    币: 182
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
试了下你的这个,嘿嘿,蓝屏,我的是AMD x4 640 ,4G内存
2011-11-15 01:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
牛,支持楼主
2011-11-15 04:31
0
雪    币: 452
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
顶顶楼主,膜拜,羡慕嫉妒恨
2011-11-15 08:17
0
雪    币: 602
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这个得顶一下 备留
2011-11-15 08:31
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
大牛啊。膜拜了
2011-11-15 09:29
0
游客
登录 | 注册 方可回帖
返回
//