无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 36067|回复: 108
打印 上一主题 下一主题

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

[复制链接]
跳转到指定楼层
1#
发表于 2005-8-26 11:57:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[这个贴子最后由turboy在 2006/01/19 10:45pm 第 9 次编辑]

【程序的历史】
  这帖子最早发在DOS联盟论坛上,后来无忧的 hnlyzhd 版主转了过来。http://bbs.wuyou.net/cgi-bin/top ... topic=10153&show=75
  原因是这样的:我曾帮一个卖电脑的朋友做过类似一键恢复的程序,就是用WBAT等批处理工具来包装Ghost,把备份保存在最后一个分区的\SYSBCK目录下,备份和恢复一次只要几分钟。我给他演示的时候效果还不错,但不久他就沮丧地告诉我:“客户在F盘发现了一个隐藏的大文件夹,里面的文件双击又不能打开,就当垃圾文件删掉了!”--我真是欲哭无泪!我已经作了隐藏,用户手册上也写了,但客户还是会自作聪明地去删掉它--看来客户的问题的确是千奇百怪。后来我想能否有这样一种方法,就是划出一个分区来单独保存系统备份,在备份完成后将此分区隐藏。这样客户的操作系统启动后怎么也看不到备份盘了,这就避免了备份被删除的尴尬。用我们的系统恢复盘启动时,这个备份分区又可见了,一切就和没有隐藏一样,可以恢复也可以更新备份。这样不就方便、安全多了。当时我把这个想法放在论坛里给大家讨论。http://www.cn-dos.net/forum/viewthread.php?tid=12660&fpage=1
  事隔一年了,一直没人写类似的程序,只好自己来写。由于我对DOS的细节还是不清楚,就写个引导程序来做了。自己努力了一阵子终于有了结果,在Bochs-2.1.1和VMWare以及我管理的二十多台清华同方P4电脑里测试通过,能够欺骗DOS在启动后为11、14、16、1B和1C、1E格式的隐藏分区分配盘符。
【程序说明】
  这是一个用来引导系统备份/恢复光盘的程序,将会放在启动软盘镜像的第一个扇区内。此程序引导系统时,出现一个提示,用户可选择按任意键启动工具软盘,也可以在等待8秒后引导硬盘上的操作系统。在选择由工具软盘启动DOS后,在MBR中隐藏的主分区将会分配盘符变得可见,这就可以用常规工具来做备份了!如果不用这个工具启动,这些备份分区就不可见,这样普通用户就无法删除备份数据了。
[UploadFile=yrt1_1125109743.jpg]
[UploadFile=yrt2_1125109806.jpg]
[UploadFile=yrt3_1125109867.jpg]
注意:上面的截图是7月23日版的,只支持FAT32隐藏分区(1B/1C),8月23日版本已经可支持FAT32/FAT16所有(01-11,04-14,06-16,07-17,0B-1B,0C-1C,0E-1E)分区类型了。
【使用方法】
  1. 在硬盘上划分出一个新的主分区(FAT16/FAT32类型),可用PQMAGIC或GDISK来做(微软的FDISK不允许创建两个主分区)。通常这个新的主分区在启动后会被分配为最后一个盘符——这可供做备份工具的朋友们参考。
  2. 用PQMAGIC或GDISK将这个新建的主分区隐藏,达到DOS正常启动后无法看到的目的。
  3. 准备一个1.44M启动软盘的镜像文件,如DOS.IMG。要确保此镜像可以启动DOS。
  4. 运行我提供的MAKEIMG.EXE制作出具备可以显隐藏分区功能的启动盘镜像NEWDOS.IMG,命令如下:
    MAKEIMG  DOS.IMG  NEWDOS.IMG
  5. 将生成的NEWDOS.IMG写入软盘或作为光盘的启动镜像或在虚拟机中直接启动,就可以看到那个被隐藏的主分区已经被分配了盘符。余下的就是向里面复制软件、备份数据等自己的事儿了。
【查找此分区的方法建议】
  方法一:在备份分区的根目录下建一个特殊名字的文件,然后用IF EXIST 命令来判断。
  方法二:用GDISK 1 /STATUS来得到分区状态,然后用程序分析。
【特别提醒】
  我保证程序中没有写硬盘MBR的代码,可是难保一切意外的发生,最好用没保存重要数据的真实硬盘测试通过后正式使用!
