tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
阅读:13102回复:56

[原创]这回这个估计用处不大

楼主#
更多 发布于:2008-09-29 00:22
=============================
11月18日更新
修正了restart setup的错误
修正了一个GPT分区判断的错误
修正了一个磁盘读取的错误
修正了一个注册表检查的错误
=============================
11月15日更新
在xiaohui的帮助下修正了若干个bug......特别是vm的兼容性上面
如果有同学遇到vm里面启动不鸟的情况
请重新下载
=============================

这回是ntldr..也就是windows vista以前版本的loader

前段时间家里3奶机的光驱要浮云了
我又不想到大奶机2奶机上去卸光驱
正巧看到网上的u盘量产可以虚拟一个光驱出来
于是买了个8G的u盘..
结果等我量产完了一试
3奶机能正常启动
但是笔记本却启动不了
网上google了一下发现是我的这个笔记本不能从usb-cdrom引导
郁闷了好久
郁闷过后于是就萌生了自己写一个osloader的想法
这样就可以想加载什么就加载什么想怎么启动就怎么启动

于是开始了解windows的这个ntldr
一开始我以为windows的这个ntldr也是能windbg的
结果才发现必须要是checked版的os而且只能com口
checked版的os我倒是不少..连IA64的我完全没环境运行的都搞来了一个
但是这个com口实在太慢..习惯了1394再来com..受不鸟
而且而且,ntldr里面的boot debugger那完全就跟没有似的
基本属于没法用...windbg不断报错报错.断点有时能设有时不能设.可以说很垃圾

于是就有了现在这份代码
先说说跟windows的ntldr有什么不同
先说.windows有的.我没有的
1.windows能从fat12,fat,fat32,ntfs,cdfs,udfs等的文件系统上加载.我的只能从ntfs的文件系统上加载
2.windows能从网络加载.我的不能
3.windows能从没int19的scsi硬盘上加载.我的不能(现在也没这种老古董不int19的了)

接着是我有的.windows没有的
1.完全能用的debugger,over com和over 1394,而over usb嘛.我没环境.所以就pass了
2.更为丰富的加载方式..你可以用windows本身的方式(MBR)加载.也可以用2003里面的startrom.com或者startrom.n12(pxe)加载还能用grub当作一个linux kernel加载.还能pxelinux.0加载.能想到的我都实现了
3.更为灵活的控制方式...这个嘛.windows那个就是完全不可控的.我的这个能传递命令行参数..那就大不一样了
4.全兼容windows的版本.至于和kernel的兼容情况..我这里刚开始开发是用的checked xp sp2.后来换checked 2k3.sp2 所以这两个版本都是能兼容的..不过x64是不兼容的.恩对.windows的x86的版本也是能引导x64的kernel的

刚开始的目的只是想能简单的引导一下我的笔记本
不过后来这个方向就偏离的越来越远.到现在我已经忘记初衷了

嗯..不错
也许你已经知道了..在能下载到的nt4的代码包里面有一份几乎完整的ntldr的实现
确实我的这个代码也大面积的copy了nt4的代码

而windows xp,2k3跟nt4的比较起来实际上的变化其实也并不大
只是多出很多来...比如nt4不支持休眠.nt4不支持debug.nt4不支持pae,nt4不支持serial console,nt4不支持ramdisk,nt4不支持xip
然后nt4有的也做了不少的bug 修改以及功能加强

那么跟nt4的已有的代码比较
我的这份代码里面多出来的东西是从哪里来的呢?

1.休眠.这部分可以google一下一个叫sandman(sandman.msuiche.net..大约是个日本人)的东西.他那里有hiberfil.sys的格式介绍.不过这格式本身等于是公开的
全部数据结构的type你能在内核的pdb里面找到..而压缩算法能在微软的一个文档里面找到介绍和实现.文件格式本身是很简单的
而休眠这个功能实现.我是ida的checked xp sp2的ntldr来的(我一直都以为休眠是acpi提供的那个什么resume from s4的功能.结果这功能是完全独立于硬件的.没acpi照样休眠)

2.debug..xp,2k3的那个debug就别ida了...kd协议和数据结构前者能在2k的代码包里面能找到(2k里面有kd的代码也有kd64的代码还有windbg的代码还有windbg64的代码,几乎是全的)
后者数据结构也是在内核的pdb里面..至于协议的变化.就不能相信2k代码里面的了..我是ida的vista的某个beta的efi版的bootmgr来的.为什么是某个beta的efi呢?因为efi的结构比bios简单.而beta版的代码没有使用"全局优化",release版本的代码全局优化以后那简直跟噩梦一样...我是没耐心去看经过全局优化以后的代码的

