首页
论坛
专栏
课程

[原创]让XP用上4G内存,有图有真相,带破解补丁

scdeny
2
2011-7-28 00:13 721549
先上图,patch之后的,原来只有2.98G,现在是3.86G了

去年7月入手小黑T410,到手就装了4G的内存,WINDOWS 7的破解补丁来的很快,很顺利就用上了3.86G(纠结于剩下的140M哪里去了?至今也没搞明白,只知道主板没有映射),而所谓的XP的种种补丁,不外乎就是Ramdisk,开启PAE之类的,毫无用处,最可怜的是竟然被某网友的“开启了PAE就能用到全部4G内存,系统属性页显示还是2.98G是假的”一说给忽悠了一年,没文化真可怕。。。就这么将信将疑用了一年,中间也纠结过一段时间,没有深入分析,近日越想越感觉不对劲,再来纠结纠结。。。
用WinDbg看看
lkd> dd MmHighestPhysicalPage
8088b124  000bf7ff 000bf399 00000040 00000000
lkd> dd MmNumberOfPhysicalPages
8088b128  000bf399 00000040 00000000 7fff0000

可见最高物理内存页号MmHighestPhysicalPage值为bf7ff,物理内存总页数MmNumberOfPhysicalPages值为bf399,换算成物理内存数0xbf399*0x1000=2.98G正好是系统属性页显示的2.98G,改变这个值,系统属性页的值也会跟着变,是不是把这个值改了你就能用到更多的内存了呢,当然不是,任务管理器里记录的内存使用量确是真是的。
那是不是我的PAE没有真正启用呢?
那我们再用WinDbg看看
lkd> !pte 80800000
                    VA 80800000
PDE at C0602020            PTE at C0404000
contains 00000000008009E3  contains 0000000000000000
pfn 800       -GLDA--KWEV   LARGE PAGE pfn 800

看吧,PDE和PTE里面的物理地址00000000008009E3和0000000000000000都是64位的,而在没有启用PAE的系统里,页表项里的物理地址是32位的。(为什么PTE里是一串0呢?因为我们看的80800000这个虚拟地址是ntkrnlpa.exe的基地址,它当然是加载在物理内存的0地址的)
那么是不是系统偷偷地在用我的4G内存了,而给我显示出2.96G的假象呢?
再祭出我们的法宝WinDbg
lkd> dd poi(MmPhysicalMemoryBlock)
8ad75c80  00000007 000bf3ab 00000001 0000009d
8ad75c90  00000100 000bf17c 000bf282 000000dd
8ad75ca0  000bf40f 00000060 000bf70f 00000008
8ad75cb0  000bf71f 0000004c 000bf7ff 00000001

这里有两个结构体:
typedef struct _PHYSICAL_MEMORY_RUN {
    PFN_NUMBER BasePage;
    PFN_NUMBER PageCount;
} PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;

typedef struct _PHYSICAL_MEMORY_DESCRIPTOR {
    ULONG NumberOfRuns;
    PFN_NUMBER NumberOfPages;
    PHYSICAL_MEMORY_RUN Run[1];
} PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR; 

从上面可以看出,我的机器有7块可用的内存,总共有bf3ab页(为什么这个数字跟上面看到的MmNumberOfPhysicalPages不符呢?),分别为1 -9d,100- bf17c,…,bf7ff,可见最大物理内存地址为bf7ff,还是与4G内存相去甚远啊。。。
那么是不是我的主板根本就不识别这么大的内存呢??
那么我们再做做实验,用nt4的源代码编译一份NTLDR,把osloader.exe探测到的物理内存输出一份,下面是通过中断获取的内存布局图,BIOS专家们都叫把它做E820图
Base	Size	Type
0	 9E800	1
9E800	1800	2
D2000	2000	2
DC000	24000	2
100000	BF17C000	1
BF27C000	6000	2
BF282000	DD000	1
BF35F000	12000	2
BF371000	1000	4
BF3F2000	1D000	2
BF40F000	60000	1
BF46F000	1F9000	2
BF668000	80000	4
BF6E8000	27000	2
BF717000	8000	1
BF71F000	4C000	1
BF76B000	C000	4
BF777000	3000	3
BF77A000	7000	4
BF781000	1000	3
BF782000	9000	4
BF78B000	1000	3
BF78C000	13000	4
BF79F000	60000	3
BF7FF000	1000	1
BF800000	800000	2
E0000000	10000000	2
FEAFF000	1000	2
FEC00000	10000	2
FED00000	400	2
FED1C000	4000	2
FED20000	70000	2
FEE00000	1000	2
FF000000	1000000	2
100000000	38000000	1