【目前最新版本:2008年10月21日编译】
  HFBOOT.ASM还是9月1日的,MAKEIMG.EXE在9月5日新增选项后编译
  hnlyzhd版主所提出启动安装在隐藏分区内的操作系统的功能现在终于真正实现了,新程序在启动时出现的8秒等待中如果按了F7键(或自定义的键),则会从第一个隐藏主分区启动,此盘分配为C:。目前我只测试了DOS7.1(Win98启动盘),我想应该也能启动WIN98。WinXP启动后会将隐藏分区变成非隐藏,用硬盘重启后仍是可显示的,肯定时WinXP在什么时候更新过MBR。LINUX没有试。
  目前使用本程序启动后,可以成功令DOS为隐藏分区分配盘符。
  在MS-FDISK、FREE-FDISK、AEFDISK、PQMAGIC、Acronis Disk Editor等大多数程序中隐藏分区都会以正常分区显示,但GDISK却可以看出此分区为隐藏分区,GDISK一定有超越BIOS中断的独特存取硬盘方法。
  crshen朋友帮我发现了几处严重的BUG,这些BUG由于DOS启动时根本没有用到所以我以前没发现。
  新加入一个功能ESC键:可以不加载本程序,正常从硬盘盘启动,。
  新加入一个功能F5键:可以不加载本程序,正常从软盘盘启动,用于需要正确查看实际分区时。
  MAKEIMG.EXE的命令行选项可以忽略大小写了。
  新的命令行如下:
  MAKEIMG  源镜像文件名  [目的镜像文件名] [选项]
   源镜像文件名  用来制作显隐藏分区功能的软盘镜像文件
   目的镜像文件名 将要生成的带显隐藏分区功能的软盘镜像文件,可省略,默认值为YISIR.IMG
  可选参数:
   /f       生成的程序在计算机启动时直接从软盘启动。
   /b       生成的程序在计算机启动时直接激活隐藏分区并启动。(注意隐藏分区中必须已安装了操作系统,此功能也未写MBR)
  无 /f 和 /b 参数时将出现提示并等待8秒,这期间按任意键从软盘启动,否则从硬盘启动且不加载显隐藏分区功能。
   /k:n      n=1-4,6-12。设置直接激活隐藏分区并启动时用的按键,可以是F1-F4、F6-F12
     /p:nn=0 - 255 ,自定义构成进度条的字符,默认是62即“>”,象219(实心方块)、220、223也挺好看
     /r:nn=1 - 24 ,自定义提示信息的在屏幕中的开始行,默认是21行,即在21行显示提示,22行显示进度条。
   /u       卸载本程序,将由本程序生成的镜像文件还原,结果保存成一个镜像文件。
希望下载和使用了这个软件的朋友跟帖或到我的小站留言谈一下看法。
2008年10月31日
  应天风、紫狐的要求又翻出源程序来,加上了对0x12->0x0c分区的映射。MAKEIMG.EXE现在是用VC6编译的Windows控制台程序了。
这里是最新的软件: BootHide.rar (30.53 KB, 下载次数: 439)
20050905的版本在这里[UploadFile=boothide060119_1137658632.zip]
新加入一个配套程序UNLOAD.COM,用于还原程序所修改的INT13中断为系统原值。
[UploadFile=screen_1137681571.gif]

[ 本帖最后由 turboy 于 2008-10-31 15:59 编辑 ]

BootHide.rar

30.53 KB, 下载次数: 482, 下载积分: 无忧币 -2

BootHide Build20081021

2#
发表于 2005-8-26 15:02:48 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

好东东谢谢楼主提供!
回复

使用道具 举报

3#
发表于 2005-8-26 20:29:48 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

不错,真是好东西啊
回复

使用道具 举报

4#
发表于 2005-8-26 20:55:03 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

不错,我正需要呢..
回复

使用道具 举报

5#
发表于 2005-8-26 20:59:24 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

好东西!
回复

使用道具 举报

6#
发表于 2005-8-26 21:38:00 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

学习,试用
回复

使用道具 举报

7#
发表于 2005-8-26 23:50:20 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

下了一个.楼主辛苦.
回复

使用道具 举报

8#
发表于 2005-8-27 09:47:54 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

楼主功力厉害,不服不行
回复

使用道具 举报

9#
发表于 2005-8-27 11:46:07 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

强人!学习收藏ing
回复

使用道具 举报

10#
 楼主| 发表于 2005-8-29 00:18:07 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

[这个贴子最后由turboy在 2005/09/02 02:43am 第 1 次编辑]

8月28日最新更新:实现了启动安装在隐藏分区内的操作系统
  我和hnlyzhd版主交流时他提出个建议:能否启动安装在隐藏分区内的操作系统。
  现在实现了,新程序在启动时出现的8秒等待中如果按了F7键(我用BOCHS调试的,它不准我用F11、F12),则会从第一个隐藏主分区启动,此盘分配为C:。
  目前我只测试了DOS7.1,不知道能不能启动WIN98。但WIN2K和XP或LINUX不用试肯定不行,它们都不依赖BIOS读盘。
  真心希望各位下载试过了的朋友能回复这个新加功能的稳定性。
在这里下载:老版本已删除
  新的命令行如下:
  MAKEIMG  源镜像文件名  [目的镜像文件名] [/f | /b | /u]
   源镜像文件名  用来制作显隐藏分区功能的软盘镜像文件
   目的镜像文件名 将要生成的带显隐藏分区功能的软盘镜像文件,可省略,默认值为YISIR.IMG
  可选参数:
   /f       生成的程序在计算机启动时直接从软盘启动。(f为小写字母)
   /b       生成的程序在计算机启动时直接激活隐藏分区并启动。(b为小写字母,注意隐藏分区中必须已安装了DOS操作系统,此功能也未写MBR)
  无 /f 和 /b 参数时将出现提示并等待8秒,这期间按任意键从软盘启动,否则从硬盘启动且不加载显隐藏分区功能。
   /u       卸载本程序,将由本程序生成的镜像文件还原。(u为小写字母)
回复

使用道具 举报

11#
发表于 2005-8-29 09:52:53 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

与 IBM 的隐藏分区跳转功能有啥区别?
回复

使用道具 举报

12#
 楼主| 发表于 2005-8-29 10:08:06 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

[这个贴子最后由turboy在 2005/08/29 10:15am 第 1 次编辑]
下面引用由xiaoyuan04172005/08/29 09:52am 发表的内容:
与 IBM 的隐藏分区跳转功能有啥区别?
原理上是一样的,可是比IBM的要安全一些。因为IBM的还要安装到MBR里面,用户的很多操作都可能会破坏掉它(一个FDISK /MBR就完了)。而我的这个是放到系统启动光盘或软盘里面,是不会被无意破坏的。而且,程序在运行时也不会向MBR里写任何东西!
另外,我想做的并不是说做一个什么“一键恢复”的启动盘,而是提供一个通用的支持程序。每个人都可以利用它的支持简单、安全的自己DIY出自己的系统恢复工具——这才是我写这个程序真正希望看到的啊!
我先整理一下,后面我还会帖出一些和它相关应用方法的例子,抛砖引玉,让大家能认识它的用法。
回复

使用道具 举报

13#
发表于 2005-8-29 10:29:13 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

下面引用由turboy2005/08/29 10:08am 发表的内容:
原理上是一样的,可是比IBM的要安全一些。因为IBM的还要安装到MBR里面,用户的很多操作都可能会破坏掉它(一个FDISK /MBR就完了)。而我的这个是放到系统启动光盘或软盘里面,是不会被无意破坏的。而且,程序在 ...
期待中......
回复

使用道具 举报

14#
 楼主| 发表于 2005-8-29 11:04:20 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

[这个贴子最后由turboy在 2005/08/29 11:15am 第 1 次编辑]

应用之一
这是我曾写过的一个用于新硬盘自动分区的程序,将自动创建一个3GB的隐藏的备份分区:
这里如何用我这个程序:
用刚才的程序做一个启动盘启动,用SYS G:(隐藏分区的的盘符)使它可以启动,将GHOST.EXE等程序复制到G:,安装系统后再把系统备份也放到G:,写好G:\AUTOEXEC.BAT。以后在用此启动盘启动时按F7,系统就会从隐藏的备份分区中启动,自动执行AUTOEXEC.BAT,进行系统恢复/备份工作。
这不是一个很好的“一键恢复”吗?
@ECHO OFF
rem FILENAME: AUTOHIDE.BAT
rem PROGRAM: Yisir
rem 用来全自动分区,公式  C:8GB + 3GB(隐藏分区) + D:40%% + E:30%% + F:30%%
:L_CCDOS
XZL
CLS
REM 检查硬盘参数
CALL HDSTATUS.BAT
ECHO             *------------------------------------------------*
ECHO             *     易老师自动分区工具 1.1   2005-5-20          *
ECHO             *     (此版程序自动创建一个3GB的备份分区)        *
ECHO             *------------------------------------------------*
ECHO             此计算机中所安装硬盘信息如下:
ECHO                     硬盘编号: %HD%
ECHO                       总容量: %HDSIZE%
ECHO                   现有分区数: %PARTS%
ECHO             警告:
ECHO                 分区是一个危险的操作, 下面的程序将导致硬盘中的
ECHO             所有数据丢失。故此程序只供专业技术人员装机时使用,
ECHO             其他人员错误操作造成的损失与作者无关!
ECHO                                     http://yisir.9126.com
ECHO             *------------------------------------------------*
ECHO             全自动分区公式  C:8GB + 3GB + D:40%% + E:30%% + F:30%%
ECHO             注:那个3GB的主分区是供备份用的隐藏分区
REM 计算各分区大小
STRINGS EXTSIZE= SUB %HDSIZE%,11000
STRINGS EXTSIZE= DIV %EXTSIZE%,10
STRINGS HDPARTD= MUL %EXTSIZE%,4
STRINGS HDPARTE= MUL %EXTSIZE%,3
STRINGS HDPARTF= SUB %HDSIZE%,8000,%HDPARTD%,%HDPARTE%
ECHO         当前方案 %HDSIZE%= C:8GB + 3GB + D:%HDPARTD%M + E:%HDPARTE%M + F:%HDPARTF%M
ECHO             *------------------------------------------------*
ECHO                 输入“auto”开始全自动分区
ECHO                 输入“hand”开始手动分区
ECHO                 输入其他值退出
ECHO             *------------------------------------------------*
STRINGS CHOICE= ASK ------------请慎重考虑后再输入你的选择:
STRINGS CHOICE= UPPER %CHOICE%
IF %CHOICE%#==AUTO# GOTO AUTO
IF %CHOICE%#==HAND# GOTO HAND
GOTO END
:AUTO
GDISK %HD% /DEL /ALL
GDISK %HD% /CRE /PRI /SZ:8000 /FOR /Q /V:SYSTEM
GDISK %HD% /CRE /PRI  /SZ:3000 /FOR /Q /V:SYS_BACKUP
GDISK %HD% /CRE /EXT /FOR /Q /V:SYS_BACKUP
GDISK %HD% /CRE /LOG /SZ:%HDPARTD% /FOR /Q /V:DATA
GDISK %HD% /CRE /LOG /SZ:%HDPARTE% /FOR /Q /V:OTHER
GDISK %HD% /CRE /LOG /FOR /Q /V:BACKUP
GDISK %HD% /HIDE /P:2
SET HDPARTD=
SET HDPARTE=
SET HDPARTF=
GOTO OK
:HAND
REM C盘
STRINGS HDPARTC= ASK 请输入%PCHAR%盘容量(最大%hdsize%MB):
GDISK %HD% /DEL /ALL
GDISK %HD% /CRE /PRI /SZ:%HDPARTC% /FOR /Q /V:SYSTEM
GDISK %HD% /CRE /EXT
REM D盘、E……
SET PNO=68
STRINGS MAXSIZE= SUB %HDSIZE%,%HDPARTC%
:P2_LOOP
STRINGS PCHAR= CHAR %PNO%
STRINGS ASKSIZE= ASK 请输入%PCHAR%盘容量(单位MB,直接回车建最大%MAXSIZE%):
IF %ASKSIZE%#==# GOTO P2_OK
GDISK %HD% /CRE /LOG /SZ:%ASKSIZE% /FOR /Q /V:LOG_%PCHAR%
STRINGS MAXSIZE= SUB %MAXSIZE%,%ASKSIZE%
STRINGS PNO= ADD %PNO%,1
GOTO P2_LOOP
:P2_OK
GDISK %HD% /CRE /LOG /FOR /Q /V:LOG_%PCHAR%
SET ASKSIZE=
SET MAXSIZE=
SET PNO=
SET PCHAR=
SET HDPARTC=
GOTO OK
:OK
GDISK %HD% /ACT /P:1
GDISK %HD% /MBR
ECHO 分区完成!请启动计算机,安装操作系统。
SET HDSIZE=
SET HDPART=
PAUSE>NUL
XZL /Q
GOTO END
:END
ECHO 已退出
这是它调用的用来得到硬盘号(HD)、已有分区数(PARTS)、容量(HDSIZE)的批处理
@ECHO OFF
rem FILENAME: HDSTATUS.BAT
rem PROGRAM: Yisir
rem 用来得到硬盘号(HD)、已有分区数(PARTS)、容量(HDSIZE)
IF %1#==SETVAR# GOTO SETVAR
REM 临时文件存在虚拟盘中
STRINGS TMPS= RIGHT %RAMDRIVE%,1
SET TMPFILE=\HDSTATUS.TXT
IF %TMPS%#==\# SET TMPFILE=HDSTATUS.TXT
SET TMPS=%RAMDRIVE%%TMPFILE%
SET TMPFILE=
SET LL=1
GDISK /STATUS>%TMPS%
:LOOP
  STRINGS HDS= READ %TMPS%,%LL%
  STRINGS TMPSTR= MID %HDS%,1,4
  STRINGS LL= ADD %LL%,1
  IF ';%TMPSTR%';==';Disk'; GOTO FOUND
  GOTO LOOP
:FOUND
STRINGS HDS= READ %TMPS%,%LL%
SET TMPSTR=
SET TMPS=
SET LL=
CALL %0 SETVAR %HDS%
GOTO END
:SETVAR
SET HDS=
SET HD=%2
SET PARTS=%3
SET HDSIZE=%7
:END
这是XZL.EXE和STRINGS.COM[UploadFile=tools_1125284541.zip]
GDISK太大了不能上传。
回复

使用道具 举报

15#
发表于 2005-8-29 19:01:55 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

看到《易老师自动分区工具》才知道原来 turboy 就是易老师,这个东东很早以前就在你的个人网站上下载收藏了,真是久仰久仰,哈哈。
看样子宣传还不够,帮忙贴一下你的网站吧:http://yisir.softhome.cn/yiarticle/index.php
回复

使用道具 举报

16#
 楼主| 发表于 2005-8-30 02:04:28 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

我在不同的机器环境测试了一下,现在自报一下BUG:如果隐藏分区位于硬盘前8G以内,在启动时按F7就可以从隐藏分区启动。但如果是在前8G以后,就不行了。
我想这应该是标准MBR引导程序的局限,就算是用GDISK把隐藏分区直接激活也没办法从中启动。还要再想想有没有办法来解决它……
回复

使用道具 举报

17#
发表于 2005-8-30 15:32:23 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

下面引用由turboy2005/08/30 02:04am 发表的内容:
我在不同的机器环境测试了一下,现在自报一下BUG:如果隐藏分区位于硬盘前8G以内,在启动时按F7就可以从隐藏分区启动。但如果是在前8G以后,就不行了。
我想这应该是标准MBR引导程序的局限,就算是用GDISK把隐藏 ...
是不是使用dos论坛那个精简了的IO.SYS?是的话替换微软原来的就可以解决,Wengier精简的版本会出现这个问题。
回复

使用道具 举报

18#
发表于 2005-8-30 23:53:40 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

能否放入U盘使用
回复

使用道具 举报

19#
 楼主| 发表于 2005-8-30 23:58:00 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

下面引用由jcc2005/08/30 11:53pm 发表的内容:
能否放入U盘使用
U盘目前还不能直接用,也许可以用NTLDR或GRUB载入一个软盘镜像的方式来使用。
回复

使用道具 举报

20#
发表于 2005-8-31 00:43:05 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

谢谢楼主
回复

使用道具 举报

21#
发表于 2005-8-31 08:22:38 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

[这个贴子最后由crshen在 2005/08/31 08:27am 第 1 次编辑]
下面引用由turboy2005/08/30 02:04am 发表的内容:
我在不同的机器环境测试了一下,现在自报一下BUG:如果隐藏分区位于硬盘前8G以内,在启动时按F7就可以从隐藏分区启动。但如果是在前8G以后,就不行了。
我想这应该是标准MBR引导程序的局限,就算是用GDISK把隐藏 ...
有关BUG的问题,请看下面,程序是以前的Build0826版反汇编得到的,相信0828版可能在这部分未作修改,根本原因就在于老的INT13只支持8G以内,而程序中的扩展int 13的42号子功能无论如何不能被执行。
回复

使用道具 举报

22#
发表于 2005-8-31 08:24:19 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

干脆直接贴过来算了:
0100        jmp 013C        
013C        cli        
013D        xor ax, ax        
013F        mov ds, ax        
0141        mov es, ax        
0143        mov ss, ax        
0145        mov ax, 7C00        
0148        mov sp, ax        
014A        sti        
014B        push ax        
014C        mov ax, 1301        
014F        mov bx, 000A        
0152        mov cx, 0068             //字符串长度
0155        mov dx, 1500        
0158        mov bp, 7D94             //字符串地址为7D94-7c00+100=294,即文末
015B        int 10                     //显示字符串及属性
015D        mov ah, 01        
015F        mov cx, 2000        
0162        int 10                     //设置光标形状
0164        mov si, 046C             //BIOS数据区0040:006c存放着定时器的计数值
0167        mov edx, [si]        
016A        mov ecx, edx        
016D        add edx, 0000009F    //设置等待时间

0174        mov ah, 01        
0176        int 16                     //判断字符是否存在
0178        je 0183                     //没有则跳转
017A        mov ah, 00        
017C        int 16                   //如有则读字符,限83键盘,ah=10时支持扩展键盘
017E        xor dx, dx          //如果有按键,则dx=0
0180        jmp 01A0        

0183        cmp ecx, [si]
0186        jnb 0195        
0188        test cl, 01        
018B        je 0195        
018D        mov ax, 0E3E        
0190        mov bx, 0004        
0193        int 10                   //显示字符0x3E ">"

0195        mov ecx, [si]        
0198        cmp edx, ecx          //定时器是否到时
019B        jnb 0174        
019D        mov dx, FFFF          //规定时间内无按键,则dx=0xFFFF

01A0        mov ah, 01
01A2        mov cx, 0D0E
01A5        int 10
01A7        mov bx, 0413
01AA        mov ax, [bx]
01AC        dec ax          //直接减少0040:0013处的值, 减少可用内存的容量
01AD        cmp dx, FFFF  
01B1        je 01B5
01B3        mov [bx], ax     //保存基本内存容量

01B5        shl ax, 06
01B8        mov es, ax             //算出减1K后的高端段址
01BA        pop si                 //si=7C00,ds:si(0000:7C00)
01BB        push es
01BC        xor di, di             //目的地址es:di(es:0000)
01BE        cld
01BF        mov cx, 0100             //0x100个字,即本程序512字节搬移
01C2        repnz
01C3        movsw                   //字符移动
01C4        mov si, 004C           //取中断向量表中,INT 13H的偏移位置
01C7        mov di, 0109           //即下面的0209,更改jmp 0000:0000为jmp 真正INT13地址
01CA        mov eax, [si]
01CD        mov es:[di], eax       //保存原INT 13H的偏移位置
01D1        cmp dx, FFFF
01D5        je 01E3               //如果从硬盘启动则跳转,即不接替INT 13
01D7        push es
01D8        pop ax
01D9        shl eax, 10
01DD        mov ax, 011B
01E0        mov [si], eax         //更改INT 13H的偏移位置为下面的021B

01E3        push ds
01E4        pop es
01E5        mov bx, 00EA
01E8        push bx
01E9        retf              //ip=00EA,cs=es,实际为执行下面的01EA

01EA        cmp dx, FFFF
01EE        je 01F9
01F0        mov cx, 4F12
01F3        mov dx, 0100         //从软盘启动,0面79道18扇区
01F6        jmp 01FF

01F9        mov cx, 0001          //从硬盘启动,0面0道1扇区
01FC        mov dx, 0080

01FF        mov ax, 0201
0202        mov bx, 7C00          //读1个扇区到7C00
0205        pushf
0206        push ds              //ds=0000
0207        push bx              //bx=7C00,INT 13返回后跳转到0000:7C00

0208        jmp 0000:0000        //01CD处修改后成为INT 13
020D-021A 11 01 14 04 16 06 17 07 1B 0B 1C 0C 1E 0E  //分区类型表
021B        cmp ah, 02        //老的读扇区功能
021E        jne 0231
0220        cmp dx, 0080
0224        jne 0231
0226        cmp cx, 0001
022A        je 024F          //读硬盘BOOT扇区
022C        cmp ah, 42       //扩展读功能,×××这里似乎不可能到达×××
022F        je 0234

0231        jmp 0208

0234        push eax
0236        xor eax, eax
0239        cmp [di+08], eax
023D        jne 024A
023F        cmp [di+0C], eax
0243        jne 024A
0245        pop eax
0247        jmp 024F

024A        pop eax
024C        jmp 0231

024F        pushf
0250        push cs
0251        call 0208
0254        jb 0293
0256        push es
0257        push ds
0258        push ax
0259        push bx
025A        push cx
025B        push cs
025C        pop ds
025D        cmp ah, 42          //扩展读功能
0260        jne 026B
0262        mov bx, [di+04]
0265        mov es, [di+06]
0268        jmp 026B

026B        add bx, 01C2  
026F        mov cx, 0004       //4个主分区
0272        mov si, 010D      //分区类型表地址020D-021A

0275        cld
0276        lodsw             //ds:si到ax,ds=cs代码段址
0277        cmp si, 011B
027B        jnb 0288          //直到类型表比较完成
027D        cmp es:[bx], al   //比较是否为隐藏分区
0280        jne 0275
0282        mov es:[bx], ah   //将隐藏分区改为非隐藏
0285        jmp 0275

0288        add bx, 0010      //第个分区表0x10字节
028C        loop 0272         //4个分区表逐一检查
028E        pop cx
028F        pop bx
0290        pop ax
0291        pop ds
0292        pop es

0293        iret
Yisir Restore Tool Loader, yisir.9126.com
Press any key to load RESTORE DISK or BOOT from HARDDISK...
0x00 0x00 0x55 0xAA
---------------------------------------
建议版主以后直接发带注释的源程序,以便大家完善,看汇编代码本来就很费神,我都没这么好的耐心,相信别人也不轻松。
另外
0208        jmp 0000:0000        //01CD处修改后成为INT 13
020D-021A 11 01 14 04 16 06 17 07 1B 0B 1C 0C 1E 0E  //分区类型表
021B        cmp ah, 02        //老的读扇区功能
021E        jne 0231
0220        cmp dx, 0080
0224        jne 0231
0226        cmp cx, 0001
022A        je 024F          //读硬盘BOOT扇区
022C        cmp ah, 42       //扩展读功能,×××这里似乎不可能到达×××
022F        je 0234
0231        jmp 0208
请楼主看一下,从021B处判断ah是否为02号功能,不是则执行int 13,是则往下执行,但ah不可能变成42h吧,那022C处岂不有问题?
----------------------------------
020D-021A 11 01 14 04 16 06 17 07 1B 0B 1C 0C 1E 0E  为分区类型表
026F        mov cx, 0004       //4个主分区
0272        mov si, 010D      //分区类型表地址020D-021A
0275        cld
0276        lodsw             //ds:si到ax,ds=cs代码段址
0277        cmp si, 011B
027B        jnb 0288          //直到类型表比较完成
027D        cmp es:[bx], al   //比较是否为隐藏分区
0280        jne 0275
0282        mov es:[bx], ah   //将隐藏分区改为非隐藏
0285        jmp 0275
0288        add bx, 0010      //第个分区表0x10字节
028C        loop 0272         //4个分区表逐一检查
从026F起检查分区表类型,个人认为只要检测最后一个分区即可,很少有人将中间的分区隐藏的。
从分区表类型看,隐藏与非隐藏差别为bit4,所有类型可合并为一种,即:
if (al and 0xF0)=0x10 then 分区类型=(al and 0x0F)
回复

使用道具 举报

23#
发表于 2005-8-31 08:34:24 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

0174        mov ah, 01        
0176        int 16                     //判断字符是否存在
0178        je 0183                     //没有则跳转
017A        mov ah, 00        
017C        int 16                   //如有则读字符,限83键盘,ah=10时支持扩展键盘
017E        xor dx, dx          //如果有按键,则dx=0
0180        jmp 01A0
int 16的00、01功能只能用83键,而10、11号功能都支持扩展键盘,你的程序不能用F11,是否与此有关?
回复

使用道具 举报

24#
 楼主| 发表于 2005-8-31 09:51:16 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

[这个贴子最后由turboy在 2005/08/31 10:21am 第 1 次编辑]

谢谢crshen的关注。
下面引用由crshen2005/08/31 08:34am 发表的内容:
0174        mov ah, 01        
0176        int 16                     //判断字符是否存在
0178        je 0183                     //没有则跳转
017A        mov ah, 00        
...
你分析得挺完善的,肯定是熬夜奋战了。不能用F11的确是这个原因,好久没用汇编了。只记得00,01这几个功能调用了,要修改也是容易的事。
不过按F7和F11的区别也不大,不如再给MAKEIMG加一个选项,可以选择热键吧。
021B        cmp ah, 02        //老的读扇区功能
021E        jne 0231
0220        cmp dx, 0080
0224        jne 0231
0226        cmp cx, 0001
022A        je 024F          //读硬盘BOOT扇区
022C        cmp ah, 42       //扩展读功能,×××这里似乎不可能到达×××
022F        je 0234
谢谢指出。这里的确是无法到达的,正在改。但程序无法启动8G后的分区和这里无关,我只管主分区表数据区,后面完全是跳到系统的MBR里去运行的。但程序一直没有问题则说明至少DOS是只用02号功能来读MBR和主分区表的。
从026F起检查分区表类型,个人认为只要检测最后一个分区即可,很少有人将中间的分区隐藏的。
从分区表类型看,隐藏与非隐藏差别为bit4,所有类型可合并为一种,即:
if (al and 0xF0)=0x10 then 分区类型=(al and 0x0F)
只检测最后一个分区是不负责任的,并非所有的隐藏分区都在最后,如果有一个遗漏了,都是严重的BUG,是不应该的。
隐藏与非隐藏差别为bit4,我也看出来了。可是我为什么不只判断bit4呢,为了程序可以继续扩充。因为分区类型不止只有FAT16/32这么几种,所谓“隐藏分区”也无非只是一个习惯的叫法——只要是DOS不能管理的都是DOS的隐藏分区(MS FDISK里叫非DOS分区),11、14、16、1B、1C……不过是前面的PQMAGIC等软件用这个方案,我们只能接受罢了。我们完全可以将一个FAT分区的类型标志域改成一个其他值,这样同样也能对操作系统隐藏该分区,可是这种做法我不提倡——可能会使事情变得越来越乱。所以我选择了查表方式。
建议版主以后直接发带注释的源程序,以便大家完善,看汇编代码本来就很费神,我都没这么好的耐心,相信别人也不轻松。
对于源代码的问题,源代码迟早会公开的,我目前只是更想知道除了我个人想要的之外,大家更想要些什么功能。当它完善一些后,我会整理代码并公开文档。
这个程序完全是用NASM汇编写的,可是汇编语言和硬盘操作这些知识并不是每一个电脑用户都懂也一定要弄懂的,我们只要能提供一个安全好用的功能就可以了。这个程序也只是我遇到的问题所想到的解决方法,我早就已经在一年前的帖子中说到了这个思路,懂汇编的用一段时间都可以写出来。你已经完整的反汇编了全部代码,对它理解的也很正确。手工写的汇编代码的反汇编结果本来也不难读,可是这不是问题的关键,关键的是现在程序面向的对象不是研究者而是使用者。LINUX是公开源代码的,可是我看不懂,更谈不上改进它,不过是改改配置文件来更好使用它了。
正向前面我说的,我写得时候必须考虑使程序能在任何机器上正常工作,而且不能突破512字节,这让我煞费苦心。本来打算用纯8086汇编的,有些操作代码太长而使用了386寄存器,有些数据直接嵌到了指令中间……这些怪招都是当年跟一些病毒学的,可是这些方法不规范,代码一长就不好控制了,而且在CPU保护模式下这些都没用了。
再次感谢crshen的关注。
回复

