原文
今天心情好,停电又有空了,就写这篇。教大家如何修改开机启动叶面,还有扫盲。
首先,介绍下什么是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 !

原文
  /********************************************************************
    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分区读写),以及如何自己加载内核等等。
      敬请期待
        ^_^