图中type为1的就是分配给本机物理内存的地址,其他的为其他硬件所用,我们把内存地址挑出来:
Base		Size
0			9E800
100000		BF17C000
BF282000	DD000
BF40F000	60000
BF717000	8000
BF71F000	4C000
BF7FF000	1000
100000000	38000000

总数为F73AC800=3.86G,尽管4G以下的地址空间被硬件占用了不少,主板并没有放弃那块内存嘛,只是把他们映射到了4G以上的空间,即100000000-138000000,看来是XP那家伙太不地道,活生生把咱们使用这块内存给掐掉了,故而产生了MmHighestPhysicalPage= BF7FF,无耻的家伙!什么?XP的内存机制不支持?不要为XP辩解,PAE技术早在Intel P6家族的CPU身上就已经开始使用了,Intel手册第一卷3.3.6节关于PAE有如下表述:
Beginning with P6 family processors, the IA-32 architecture supports addressing of
up to 64 GBytes (2^36 bytes) of physical memory.
也就是说,从Intel P6家族的CPU开始,(PAE技术让)IA-32架构的CPU就支持对64G的物理内存进行寻址, P6家族可是很老CPU了,奔二,奔三就属于P6家族的,所以XP这个后来才发布的操作系统不可能连PAE都没考虑进去吧。
既然那块4G以上的内存地址被主板识别,NTLDR也探测到了,操作系统也支持,那我们为什么还是用不到呢?到底是NTLDR没有告诉ntkrnlpa.exe,还是ntkrnlpa.exe自己给我们截断了?
这怎么调试呢?Bochs?不行,我总共才4G内存,哪有那么多内存分配给Bochs用呢,要有XP的ntos的源码就好了,ntos的入口函数为
VOID KiSystemStartup(PLOADER_PARAMETER_BLOCK KissLoaderBlock)
在NTLDR向ntos交权的时候,会将内存描述链表通过结构体参数LOADER_PARAMETER_BLOCK传过去,这个结构体原型为
typedef struct _LOADER_PARAMETER_BLOCK {
    LIST_ENTRY LoadOrderListHead;
    LIST_ENTRY MemoryDescriptorListHead;
    LIST_ENTRY BootDriverListHead;
ULONG KernelStack;
……
后面太长,省略掉
} LOADER_PARAMETER_BLOCK, *PLOADER_PARAMETER_BLOCK;

既然没有XP的源码,那就用wrk将就一下吧,将wrk编译的内核文件wrkx86.exe来替换ntkrnlpa.exe,系统肯定是起不来的,不过我们只需要在wrkx86.exe的入口点打印出NTLDR传过来的内存描述链表就好了,MEMORY_ALLOCATION_DESCRIPTOR的原型为
typedef struct _MEMORY_ALLOCATION_DESCRIPTOR {
    LIST_ENTRY ListEntry;
    TYPE_OF_MEMORY MemoryType;
    ULONG BasePage;
    ULONG PageCount;
} MEMORY_ALLOCATION_DESCRIPTOR, *PMEMORY_ALLOCATION_DESCRIPTOR;

于是我们很快得到了结果:(无法上图,遗憾)

咦!NTLDR貌似真的没有把4G以上的地址传过来啊,怎么到FF000这块内存就完了呢?
难道NTLDR私自把4G以上的地址给裁了?难道一切罪恶的源泉在NTLDR?在此我犯了个严重的错误,以为胜利在望,加班加点研究NTLDR,最好成功跳过NTLDR截去4G以上内存的代码了,启动发现XP依然显示2.98G的可用内存,怎么回事呢?回过头来再分析NTLDR,才发现了如下的代码
if ( (_BYTE)BlUsePae_0 )
    {
      v10 = BlpAllocatePAETables();
      if ( v10 )
        return v10;
    }
    else
    {
      BlpTruncateDescriptors(0xFFFFFu);
}

