欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

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

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功