3.pae.这个ida xp和2k3的就行了..本身不复杂就只是几个table设置.当然我还是推荐你ida一下vista的...因为xp和2k3的osloader只是工作在非pae的分页模式下.到最后了要转移执行到kernel的时候才去设置pae的那些table,设置完了接着就是移交控制权..而vista的不这样.vista的winload一开始就会打开pae.整个winload都是工作在pae环境下的.而且vista的这部分不管是pae的还是普通分页的代码是实现到一个lib里面的.所以即使vista的bootmgr不使用pae,这份pae的实现也是在bootmgr里面存在的..这样你能两方对比看普通分页跟pae有什么差异

4.serial console这就简单到不能再简单了..只是一部分的escape sequence处理而已

5.ramdisk..这个是指sdi的ramdisk不是wim的...sdi的我只是google到一个俄文的格式说明.不过这个东西本身就很简单.不压缩也不加密就是一个fat32的磁盘镜像

6.xip这个几乎就是和ramdisk联系到一起的..不过我很好奇..x86平台的非ce版的谁会用xip?..osloader里面的xip很简单.就只是一个4MB page的large read

7.然后就是我上面还提到的用非m$的比如grub,syslinux,pxelinux加载的部分.这个部分都是一些linux的东西.很简单的.一些特殊的结构让grub把我的这个ntldr识别成一个linux的kernel.然后grub会用加载linux kernel的协议方式(而不是通常的chainloader的方式)加载我的ntldr.其中最重要的就是能传递命令行参数..而命令行参数的最主要的作用就是在第一时间在快到不能再快的情况下初始化debugger...而windows的ntldr的debugger初始化太晚太晚代码都可以说执行了一大半了才初始化debugger..若干个东西都错过了.

牛皮吹了这么多.
其实我也想谈一谈这个具体的实现
不过想来想去真不知道该怎么说
osloader的功能很简单很单一....加载操作系统
但是osloader也并不像是某某驱动一样简单.
osloader的几个部分随便挑一个都能写一个长篇
比如内存管理..虽然没有kernel那么复杂.但是麻雀虽小..(这个部分推荐看vista的..因为xp和2k3的这个显得还是有点弱智,比如heap能分配不能释放,pde也只分配不释放等等)
又比如休眠..这个代码其实也不多..但是他跨度很大..涉及的东西多..都是一些内部内部内部做法
再比如文件系统..虽然没有cc没有vm没有fsd没有fastio.但是一样有disk cache(nt4的代码里面是没有这个功能的)..
就ntfs来说读是完整的(压缩的也能读).写只能写non-resident的attribute.但是他也不简单.(再次推荐vista.他的读写都是完整的)

最后..还是挺推荐看看ntldr和bootmgr和winload的
这几个里面的东西很多
1.内存管理..虽然他没有share memory没有copy on write更没有prototype也没有demand-zero
2.文件系统..这部分很有加载..没有cc没有vm没有fsd没有fastio没有irp.直接着眼文件系统他本身..你不用分神去处理异常不用去pin/unpin不用管oplock更不用acquire/release eresource
3.这ntldr里面有个精简版的scsiport...这不用太多介绍了吧
4.这里面有注册表的读取加载..理由同2..

最后最后最后
老规矩.....代码包里面
source目录下面是代码...
他下面有2个工程.一个是osloader.这个是运行在保护模式的主要的模块.用vc直接编译(虽然有不少恶心的inline asm).
另一个工程是startup module,他运行在实模式下..他负责"加载执行"osloader.并为osloader提供一些bios的中断封装.这个工程的编译需要下载一个nasm.exe
nasm是一个跨平台的汇编编译器..他就一个exe文件干净绿色.而且很简单.没有masm或者tasm那么复杂..你看看就知道了.asm源代码里面除了代码还是代码.没那么多乱七八糟的宏
没办法..这个startup module是全汇编的...我实在不想去装个16位的c编译器.反正也不大..纯汇编也就纯汇编了.也不麻烦.短短两三千行的汇编代码还是挺容易维护的
他的编译..我已经加到vc的工程里面的..你把nasm放到你的path里面直接就能在vc里面编译....多看看vc的工程配置...如果你遇到startup module的编译问题的话