BlpTruncateDescriptors(0xFFFFFu)函数的功能就是设置内存描述链表的最大页面号为0xFFFFF,即截去4G以上的内存,原来我们编译的wrkx86.exe不支持PAE,被NTLDR发现了,故而才调用BlpTruncateDescriptors截断的,而我们的XP用的内核ntkrnlpa.exe是支持PAE的,那么就不会截断了,哎,马虎啊。。。
那还是锁定ntkrnlpa.exe分析吧,充分发扬废寝忘食的精神,终于找到了一个可疑的函数ExVerifySuite,这不会就是验证我们版本的函数吧,网上一查,发现有位“老生常谈”早就发现了,他的文章在这里
http://thxlp.wordpress.com/2008/08/03/%E8%80%81%E7%94%9F%E5%B8%B8%E8%B0%88-windows%E5%92%8C4g%E4%BB%A5%E4%B8%8A%E7%89%A9%E7%90%86%E5%86%85%E5%AD%98/
汗。。。。差距啊,不过这位老大发现这么久竟然不出补丁,拯救我们广大百姓于水货,哎。。。害我熬夜伤神这么久。。。。
不过这位“老生”的代码不知道从哪里搞的,nt4源码里没有MiCheckPaeLicense这个函数,而windows2000的源代码里虽然有这个函数,但差别很大,wrk的源代码里也不是那样的,反汇编XP的ntkrnlpa.exe,代码如下
int __usercall MiCheckPaeLicense<eax>(PLOADER_PARAMETER_BLOCK LoaderBlock<eax>)
{
  EndPage = 0;
  LoaderBlock1 = LoaderBlock;
  MaxPageCount = 0x100000u;
  MaxPage = 0;
  if ( ExVerifySuite(DataCenter) == 1 )
  {
    if (LoaderBlock->u.I386.VirtualBias )
    {
      MaxPageCount = 0x400000u;                 // booting /3gb: 16G
      MaxPage = 0x400000u;
    }
    else
    {
      MaxPageCount = 0x1000000u;
    }                                           // DataCenter: 64G
  }
  else
  {
    if ( MmProductType == 0x690057 || ExVerifySuite(Enterprise) != 1 )
    {
      if ( ExVerifySuite(ServerAppliance) == 1 )
        MaxPageCount = 0x80000u;                // 2G
      else
        MaxPage = 0x100000u;                    // 4G
    }
    else
    {
      MaxPageCount = 0x800000u;// Advanced Server is permitted a maximum of 32gb
    }
  }

实在是不知道这位高人的代码来自哪里,恳请各位高人给予指点。。。
从这段代码里可以看出,MiCheckPaeLicense函数会检查操作系统的版本,如果是DataCenter,就允许使用64G内存,Advanced Server为32G,如果为精简版则为2G,其他版本为4G,看来真是ntkrnlpa.exe在作怪,先别急着patch,验证内存限制的还有一个地方,在MmAddPhysicalMemoryEx函数里也会调用ExVerifySuite这个函数,代码如下:
if ( ExVerifySuite(DataCenter) == 1 )
  {
    LimitPage = 0x1000000u;                     // DataCenter : 64G
  }
  else
  {
    if ( MmProductType == 0x690057 || (v9 = ExVerifySuite(Enterprise) == 1, LimitPage = 0x800000u, !v9) )// Advanced Server : 32G
      LimitPage = 0x100000u;                    // Other : 4G
  }

代码都差不多,要patch的话两个地方要一起改,至于怎么改?代码都在这么里,想怎么改就怎么改吧,只要两个地方都改了就行,只要其中一个地方不改,ntos都会阴魂不散的把你多出来的内存吃掉…
看成果吧
lkd> dd MmHighestPhysicalPage
8088b124  00137fff 000f7399 00000040 00000000

lkd> dd MmNumberOfPhysicalPages
8088b128  000f7399 00000040 00000000 7fff0000

lkd> !pte d0800000
                    VA d0800000
PDE at C0603420            PTE at C0684000
contains 00000001004DF963  contains E15C080000000400
pfn 1004df    -G-DA--KWEV   not valid
                            Proto: E15C0800

数数这个地址1004DF963,9位啊,4G以上了,不要被E15C080000000400这个地址吓到了,64位,有这么大的地址吗?查查PTE的结构体就知道了,前面的几位是标志位
再看物理内存块
lkd> dd poi(MmPhysicalMemoryBlock)
8baa3c70  00000008 000f73ab 00000001 0000009d
8baa3c80  00000100 000bf17c 000bf282 000000dd
8baa3c90  000bf40f 00000060 000bf70f 00000008
8baa3ca0  000bf71f 0000004c 000bf7ff 00000001
8baa3cb0  00100000 00038000 0001000a 6c4d6d4d

看到了吗,我的机器现在有8块可用的内存了,多了一个100000-138000,总共有f73ab页了,0xf73ab*0x1000=3.86G,至于还有140M,主板没映射,用不到了,能不能解决呢?希望各位牛人能够给予指点。。。

后面部分比较仓促,主要是听到重任到来的消息,没时间仔细写了,补丁没写完,估计一时半会完成不了了,仓促发帖,开始潜伏。。。

忙里偷闲,补丁写好了,赶紧传上来共享,本机测试通过,如果使用过程中发现问题请给我留言。。。
——————————————————————————————————————————
最近忙死了,几天没上网了,更没时间去研究这个,让各位失望了。。。 坛子里的牛人们如果有时间去研究研究吧,MengXP执着的钻研精神让我佩服,离成功只有一步之遥了,希望大家能齐心协力,早日解决这些问题,我只能忙过这阵子再来了。。。
---------------------------------------------------------------
实在抱歉,上个版本出的太匆忙了,严重问题都没有发现,下载这个版本XP64G20110805.rar的朋友请骂我,实在是疏忽大意,抱歉抱歉。。。。
----------------------------------------------------------------------------------------------------------------------------------------------
终于有时间继续研究一下了,发现原因主要在DMA,修改之后,USB存储设备基本可以正常使用了,先上补丁,回头再发技术帖

[防守篇]2018看雪.TSRC CTF 挑战赛(团队赛)11月1日征题开启!

上传的附件:
最新回复 (415)
stu 2011-7-28 00:30
2

0

原来高手都是晚上粗现.
上次IE源码也是.
前排找租了。
MengXP 2011-7-28 00:58
3

0

ntldr是没有问题的。xp的ntldr和2003的ntldr通用。。
2003的支持pxe
wrk代码中找不到MiCheckPaeLicense,微软给封装到lib里了。函数名也给改了。。
不过定位的确很好定位的
光patch ntoskrnl.exe里的MiCheckPaeLicense不够
hal.dll里面也有问题
1年前我试过。启动过程中蓝屏了。
更严重的时候c盘分区表挂掉了。
当初我很郁闷的放弃了。。

tiamo上图只有2G
4G的那张图是win2003

楼主你改成功了就发图片吧。
发系统属性的。
MengXP 2011-7-28 01:04
4

0

E820里面描述的都是可用内存
你加一下。肯定不够4G。
有些内存无法映射 废掉了。跟芯片组有关
paulbaby 2011-7-28 02:58
5

0

强人.....
魔豆腐 2011-7-28 08:36
6

0

那现在用什么方法能上3.8G捏,望大大们指点
kvllz 9 2011-7-28 09:16
7

0

说的很清楚了 patch ntkrnlpa.exe 这个文件 两个地方强制跳到DataCenter模式就可以使用最多64G的内存了。建议楼主发个patch的文件或补丁,看雪来加精吧呵呵
ChiChou 2011-7-28 09:46
8

0

操作系统里面的1G是1024MB,但是U盘之类标注的大小是1000MB算1G,那被吃掉的140MB应该也是这样……
3.86x1024=3952.64约等于4000
scdeny 2 2011-7-28 10:06
9

0

对,光patch ntoskrnl.exe里的MiCheckPaeLicense确实不够,因为还要path MmAddPhysicalMemoryEx函数,与HAL无关,我没改HAL,用的就很好。。。
albeta 2011-7-28 10:08
10

0

还在用2G内存的飘过,等楼主出补丁。
不过最重要的还是要拿到微软的私钥啊。
冷煞xiaosan 2011-7-28 10:09
11

0

精华...广告位招租!
scdeny 2 2011-7-28 10:11
12

0

流言害死人哪。。。我就是被这种流言忽悠了着用了一年的2.98G内存,必须要自己去确认才能下结论,网上这种说法很多,都是误导,硬盘的容量确实是1000进制的,但内存绝对不是,我的机器上那140M没有映射,有的机器上却是全部映射的,可以探索一下如何解决。。。
scdeny 2 2011-7-28 10:14
13

0

对啊,我的总数为F73AC800=3.86G,是不是用改BIOS或者其他什么方法能解决呢??值得探索一下
tihty 3 2011-7-28 10:17
14

0

直接用win64吧..
scdeny 2 2011-7-28 14:19
15

0

win7 x64是我的娱乐用系统,搞逆向还是要XP。。。
zjfree 2011-7-28 14:44
16

0

看雪小改版了???
bjdudu 2011-7-28 14:47
17

0

顶我的兄弟一个
loqich 2011-7-28 14:48
18

0

你用久了就知道了 有时启动不起来。。。我用过一个月 patch掉 有时会启动不了
wzmooo 2011-7-28 14:57
19

0

好像那个文章说还要965以上的板子才能真正使用4G以上
felsenlee 2011-7-28 15:12
20

0

比较高深,我还是看些基础的吧
dkxzl 1 2011-7-28 15:56
21

0

very good
MengXP 2011-7-28 17:29
22

0

神啊!膜拜啊~!~~好牛逼的图啊~~~~~~~~~~~~~

我patch了那个checklicense之后蓝了。我还一直以为是hal搞的鬼…

关于那120M 是没办法挽回了。不信你可以装一个32位的2003 就知道啦~~

我也想打补丁啊~

啊啊啊啊啊你太强大了
MengXP 2011-7-28 17:35
23

0

还有我以前试过修改安装盘。有个inf文件,改一下可以变成datacenter,安装之后同样蓝了,我就放弃了……
MengXP 2011-7-28 18:13
24

0

哎。虽然你成功了。。我这依然启动不起来。。

你的程序无法识别我的ntkrnlpa.exe

按你说的 patch 那2个地方
我把cmp后面的jnz改成2个nop。

继续蓝。各种蓝。

有可能刚进桌面蓝 有可能滚动条蓝。。minidump都无法保存。

其中一次蓝在win32k.sys

难道是显卡驱动的问题。。
达文西 2011-7-28 18:30
25

0

膜拜楼主,但不敢轻易尝试。。。
FishSeeWater 11 2011-7-28 18:44
26

0

牛帖留名,楼主的思路很清晰,文笔流畅。好文
xzchina 1 2011-7-28 19:21
27

0

支持楼主!!

哎 MengXP 最近没见你 难道你又在写调试器啊。。 你这个疯子。。
MengXP 2011-7-28 19:41
28

0

妞你试试这个补丁呗。。

大家伙有实验成功的么 :(
xzchina 1 2011-7-28 19:48
29

0

脱下裤子 露出pp  打烂
scdeny 2 2011-7-28 20:03
30

0

这个。。。对了,改动ntkrnlpa.exe后要用PEEditor修正一下校验和,是不是这个问题?实在不行能不能把你的ntkrnlpa.exe给我发一个。。。
MengXP 2011-7-28 20:34
31

0

我用lordpe修了。
我咋发给你?你邮箱?qq?
你加我qq呗 4003032
mumaren 2011-7-28 21:06
32

0

mark一个

以后看
moonspot 2011-7-28 22:52
33

0

拜读了收蒧。。。
ember 2011-7-29 09:40
34

0

楼主的实事求是精神值得学习!
zkyq 2011-7-29 09:44
35

0

我现在2G的还没用上呢,何谈4G呀
obaby 18 2011-7-29 16:22
36

0

话说楼主的程序我测试了一下,两台机器你的程序都识别不出ntkrnlpa.exe的版本。
scdeny 2 2011-7-29 18:52
37

0

不好意思,ntkrnlpa.exe版本太多了,我的邮箱scdengyuan~qq.com,如果需要破解,请把ntkrnlpa.exe发到我邮箱吧
快雪时晴 4 2011-7-29 19:01
38

0

2天没来,冷不丁出了个大杀器。
关注后续发展....
lsmjj 2011-7-29 19:26
39

0

膜拜大牛 今天还有个人说4个g内存的事
scdeny 2 2011-7-29 19:38
40

0

附件补丁已经升级!
抱歉,各位,由于特征码选择不好,导致补丁不识别很多的ntkrnlpa.exe文件,特此升级,希望能对大家有所帮助,再有不识别的情况请大家将ntkrnlpa.exe文件发送到我邮箱scdengyuan@qq.com,我将尽力帮大家破解
天地豪迈 2011-7-29 20:49
41

0

如果 这个搞出来完善了,真太好了,不用安装2003来玩游戏了。。。楼主加油
wawt 2011-7-29 22:18
42

0

俺的这个文件也不中,已给楼主发邮件,谢谢!
scdeny 2 2011-7-29 22:33
43

0

新版的已经发到您邮箱了,请查收
上网鱼 2011-7-30 13:46
44

0

绝对好贴。先顶后看
hacker一疒亻 2011-7-30 17:32
45

0

1、现在对于4G或者是更高的内存,研究对象都是针对32位系统来说的。
PAE是一个方法,可以让32位的XP实现4G或者是更多内存的使用,同时还要开启3GB功能。
至于楼主说的被忽悠了一年多的PAE这个事儿不是怎么回事儿,可否具体讲述?难道我们都一直没有用上4G内存?
2、我现在使用的系统是XP64位和win732位,对于前都应该是没有内存用不到的烦恼,那么看了你的文章前面提到win7有相关的破解补丁,你是指有了大内存的破解补丁了呢?还是指系统可以使用了?  如果是前者,那么可否给一个指点,或者软件下载地址
scdeny 2 2011-7-30 19:13
46

0

请看这里吧http://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx
PAE确实可以让x86硬件支持到能够访问64G的地址空间,Windows的内核也支持使用多达64G的物理地址空间,但是微软偏偏要对各个版本的Windows的物理内存上限作出限制,下面是XP和Win7的物理内存上限

可见微软对XP64位的内存限制是128G,对Win7 32位的内存限制是4G,但这4G不全为物理内存,请再看下面的文字

拙劣的翻译一下,大概是这个意思:显卡和其他设备是如何影响内存上限的
设备必须把他们的地址映射到4GB以下,以便兼容不支持PAE的windows版本。因此,如果系统安装了4GB的内存,那么其中一部分内存要么被禁用掉要么被BIOS重映射到4GB以上的地址空间。如果这部分内存被重映射,X64 Windows能够正常使用这些内存。X86客户端版的Windows不支持(不是不支持,其实是被微软强行限制的)这部分被映射到4GB以上的内存,他们不能访问这块区域。任何X64Windows或者X86服务器版的则可以访问。(可怜的是,这部分被重映射的内存往往多达1G)
所以说,不管您用的是Win7还是XP,只要是32位客户端版的,都不可能把您的4GB内存用完,那差不多1G的被重映射到4GB以上的内存微软是不会让您用的。。。
那个Win7 32位的内存补丁名叫ReadyFor4G,谷歌一下就有,很好找
上传的附件:
房有亮 3 2011-7-30 19:34
47

0

965以前的主板不支持4G 怎么开启也是无效的
justlovemm 2011-7-30 19:55
48

0

希望能出一个通用的补丁,我的T400现在也是只有2.98GB
zhangsj 2011-7-30 19:57
49

0

这么霸气 ? 是真是假?
zouzhiyong 3 2011-7-30 21:32
50

0

mark~~,主要看分析~
返回