如何获取已删除分区中索引节点在块设备中的偏移量

2023-12-06

在全新安装过程中,我不小心格式化了包含数据的磁盘。我尝试过使用一些工具:最重要的是testdisk,但我没有得到好的结果。 (看我不成功的帖子在超级用户上)。

所以我决定阅读一些有关的文档ext2 文件系统结构,我可以获得一些结果:

删除的分区有一个像这样的目录树:

dev
|-scripts
|-projects
|-services
|-...
Medias
|-downloads
|-Musique
|-...
backup
...

因此,基于 ext2 目录项格式:

Directory Entry
Starting_Byte Ending_Byte Size_in_Bytes Field_Description
0   3       4   Inode
4   5       2   Total size of this entry (Including all subfields)
6   6       1   Name Length least-significant 8 bits
7   7       1   Type indicator (only if the feature bit for "directory entries have file type byte" is set, else this is the most-significant 8 bits of the Name Length)
8   8+N-1   N   Name characters

我试图找到一些与这个结构匹配的数据。
我使用了这个脚本:

    var bindexOf = require('buffer-indexof');

    var currentOffset=0;
    var deviceReadStream = fs.createReadStream("/dev/sdb");

    deviceReadStream.on('error',function(err){
        console.log(err);
    });

    deviceReadStream.on('data',function(data){

        var dirs = ["dev","scripts","services","projects","Medias","downloads","Musique","backup"];
        dirs.forEach(function(dir){

            dirOctetFormat = new Buffer(2);
            dirOctetFormat.writeUInt8(dir.length,0);
            dirOctetFormat.writeUInt8(2,1);// type is directory
            dirOctetFormat= Buffer.concat( [dirOctetFormat, new Buffer(dir)]);

            var offset = bindexOf( data, dirOctetFormat );
            if( offset >= 0 ){    
                console.log( dir + " entry found at offset " + (currentOffset + offset) );
            } 

        });
        currentOffset += data.length;
    });
}

我发现 data 似乎是 dev 目录的目录条目:

 ===== Current offset: 233590226944 - 217.5478515625Gio ====== 
scripts entry found at offset 233590227030
services entry found at offset 233590227014
projects entry found at offset 233590228106

如果是这样的话,我得到了它的子目录的索引节点号:脚本、项目、服务......

但我不知道该怎么办! 我试图根据以下信息推断出这些索引节点的位置本指南, 但由于我无法找到已删除文件系统的超级块,我只能猜测块大小、块数量…… 对我来说,希望获得结果似乎有点模糊。

那么,您是否可以为获取索引节点偏移量所需的所有值提供一些间隔,以及获取此偏移量的更正式的公式?


如果您仅删除了分区表(或对其进行了修改),并且数据尚未重新用于其他用途,您仍然可以获得数据。

ext2 文件系统在超级块中有一个 MAGIC 编号,因此要恢复分区,您只需搜索它即可。我在一台机器上执行了此操作,并且能够恢复一个磁盘中的不是一个分区,而是七个分区。你有一些机会得到无效的数字,但只要寻找那个魔力即可。幻数定义于include/uapi/linux/magic.h值是#define EXT2_SUPER_MAGIC 0xEF53(它在偏移处找到#define EXT2_SB_MAGIC_OFFSET 0x38- -从文件include/linux/ext2_fs.h)

要搜索超级块,只需尝试查找0xef53偏移处0x38在磁盘的一个扇区中,它将标记分区的第一个块。请注意,该超级块在一个分区中被复制多次,因此您会找到它的所有副本。

祝你好运! (当它发生在我身上时我也有过)


编辑(举例说明)

只需查看我自己的分区之一中的神奇数字即可:

