2013-01-12 23 views
0

我正在研究一個基本的文件卡弗,我目前正在計算文件的字節位置。計數存儲在變量中的字段數

我已經研究出我需要一段代碼來執行以下步驟;

  1. 找到$ SEARCHQUERY可變
  2. 刪除字符串的其餘部分的$ SEARCHQUERY發現
  3. 後計數,現在存在內部變量
  4. 減去2從該變量的字段數考慮到十六進制偏移和$ SEARCHQUERY本身
  5. 然後乘以二的答案,以獲得正確的字節數

就是這樣的一個例子;

  1. 找到內 「FFD8」 「00052a0:b4f1 559c FFD8 FFE0 0010 4a46 4946 0001」
  2. 變量被更新爲 「00052a0:b4f1 559c FFD8」
  3. $字段計數被分配 「4」 的值
  4. $段計數=((段計數-2))
  5. $ BYTECOUNT =((段計數* 2))

我只有指望在田裏的數量如何竭盡所能,一個基本的想法VAR iable。例如,我將如何計算變量中有多少個字段,直到找到$ 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 

感謝您的幫助!

+0

讀關於AWK和它的'FS'(字段分隔符),和變量'NF'(場數)。你可以消除所有額外的進程,比如'grep'和'cut'。另外,你的問題有點不清楚,你看到這個函數的輸出是什麼?文檔塊說「隱藏在其他文件中的文件」,但您的示例數據似乎不支持。 (請輸出樣品)。祝你好運! – shellter

+0

謝謝,我會做的! 本質上,它將能夠通過獲取隱藏文件開始的確切字節來提取與非相關數據混淆的文件。例如,它將搜索JPG頭文件「ffd8」和頁腳「ffd9」,基本上只是將所有數據從兩端剪切並粘貼到另一個文件中,以便正常查看圖像。 – Revenant

+0

我添加了行 'echo $ fullOffset | awk -F「」「/ $ searchString/{print NF}」' 但它僅輸出變量中的字段數量。該變量包含'00052a0:b4f1 559c ffd8 ffe0 0010 4a46 4946 0001 ..U ....... JFIF..'。 – Revenant

回答

0

如果以更簡單的格式將文件轉換爲十六進制文件,可能會更容易。例如,你可以使用命令

hexdump -v -e '/1 "%02x "' $FILE 

打印的文件,轉換成恰好三個字符的每個字節:兩個十六進制數字和空格。

你可以找到ffd8所有實例的字節偏移前綴:

hexdump -v -e '/1 "%02x "' $FILE | grep -Fbo 'ff d8 ' 

所以,你可以從第一個流的整個文件(偏移量需要由3分字節)的ffd8例如使用:

tail -c+$((
    $(hexdump -v -e '/1 "%02x "' $FILE | grep -Fbo 'ff d8 ' | head -n1 | cut -f1 -d:) 
/3 + 1)) $FILE 

(即假定,不管你用它來顯示文件知道不足以阻止我t擊中圖像的末尾。但你可以同樣找到最後的結束標記。)

這取決於GNU grep;標準的Posix grep缺少-b選項。但是,它可以與awk做到:

tail -c+$(
    hexdump -v -e '/1 "%02x\n"' $FILE | 
    awk '/d8/&&p=="ff"{print NR-1;exit}{p=$1}' 
) $FILE 

的選項說明:

tail -c+N file starting at byte number N (first byte is number 1) 

hexdump -v  do not compress repeated lines on output 
     -e 'FORMAT' use indicated format for output: 
      /1  each format consumes 1 byte 
      "%02X " output two hex digits, including leading 0, using lower case, 
        followed by a space. 

grep -F  pattern is just plain characters, not a regular expression 
     -b  print the (0-based) byte offset of the... 
     -o  ... match instead of the line containing the match 

cut  -f1  output the first field of each line 
     -d:  fields are separated by : 
+0

鑑於上面的Josh的輸入,你的方法考慮到文件頭/頁腳被分成多行,這使得我已經擁有的更好,但是我在理解它時遇到了一些麻煩。 我一直在使用的方法搜索標題,在本例中爲「ffd8」,並獲取該行的偏移量並將其轉換爲十進制。然後將行首和標題之間的字節數添加到該十進制數中,以便爲dd過程創建起始位置。然後對文件頁腳也做了同樣的處理,但也包括了頁腳中的字節。 – Revenant

+0

現在知道起始位置和結束位置,計算兩者之間的差異,並使用dd命令提取文件,跳過不需要的數據(起始位置)並提取特定長度的字節(起始位置和結束位置之間的差異)。 現在,我的想法是,在解析文件中的所有數據以便將其看作單個字節以單個空格分隔後,它將刪除文件頭之前的所有數據,並重復此功能爲頁腳,但刪除後的所有數據? – Revenant

+0

謝謝!我懂得它的工作原理,並且理解了所有這一切。你能在最後解釋「/ 3 + 1」的意義嗎?如果我將其更改爲「/ 4」,則該線不再起作用。 – Revenant