ida下面是checked xp sp2的ida 5.2的文件...相对我以前的ida文件
这次这个估计会让你有点失望...
ida里面并没太多东西.因为我逆向的结果都记录到的c++代码里面.而没有像以前一样放ida里面
不过有c++源代码..ida你基本就可以无视

还有一个tftpd的目录是我用来调试的
里面有个绿色的tftpd的服务器端...(我只是用他的tftp功能..没有用dhcp.我的局域网上有专门的dhcp服务器)
pxelinux.0这个是pxelinux的pxe文件
startrom.n12这个windows 2003里面的startrom.他会加载osloader,exe..注意他需要的是一个pe格式的32位的osloader文件.但是你要rename成ntldr.不能直接用你的ntldr.你需要把前面的那段16位的startup代码给去掉.(另.不知道是我的bios的原因还是什么的.只要我pxe启动bios int13的返回结果就一定告诉我硬盘不支持LBA模式.但是我确实能用LBA模式去访问硬盘)

pxelinux.cfg目录下面有个pxelinux的配置文件.很简单
DEFAULT Windows
TIMEOUT 50
SERIAL 0 115200

LABEL Windows
    KERNEL NTLDR.krl
    APPEND root=/dev/sda1 debugport=1394 channel=12 debugstop redirectport=com1 redirectbaudrate=115200 forcelba autoreboot

倒数第二行就是kernel
最后一行就是命令行...

你要调试osloader.exe就直接windbg了
要调试startup.那要么你用ice.要么就虚拟机..我用bochs调试..还行..就是那个硬盘镜像你得要有一个能在windows下面使用能虚拟带着mbr的整个硬盘的软件而不是filedisk这种只是虚拟一个分区的软件(打个广告..试试我写的开源的在这个论坛上能找到的那个虚拟磁盘)

另外你能发现一个libcnt.lib的文件
他是一个有一些能在kernel模式下使用的c运行库.比如string的函数.memory的函数.等等的
我是用nt4里面的crt编译来的..所以没有_s的safe版...也没有atoi64这样的64位版
本来是打算用2008的crt源代码编译一个_s版的..结果发现nt4已经有写好的make文件
于是我偷了个懒..直接用nt4的代码编译了一份..

更新了附件
int13 ext的bug已经修正
附件名称/大小 下载次数 最后更新
ntldr.rar (2032KB)  572 2008-11-18 13:11

最新喜欢:

massermasser WLDNAWLDNA yeaipingyeaipi...
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-09-29 01:02
我来捧个钱场,呵呵,厉害啊,精力更是充沛
提问归提问,还是只能靠自己
root60931
驱动大牛
驱动大牛
  • 注册日期2002-10-25
  • 最后登录2023-10-29
  • 粉丝2
  • 关注0
  • 积分1013分
  • 威望432点
  • 贡献值0点
  • 好评度311点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2008-09-29 01:35
天人。。。
好好学习,天天向上! root60931@gmail.com
clicx
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2008-09-29 10:10
不得了
---内核开发合作或提供基础技术服务QQ:22863668 ---
玄风残翼
驱动牛犊
驱动牛犊
  • 注册日期2005-10-10
  • 最后登录2015-04-07
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望172点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-09-29 10:17
一不小心就只能睡剃毛老仙的地板了……唉。

下一份来研究一下。说不定改造个无盘出来……
WY.lslrt
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2009-10-27
  • 粉丝0
  • 关注0
  • 积分116分
  • 威望15点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-09-29 14:25
碰到老仙这样的人,我就开始想杀人了
---传说中的分割线--------
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
6楼#
发布于:2008-09-29 19:55
下一个小东西预告....

那就是pci总线驱动..
目前还有若干bug...调好就发上来
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2008-09-30 10:12
好东西,收藏起来,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
xuplus
驱动牛犊
驱动牛犊
  • 注册日期2008-04-10
  • 最后登录2010-06-11
  • 粉丝1
  • 关注0
  • 积分2分
  • 威望28点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-09-30 12:42
牛人!
国庆快乐各位!
liio
驱动小牛
驱动小牛
  • 注册日期2005-12-24
  • 最后登录2022-06-16
  • 粉丝4
  • 关注1
  • 积分24分
  • 威望343点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2008-10-02 05:43
这次不顶就太对不住人了。
以前我也尝试写过。
楼主费心了。

虽然现在已经用不上。但对楼主的精神太崇拜了。。
x-star
驱动小牛
驱动小牛
  • 注册日期2007-04-26
  • 最后登录2018-11-17
  • 粉丝0
  • 关注0
  • 积分65分
  • 威望664点
  • 贡献值1点
  • 好评度39点
  • 原创分1分
  • 专家分1分
  • 社区居民
10楼#
发布于:2008-10-13 18:32
惊!!!
boywhp
驱动中牛
驱动中牛
  • 注册日期2007-08-09
  • 最后登录2015-04-24
  • 粉丝2
  • 关注0
  • 积分1105分
  • 威望515点
  • 贡献值0点
  • 好评度254点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2008-10-27 19:54
想拜下大牛为师
iceburning
驱动牛犊
驱动牛犊
  • 注册日期2006-08-18
  • 最后登录2010-02-28
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望170点
  • 贡献值0点
  • 好评度39点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2008-10-27 22:04
佩服的很啊
I Believe I Can Fly,I Believe I Can Touch The sky!
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2008-10-28 13:24
引用楼主tiamo于2008-09-29 00:22发表的 [原创]这回这个估计用处不大 :
这回是ntldr..也就是windows vista以前版本的loader

前段时间家里3奶机的光驱要浮云了
我又不想到大奶机2奶机上去卸光驱
正巧看到网上的u盘量产可以虚拟一个光驱出来
.......


纯粹自己做着玩的?哇,不拿钱做的?
wollok
驱动小牛
驱动小牛
  • 注册日期2002-11-12
  • 最后登录2012-07-18
  • 粉丝0
  • 关注0
  • 积分571分
  • 威望335点
  • 贡献值0点
  • 好评度52点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2008-10-31 15:04
居然写出来一份可编译的,佩服。。。。
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
15楼#
发布于:2008-10-31 19:33
我其实不是做驱动的...
我的本行是做游戏的...

自己写着玩...不拿钱的
不然怎么可能公开源代码
引用第13楼violin于2008-10-28 13:24发表的  :


纯粹自己做着玩的?哇,不拿钱做的?
sczhangmin
驱动牛犊
驱动牛犊
  • 注册日期2007-03-21
  • 最后登录2011-11-17
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望60点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2008-11-02 12:31
请教一下tiamo 兄弟,你提到的:
“先说说跟windows的ntldr有什么不同
......
2.windows能从网络加载.我的不能
.....”

这里是指WINDOWS的NTLDR,能通过网卡PXE从服务器下载BOOT.INI和各种设备驱动,以及启动过程中需要的各种内核文件吗?

WINDOWS的那个版本开始提供这种功能,VISTA?

如果要逆向分析网络启动,该IDA拿个文件名,你的压缩包内那个IDB文件是否包含网络这部分?
tiamo
VIP专家组
VIP专家组
  • 注册日期2002-02-26
  • 最后登录2018-01-09
  • 粉丝17
  • 关注4
  • 积分50分
  • 威望142点
  • 贡献值1点
  • 好评度40点
  • 原创分2分
  • 专家分15分
  • 原创先锋奖
  • 社区居民
17楼#
发布于:2008-11-02 14:27
你硬盘上那个ntldr不能从网络下载的
你需要一个叫做startrom.n12或者startrom.com的文件..这个文件才能从网络上下载..他在2003的安装盘上能找到
pxe支持是从2000开始就有的..nt4好像没有
网络下载是说下载boot.ini,ntdetect.com,kernel,hal,设备驱动.等等..整个操作系统都能从网络上下载

网络启动没什么特别的....大部分是pxe的bios调用mtftp加载文件...按照pxe的协议做bios调用
还有一个tftp的协议实现...里面有udp协议实现...我的ida里面有这部分代码...不过没有详细的分析

引用第16楼sczhangmin于2008-11-02 12:31发表的  :
请教一下tiamo 兄弟,你提到的:
“先说说跟windows的ntldr有什么不同
......
2.windows能从网络加载.我的不能
.....”
.......
sczhangmin
驱动牛犊
驱动牛犊
  • 注册日期2007-03-21
  • 最后登录2011-11-17
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望60点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2008-11-02 22:21
非常感谢!
xiaohui0930
驱动牛犊
驱动牛犊
  • 注册日期2007-02-08
  • 最后登录2010-01-30
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2008-11-03 06:50
1. 下载回来,编译一遍后,在我这里似乎无法从NTFS分区中启动,在VM虚拟机中,表现为不停的重启,屏幕无任何提示。
2. tftp目录中的NTLDR.krl改名后放到VM中也无法启动机器,表现为黑屏,也是无任何提示。。。
想请教一下楼主具体是如何调试的,谢谢!      
上一页
游客

返回顶部