解析没有剪辑的流

Gae*_*ael 13 javascript regex stream node.js

我正在阅读一个使用正则表达式进行测试的流:

var deviceReadStream = fs.createReadStream("/path/to/stream");

deviceReadStream.on('data',function(data){
  if( data.match(aRegex) )
    //do something
});
Run Code Online (Sandbox Code Playgroud)

但是当流被分成几个块时,切割可能会让我错过一场比赛.那么有一个更好的模式来连续测试正则表达式的流?

更多细节

流是崩溃文件系统的内容.我正在寻找ext2签名(0xef53).由于我不知道如何拆分块,签名可能会被拆分而不被检测到.

所以我使用循环来分隔自己如何分割块,即通过文件系统的块.

但是使用流似乎是一种更好的模式,那么如何在定义块大小的同时使用流呢?

Ed *_*lot 6

假设您的代码只需要搜索签名0xef53(在问题的"更多细节"部分中指定...

执行此操作并继续使用正则表达式的一种方法是保留对先前数据缓冲区的引用,将其与当前数据缓冲区连接,并在其上运行正则表达式.它对cpu的使用有点沉重,因为它有效地扫描每个数据缓冲区两次(并且由于连接而有很多内存分配).它相对容易阅读,因此将来可以维护.

以下是代码外观的示例

var deviceReadStream = fs.createReadStream("/path/to/stream");
var prevData = '';

deviceReadStream.on('data',function(data){
  var buffer = prevData + data;
  if( buffer.match(aRegex) )
    //do something

  prevData = data;
});
Run Code Online (Sandbox Code Playgroud)

另一种选择是更多地手动进行字符比较,以便代码可以在签名跨数据缓冲区分割时捕获.您可以在此相关问题中查看解决方案.在流中搜索字符串的有效方法.根据最佳答案的博客文章,他编写的Haxe代码可以构建为生成JavaScript,然后您可以使用它.或者您可以编写自己的自定义代码来进行搜索,因为您要查找的签名只有4个字符长.


use*_*881 2

首先,如果您决定在 Nodejs 中使用正则表达式,请尝试一下 pcre。PCRE 的节点包装器可用。Pcre 可以配置为进行可以跨缓冲区边界恢复的部分匹配。

不过,您可能只是grep(或fgrep对于多个静态字符串)从终端获取字节偏移量。然后,您可以使用xxdless查看它或dd提取一部分。

例如,要使用 grep 获取偏移量:

grep --text --byte-offset --only-matching --perl-regex "\xef\x53" recovery.img
Run Code Online (Sandbox Code Playgroud)

请注意,grep 命令行选项可能会因您的发行版而异。

你也可以看看bgrep虽然我没有用过它。

我很幸运地使用各种 shell 工具和脚本进行恢复。

其他一些离题评论:

  1. 请记住您所搜索的内容的字节序。
  2. 如果您尚未进行恢复,请在进行恢复时拍摄一张图像。除其他危险外,如果设备开始出现故障,进一步访问可能会使情况变得更糟。
  3. 参考数据雕刻工具。参考
  4. 正如您提到的,文件可能是碎片化的。我仍然希望分区和文件从扇区边界开始。据我所知,魔法通常不会被分割。
  5. 请小心,不要无意中写入您正在恢复的设备。
  6. 如您所知,如果您重建映像,您可以使用环回驱动程序来安装映像。