在线搜索
|
有问题找看雪
ntldr(Windows引导程序) DIY 初级篇 by 0403
标 题:
ntldr(Windows引导程序) DIY 初级篇 by 0403
作 者:
weizehua
时 间:
2011-05-17 12:02:34
链 接:
http://bbs.pediy.com/showthread.php?t=134087
原文
今天心情好,停电又有空了,就写这篇。教大家如何修改开机启动叶面,还有扫盲。
首先,介绍下什么是ntldr.
ntldr,位于主引导区的根目录(一般是c:\ntldr,带隐藏属性)把ntldr写长一点就是nt loader。nt是微软的系统的总称,load是加载的意思。那么ntldr就是加载系统的工具。其实我们的电脑开机的时候,选择系统的界面就是它控制的。
此次修改ntldr,目的就是修改那个选择系统的界面。
在修改ntldr之前,告诉你一个ntldr的”秘密”:它其实是两个可运行文件。一个是Startup.com(负责初始化cpu等等的工作)另一个是osLoader.exe(负责加载系统)。其中后者的文件格式完全符合PE文件格式(这个我不打算扫盲,简单点说,我们电脑上运行的软件,99.99%是PE文件)。因为后者这种格式很特殊,所以我们很容易修改它!
好,废话够了,进入正题了。
要准备的软件:Windows 系列系统,winhex,PE Explorer
要准备的硬件:能用的电脑一台,正常人一个
技术要求:挥鼠标、敲键盘、看懂字。
0
0
0
首先…我们按机箱上的开机键………………(哎呀,我的头好疼,谁这么缺德仍砖头啊)
0
0
首先,进我的电脑-c盘。点上面的工具-文件夹属性-察看-”显示所有文件或文件夹”,并将上面的”隐藏系统关键……”的勾去掉。
这时你可以看到ntldr了。
用winhex打开它,按下CTRL + F,输入MZ,回车。
此时已经定位到了osloader.exe的起始数据,前面的数据都是startup.exe的。接下来我们分割它们出来。
选中MZ前面的(不包括MZ)所有数据,右键-编辑-十六进制编辑-复制到新文件,保存为你喜欢的文件(A)。同法把MZ(包括MZ)后面的东西复制到新的文件(B)中。
用pe explorer 打开B,然后点资源编辑。选中字符串,再选中文。
嘿嘿,你一个一个点点看,是不是有你熟悉的句子呀?那改吧!
改完了,记得保存,它也许有个提示:什么什么大小改变,是否什么…………要选”是”。
剩下的就是重新合并两个文件啦,用winhex打分别开1和2。切换到2,全选(ctrl+a),十六进制复制(ctrl+c)。再切换到1,托到最后面,粘贴(ctrl+v)保存为ntldr.
Enjoy it !
标 题:
ntldr(Windows引导程序) DIY 进阶篇 by 0403
作 者:
weizehua
时 间:
2011-05-17 12:03:53
链 接:
http://bbs.pediy.com/showthread.php?t=134088
原文
/********************************************************************
Data: 2011-05-17 May 17 2011 Tuesday
Time: 10:30:12
FileName: ntldr(Windows引导程序) DIY 进阶篇 by 0403
Author: 0403
*********************************************************************/
在上一篇(《ntldr(Windows引导程序) DIY 初级篇 by 0403》)中,我介绍了如何通过修改资源中的字符串来修改系统选择页面。
在这一篇中,我要介绍的是如何完全DIY自己的启动选择页面,例如给系统加密,显示Logo等等。
硬件要求:
上一篇中需要的所有硬件
脑子
技术要求:
上一篇中需要的所有技术
C语言
软件要求:
C编译环境(推荐VC++2008以上版本)
DDK
NTLDR源文件(文章最后提供下载链接)
NAsm(NetWide Assmebler)
可选软件:
Virtual Box(测试环境)
VMware DiskMount Utility(VMDK格式虚拟硬盘映射)
首先,我们要修改一下环境,把NAsm的路径加到Path(环境变量)里去,这样就能成功编译NTLDR了。
好,开工!
/*
以下打开的文件,全部在NTLDR源码中。
我用的IDE环境是VC2008,如果环境不同,快捷键不同那别怪我)
至于NTLDR具体做什么我就不累赘了,想知道的可以参考别人的NTLDR分析。
*/
先介绍一下里面我们会用到的函数:
默认打印函数:
BlPrint --使用方法等同于C标准库里的printf
默认键盘输入函数:
BlGetKey --这个函数立即返回,如果没有输入则返回0,如果我们想让它读到一个键再返回,就自己写一个函数。
默认硬盘访问函数:(在这个NTLDR里好像只可读,其他方式访问全部失败。(ArcOpenReadOnly))
ArcOpen --这个函数打开某个分区,之后再调用BlOpen打开对应的文件
BlOpen --这个函数打开分区上的文件,使用相对与根目录的路径。
BlRead --顾名思义
BlWrite --顾名思义
BlClose --顾名思义
ArcClose --顾名思义
可见,键盘输入并不够完善,我们自己构造两个函数来实现更丰富的键盘输入吧:
/*
函数功能 : 从键盘读入一个键,直到有按键了才返回。
参数 : 无
返回值 : 读入的字
*/
char getchar_0403 ()
{
ULONG c;
do
{
c = BlGetKey ();
} while (!c);
return (char)c;
}
/*
函数功能 : 从键盘读入一个字符串,直到回车才返回。不支持退格。
参数 : str -保存字符串的地址
MaxCount -最多读入多少个字
返回值 : 读入的字数。
*/
unsigned gets_0403 ( char *str, unsigned MaxCount )
{
unsigned i;
for (i = 0; i < MaxCount ; i++, str++)
{
ULONG dd = 1;
*str = getchar_0403 ();
BlPrint ( "%c", *str );
if ( *str == '\r' || *str == '\n')
{
*str = 0;
break;
}
}
BlPrint ( "\n" );
return --i;
}
好了,我们可以实现屏幕输出和键盘输入咯!
接下来我提供几个代码位置,我们可以插入我们自己的代码进去,来改变NTLDR的启动显示。至于为什么插到那些位置上,我不累赘。
初始化:
Entry.cpp,第349行。
系统选择画面:
selkrnl.cpp,第758行。
高级启动画面:
advboot.cpp,第379行。
好的,就这样!这是我的例子:
我在 初始化 那里添加以下代码:
const char PASS_WORD[] = "0403";
void Sleep_0403 (ULONG Second)
{
ULONG Start = ArcGetRelativeTime ();
while (ArcGetRelativeTime () - Start < Second)
;
}
// Line 349
while (true)
{
BlClearScreen ();
BlPrint ( "\t\t\t0403 Loader V 0.1 \n\n" );
BlPrint ( "Please input the login password:\n" );
gets_0403 () (PassWord, sizeof(PassWord));
if (strcmp (PassWord, PASS_WORD))
{
BlPrint ("error!\n");
Sleep_0403 (1);
continue;
}
else
{
BlPrint ("All right!\n");
Sleep_0403 (1);
break;
}
}
结果你猜,你肯定知道啦!
NTLDR下载地址:
(115网盘)
http://u.115.com/file/dnambjym
Nasm下载地址:
(2011-5-17最新版)
http://www.nasm.us/pub/nasm/releaseb...-installer.exe
好啦,这篇介绍了如何做自己的NTLDR,主要介绍了如何进行屏幕输出和键盘输入,以及硬盘读取。
你肯定不满足,因为你也许还想要对硬盘进行读写,而不是只读,甚至想加载自己的内核,如Linux内核呀,DOS呀。
那么就看我的下一篇吧!
下一篇:
《ntldr(Windows引导程序) DIY 终极篇 by 0403》
将介绍如何对GDT进行修改,突破WinNT的权限限制,如何构建自己的函数,实现对硬盘的完全读写(绝对读写和NTFS分区读写),以及如何自己加载内核等等。
敬请期待
^_^