上面提到的I/O函数在osloader.exe里是通过一个指针数组来访问的。AndreaGeddon在他的文章(Understanding Win2k Sources - Part 1 by AndreaGeddon)里提到这个指针在BootContextRecord的第二个双字处了解这些函数的定义对逆向osloader.exe很有好处,根据我收集的资料,这个函数表不完全的定义如下:
BOOTFONT.BIN是NTLDR和SETUPLDR.BIN使用的字体文件,它提供了Windows系统启动阶段其他语言(非英语)的字体点阵。本文针对的BOOTFONT.BIN为中文版本Windows XP With SP2所附带(Windows 2000/XP/2003使用的字库文件完全相同),其他语言的应该类似。
用Ultraedit-32打开BOOTFONT.BIN,可以发现头四个字节为"MdeT",为什么要用这么奇怪的魔数呢?答案在泄漏的windows nt4源代码中。在bootfont.h中对这个魔数进行了定义:
+------------------------------------------+
| // Define signature value. |
| // |
| #define BOOTFONTBIN_SIGNATURE 0x5465644d |
+------------------------------------------+
0x5465644d即为"TedM",Windows最开始的本地化版本是日文版,因此由日本的开发人员做了最初的本地化工作,可以从ntos\boot\bootfont\readme.txt中看出来:
+-----------------------------------------------------------------------+
| The jpn directory contains the original fntjapan.h that was once |
| compiled into the x86 boot loaders, and a program I wrote to generate |
| bootfont.bin for Japan from it. |
| |
| - tedm, 7/11/95, Tokyo |
+-----------------------------------------------------------------------+
0x04-0x07为语言代码,对于中文则为0x804。
0x08-0x0b为BOOTFONT.BIN支持的单字节字符个数(NumSbcsChars)。
0x0c-0x0f为BOOTFONT.BIN支持的双字节字符个数(NumDbcsChars)。
0x10-0x13为单字节字符点阵在文件中的偏移(SbcsOffset)。
0x14-0x17为双字节字符点阵在文件中的偏移(DbcsOffset)。
0x18-0x1b为所有单字节字符点阵数据的总长度(SbcsEntriesTotalSize)。
0x1c-0x1f为所有双字节字符点阵数据的总长度(DbcsEntriesTotalSize)。
0x20-0x2b为一个数组,存放了DBCS的前导字节范围,最后以"\0\0"结尾,MAX_DBCS_RANGE的值当前为5(DbcsLeadTable[(MAX_DBCS_RANGE+1)*2])。
0x2c表示字符的高度(CharacterImageHeight)。
0x2d表示字符的TopPad(CharacterTopPad)。
0x2e表示字符的BottomPad(CharacterBottomPad)。
0x2f表示单字节字符的宽度(CharacterImageSbcsWidth)。
0x30表示双字节字符的宽度(CharacterImageDbcsWidth)。