|
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 |
|
|
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 |
|
|
hnlyzhd
高级用户
积分 544
发帖 164
注册 2004-10-17
状态 离线
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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 |
|
|
hnlyzhd
高级用户
积分 544
发帖 164
注册 2004-10-17
状态 离线
|
|
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 |
|
|
hnlyzhd
高级用户
积分 544
发帖 164
注册 2004-10-17
状态 离线
|
|
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 |
|
|