中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS启动盘 & LOGO技术 (启动盘室) » DOS启动后用隐藏分区数据的程序,源码公开了!
« [1] [2] [3] »
作者:
标题: DOS启动后用隐藏分区数据的程序,源码公开了! 上一主题 | 下一主题
pfox
银牌会员




积分 1451
发帖 446
注册 2002-10-20
状态 离线
『第 16 楼』:  

原来用老版本处理过的img可以直接再用新版本进行处理吗?还是要没有处理过的img才能处理?




我的下载空间
2005-8-26 17:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


积分 322
发帖 99
注册 2004-7-3
来自 湖北
状态 离线
『第 17 楼』:  

得用没有处理过的img重做才行,或者你用标准的启动扇区替换已经做过的后再做。只是做程序了,忘了考虑卸载程序,以后一定加上。
我在无忧已经发了个新的,不过也没有卸载程序。



从95年开始用DOS3.2,96年在Windows3.1里认识了鼠标,97年开始用Win95,98年装过NetWare,99年迷过Linux,现在用WinXP、WinME和DOS7.1。一回首,从盲到忙,从忙到茫。
2005-8-26 18:01
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (123693086)  编辑帖子  回复  引用回复
pfox
银牌会员




积分 1451
发帖 446
注册 2002-10-20
状态 离线
『第 18 楼』:  



  Quote:
Originally posted by TurboY at 2005-8-26 06:01 PM:
得用没有处理过的img重做才行,或者你用标准的启动扇区替换已经做过的后再做。只是做程序了,忘了考虑卸载程序,以后一定加上。
我在无忧已经 ...

无忧的版本你你这里的版本不同吗?




我的下载空间
2005-8-26 21:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


积分 322
发帖 99
注册 2004-7-3
来自 湖北
状态 离线
『第 19 楼』:  

谢谢!
两者实际是一样的,这里原来那个只是没改MAKEIMG而已.



从95年开始用DOS3.2,96年在Windows3.1里认识了鼠标,97年开始用Win95,98年装过NetWare,99年迷过Linux,现在用WinXP、WinME和DOS7.1。一回首,从盲到忙,从忙到茫。
2005-8-26 21:38
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (123693086)  编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


积分 322
发帖 99
注册 2004-7-3
来自 湖北
状态 离线
『第 20 楼』:  

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为小写字母)

真心希望各位下载试过了的朋友能回复讨论一下这个新加功能的稳定性!



从95年开始用DOS3.2,96年在Windows3.1里认识了鼠标,97年开始用Win95,98年装过NetWare,99年迷过Linux,现在用WinXP、WinME和DOS7.1。一回首,从盲到忙,从忙到茫。
2005-8-29 00:36
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (123693086)  编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


积分 322
发帖 99
注册 2004-7-3
来自 湖北
状态 离线
『第 21 楼』:  

又发现了一个强大的DOS文件系统驱动程序,这是在DOS层实现我所提出的问题的。
我等了一年了,看来能人真不少啊。软件厂家的网站是www.paragon.ag

我是在下面的帖子中得到的,里面有下载
[url]http://bbs.wuyou.com/cgi-bin/topic.cgi?forum=34&topic=10488&show=0[url]
Paragon DOS IFS Driver 通吃NTFS/Ext2FS/Ext3FS以及隐藏FAT/FAT32的读写,才300多k,比NTFS PRO FOR DOS好多了,另外,它还支持DOS长文件名读写,完全支持中文名称。功能巨大,不可不拥有。



从95年开始用DOS3.2,96年在Windows3.1里认识了鼠标,97年开始用Win95,98年装过NetWare,99年迷过Linux,现在用WinXP、WinME和DOS7.1。一回首,从盲到忙,从忙到茫。
2005-8-29 14:24
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (123693086)  编辑帖子  回复  引用回复
crshen
中级用户




积分 447
发帖 126
注册 2004-2-10
状态 离线
『第 22 楼』:  

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

[ Last edited by crshen on 2005-8-31 at 08:04 ]



从来不用别人的东西,要用,也先改成自己的再说!
2005-8-29 18:16
查看资料  发送邮件  发短消息 网志  OICQ (67154440)  编辑帖子  回复  引用回复
crshen
中级用户




积分 447
发帖 126
注册 2004-2-10
状态 离线
『第 23 楼』:  

建议版主以后直接发带注释的源程序,以便大家完善,看汇编代码本来就很费神,我都没这么好的耐心,相信别人也不轻松。

另外
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)

[ Last edited by crshen on 2005-8-31 at 08:23 ]



从来不用别人的东西,要用,也先改成自己的再说!
2005-8-29 18:19
查看资料  发送邮件  发短消息 网志  OICQ (67154440)  编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


积分 322
发帖 99
注册 2004-7-3
来自 湖北
状态 离线
『第 24 楼』:  

【9月1日最新更新】
  谢谢crshen指出BUG,看来DOS启动时基本上没用扩展INT13功能来读MBR,所以那些死代码基本上就没有运行到,从运行表面上看好像没问题了,但BUG还是存在。现在已经全部修正了。
  8月28日无法从后面的隐藏分区启动的问题解决了,现在已经可以正常启动隐藏主分区中的操作系统。其实是程序本身的问题,程序虽然在启动后把隐藏分区向其他程序报告为正常分区,但在自己完工后把控制权交还MBR时却忘了改。结果MBR还是装入了原来的激活分区引导程序,但在那个操作系统启动时读到的激活分区却是那个已经显示出来的隐藏分区了。所以当两个系统都是DOS或Win98时由于启动文件一样时是正常的,两个系统不同时就有异常了。
  新程序在启动时出现的8秒等待中如果按了F7键(或自定义的键),则会从第一个隐藏主分区启动,此盘分配为C:。目前我只测试了DOS7.1(Win98启动盘),我想应该也能启动WIN98。WinXP启动后会将隐藏分区变成非隐藏,用硬盘重启后仍是可显示的,肯定时WinXP在什么时候更新过MBR。LINUX没有试。
  新加入一个功能键ESC:可以不加载本程序,正常从硬盘盘启动,。
  新加入一个功能键F5:可以不加载本程序,正常从软盘盘启动,用于需要正确查看实际分区时。
  MAKEIMG.EXE的命令行选项可以忽略大小写了。
  尽管程序改动了不少,裁掉了很多提示信息,可是程序已经快写满512字节了,只剩1个字节的空间了。如果再要加别的功能,只能再开一个扇区了。

  新的命令行如下:
  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       卸载本程序,将由本程序生成的镜像文件还原,结果保存成一个镜像文件。

附件 1: build050901.zip (2005-9-2 02:47, 43.59 K, 下载附件所需积分 1 点 ,下载次数: 33)


从95年开始用DOS3.2,96年在Windows3.1里认识了鼠标,97年开始用Win95,98年装过NetWare,99年迷过Linux,现在用WinXP、WinME和DOS7.1。一回首,从盲到忙,从忙到茫。
2005-9-2 02:47
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (123693086)  编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


积分 322
发帖 99
注册 2004-7-3
来自 湖北
状态 离线
『第 25 楼』:  

  感谢各位朋友的关注,为方便感兴趣的朋友改进,源程序开放。先公开引导区模块(HFBOOT.ASM)的源程序。

  在写这个程序之前,我看到了很多“一键恢复”的介绍,这些工具里面以IBM技术为基础的为多。网上搜索到关于IBM“F11”键恢复的文章很多,可是多数是讲如何修复IBM的,觉得程序写在MBR里面是不妥的,很容易被破坏。另外IBM虽然没有追究大家的盗版使用责任,可是这也不是长久的。我于是决定写一个与之功能相似的程序,让大家测试和使用。我在写程序时思考了IBM“F11”键恢复的原理,可是我并没有反汇编和阅读IBM的代码,因此完全是自己写的,没有那些多麻烦。但是正因为只是自己一个人写的,所以不一定象IBM一样有过充分的测试,尽管我在程序中没有任何写硬盘的代码(可参看源代码),但使用此程序的风险还是存在的。希望朋友们在充分测试(虚拟机、空闲硬盘……)后再正式使用它!

  还是那句老话,本人保留对原始程序的所有权。你可以自由阅读和修改你认为可以改进的地方,但是请在重新发布时保留原作者的信息,并且我希望你能将源文件公开并告诉我(turboy@163.com),保持这个工具的一贯作风。

这里是本人网站上语法加亮的源程序:http://yisir.softhome.cn/yiarticle/act.php?obj=article&id=136

  下面是引导区模块(HFBOOT.ASM)的源程序:
; ==========================================================================
; 这是一个用来引导我的系统备份/恢复光盘的启动软盘的程序,将会放在软盘的第一
; 个扇区内。此程序引导系统时,出现一个提示,用户可选择按任意键启动工具软盘,
; 也可以在等待8秒后引导硬盘上的操作系统。在选择由工具软盘启动DOS后,在MBR中
; 隐藏的FAT32主分区(0B/0C)将会分配盘符变得可见,这就可以用常规工具来做备
; 份了——备份在隐藏分区里,看谁能删得掉!
; 最后版本:2005/9/5
; ==========================================================================
; 编程记录:
; 6月29日的版本只处理了传统INT13的2号功能,所以在虚拟机中的小硬盘(1B-FAT32)
; 中调试正常,一到了用LBA方式读取的分区(1C-FAT32LBA,1E-FAT16LBA)就完了。可是
; 现在的硬盘已经没有8GB以下的了,读取也几乎全是用LBA方式了。
;
; 7月23日:
;     加入对扩展INT3读取(42号)功能的接管,实现对隐藏LBA分区的读取,由于现
; 在硬盘分区几乎没有用FAT16的了,所以只处理了FAT32的。
;     由于新代码的加入,我原来的提示信息也不得已剪了一部分。
;
; 8月22日:
;     加入一个可识别分区标志码列表(FlagTable),逐一判断处理。
; 在FlagTable DW xxyy中,每一个字中的xx代表原始分区标志码,yy代表隐藏时的分区标志码
; 如0414h代表原始分区为04h(FAT12),隐藏时的分区标志码为14h
; 现在,可以无限扩充了。
;
; 8月28日:
;     试验加入从隐藏分区启动的功能。
; 1、在启动后利用自己的INT13将原分区激活标志改为00,将能改为正常分区的原隐
;藏分区的激活标志改为80。
; 2、在安装前判断按键,用DX寄存器作为标志,无按键DX=0XFFFF,按F7时DX=1,
; INT13中CH=1,按其他键时DX=0,INT13中CH=0。
; 3、在INT13中,使用CH作为是否激活隐藏分区的判断标志,为1时从隐藏分区启动。
; 3、由于BOCHS虚拟机使用了F11和F12两个键,故设定按F7键由隐藏分区启动。
;
; 8月31日:
;     crshen发现了几个BUG,现在一一解决。从隐藏分区启动的功能。
; 1、读不出F11是因为INT10H的0号功能不支持扩展键盘,现在改为10H号功能。可是
; 在QEMU中10号功能也不能读F11,而VPC却可以,可能是两者的BIOS不同或QEMU拦截
; 了F11/F12吧。
; 2、在安装前判断按键,如果按ESC键,则直接进入硬盘启动。
; 3、有一个判断跳转有误,致使INT13H的42H功能处理无效,我大意了,在加入处理
; 42H功能代码时忘了改前面的代码。
; 4、不能从8G以后的隐藏分区启动是因为在我的INT13过程中有一个严重的错误,这
; 个错误是由于我参考的资料有误而引入的。 在INT13H扩展功能中是用DS:SI来指向
; DAP的, 而不是那篇资料中说的DS:DI。这可真是……
;  在MS-FDISK、FREE-FDISK、AEFDISK、PQMAGIC、Acronis Disk Editor等大多数
; 程序中隐藏分区都会以正常分区显示,但GDISK却可以看出此分区为隐藏分区,
; GDISK一定有超越BIOS中断的独特存取硬盘方法。

; 9月1日:
;  目前9-2 0:47我已经将可能想到的BUG全部排除了, 而程序的长度也接近512字节的
; 极限了。
; 1、又发现原来的程序中有一处死码,是在调用原INT13中断后,AH已被作为返回值
; 了,却还在用AH判断扩展INT13,所以后面处理扩展INT13功能的代码就不会运行了。
; 修改成将AX压栈保存,但代码就更乱了,于是重写了前面的代码。
; 2、跟踪、思考了两天,才发现不能在机房的P4上启动隐藏分区上的OS的原因竟是原
; 来玩的一个技巧。真是聪明反被聪明误啊!
; 3、改变了开始时判断方式,DX中,DH=0安装INT13,DH=FFH不安装;DL=0载入软盘
; 引导记录启动,DL=80H载入硬盘MBR启动
; 4、新加入一个功能ESC键:可以不加载本程序,正常从硬盘盘启动,以用于一般情
; 况。
; 5、新加入一个功能F5键:可以不加载本程序,正常从软盘盘启动,以用于一般情况。
; ==========================================================================

;GoodFlag1 equ 0bh
;HideFlag1 equ 1bh
;GoodFlag2 equ 0ch
;HideFlag2 equ 1ch
;GoodFlag3 equ 0eh
;HideFlag3 equ 1eh

ORIGIN EQU 7C00H; Origin of bootstrap LOADER
BIO_MEMEQU 0413H; BIOS Memory size =640(KB)
BIO_CLKEQU 046CH; BIOS Clock (1/18.2 seconds)
DSK_PARMSEQU 1EH*4;POINTER TO DRIVE PARAMETERS
KEY_BOOTHIDDENEQU 41H;Scancode: F7=41H, F11=85H, F12=86H
KEY_BOOTFLOPPYEQU 3FH;Scancode: F5=3FH
KEY_ESCAPEEQU 01H;Scancode: ESC=01H
BOOTHIDDENFLAGEQU 80h

ORG0000h
START:
; WARNING -- Don change this to a short jmp
jmp short main; Jump to start of code
nop
; ==========================================================================
; Start of BPB area of the boot record
OemName         DB "MSDOS"
OsVersion DB "5.0"; DOS version number
BPB:
BytesPerSector DW 512; Size of a physical sector
SecsPerClust DB 1; Sectors per allocation unit
ReservedSecs DW 1; Number of reserved sectors
NumFatsDB 2; Number of fats
NumDirEntries DW 00E0h; Number of direc entries
TotalSectors DW 0B40H; Number of sectors - number of hidden
; sectors (0 when 32 bit sector number)
MediaByte DB 0F0H; MediaByte byte
NumFatSecs DW 9; Number of fat sectors
SecPerTrack DW 18; Sectors per track
NumHeads DW 2; Number of drive heads
HiddenSecs DD 0; Number of hidden sectors
BigTotalSecs DD 0; 32 bit version of number of sectors
BootDrv DB 0h
CurrentHead DB 0h; Current Head
ExtBootSig DB 41
SerialNum DD 20050628h
VolumeLabel DB "YISIR_LOADER"
FatId DB "FAT12"

; =========================================================================
; First thing is to reset the stack to a better and more known
; place. The ROM may change, but wed like to get the stack
; in the correct place.
main:
cli;Stop interrupts till stack ok
xor AX,AX
mov ds,ax
mov es,ax
mov SS,AX;Work in stack just below this routine
mov ax,ORIGIN
mov sp,ax
sti
PUSH AX
        ;Show message
        mov ax,1301h
        mov bx,000ah
        mov cx,MyMsgLen
        mov dx,1500h
        mov bp,MyMsg+ORIGIN
        int 10h
        ;Hide the cursor
        mov ah,1
        mov cx,2000h
        int 10h
        ;Wait 10 seconds
        mov si, BIO_CLK
        mov edx, dword [si]
        mov ecx, edx
        add edx, 159;18.2*10 seconds
ReadKB:
;Change 5 bytes with install option
;Case Option:/f   Boot from floppy disk directly, do not waiting 8 seconds
;31H D2Hxor dx,dx
;E9H xxH 00Hjmp BiosMemory
;
;Case Option:/b   Boot from HIDDEN parition derectly (activate it and load it)
;31H D2Hxor dx,dx
;E9H xxH 00Hjmp Key_F7
;
;Case Default:       Show message and wait 8 second
        mov ah, 11h;Get keyboard status
        int 16h
        jz NoKeyPress
        mov ah,10h;Read a key (In old code, AH=0, can not read F11/F12...)
        int 16h
        xor dx,dx
cmp ah, KEY_ESCAPE
jz DX_HD;Press ESC to BOOT from Harddisk
cmp ah, KEY_BOOTFLOPPY
jnz RKB_1
mov dh, 0ffh;dh=0 Install INT13, else do not Install. Now DX=FF00H
jmp BiosMemory
RKB_1:
cmp ah, KEY_BOOTHIDDEN
jnz BiosMemory
Key_F7:
;If press Hot key, Boot From Hidden Partition. Now DX=0001H
;modify CH=80h in Int13 procedure
mov byte[ORIGIN+2+BootHiddenCode], BOOTHIDDENFLAG
        jmp DX_HD
NoKeyPress:
        cmp ecx, dword [si]
        jae L_0
        test cl,1
        jz  L_0
        mov ax,0e3eh; write ">" to show progressing
        mov bx,0004h
        int 10h
L_0:
        mov ecx, dword [si]
        cmp edx,ecx
        jae ReadKB
