-
-
ntldr(Windows引导程序) DIY 进阶篇 by 0403
-
发表于:
2011-5-17 12:03
14399
-
ntldr(Windows引导程序) DIY 进阶篇 by 0403
[Label=原文]
/********************************************************************
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/releasebuilds/2.10rc4/win32/nasm-2.10rc4-installer.exe
好啦,这篇介绍了如何做自己的NTLDR,主要介绍了如何进行屏幕输出和键盘输入,以及硬盘读取。
你肯定不满足,因为你也许还想要对硬盘进行读写,而不是只读,甚至想加载自己的内核,如Linux内核呀,DOS呀。
那么就看我的下一篇吧!
下一篇:
《ntldr(Windows引导程序) DIY 终极篇 by 0403》
将介绍如何对GDT进行修改,突破WinNT的权限限制,如何构建自己的函数,实现对硬盘的完全读写(绝对读写和NTFS分区读写),以及如何自己加载内核等等。
敬请期待
^_^
[/Label]
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课