【发布时间】:2012-12-27 05:19:40
【问题描述】:
我正在开发一个基本的文件雕刻器,目前我正忙于计算文件的字节位置。
我发现我需要一段代码来执行以下步骤;
- 在变量中找到 $searchQuery
- 找到 $searchQuery 后删除字符串的其余部分
- 计算变量中现在存在的字段数
- 将此变量减去 2 以考虑十六进制偏移量和 $searchQuery 本身
- 然后将答案乘以 2 得到正确的字节数
这方面的一个例子是;
- 在“00052a0: b4f1 559c ffd8 ffe0 0010 4a46 4946 0001”中找到“ffd8”
- 变量更新为“00052a0: b4f1 559c ffd8”
- $fieldCount 被赋值为“4”
- $fieldCount=((fieldCount-2))
- $byteCount=((fieldCount*2))
除了计算变量中的字段数之外,我对如何做所有事情都有一个基本的想法。例如,在找到 $searchQuery 之前,如何计算变量中有多少字段?同样,删除字符串中不必要的部分后,如何计算字段数?
使用 grep 找到 $searchString 后,我不知道如何继续。我当前的代码如下所示;
#!/bin/bash
#***************************************************************
#Name: fileCarver.sh
#Purpose: Extracts files hidden within other files
#Author:
#Date Written: 12/01/2013
#Last Updated: 12/01/2013
#***************************************************************
clear
#Request user input
printf "Please enter the input file name: "
read inputFile
printf "Please enter the search string: "
read searchString
#Search for the required string
searchFunction()
{
#Search for required string and remove unnecessary characters
startHexOffset=`xxd $1 | grep $2 | cut -d":" -f 1`
#Convert the Hex Offset to Decimal
startDecOffset=$(echo "ibase=16;${startHexOffset^^}" | bc)
}
searchFunction $inputFile $searchString
exit 0
感谢您的帮助!
【问题讨论】:
-
阅读有关 awk 的信息,它是
FS(字段分隔符)和NF(字段数)变量。您可以消除所有额外的进程,例如grep和cut。另外,你的问题有点不清楚,你看到这个函数的输出是什么? doc 块说“隐藏在其他文件中的文件”,但您的示例数据似乎不支持这一点。 (请提供示例输出)。祝你好运! -
谢谢,我会的!本质上,它将能够通过获取隐藏文件开始的确切字节来提取被不相关数据混淆的文件。例如,它会搜索JPG页眉“ffd8”和页脚“ffd9”,基本上只是将两端的数据全部剪切粘贴到另一个文件中,就可以正常查看图片了。
-
我添加了
echo $fullOffset | awk -F " " "/$searchString/{print NF}"这一行,但它只输出变量中字段的数量。该变量包含00052a0: b4f1 559c ffd8 ffe0 0010 4a46 4946 0001 ..U.......JFIF..。 -
好的,是的。现在,您可以使用
{for (i=1;i<=NF;i++){if ($i ~ /$searchString/) printf("fldNum=%d=%s\n", i, $i)}遍历当前行的所有元素。注意i可以是一个计数器,就像在c中一样,但也可以通过$i引用它的值。这适用于所有在 awk 中保存数字的变量,包括 NF,因此 $NF 将打印该行的最后一个元素,$(NF-3)将打印该行最后一个字段的第三个(例如)。您可以使用$(NF-n)和 n 作为整数值。您可以将 i 的值分配给startPos和endPos,然后遍历该范围 4urfile。祝你好运。 -
如果我理解您正在尝试正确执行的操作,那么解析 xxd 的输出以查找给定模式是一种非常不灵活的方法。如果您要查找的字节序列没有与 4 字节边界对齐怎么办?如果,当被 xxd 转储时,您的模式被分成几行怎么办?