![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-17 11:25 |
共 47,814 主题排行 / 349,905 发帖 / 今日 2 篇 / 48,259 会员排行 |
| DOS启动盘 & LOGO技术 (启动盘室) » DOS启动后用隐藏分区数据的程序,源码公开了! |
| 可打印版本 14,335 / 32 |
| 第1楼 TurboY | 发表于 2005-07-23 23:04 |
| 中级用户 发帖 99 积分 322 来自 湖北 | |
|
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 ] |
|
| 第2楼 hnlyzhd | 发表于 2005-08-05 10:50 |
| 高级用户 发帖 164 积分 544 | |
|
楼主这个很有创意,我要转贴了!SYSOFT.ZDWX.COM和BBS.WUYOU.COM
不过楼主最好能写个专用的创建隐藏分区的小程序。我对这个引导盘进行 测试后发现不支持HIDE.COM,PQ,GRUB等程序创建的隐藏分区。如果这个小引导程序能够支持HPA分区就更好了! 关注和期待中! [ Last edited by hnlyzhd on 2005-8-5 at 10:56 ] |
|
| 第3楼 TurboY | 发表于 2005-08-11 19:07 |
| 中级用户 发帖 99 积分 322 来自 湖北 | |
|
谢谢关注!是这样的,由于程序在启动扇区中,只能用512字节,还要保留一些空间,所以代码不能太长(也许优化一下可以处理更多的分区类型,以后我再挤一挤),目前这个程序只处理了两种类型的隐藏分区,即0X1B(FAT32)和0X1C(FAT32-LBA),而且只能是主分区(在MBR中定义的)。理论上只要是用DOS能支持的分区类型转成的隐藏分区,应该都没有问题的。你可以把常见的这些隐藏分区的类型码发上来,我就可以全加上去。
|
|
| 第4楼 hnlyzhd | 发表于 2005-08-12 13:17 |
| 高级用户 发帖 164 积分 544 | |
|
隐藏分区的类型我还不太懂得如何来看呢,不好意思了!
你可以用GRUB或者PQ或者ACRONIS等软件来测试,支持的隐藏分区越多越好1 |
|
| 第5楼 pfox | 发表于 2005-08-13 20:28 |
| 银牌会员 发帖 446 积分 1,451 | |
|
列出目前我所知道的隐藏分区类型:
11、14、16、17、1b、1c、1e、26 如果这个东东能够支持HPA那就完美了,当然,如果空间太小支持不了,那么可以单独做成一个软件吗。 [ Last edited by pfox on 2005-8-13 at 20:36 ] |
|
| 第6楼 TurboY | 发表于 2005-08-14 22:51 |
| 中级用户 发帖 99 积分 322 来自 湖北 | |
|
我刚才在 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 -- ? 这个就不知道是原始类型是什么了。 有了这些对照,才能开工。 |
|
| 第7楼 pfox | 发表于 2005-08-16 09:42 |
| 银牌会员 发帖 446 积分 1,451 | |
Originally posted by TurboY at 2005-8-14 10:51 PM: 呵呵,26是spfdisk自己使用的隐藏分区类型,我列出的那些类型是从spfdisk搬出来的,所以这个你在FDISKPT.INI查不到。 |
|
| 第8楼 crshen | 发表于 2005-08-19 08:38 |
| 中级用户 发帖 126 积分 447 | |
|
建议把源程序贴出来,大家可以一起完善。
|
|
| 第9楼 crshen | 发表于 2005-08-19 08:57 |
| 中级用户 发帖 126 积分 447 | |
|
晕,懒惯了,没想到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 ,al add ,ax add ,al loopnz locloop_0113 ; Loop if zf=0, cx>0 locloop_0113: inc ax or si,ax or ,ax adc al, add al, 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, dec ax ;* cmp dx,0FFFFh db 81h,0FAh,0FFh,0FFh ; Fixup - byte match jz $+4 ; Jump if zero mov ,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, mov es, 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 ,1Bh jne loc_026E ; Jump if not equal mov byte ptr ,0Bh jmpn loc_0276 loc_026E: cmp byte ptr ,1Ch jne loc_0276 ; Jump if not equal mov byte ptr ,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 |
|
| 第10楼 TurboY | 发表于 2005-08-22 22:50 |
| 中级用户 发帖 99 积分 322 来自 湖北 | |
|
我用的是NASM,程序是启动扇区代码,上面的朋友反汇编有问题。
我现在还在改它,现在加入一个可识别分区标志码列表(FlagTable),逐一判断处理,只要是表中有的分区类型都可以处理了,现在可支持01-11,04-14,06-16,07-17,0b-1b,0c-1c,0e-1e。没有的也可很快加进来。大家可以到这里下新的。 http://yisir.softhome.cn/yisir/hfboot/fortestd.zip |
|
| 第11楼 hnlyzhd | 发表于 2005-08-24 20:21 |
| 高级用户 发帖 164 积分 544 | |
|
我用GRUB隐藏了一个分区型号为1B,用这个启动后还是认不到隐藏隐藏分区。
|
|
| 第12楼 TurboY | 发表于 2005-08-25 09:08 |
| 中级用户 发帖 99 积分 322 来自 湖北 | |
|
1B的分区我在我机房的电脑上试过,可以的啊。
你的这个分区是主分区吗?这个程序只能处理主分区。 |
|
| 第13楼 hnlyzhd | 发表于 2005-08-25 10:22 |
| 高级用户 发帖 164 积分 544 | |
|
原来如此呀,你没说明,我弄的是扩展分区,呵呵,能不能支持扩展分区呢?
|
|
| 第14楼 hnlyzhd | 发表于 2005-08-25 10:25 |
| 高级用户 发帖 164 积分 544 | |
|
还有个更好的想法:
比如IBM的F11激活隐藏分区,ACRONIS的F11激活隐藏分区然后从隐藏分区启动相应恢复程序,这些都要写到MBR上,能不能写个引导代码从软件来激活它们呢? 或者直接用NTLDR加载激活呢? |
|
| 第15楼 TurboY | 发表于 2005-08-26 12:32 |
| 中级用户 发帖 99 积分 322 来自 湖北 | |
|
向IBM和ACRONIS那样应该是可以的。
在这个程序里加上一个从隐藏分区启动的功能应可以做到,但我可又要挤一挤了。512字节的空间写不了太多程序啊。 用NTLDR加载也可以,我现在来做试试看。 |
|
| 1 2 3 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |