中国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启动后用隐藏分区数据的程序,源码公开了! 上一主题 | 下一主题
TurboY
中级用户

绝不写垃圾帖


积分 322
发帖 99
注册 2004-7-3
来自 湖北
状态 离线
『楼 主』:  DOS启动后用隐藏分区数据的程序,源码公开了!

  我去年曾发过一个帖子那位有办法能在DOS中让隐藏分区可见吗?,里面提到了两个思路:
  第一种思路:在系统恢复盘的引导扇区中加入一段程序,它驻留内存后接管Int13H,凡是对备份分区的ID的读取(1BH),均返回0BH即可见分区。后来的DOS启动后,此分区自然可见了。这是类似引导型病毒的做法。
  第二种思路:在系统恢复盘的DOS启动后,由一个程序查找隐藏的备份分区,并将它作为一个正常的FAT32分区添加到DOS的设备链上,并赋以相应的盘符。这是类似NTFS4DOS的做法。

  希望有人能够利用这个思路做点工具出来,可是很久还是没有见到,我自己也懒得理了,开始用批处理来查找分区供GHOST调用。
  今年又看到这个帖子,终于不想偷懒,由于我对DOS的细节还是不清楚,就写个引导程序来做了。终于有了结果,在Bochs-2.1.1和VM里测试通过,能够欺骗DOS在启动后为1B和1C格式的隐藏分区分配盘符。在这里拿出来希望朋友们能够帮忙用多余的真实硬盘测试一下。(特别提醒,我保证程序中没有写MBR的代码,可是难保一切意外的发生,最好用没保存重要数据的真实硬盘来做!)
  下载地址:
已经改成8月23日编译的了,见附件。
  测试方法:
  解压下载的ZIP文件,准备一个启动盘镜像文件。
  运行解压目录里的镜像修改程序,格式
    MAKEIMG <原镜像文件> <新镜像文件>
  生成的新镜像文件即可在虚拟机中测试,如要在真实机器里测试可写入软盘或用VFLOPPY等软件来做。

  VMware截图:




下面是编程的记录:
  这是一个用来引导我的系统备份/恢复光盘的启动软盘的程序,将会放在软盘的第一个扇区内。此程序引导系统时,出现一个提示,用户可选择按任意键启动工具软盘,也可以在等待8秒后引导硬盘上的操作系统。在选择由工具软盘启动DOS后,在MBR中隐藏的FAT32主分区(0B/0C)将会分配盘符变得可见,这就可以用常规工具来做备份了——备份在隐藏分区里,看谁能删得掉!
最后版本:2005/7/23 2005/6/29
后记:
  6月29日的版本只处理了传统INT13的2号功能,所以在虚拟机中的小硬盘(1B-FAT32)中调试正常,一到了用LBA方式读取的分区(1C-FAT32LBA,1E-FAT16LBA)就完了。可是现在的硬盘已经没有8GB以下的了,读取也几乎全是用LBA方式了。
7月23日:
  加入对扩展INT3读取(42号)功能的接管,实现对隐藏LBA分区的读取,由于现在硬盘分区几乎没有用FAT16的了,所以只处理了FAT32的。
  由于新代码的加入,我原来的提示信息也不得已剪了一部分。

【目前最新版本】
  HFBOOT.ASM还是9月1日的,MAKEIMG.EXE在9月5日新增选项后编译

  新的命令行如下:
  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 15:38 ]

   此帖被 +1 点积分    点击查看详情   
评分人:【 分数: +1  时间:2010-3-22 20:16




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




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

楼主这个很有创意,我要转贴了!SYSOFT.ZDWX.COM和BBS.WUYOU.COM

不过楼主最好能写个专用的创建隐藏分区的小程序。我对这个引导盘进行 测试后发现不支持HIDE.COM,PQ,GRUB等程序创建的隐藏分区。如果这个小引导程序能够支持HPA分区就更好了!

关注和期待中!