mov dh,0ffh;Do not install INT13. Now DX=FF00
DX_HD:
mov dl,080h;Boot from HD.
;DH=0 Install INT13, DH=FFH do not Install
;DL=0 Boot Floppy, DL=80H Boot HD
;Now:
;  ESC DX=FF80, F5 DX=FF00H, F7 DX=0080H, ANYKEY DX=0000H, TIMEOUT DX=FF80H
BiosMemory:
        ;Show the cursor
        mov ah,1
        mov cx,0d0eh
        int 10h
;BIOS MEMORY - 2KB
mov bx,BIO_MEM;bx=280H (KB)
mov ax,word [bx]
dec ax
cmp dh,0
jnz L_1
mov word [bx],ax;If DH=FF, Do not install
L_1:
;Move to High Memory. ex. 9fc0:0000
shl ax,6;ax=9fc0h SEG of top memory
mov es,ax;es=9fc0h
pop si;si=7c00h
push es;ready to RETF
xor di,di;di=0
cld
mov cx,100h
repnz movsw;move code to 9fc0:0000

cmp dh,0
jnz L_2;If DH=0ffh, Do not install
;modify Int13
mov si,4ch;Int13 13h*4
mov di,OLDINT13
;Save Old
mov eax,[si]
mov [es:di],eax
;cmp dh,0
;jnz L_2;If DH=0ffh, Do not install
push es
pop ax
shl eax,16
mov ax, MyInt13
mov [si],eax
L_2:;Jump to high address, 9fc0:00xx
push ds
pop es
mov bx,word Entre2
push bx;push 9fc0:Entre2
retf;跳到高端执行
Entre2:
        cmp dl,0;If DX <> 0, Load HD-MBR
        jnz L_3
ReadFD:;Read old boot sector from Floppy H1 T79 S18
        mov cx,4f12h
        mov dx,0100h
        jmp RunInt13
L_3:;Read from Harddisk H0 T0 S1 MBR
        mov cx,1
        mov dx,80h
RunInt13:
        mov ax,0201h
        mov bx,ORIGIN
        push ds
        push bx
int 13h
retf
; 2005-9-1
; 这里是原来用的花哨技巧代码,就是它们导致使用F7启动不了隐藏分区。因为这里读到的是原始的MBR
;        pushf        ;int 13h
;        push ds
;        push bx
; ------------------------------------------

;Jump to Old INT 13H
JmpFarInt13:
         DB 0eah ;JMP far OLDINT13
OLDINT13 DW 0,0
;End of Install-code

;Partition Flag Table  normal and hidden
FlagTable:
         dw 0111h, 0414h, 0616h, 0717h, 0b1bh, 0c1ch, 0e1eh
FlagTableEnd:

;My INT13h code
MyInt13:
cmp ah,2        ;Is Read?
jz Func2
cmp ah,42h      ;Is ExtRead?
jz Func42
JmpOldInt13:
jmp JmpFarInt13
Func2:
CMP DX,0080H;Is Harddisk and Head 0?
jnz JmpOldInt13
cmp cx,0001H;Is Track 0 Sector 1?
jnz JmpOldInt13
pushf;Simulate INT operator
push cs
CALL JmpFarInt13;Call old INT13
jc exit;Flase then Exit
push bx
push es
jmp EditFlag
Func42:
cmp dl,80h;Is Harddisk
jnz JmpOldInt13
push eax
xor eax,eax
cmp dword [si+8],eax;Is Sector 0, Low 32bit
jnz ExitFunc42
cmp dword [si+12],eax;Is Sector 0, Hight 32bit
jnz ExitFunc42
pop eax
pushf;Simulate INT operator
push cs
CALL JmpFarInt13;Call old INT13
jc exit;If flase then Exit
push bx
push es
mov bx, [si+4]; Fix BX,ES like Int13h Func02
mov es, [si+6]
jmp EditFlag
ExitFunc42:
pop eax
jmp JmpOldInt13
EditFlag:
push ax
push cx
push si; DS:SI -> DAP
push ds
push cs
pop ds
add bx, 01c2h; ES:BX -> Partition Flag
BootHiddenCode:
mov cx, 4; CL=4, CH will can be change by Makeimg.c with 1 to Modify the ActiveFlag
cmp1:
        mov si, FlagTable
cmp ch, BOOTHIDDENFLAG;If CH=BOOTHIDDENFLAG, Boot from hidden Partition
jnz nextFlag
mov byte [es:bx-4], 0;Clear Active Flag for boot from hidden partition
nextFlag:
        cld
        lodsw
        cmp si, FlagTableEnd
        jae nextPart
        cmp byte [es:bx], al
        jnz nextFlag
        mov byte [es:bx], ah
cmp ch,BOOTHIDDENFLAG;If CH=BOOTHIDDENFLAG, Boot from hidden Partition
jnz JmpNextFlag
mov byte [es:bx-4], 80h
xor ch, ch;Set CH=0h, Don't modify the next.
JmpNextFlag:
        jmp nextFlag
nextPart:
add bx,10h
dec cl
ja cmp1
pop ds
pop si
pop cx
pop ax
pop es
pop bx
exit:
iret
; End of INT13H code

MyMsg    db "PartUnhide Loader, yisir.9126.com, 2005-9-5",13,10
;         db "Press any key to load RESTORE FLOPPY DISK...",13,10
MyMsgLen equ $-MyMsg

times 510 -($-$$) db 0
BOOTFLAG db 55h,0aah




从95年开始用DOS3.2,96年在Windows3.1里认识了鼠标,97年开始用Win95,98年装过NetWare,99年迷过Linux,现在用WinXP、WinME和DOS7.1。一回首,从盲到忙,从忙到茫。
2005-9-6 15:03
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (123693086)  编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


积分 322
发帖 99
注册 2004-7-3
来自 湖北
状态 离线
『第 26 楼』:  

【目前最新版本】
  HFBOOT.ASM还是9月1日的,MAKEIMG.EXE在9月5日新增选项后编译
MAKEIMG.EXE可以处理非1.44M软盘镜像了。
  新的命令行如下:
  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       卸载本程序,将由本程序生成的镜像文件还原,结果保存成一个镜像文件。

希望下载和使用了这个软件的朋友跟帖或到我的小站留言谈一下看法。

[ Last edited by TurboY on 2005-9-6 at 20:15 ]

附件 1: build050905.zip (2005-9-6 20:15, 44.33 K, 下载附件所需积分 1 点 ,下载次数: 47)


从95年开始用DOS3.2,96年在Windows3.1里认识了鼠标,97年开始用Win95,98年装过NetWare,99年迷过Linux,现在用WinXP、WinME和DOS7.1。一回首,从盲到忙,从忙到茫。
2005-9-6 15:04
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (123693086)  编辑帖子  回复  引用回复
crshen
中级用户




积分 447
发帖 126
注册 2004-2-10
状态 离线
『第 27 楼』:  

图形界面版升级至1.1版,可用于非1.44M映像。

[ Last edited by crshen on 2005-9-10 at 20:17 ]

附件 1: 安装.jpg (2005-9-10 19:30, 33.97 K, 下载附件所需积分 1 点 ,下载次数: 2)


附件 2: 启动提示.jpg (2005-9-10 20:16, 6.75 K, 下载附件所需积分 1 点 ,下载次数: 3)


附件 3: unhide.rar (2005-9-10 20:16, 171.66 K, 下载附件所需积分 1 点 ,下载次数: 75)


从来不用别人的东西,要用,也先改成自己的再说!
2005-9-6 21:34
查看资料  发送邮件  发短消息 网志  OICQ (67154440)  编辑帖子  回复  引用回复
hnlyzhd
高级用户




积分 544
发帖 164
注册 2004-10-17
状态 离线
『第 28 楼』:  

再来看一下,准备睡觉!
暂没有意见,正在找问题和发现新的需要的功能!
哈哈!~



    我的留言簿

http://hnlyzhd.ys168.com            我的网络盘
2005-9-8 23:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fdsiuha
高级用户




积分 587
发帖 302
注册 2005-7-25
状态 离线
『第 29 楼』:  

crshen贴出的像MBR,但是是哪个操作系统的呢?

我记得我看过的几个MBR开始初始化寄存器之后都是将7C00的引导代码立刻读到内存中的其他地方,把堆栈放在7C00开始。

我不太清楚是为什么要这样做,而且crshen贴出的ASM没有这些步骤。
哪位大侠解说一下?

[ Last edited by fdsiuha on 2005-9-10 at 00:12 ]



欢迎造访DOS的小屋!
http://risky.ik8.com
2005-9-10 00:06
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
hiboy
新手上路





积分 10
发帖 1
注册 2005-9-3
状态 离线
『第 30 楼』:  

我看了,弱问一个为什么代码里有eax?是8086?我用了16位的汇编,自己研究的时候会被卡巴认为是病毒。IBM的F11好像用了int 13h重写MBR,而不是驻留。因为确实很多病毒做法是驻留,而改写int 13h的那一段代码是特征码,大概用eax才没有被报告是病毒

2005-9-11 10:55
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: