无忧启动论坛

标题: 请p大写段G4D下恢复BOOTICE备份的U盘DPT到U盘的代码 [打印本页]

作者: chiannet    时间: 2015-10-8 11:28
标题: 请p大写段G4D下恢复BOOTICE备份的U盘DPT到U盘的代码
请p大写段G4D下恢复BOOTICE备份的U盘DPT到U盘的代码。谢谢。
作者: pseudo    时间: 2015-10-8 12:13
本帖最后由 pseudo 于 2015-10-8 12:18 编辑

我写不好。提供点思路。
g4d支持dd命令,在g4d命令行输入
help dd
可显示用法。坛里可以找到g4d帮助文件,有更多资料和实例。
这个dd其实类似linux/unix的dd命令,可从linux角度学习它。

dd命令总可以做到:把备份的映像文件恢复到盘上。命令大致是(未试过):
dd if=(hd1,0)/bakup.dpt of=(hd0)

我不了解DPT文件的结构,如果它是盘映像,就直接恢复好了,如果它头部有些元数据,后面才是盘映像,那你要找到其中映像起点偏移(skip),从文件的那个位置恢复。如果它更复杂,比如说做了压缩,那就麻烦了。

总的来说,问题的关键是学习dd命令用法、了解dpt文件结构。这两点我现在也不大懂。

另外,要做成给别人用的通用的东西的话,要考虑更多情景,这可能才是难点。
作者: chiannet    时间: 2015-10-8 12:35
标题:
pseudo 发表于 2015-10-8 12:13
我写不好。提供点思路。
g4d支持dd命令,在g4d命令行输入
help dd



Multiple Card__Reader 7.2GB.dpt.7z (1.35 KB, 下载次数: 3)

这是一个样本。
110h--30fh 疑似mbr+dpt?不是很明白。

320h-51fh

530h-72fh

作者: pseudo    时间: 2015-10-8 22:10
看了一下,dpt文件结构大致是这样的:
除了头部,它从110h开始记录硬盘首扇区和各分区首扇区的内容。每个扇区的记录相隔16字节。
这里假定各分区都是primary分区,不涉及扩展分区的情形。事实上U盘分区多是primary分区,扩展分区罕见。

primary分区越多,dpt文件越长,但分区顶多4个(不考虑gpt)。
可以统一按4个恢复,因为偏移skip超出dpt内容时dd命令自动失效。
代码大致如下(未试过,数据无价,目标盘要核准):

set dst=hd1
set src=(hd0,0)/my.dpt

dd if=%src% of=(%dst%)+1    bs=1 count=512 skip=0x110
dd if=%src% of=(%dst%,0)+1 bs=1 count=512 skip=0x320
dd if=%src% of=(%dst%,1)+1 bs=1 count=512 skip=0x530
dd if=%src% of=(%dst%,2)+1 bs=1 count=512 skip=0x740
dd if=%src% of=(%dst%,3)+1 bs=1 count=512 skip=0x950

作者: chiannet    时间: 2015-10-9 00:04
pseudo 发表于 2015-10-8 22:10
看了一下,dpt文件结构大致是这样的:
除了头部,它从110h开始记录硬盘首扇区和各分区首扇区的内容。每个 ...

set dst=ud
set src=(ud)/my.dpt
dd if=%src% of=(%dst%)+1   bs=1 count=512 skip=0x110
dd if=%src% of=(%dst%,0)+1 bs=1 count=512 skip=0x320
dd if=%src% of=(%dst%,1)+1 bs=1 count=512 skip=0x530
dd if=%src% of=(%dst%,2)+1 bs=1 count=512 skip=0x740
dd if=%src% of=(%dst%,3)+1 bs=1 count=512 skip=0x950

谢谢P大,我明天试试。
作者: chiannet    时间: 2015-10-9 07:02
本帖最后由 chiannet 于 2015-10-9 07:17 编辑
pseudo 发表于 2015-10-8 22:10
看了一下,dpt文件结构大致是这样的:
除了头部,它从110h开始记录硬盘首扇区和各分区首扇区的内容。每个 ...

测试:
1、创建了一个三分区U盘、PE相关文件统统至于高端隐藏区,此时测试能顺利EFI及BIOS引导。
2、用bootice立即备份dpt并藏在UD里。
3、用PECMD删除高端隐藏区,此时测试已不能EFI引导,BIOS引导仅能到fb菜单。
4、UD区就3文件:(ud)/fb.cfg、(ud)/my.dpt及(ud)/grldr 20131130 0.45C ,修改内置菜单如下后再次启动,EFI及BIOS引导均成功修复。






set /a m=0
set dst=%@root:~1,3%
# %dst%=hdx
# 万一存在%@root%=(hd12,0)呢?即大于9的情形怎么自适应



:BA
if "%@root:~1,1%"=="f" && find --set-root --devices=f /52PE/SETUPLDR.BIN && goto A
find --set-root --ignore-floppies --ignore-cd /52PE/SETUPLDR.BIN && goto A
map (ud)/USBZLv2.iso (0xff) && map --hook && root (0xff) && goto A
set src=(ud)/my.dpt
#实际上仅仅使用了if的自0x110起的512字节用dd写到of,再请P大分析分析
if %m%==0 dd if=%src% of=(%dst%)+1  bs=1 count=512 skip=0x110
set /a m=%m%+1
if %m%==1 goto :BA
goto B


:A
command ()/BOOT/GRUB/F6IMG ()/BOOT/SRS
chainloader /52PE/SETUPLDR.BIN
boot

:B
commandline


作者: chiannet    时间: 2015-10-9 10:31
本帖最后由 chiannet 于 2015-10-9 10:33 编辑






这个内置菜单写成了以下这个样子,有些啰嗦,但管用。

#--
configfile
default 0
timeout 0
title USBZL
set reb=Y
if "%@root:~1,1%"=="f" && find --set-root --devices=f /52PE/SETUPLDR.BIN && command ()/BOOT/GRUB/F6IMG ()/BOOT/SRS && set reb=N && chainloader /52PE/SETUPLDR.BIN && boot
find --set-root --ignore-floppies --ignore-cd /52PE/SETUPLDR.BIN && command ()/BOOT/GRUB/F6IMG ()/BOOT/SRS && set reb=N && chainloader /52PE/SETUPLDR.BIN && boot
map (ud)/USBZLv2.iso (0xff) && map --hook && root (0xff) && command ()/BOOT/GRUB/F6IMG ()/BOOT/SRS && set reb=N && chainloader /52PE/SETUPLDR.BIN && boot
# set dst=%@root:~1,3%
if "%reb%"=="Y" && dd if=(ud)/my.dpt of=(%@root:~1,3%)+1  bs=1 count=512 skip=0x110
if "%@root:~1,1%"=="f" && find --set-root --devices=f /52PE/SETUPLDR.BIN && command ()/BOOT/GRUB/F6IMG ()/BOOT/SRS  && chainloader /52PE/SETUPLDR.BIN && boot
find --set-root --ignore-floppies --ignore-cd /52PE/SETUPLDR.BIN && command ()/BOOT/GRUB/F6IMG ()/BOOT/SRS && chainloader /52PE/SETUPLDR.BIN && boot
commandline


作者: pseudo    时间: 2015-10-9 18:29
set dst=ud
...
dd if=%src% of=(%dst%)+1   bs=1 count=512 skip=0x110
dd if=%src% of=(%dst%,0)+1 bs=1 count=512 skip=0x320
...
这样子不妥。

这时(%dst%,0)成为(ud,0),这个表示法印象中g4d旧版不支持,新版也许支持?我不能确定。

如果确认ud对应hd0(比较ls (hd0)/跟ls (ud)/看看),那么还是该写
set dst=hd0

写盘操作风险高,要自动适应多种场合还是有点复杂的。
你好象在用g4d做循环,我觉得如果次数少,不如直接抄几遍算了,呵呵。
作者: chiannet    时间: 2015-10-9 18:46
本帖最后由 chiannet 于 2015-10-9 18:47 编辑
pseudo 发表于 2015-10-9 18:29
set dst=ud
...
dd if=%src% of=(%dst%)+1   bs=1 count=512 skip=0x110


如果是0.46agrldr,要加这句
if "%@root%"=="(ud)" && calc *0x82A0=*0x82b9&0xff


......

set dst=%@root:~1,4%
if "%@root:~4,1%"=="," && set dst=%@root:~1,3%
if "%@root:~4,1%"==")" && set dst=%@root:~1,3%
dd if=(ud)/my.dpt of=(%dst%)+1  bs=1 count=512 skip=0x110
.......









欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3