首页
社区
课程
招聘
ntldr(Windows引导程序) DIY 进阶篇 by 0403
发表于: 2011-5-17 12:03 14287

ntldr(Windows引导程序) DIY 进阶篇 by 0403

2011-5-17 12:03
14287
[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直播授课

收藏
免费 7
支持
分享
最新回复 (13)
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
等会回去试试、期待楼主下篇!
2011-5-17 12:12
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
下篇会“很快”出来的
2011-5-17 12:13
0
雪    币: 241
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习了~~过来拜高手~
2011-5-17 15:19
0
雪    币: 4580
活跃值: (992)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
不错不错,很久木见这样的好文了
2011-5-17 16:09
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
那个ntldr文件已经到期了,
2011-5-18 16:56
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
7
已经续期^_^
2011-5-22 16:06
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
下篇还木出来,楼主木有小JJ。
2011-5-22 16:14
0
雪    币: 62
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主哪里来的NTLDR源代码?

有更新的版本么?win 03 sp2的
2011-5-22 19:24
0
雪    币: 172
活跃值: (212)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
lz V5~~~~~~~~
2011-5-30 04:11
0
雪    币: 1683
活跃值: (674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好东西,
2011-5-30 04:29
0
雪    币: 1530
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
非常棒的帖子  等待高級篇
2011-5-30 11:52
0
雪    币: 143
活跃值: (61)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
13
Sorry, 我没有。
2011-6-4 17:03
0
雪    币: 492
活跃值: (53)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
14
ntldr(Windows引导程序) DIY 终极篇 by 0403

怎么还没出来啊?
2011-7-14 18:16
0
游客
登录 | 注册 方可回帖
返回
//