# hd /dev/sda3 | head -20
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000400  40 62 08 00 00 87 21 00  26 ad 01 00 f6 30 15 00  |@b....!.&....0..|
00000410  1d 31 08 00 00 00 00 00  02 00 00 00 02 00 00 00  |.1..............|
00000420  00 80 00 00 00 80 00 00  90 1f 00 00 cf 60 af 55  |.............`.U|
00000430  fc 8a af 55 2d 00 ff ff  53 ef 01 00 01 00 00 00  |...U-...S.......|<- HERE!!!
00000440  36 38 9d 55 00 00 00 00  00 00 00 00 01 00 00 00  |68.U............|
00000450  00 00 00 00 0b 00 00 00  00 01 00 00 3c 00 00 00  |............<...|
00000460  46 02 00 00 7b 00 00 00  5a bf 87 15 12 8f 44 3b  |F...{...Z.....D;|
00000470  97 e7 f3 74 4d 75 69 12  72 6f 6f 74 00 00 00 00  |...tMui.root....|
00000480  00 00 00 00 00 00 00 00  2f 00 61 72 67 65 74 00  |......../.arget.|
00000490  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 18 02  |................|
000004d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000004e0  08 00 00 00 00 00 00 00  00 00 00 00 93 54 99 ab  |.............T..|
000004f0  aa 64 46 b3 a6 73 94 34  a3 79 46 28 01 01 00 00  |.dF..s.4.yF(....|
00000500  0c 00 00 00 00 00 00 00  e5 61 92 55 0a f3 02 00  |.........a.U....|
00000510  04 00 00 00 00 00 00 00  00 00 00 00 ff 7f 00 00  |................|
00000520  00 80 10 00 ff 7f 00 00  01 00 00 00 ff ff 10 00  |................|

记住它是偏移的0x38从块原点开始计数,并假设超级块是分区中的第二个块(为引导代码保留的块 0,因此它将是块 1,每个块有两个扇区,以形成 1k 块大小),因此您必须倒带0x438从幻数开始的字节来获取分区原点。

我已在整个磁盘上运行该命令,得到以下结果:

# hd /dev/sda | grep " [0-9a-f][0-9a-f]  53 ef" | sed -e 's/^/    /' | head
006f05f0  ee 00 00 11 66 0a 00 00  53 ef 00 00 11 66 2d 00  |....f...S....f-.|
007c21d0  55 2a aa 7d f4 aa 89 55  53 ef a4 91 70 40 c1 00  |U*.}...US...p@..|
20100430  fc 8a af 55 2d 00 ff ff  53 ef 01 00 01 00 00 00  |...U-...S.......|
2289a910  0f 8f 4f 03 00 00 81 fe  53 ef 00 00 0f 84 ce 04  |..O.....S.......|
230d4c70  0a 00 00 00 1c 00 00 00  53 ef 01 00 00 00 00 00  |........S.......|
231b7e50  a0 73 07 00 00 00 00 00  53 ef 0d 00 00 00 00 00  |.s......S.......|
23dbd230  d5 08 ad 2b ee 71 07 8a  53 ef c2 89 d4 bb 09 1f  |...+.q..S.......|
25c0c9e0  06 00 00 00 00 4f 59 c0  53 ef 32 c0 0e 00 00 00  |.....OY.S.2.....|
25d72ca0  b0 b4 7b 3d a4 f7 84 3b  53 ef ba 3c 1f 32 b9 3c  |..{=...;S..<.2.<|
25f0eab0  f1 fd 02 be 28 59 67 3c  53 ef 9c bd 04 30 72 bd  |....(Yg<S....0r.|

显然,这个列表中无趣的行比我们需要的多得多。为了找到这里感兴趣的一个,我们必须对数字进行一些计算。我们已经看到扇区的长度是 512 字节(这是0x200以十六进制表示),我们可以在偏移处拥有超级块魔法0x438,所以我们期望有效偏移量为0xXXXXXX[02468ace]38仅有的。只需选择偏移量以该表达式结尾的行,您将在偏移量处获得第一个有效的超级块(在第三行中)0x20100430。 减法0x430给出分区的字节偏移量(0x20100000,然后将结果除以0x200, 给予0x100800, or 1050624)

# fdisk -l /dev/sda | sed -e 's/^/    /'

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: DF97DAD4-727D-4BB3-BD7B-3C5A584A2747

Device         Start        End    Sectors   Size Type
/dev/sda1       2048     526335     524288   256M EFI System
/dev/sda2     526336    1050623     524288   256M BIOS boot
/dev/sda3    1050624   18628607   17577984   8.4G Linux filesystem  <-- HERE!!!
/dev/sda4   18628608   77221887   58593280    28G Linux filesystem
/dev/sda5   77221888   85035007    7813120   3.7G Linux filesystem
/dev/sda6   85035008  104566783   19531776   9.3G Linux filesystem
/dev/sda7  104566784  135817215   31250432  14.9G Linux swap
/dev/sda8  135817216  155348991   19531776   9.3G Linux filesystem
/dev/sda9  155348992 1953523711 1798174720 857.4G Linux filesystem
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取已删除分区中索引节点在块设备中的偏移量 的相关文章

  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 多处理:仅使用物理核心?

    我有一个函数foo它消耗大量内存 我想并行运行多个实例 假设我有一个有 4 个物理核心的 CPU 每个核心有两个逻辑核心 我的系统有足够的内存来容纳 4 个实例foo并行但不是 8 个 此外 由于这 8 个核心中的 4 个是逻辑核心 我也不
  • 跨平台 C++ 文件系统观察器

    我正在寻找一个跨平台文件系统观察器 类似于文件系统观察者 http msdn microsoft com en us library system io filesystemwatcher aspx NET 中的类 因为它是守护进程 服务
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • CoreData 错误:API 滥用:尝试序列化非拥有协调器上的存储访问

    Note 这个帖子不适用 因为我实际上使用 CoreData In 这个帖子最后一个答案建议在添加新对象之前获取新后台线程中的所有项目 但这是在我的代码中完成的 这个帖子建议在保存项目上下文之前对项目进行故障排除 但这也在我的代码中完成 我
  • C# 中同一 LAN 上的 MAC 地址到 IP 地址

    有没有办法在 C 中找到 MAC 地址到 IP 地址之间的映射 我认为 RARP 应该能够做到这一点 C 中是否有可用的 API 为什么不生成一个进程来调用rarp并从进程的输出中读取输入流 这是一种真正便宜 简单 愉快的做法 在我的脑海中
  • javascript - 将变量插入正则表达式

    我有以下工作正常 允许表单字段在空白或包含单词 hello 或通过其他验证时有效 var re new RegExp hello FG d 5 d 5 AB 但我想让 hello 这个词成为一个变量的值 我已经尝试过 但它似乎不再起作用 v
  • 如何在 VS 2008 中用 HTML 标记快速包围文本?

    我正在使用 Visual Studio 2008 编辑器 有没有办法以一段文本为例 突出显示它并使用快捷方式快速添加标记 例如 假设我有一条短信 我去了 the store我想将其加粗 我必须输入 b the store b 有没有更快更简
  • 如何获取视图html并返回客户端

    下面是返回视图到 jquery 函数的代码片段 但我想知道如何提取或获取视图 html 并返回到客户端 function myddl change function var url this data url var value this
  • 是否有 C# 相当于 Java ConcurrentHashMap

    我需要 C 中的字典 哈希图 允许您执行以下操作 无需锁定即可同时输入值和迭代 锁只放 get没有被锁定 可能会同时get很多次 Thanks 在这里查看 ConcurrentDictionary http msdn microsoft c
  • android操作系统可以捕获蓝牙鼠标右键单击和滚轮事件吗?

    我有一部 android 2 3 5 手机 它可以连接到蓝牙鼠标 但我发现它只响应左键单击和鼠标移动 if event getAction MotionEvent ACTION DOWN Left Button else if event
  • Cordova/PhoneGap无法添加WP7/WP8/Windows平台

    我在 Win8 上尝试添加 wp8 平台时遇到错误 详细信息如下 CordovaWP8 gt cordova d 平台添加 wp8 wp8 的科尔多瓦库已经存在 无需下载 继续 检查平台 wp8 是否通过最低要求 检查 wp8 要求 运行
  • Visual Studio 2015 Intellisense 键盘选项

    首先 我是在这里问这个问题 而不是在 Microsoft 论坛上 因为它们是 嗯 你知道它们是什么 我喜欢 VS2015 Intellisense 自动完成功能 当我需要它们时 但他们愚蠢地添加了空格键作为选择键 更愚蠢的是 他们还添加了
  • 获取WPML的语言代码

    我正在尝试获取 WPLM wordpress 插件的语言代码 这就是我在没有运气的情况下所做的 p Spanish text p 知道问题出在哪里吗 我检查了一些教程 他们就是这样做的 es En不是有效的语言代码 你只想使用es p Sp
  • 为什么我不能使用引用子类型实例的父类型的引用来调用子类方法?

    我正在学习Java 同时试图理解继承 我无法弄清楚为什么子类 walk 中的重写方法被执行 但其他 xyz 方法却没有被执行 class Person public void walk System out println walking
  • 按欧拉角输入旋转四元数

    我正在编写一段代码来控制 3D 空间中的机械臂 机械臂通过四元数处理旋转 但我希望用户通过改变偏航 俯仰和滚动来控制它 因为人类使用这些更明智 我编写了函数来获取用户想要在每个方向 滚动 俯仰 偏航 旋转手臂的量并输出新的四元数 我将 cu
  • 使用 perl 从远程主机读取文件

    我正在尝试从 ubuntu 机器读取位于同一 LAN 中远程主机 ubuntu 上的 root 目录下的文件 temp txt ssh 和 ftp 已打开 perl 脚本能够连接 并出现一个 OpenSSH 对话框 要求输入密码 然后程序存
  • 使用线程睡眠更新 UI

    我正忙于为 Android 设备制作应用程序 现在我正在测试一些东西 我想改变背景颜色有限次 比如说 5 次 每次背景改变时 我希望它在 2 3 秒后再次改变 如果我使用 Thread 类 它会在 Thread 完成后加载整个模板 您看不到
  • 在后面创建数据模板代码

    我正在尝试创建一个用于显示数据的列表框视图 并且希望它包含一个带有 2 列 产品 ID 和产品条形码 数据模板的列表框 我想使用纯 C 代码创建它 或者如果可能的话通过 xaml 加载它 如果我可以创建一个模板 我就可以将 C 作为某种资源
  • 使用 scipy.io.savemat 保存嵌套列表

    这与我的上一个问题有关 可以找到here 我正在处理类似于我在该链接中描述为markerList 的列表的列表 因此是一个具有三个级别的列表 我需要将此信息保存为 mat 文件 但无法将其保存为正确的类型 当使用 scipy io save
  • 带分隔线的进度条

    有人可以向我解释如何实现带有分隔线的进度条 如下图所示吗 对于我正在使用的进度条https github com akexorcist Android RoundCornerProgressBar但这似乎没有分隔符选项 replace Pr
  • Spring Boot 和 JUnit 5 之间的交互——必须使用整体工件而不是个体?

    这个问题之前已经被问过 例如here 但我的观察与之前报道的不一样 我注意到要让 JUnit 5 工作 我必须包含整个 JUnit 5 工件 testImplementation org junit jupiter junit jupite
  • 我应该使用什么正则表达式根据 2 个单词格式和空格分割字符串?

    我正在尝试分割字符串 Chan 0 2 50 0 12 13 92 83 46 Chan 1 2 58 85 92 2 47 9 03 Chan 2 5 00 85 0 33 33 6 64 Chan 3 0 00 0 00 14 41 8
  • 如何获取已删除分区中索引节点在块设备中的偏移量

    在全新安装过程中 我不小心格式化了包含数据的磁盘 我尝试过使用一些工具 最重要的是testdisk 但我没有得到好的结果 看我不成功的帖子在超级用户上 所以我决定阅读一些有关的文档ext2 文件系统结构 我可以获得一些结果 删除的分区有一个