使用道具 举报

25#
发表于 2005-8-31 10:06:00 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

关注一下!
回复

使用道具 举报

26#
发表于 2005-8-31 17:36:25 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

我一般安装的机器的隐藏分区都在第二个分区。
回复

使用道具 举报

27#
 楼主| 发表于 2005-9-2 02:20:43 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

  8月28日无法从后面的隐藏分区启动的问题解决了,现在已经可以正常启动隐藏主分区中的操作系统。其实是程序本身的问题,程序虽然在启动后把隐藏分区向其他程序报告为正常分区,但在自己完工后把控制权交还MBR时却忘了改。结果MBR还是装入了原来的激活分区引导程序,但在那个操作系统启动时读到的激活分区却是那个已经显示出来的隐藏分区了。所以当两个系统都是DOS或Win98时由于启动文件一样所以是正常的,两个系统不同时就有异常了。
  新程序在启动时出现的8秒等待中如果按了F7键(或自定义的键),则会从第一个隐藏主分区启动,此盘分配为C:。目前我只测试了DOS7.1(Win98启动盘),我想应该也能启动WIN98。WinXP启动后会将隐藏分区变成非隐藏,用硬盘重启后仍是可显示的,肯定时WinXP在什么时候更新过MBR。LINUX没有试。
  新加入一个功能键ESC:可以不加载本程序,正常从硬盘盘启动,。
  新加入一个功能键F5:可以不加载本程序,正常从软盘盘启动,用于需要正确查看实际分区时。
  MAKEIMG.EXE的命令行选项可以忽略大小写了。
  修正了几个大BUG。
  新的命令行如下:
  MAKEIMG  源镜像文件名  [目的镜像文件名] [/f | /b | /u | /k:n]
   源镜像文件名  用来制作显隐藏分区功能的软盘镜像文件
   目的镜像文件名 将要生成的带显隐藏分区功能的软盘镜像文件,可省略,默认值为YISIR.IMG
  可选参数:
   /f       生成的程序在计算机启动时直接从软盘启动。
   /b       生成的程序在计算机启动时直接激活隐藏分区并启动。(注意隐藏分区中必须已安装了操作系统,此功能也未写MBR)
  无 /f 和 /b 参数时将出现提示并等待8秒,这期间按任意键从软盘启动,否则从硬盘启动且不加载显隐藏分区功能。
   /k:n      n=1-4,6-12。设置直接激活隐藏分区并启动时用的按键,可以是F1-F4、F6-F12
   /u       卸载本程序,将由本程序生成的镜像文件还原,结果保存成一个镜像文件。
[UploadFile=build050901_1125598678.zip]
回复

使用道具 举报

28#
发表于 2005-9-2 20:55:21 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

恭喜恭喜,改了很多代码,等我下次上夜班时再研究研究。
回复

使用道具 举报

29#
 楼主| 发表于 2005-9-2 23:11:32 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

下面引用由crshen2005/09/02 08:55pm 发表的内容:
恭喜恭喜,改了很多代码,等我下次上夜班时再研究研究。
  9月1日的程序的确调整了很多,除了功能增加了之外,流程理得更清晰,比起以前更好看懂了——当然指令行数也增加了。你已经反汇编过一次了,用引导扇区格式来反汇编,开始时用一个寄存器做标志来判断如何安装和引导……还是先让你自己看看吧,说多了就没意思了。
  现在程序已经很接近512字节了,除非删掉所有的提示信息,否则不能再加新的功能了,也算基本完善了。以前还想加上能处理逻辑分区的功能,可是至少需要一两百字节,看来是没法挤进去了。你先跟踪看看现在的这个还有什么BUG,完了我再发源程序给你对照。
  你再来时留个Email,以后好交流。
回复

使用道具 举报

30#
发表于 2005-9-3 17:15:15 | 只看该作者

更新:制作显隐藏分区功能的软盘镜像文件工具,真正启动隐藏分区里的操作系统

刚下班,顺便看了一下,还没测试:
1. 安装程序有点问题,只能认1.44M的映像,如果<1.44则自动扩展为1.44(以00填充),如果>1.44,则截掉一半,看现在的光盘上,映像大小各异,好像不太好吧。
2. 最好做成Windows图形界面的安装程序,过两天我有空倒可以做一个,或者你自己搞一个吧。
3. 为方便别人一起分析,将提取引导文件方法介绍如下:
利用安装程序制作1.44M启动映像
利用WinHex打开上面生的映像,将开始的512字节(0000-01FF)“编辑”-“复制扇区”-“进入新文件”-填写文件名即可。
三种安装生成的文件差异如下:
偏移(16进制)  无参        /b         /f
    74         B4         31         31
    75         11         D2         D2
    76         CD         E9         E9
    77         16         1B         41
    78         74         00         00
5 差异 发现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-15 19:06

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表