[ Last edited by hnlyzhd on 2005-8-5 at 10:56 ]



    我的留言簿

http://hnlyzhd.ys168.com            我的网络盘
2005-8-5 10:50
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


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

  谢谢关注!是这样的,由于程序在启动扇区中,只能用512字节,还要保留一些空间,所以代码不能太长(也许优化一下可以处理更多的分区类型,以后我再挤一挤),目前这个程序只处理了两种类型的隐藏分区,即0X1B(FAT32)和0X1C(FAT32-LBA),而且只能是主分区(在MBR中定义的)。理论上只要是用DOS能支持的分区类型转成的隐藏分区,应该都没有问题的。你可以把常见的这些隐藏分区的类型码发上来,我就可以全加上去。



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




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

隐藏分区的类型我还不太懂得如何来看呢,不好意思了!
你可以用GRUB或者PQ或者ACRONIS等软件来测试,支持的隐藏分区越多越好1



    我的留言簿

http://hnlyzhd.ys168.com            我的网络盘
2005-8-12 13:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pfox
银牌会员




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

列出目前我所知道的隐藏分区类型:
11、14、16、17、1b、1c、1e、26
如果这个东东能够支持HPA那就完美了,当然,如果空间太小支持不了,那么可以单独做成一个软件吗。

[ Last edited by pfox on 2005-8-13 at 20:36 ]




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

绝不写垃圾帖


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

我刚才在 DOS7.10的FDISK所带的FDISKPT.INI文件里发现很多有用的信息,可以找到下面的对应关系:
11 -- 01 FAT12
14 -- 04 FAT16
16 -- 06 FAT16(BIGDOS)
17 -- 07 NTFS
1b -- 0b FAT32
1c -- 0c FAT32 LBA
1e -- 0e FAT16 LBA
26 -- ? 这个就不知道是原始类型是什么了。

有了这些对照,才能开工。



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




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



  Quote:
Originally posted by TurboY at 2005-8-14 10:51 PM:
我刚才在 DOS7.10的FDISK所带的FDISKPT.INI文件里发现很多有用的信息,可以找到下面的对应关系:
11 -- 01 FAT12
14 -- 04 FAT16
16 -- 06 FAT16(BIGDOS)
17 -- 07 NTFS
1 ...

呵呵,26是spfdisk自己使用的隐藏分区类型,我列出的那些类型是从spfdisk搬出来的,所以这个你在FDISKPT.INI查不到。




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




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

建议把源程序贴出来,大家可以一起完善。



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




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

晕,懒惯了,没想到512字节必然是汇编代码,现粗略看了一下,大家一起讨论吧:

PAGE  59,132

;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹
;圹                                                                         圹
;圹                                HFBOOT                                         圹
;圹                                                                         圹
;圹      Created:                                                         圹
;圹      Passes:    5          Analysis        Options on: none                 圹
;圹                                                                         圹
;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

target                EQU   'M5'                      ; Target assembler: MASM-5.0

include  srmacros.inc


; The following equates show data references outside the range of the program.

d_0000_01C2_e        equ        1C2h
d_0000_0413_e        equ        413h
d_0000_7D81_e        equ        7D81h                        ;*

seg_a                segment        byte public
                assume        cs:seg_a, ds:seg_a


                org        100h

HFBOOT                proc        far

start:
                jmp        short real_start
                                                ;* No entry point to code
                nop
                dec        bp
                push        bx
                inc        sp
                dec        di
                push        bx
                xor        ax,302Eh
                add        [bp+si],al
                add        [bx+di],ax
                add        [bp+si],al
                loopnz        locloop_0113                ; Loop if zf=0, cx>0


locloop_0113:
                inc        ax
                or        si,ax
                or        [bx+si],ax
                adc        al,[bx+si]
                add        al,[bx+si]
                db        10 dup (0)
                db         29h, 28h, 06h, 05h
                db        ' YISIR_LOADERFAT12'

;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹
;
;                       External Entry Point
;
;圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹

real_start:
                cli                                ; Disable interrupts
;*                xor        ax,ax                        ; Zero register
                db         31h,0C0h                ;  Fixup - byte match
                mov        ds,ax
                mov        es,ax
                mov        ss,ax
                mov        ax,7C00h
;*                mov        sp,ax
                db         89h,0C4h                ;  Fixup - byte match
                sti                                ; Enable interrupts
                push        ax
                mov        ax,1301h
                mov        bx,0Ah
                mov        cx,7Ah
                mov        dx,1500h
                mov        bp,d_0000_7D81_e
                int        10h                        ; Video display   ah=functn 13h
                                                ;  write string, al=mode,bh=page
                                                ;   bl=attrib, cx=string length
                                                ;   dh=row, dl=column, at es:bp
                mov        ah,1
                mov        cx,2000h
                int        10h                        ; Video display   ah=functn 01h
                                                ;  set cursor mode in cx
                mov        si,46Ch
                db         66h, 8Bh, 14h, 66h, 89h,0D1h
                db         66h, 81h,0C2h, 9Fh, 00h, 00h
                db         00h,0B4h, 01h,0CDh, 16h, 74h
                db         09h,0B4h, 00h,0CDh, 16h, 31h
                db        0D2h,0E9h, 1Dh, 00h, 66h, 3Bh
                db         0Ch, 73h, 0Dh,0F6h,0C1h, 01h
                db         74h, 08h,0B8h, 3Eh, 0Eh,0BBh
                db         04h, 00h,0CDh, 10h, 66h, 8Bh
                db         0Ch, 66h, 39h,0CAh, 73h,0D7h
                db        0BAh,0FFh,0FFh
loc_01A0:
                mov        ah,1
                mov        cx,0D0Eh
                int        10h                        ; Video display   ah=functn 01h
                                                ;  set cursor mode in cx
                mov        bx,d_0000_0413_e
                mov        ax,[bx]
                dec        ax
;*                cmp        dx,0FFFFh
                db         81h,0FAh,0FFh,0FFh        ;  Fixup - byte match
                jz        $+4                        ; Jump if zero
                mov        [bx],ax
                db        0C1h,0E0h, 06h, 8Eh,0C0h, 5Eh
                db         06h, 31h,0FFh,0FCh,0B9h, 00h
                db         01h,0F2h,0A5h,0BEh, 4Ch, 00h
                db        0BFh, 09h, 01h, 66h, 8Bh, 04h
                db         26h, 66h, 89h, 05h, 81h,0FAh
                db        0FFh,0FFh, 74h, 0Ch, 06h, 58h
                db         66h,0C1h,0E0h, 10h,0B8h, 0Dh
                db         01h, 66h, 89h, 04h, 1Eh, 07h
                db        0BBh,0EAh, 00h, 53h,0CBh, 81h
                db        0FAh,0FFh,0FFh, 74h, 09h,0B9h
                db         12h, 4Fh,0BAh, 00h, 01h,0E9h
                db         06h, 00h,0B9h, 01h, 00h,0BAh
                db         80h, 00h
loc_01FF:
                mov        ax,201h
                mov        bx,7C00h
                pushf                                ; Push flags
                push        ds
                push        bx

HFBOOT                endp

;哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌哌
;                              SUBROUTINE
;苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘苘

sub_0208        proc        near
loc_0208:
;*                jmp        far ptr l_0000_0000        ;*
sub_0208        endp

                db        0EAh
                dw        0, 0                        ;  Fixup - byte match
                                                ;* No entry point to code
                cmp        ah,2
                jne        loc_0223                ; Jump if not equal
                cmp        dx,80h
                jne        loc_0223                ; Jump if not equal
;*                cmp        cx,1
                db         81h,0F9h, 01h, 00h        ;  Fixup - byte match
                jz        loc_0241                ; Jump if zero
                cmp        ah,42h                        ; 'B'
                je        $+5                        ; Jump if equal
loc_0223:
;*                jmp        loc_0208
                db        0E9h,0E2h,0FFh                ;  Fixup - byte match
                db         66h, 50h, 66h, 31h,0C0h, 66h
                db         39h, 45h, 08h, 75h, 0Bh, 66h
                db         39h, 45h, 0Ch, 75h, 05h, 66h
                db         58h,0E9h, 05h, 00h, 66h, 58h
                db        0E9h,0E2h,0FFh
loc_0241:
                pushf                                ; Push flags
                callf        sub_0208
                jc        loc_ret_0280                ; Jump if carry Set
                push        es
                push        ds
                push        bx
                push        cx
                cmp        ah,42h                        ; 'B'
                jne        loc_025A                ; Jump if not equal
                mov        bx,[di+4]
                mov        es,[di+6]
                jmpn        loc_025C
loc_025A:
                push        es
                pop        ds
loc_025C:
                add        bx,d_0000_01C2_e
                mov        cx,4

locloop_0263:
                cmp        byte ptr [bx],1Bh
                jne        loc_026E                ; Jump if not equal
                mov        byte ptr [bx],0Bh
                jmpn        loc_0276
loc_026E:
                cmp        byte ptr [bx],1Ch
                jne        loc_0276                ; Jump if not equal
                mov        byte ptr [bx],0Ch
loc_0276:
;*                add        bx,10h
                db         81h,0C3h, 10h, 00h        ;  Fixup - byte match
                loop        locloop_0263                ; Loop if cx > 0

                pop        cx
                pop        bx
                pop        ds
                pop        es

loc_ret_0280:
                iret                                ; Interrupt return
                db        'Yisir Restore Tool Loader, 2005-'
                db        '7-23 http://yisir.9126.com/', 0Dh
                db        0Ah, 'Press any key to load RESTO'
                db        'RE DISK or BOOT from HARDDISK...'
                db        0Dh, 0Ah
                db         00h, 00h, 00h, 55h,0AAh

seg_a                ends



                end        start



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

绝不写垃圾帖


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

我用的是NASM,程序是启动扇区代码,上面的朋友反汇编有问题。
我现在还在改它,现在加入一个可识别分区标志码列表(FlagTable),逐一判断处理,只要是表中有的分区类型都可以处理了,现在可支持01-11,04-14,06-16,07-17,0b-1b,0c-1c,0e-1e。没有的也可很快加进来。大家可以到这里下新的。
http://yisir.softhome.cn/yisir/hfboot/fortestd.zip



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




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

我用GRUB隐藏了一个分区型号为1B,用这个启动后还是认不到隐藏隐藏分区。



    我的留言簿

http://hnlyzhd.ys168.com            我的网络盘
2005-8-24 20:21
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
TurboY
中级用户

绝不写垃圾帖


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

1B的分区我在我机房的电脑上试过,可以的啊。
你的这个分区是主分区吗?这个程序只能处理主分区。



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




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

原来如此呀,你没说明,我弄的是扩展分区,呵呵,能不能支持扩展分区呢?



    我的留言簿

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




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

还有个更好的想法:
比如IBM的F11激活隐藏分区,ACRONIS的F11激活隐藏分区然后从隐藏分区启动相应恢复程序,这些都要写到MBR上,能不能写个引导代码从软件来激活它们呢?
或者直接用NTLDR加载激活呢?



    我的留言簿

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

绝不写垃圾帖


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

向IBM和ACRONIS那样应该是可以的。
在这个程序里加上一个从隐藏分区启动的功能应可以做到,但我可又要挤一挤了。512字节的空间写不了太多程序啊。
用NTLDR加载也可以,我现在来做试试看。



从95年开始用DOS3.2,96年在Windows3.1里认识了鼠标,97年开始用Win95,98年装过NetWare,99年迷过Linux,现在用WinXP、WinME和DOS7.1。一回首,从盲到忙,从忙到茫。
2005-8-26 12:32
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (123693086)  编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: