无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 4352|回复: 12
打印 上一主题 下一主题

求助帖:如何用PECMD+IMDISK挂载 U+隐藏区?热心的高手请进帮帮忙。

[复制链接]
跳转到指定楼层
1#
发表于 2015-4-23 14:08:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yjmub 于 2015-4-23 14:14 编辑

如题:WIN7PE已经集成IMDISK,如何挂载U+隐藏区?阿弥陀佛给的代码,看不懂,不会用。下面是佛的代码:

  1. ///使用PECMD+IMDISK来挂载U+深度隐藏区
  2.     envi &disk=1          //要挂载的磁盘号,这里是u盘1,多个u盘自己改
  3.     envi &volume=Z     //指定盘符
  4.     envi &readonly=1   //默认1为只读挂载,其它数值为可写挂载
  5.     envi &start=
  6.     envi &lenth=
  7.     //读取被转移的分区表项中的逻辑起始扇区和总扇区数
  8.      FORX * 49654 49655 49656 49657 49658 49659 49660 49661,&&num,
  9.       {
  10.       GETF \\.\PhysicalDrive%&disk%,%&num%#1,&&V
  11.       rstr &&V=2,%&V%
  12.       ifex $%&num%<49658,envi-ret &start=%&V%%&start%!envi-ret &lenth=%&V%%&lenth%
  13.       }
  14.     //数值转换为10进制
  15.     calc -base=10 &lenth=0x%&lenth%
  16.     calc -base=10 &start=0x%&start%
  17.     //配合imdisk挂载深度隐藏区
  18.     find $%&readonly%=1,RAMD ImDisk*&V*%&start%s*%&lenth%s*0*\\.\PhysicalDrive%&disk% -a -o hd -m %&volume%:!RAMD ImDisk*&V*%&start%s*%&lenth%s*1*\\.\PhysicalDrive%&disk% -a -o hd -m %&volume%:
  19.    
复制代码

热心的高手路过请不吝赐教。zds1210说是让请教M大,好久不来论坛,不知M大是谁,勿怪!如M大路过,请费举手之劳,为老菜鸟解惑,不胜感谢!,如果有集成此功能的PE请给个链接,再次感谢!
2#
发表于 2015-4-23 14:34:24 | 只看该作者
取自S大的源码:

用法 pecmd load "mount_hiend.ini" 1#4 Z: ro
        pecmd load "mount_hiend.ini" 1#3 Z: ro
  
注意,使用时1#4 要注意避免1所代表的是本地硬盘,红色字符是特征文件。没有这些文件,表示挂错了,unmount

以下是《mount_hiend.ini》
envi in1=%~1   // 源物理磁盘号#分区号
envi in2=%~2   // 挂载的目标盘符:字母带冒号结尾的
envi in3=%~3   // 只读:ro 可写:rw

MSTR -delims:# n_hd=<1>%in1%
MSTR -delims:# par=<2>%in1%
FIND $%in3%=ro, envi &&rw=0!envi &&rw=1
GetMbrPt %n_hd%#%par% &&part_info
MSTR par.active=<1>%part_info%
MSTR par.fs=<2>%part_info%
MSTR par.start=<3>%part_info%
MSTR par.len=<4>%part_info%
FIND |%par.active%=0,!exit //不是USBZL或USBOS,退出
// mess MBR: %n_hd%-%par%\n%par.active%,%par.fs%,%par.start%,%par.len%
FIND |%par.fs%=0,exit   //类型=0,返回
FIND |%par.len%=0,exit  //长度=0,返回
PART -admin list part %n_hd%#%par%, &&part_info
MSTR par.letter=<8>%part_info%
FIND $%par.letter%=,!exit  //盘符不为空,退出,避免重复挂载

RAMD ImDisk*&&V*%par.start%s*%par.len%s*%rw%*\\.\PhysicalDrive%n_hd% -a -o hd -m %in2%   //扇区映射

ifex %in2%\USBZL.FLG,!ifex %in2%\USBOS.VER,!Call UNMOUNT
  
_SUB GetMbrPt
    MSTR -delims:# n_hd=<1>%~1
    MSTR -delims:# n_par=<2>%~1
    SET &nm=\\.\PhysicalDrive%n_hd%
    ;read active flag
    CALC  &&addr=0x1BE+16*(%n_par%-1)
    GETF %nm%,%&addr%#1,&&pt.flag
    ;read type
    CALC  &&addr=0x1C2+16*(%n_par%-1)
    GETF %nm%,%&addr%#1,&&pt.type
    ;read "start sector" and "length in sectors"
    CALC  &&addr=0x1C6+16*(%n_par%-1)
    GETF# %nm%,%&addr%#8,&&sn1
    SET?long    &sn1=&&pt.start:0
    SET?long    &sn1=&&pt.len:4
    ENVI ret=%pt.flag% %pt.type% %pt.start% %pt.len%
    ENVI-ret %~2=%ret%
_END

_SUB UNMOUNT
        RAMD Imdisk*&&V3 -d -u %in2%
        RAMD Imdisk*&&V3 -D -u %in2%
        RAMD Imdisk*&&V3 -R -u %in2%
_END
回复

使用道具 举报

3#
发表于 2015-4-23 14:55:41 | 只看该作者
本帖最后由 chiannet 于 2015-4-23 14:58 编辑

function  MOUNT_part(phyNumber: integer): boolean;
  var
  k:integer;
begin
    result:=false;
    k:=0;
    if phyNumber>=0 then repeat
      WinExecAndWait32(PECMD+' LOAD '+windir+'\MOUNTHI_END2W.ini '+inttostr(phyNumber)+'#4 W: ro',0);
      IF not(fileEXists('W:\usbOS.VER') or fileEXists('W:\usbzl.FLG')) then
         WinExecAndWait32(PECMD+' LOAD '+windir+'\MOUNTHI_END2W.ini '+inttostr(phyNumber)+'#3 W: ro',0);

      IF fileEXists('W:\usbOS.VER') or fileEXists('W:\usbzl.FLG') then
       result:=true
        else  begin
           inc(k);
           sleep(400);
         //  WinExecAndWait32(windir+'\SYSTEM32\BOOTPART.EXE -eject W:' ,0);
        end;
    until  (k>=3) or result;
end;


Procedure MOUNTHI_END2W;
  var
  k:integer;
BEGIN

AList:=TStringList.Create;
with AList do  begin
        add('envi in1=%~1');   // 源物理磁盘号#分区号
        add('envi in2=%~2');   // 挂载的目标盘符:字母带冒号结尾的
        add('envi in3=%~3');   // 只读:ro 可写:rw
        add('MSTR -delims:# n_hd=<1>%in1%');
        add('MSTR -delims:# par=<2>%in1%');
        add('FIND $%in3%=ro, envi &&rw=0!envi &&rw=1');
        add('GetMbrPt %n_hd%#%par% &&part_info');
        add('MSTR par.active=<1>%part_info%');
        add('MSTR par.fs=<2>%part_info%');
        add('MSTR par.start=<3>%part_info%');
        add('MSTR par.len=<4>%part_info%');
        add('FIND |%par.active%=0,!exit'); //不是USBZL或USBOS,退出
        add('FIND |%par.fs%=0,exit');   //类型=0,返回
        add('FIND |%par.len%=0,exit');  //长度=0,返回
        add('PART -admin list part %n_hd%#%par%, &&part_info');
        add('MSTR par.letter=<8>%part_info%');
        add('FIND $%par.letter%=,!exit');  //盘符不为空,退出,避免重复挂载
        add('RAMD ImDisk*&&V*%par.start%s*%par.len%s*%rw%*\\.\PhysicalDrive%n_hd% -a -o hd -m %in2%');   //扇区映射
        add('ifex %in2%\USBZL.FLG,!ifex %in2%\USBOS.VER,!Call UNMOUNT');
        add('_SUB GetMbrPt');
        add('MSTR -delims:# n_hd=<1>%~1');
        add('MSTR -delims:# n_par=<2>%~1');
        add('SET &nm=\\.\PhysicalDrive%n_hd%');
        add('CALC  &&addr=0x1BE+16*(%n_par%-1)');
        add('GETF %nm%,%&addr%#1,&&pt.flag');
        add('CALC  &&addr=0x1C2+16*(%n_par%-1)');
        add('GETF %nm%,%&addr%#1,&&pt.type');
        add('CALC  &&addr=0x1C6+16*(%n_par%-1)');
        add('GETF# %nm%,%&addr%#8,&&sn1');
        add('SET?long    &sn1=&&pt.start:0');
        add('SET?long    &sn1=&&pt.len:4');
        add('ENVI ret=%pt.flag% %pt.type% %pt.start% %pt.len%');
        add('ENVI-ret %~2=%ret%');
        add('_END');
        add('_SUB UNMOUNT');
        add('RAMD Imdisk*&&V3 -d -u %in2%');
        add('RAMD Imdisk*&&V3 -D -u %in2%');
        add('RAMD Imdisk*&&V3 -R -u %in2%');
        add('_END');
        SaveToFile(windir+'\MOUNTHI_END2W.ini');
        Clear;
end;

   p1:='';
   for i:=65 to 90  do
     if DiskInDrive(chr(i)) then
        if GetDriveType(Pchar(chr(i)+':\')) = DRIVE_REMOVABLE then
            if MOUNT_part(GetVolumeInfo(chr(i)).DiskNumber) then begin p1:='YES'; break; end;

//以上第一轮 ,识别为可移动设备的物理盘优先,若这一轮没挂到,进行下一轮

   IF p1<>'YES' THEN BEGIN
      for i:=65 to 90 do
         if DiskInDrive(chr(i)) then  begin
           k:=GetVolumeInfo(chr(i)).DiskNumber;  //获取盘符所在的物理盘号。
          //为避免挂本地硬盘,我们推定U盘上不应存在以下这些目录或文件,把存在这些文件的分区所在的“物理盘号”列入不予挂载黑名单
           if DirectoryExists(chr(i)+':\Windows\System32\drivers') or fileEXists(chr(i)+':\hiberfil.sys') or DirectoryExists(chr(i)+':\Users\All Users\Microsoft') then   
               if AList.IndexOf(inttostr(k))<0 then AList.Add(inttostr(k));
           end;

    DList:=TStringList.Create;
    with DList do begin
      p1:=windir+'\DISKPH70.TXT';
      Add('part LIST disk,&&dsks');
      Add('FILE '+P1);
      Add('WRIT '+P1+',$1,%dsks%');
      SaveToFile(windir+'\MOUNTHIEND2W.ini');
      WinExecAndWait32(PECMD+' LOAD '+windir+'\MOUNTHIEND2W.ini',0);
      if fileexists(p1) then begin LoadFromFile(p1); deletefile(p1);   end;
      deletefile(windir+'\MOUNTHIEND2W.ini');
      if Count>0 then
        for I := 0 to Count - 1 do begin
         KeyList:= TStringList.Create;
         ExtractStrings([' '], [' ','#','.'], PChar(DList), KeyList);
         if KeyList.Count>0 then
            for k := 0 to KeyList.Count - 1 do
                if AList.IndexOf(KeyList[k])<0 then if MOUNT_part(k) then begin p1:='YES';break; end;   //不在不予挂载黑名单   “物理盘号”,就试着挂载
         KeyList.Free;
         if p1='YES' then break;
         end;
      free;
    end;
    AList.Free;
    END;
   deletefile(windir+'\MOUNTHI_END2W.ini');
END;


由于不太习惯PECMD编程,用delphi 写了上述代码,测试蛮好,无论在VM虚拟机(U盘被识别为本地硬盘)还是实机,均能正确挂载。
回复

使用道具 举报

4#
发表于 2015-4-23 15:48:35 | 只看该作者
还是感觉复杂,最好像bootpart一样子简明实用就行了。
回复

使用道具 举报

5#
发表于 2015-4-23 15:53:07 | 只看该作者
PECMD2012.01.88.05.58 已经内置了 U+  UD的加载功能可以只接用。
MOUN -udm  -mall  -mhide -u+   -udfs  -udimg: efi.img    \\.\PhysicalDrive1   R-

啥都给你挂上。(包挂U+深度隐藏和高端隐藏)
HELP MOUN

点评

不过还是有些人不喜欢一口气全部挂上.....  详情 回复 发表于 2015-4-23 16:16
回复

使用道具 举报

6#
发表于 2015-4-23 16:16:25 | 只看该作者
mdyblog 发表于 2015-4-23 15:53
PECMD2012.01.88.05.58 已经内置了 U+  UD的加载功能可以只接用。
MOUN -udm  -mall  -mhide -u+   -udfs  ...

不过还是有些人不喜欢一口气全部挂上.....

点评

讲解起来方便而已。 以不变应万变。 实际 上减几个 开关 比加结果开关容易。  详情 回复 发表于 2015-4-23 16:21
回复

使用道具 举报

7#
发表于 2015-4-23 16:21:26 | 只看该作者
本帖最后由 mdyblog 于 2015-4-23 16:27 编辑
sp_star 发表于 2015-4-23 16:16
不过还是有些人不喜欢一口气全部挂上.....

1:
讲解起来方便而已。 以不变应万变。
实际 上减几个 开关  比加结果开关容易。

2:对PE开发者,不关心具体部署方式,希望的就是 一通用的写法。 以不变应万变。

点评

M大的pecmd 脚本挂载U+隐藏区,UDM区,应该是相当的方便。大大能不能公布相应的方法。  详情 回复 发表于 2015-4-23 17:11
回复

使用道具 举报

8#
发表于 2015-4-23 17:11:10 | 只看该作者
mdyblog 发表于 2015-4-23 16:21
1:
讲解起来方便而已。 以不变应万变。
实际 上减几个 开关  比加结果开关容易。

M大的pecmd 脚本挂载U+隐藏区,UDM区,应该是相当的方便。大大能不能公布相应的方法。
回复

使用道具 举报

9#
 楼主| 发表于 2015-4-27 01:05:02 | 只看该作者
本帖最后由 yjmub 于 2015-4-27 01:08 编辑

反馈一下:WIN7 64位系统,安装了IMDISK,C盘下放了个PECMD.exe(PECMD2012.01.88.05.59),U盘U+隐藏区有三个文件,EFI.img, USBZL.FLG, USBOS.VER,
一、CMD下执行PECMD MOUN -udm  -mall  -mhide -u+   -udfs  -udimg: efi.img    \\.\PhysicalDrive1   R-       结果是啥也没挂上。(CMD已经切换到C:\)
二、c盘建mount_hiend.ini (复制上面的代码),CMD下运行 pecmd load "mount_hiend.ini" 1#4 Z: ro和pecmd load "mount_hiend.ini" 1#3 Z: ro,结果是啥也没有挂上
。(CMD已经切换到C:\)
现在就剩下那个dephi代码,谁帮忙编译下,再试吧。
各位高手的方法应该是没有错的,不知是我错在什么地方?



点评

要求 1、windows所在盘符为X:(几乎限定只能在PE中耍耍); 2、%windir%\system32\下存在2012版pecmd.exe 及imdisk.exe; 3、启用了imdisk的服务; 4、高端隐藏区的分区号必须是是4(例如UltraISO+fbin  详情 回复 发表于 2015-4-27 09:30
\\.\PhysicalDrive1 试试 \\.\PhysicalDrive0 \\.\PhysicalDrive2  详情 回复 发表于 2015-4-27 04:43
回复

使用道具 举报

10#
发表于 2015-4-27 04:43:10 | 只看该作者
本帖最后由 mdyblog 于 2015-4-27 04:44 编辑
yjmub 发表于 2015-4-27 01:05
反馈一下:WIN7 64位系统,安装了IMDISK,C盘下放了个PECMD.exe(PECMD2012.01.88.05.59),U盘U+隐藏区有三个 ...

\\.\PhysicalDrive1
试试  \\.\PhysicalDrive0
\\.\PhysicalDrive2


  1. @ver
  2. imdisk -l
  3. PECMD MOUN -udm  -mall  -mhide -u+   -udfs  -udimg: efi.img    \\.\PhysicalDrive0   R-  
  4. PECMD MOUN -udm  -mall  -mhide -u+   -udfs  -udimg: efi.img    \\.\PhysicalDrive1   R-  
  5. PECMD MOUN -udm  -mall  -mhide -u+   -udfs  -udimg: efi.img    \\.\PhysicalDrive2   R-
  6. imdisk -l
  7. pause
复制代码

  
贴图
回复

使用道具 举报

11#
发表于 2015-4-27 09:30:35 | 只看该作者
yjmub 发表于 2015-4-27 01:05
反馈一下:WIN7 64位系统,安装了IMDISK,C盘下放了个PECMD.exe(PECMD2012.01.88.05.59),U盘U+隐藏区有三个 ...



要求
1、windows所在盘符为X:(几乎限定只能在PE中耍耍);
2、%windir%\system32\下存在2012版pecmd.exe 及imdisk.exe;
3、启用了imdisk的服务;
4、高端隐藏区的分区号必须是是4(例如UltraISO+fbinst.exe弄出的三分区)或3(例如GDISK32+fbinst.exe弄出的三分区)。

示例:
mount_hiend.exe Z: mypath\myfile.flg ro
mount_hiend.exe w: "mypath  fff\myf   ile.flg" ro

   参数1: 挂载的目标盘符:字母带冒号结尾的。
   参数2: 标志文件。
   参数3: 只读:ro ;可写:rw标志。

我没有测试,你试试吧: mount_hiend.7z (104.22 KB, 下载次数: 22)

点评

C大,启用imdisk服务是不是导入注册表就行了?  详情 回复 发表于 2015-5-4 00:20
回复

使用道具 举报

12#
发表于 2015-5-4 00:20:41 来自手机 | 只看该作者
chiannet 发表于 2015-4-27 09:30
要求
1、windows所在盘符为X:(几乎限定只能在PE中耍耍);
2、%windir%\system32\下存在2012版 ...

C大,启用imdisk服务是不是导入注册表就行了?
回复

使用道具 举报

13#
 楼主| 发表于 2015-5-4 16:31:45 | 只看该作者
本帖最后由 yjmub 于 2015-5-4 16:33 编辑
C大,启用imdisk服务是不是导入注册表就行了?

导入注册表后,ImDskSvc服务类型是自启,但是没有启动,好象还是要手动启动一样,用net start看下,并没有启动。用net start或sc启动下好象才启动。但IMDISK服务好象是启动了,但为什么没有在启动列表中,菜鸟我一直没有弄清楚。正常系统中IMDISK服务也没有在列表中。但net start imdisk,显示已经启动。菜鸟回答,勿用在意。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-12-1 11:25

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表