【问题标题】:How can i search for an hexadecimal content in a file in a linux/unix/bash script? [closed]如何在 linux/unix/bash 脚本的文件中搜索十六进制内容? [关闭]
【发布时间】:2020-05-03 16:38:30
【问题描述】:

我有一个十六进制字符串 s 和一个文件 f,我需要在文件中搜索该字符串的第一次出现并将其保存在一个带有他的偏移量的变量中.我认为正确的方法是将文件转换为十六进制并使用 grep 进行搜索。主要问题是我看到了很多要转换的命令(hexdump、xxd 等),但它们都没有真正起作用。有什么建议吗? 我的尝试是这样的:

xxd -plain $f > $f
grep "$s" .

输出应该是这样的:

> offset:filename

【问题讨论】:

  • 欢迎来到 Stack Overflow。 SO 是面向专业和热情的程序员的问答页面。将您自己的代码添加到您的问题中。您应该至少展示自己为解决这个问题所做的研究。
  • 将您的文件和所需的输出添加到您的问题中(无评论)。
  • @U880D 我已经看过那篇文章,但我在理解那篇文章的管道方面遇到了很大的问题,因为我需要文件名和偏移量,而不是内容。所以很难改变它以使其成为那样......

标签: linux bash search hex


【解决方案1】:

没有任何错误处理的第一种方法可能看起来像

#!/bin/bash

BINFILE=$1
SEARCHSTRING=$2

HEXSTRING=$(xxd -p ${BINFILE} | tr -d "\n")
echo "${HEXSTRING}"

echo "Searching ${SEARCHSTRING}"
OFFSET=$(grep -aob ${SEARCHSTRING} <<< ${HEXSTRING} | cut -d ":" -f 1)

echo ${OFFSET}:${BINFILE}

因为Does hexdump respect the endianness of its system?,我在这里使用了xxd。另请注意,根据How to find a position of a character using grep? grep 将返回多个匹配项,而不仅仅是第一个。偏移量将从 1 开始计算,而不是 0。对于 substract 1 from the variable ${OFFSET},您可以使用 $((${OFFSET}-1))

即在系统二进制文件中搜索“字符串”ELF (HEX 454c46) 看起来像

./searchHEX.sh /bin/yes 454c46
7f454c460201010000000000000000000...01000000000000000000000000000000
Searching 454c46
2:/bin/yes

【讨论】:

  • 你的方法效果很好,我终于理解了 xxd,唯一的问题是我必须考虑字节偏移量,我看到有一个 cut 方法而不是 d 的选项。我正在尝试实现这一点
  • @SaltyGiampy,感谢您的反馈。同时,我正在寻找一种解决方案,让hexdump 产生与xxd 相同的输出......因为这是我的 RHEL 基础安装的一部分,我不需要安装额外的软件包。不幸的是,我只发现了一种笨拙的“重新格式化”方法,即hexdump -C ${BINFILE} | cut -d " " -f 3- | cut -d " " -f -17 | head -n -1 | tr -d " " | tr -d "\n"
  • 这看起来很棘手,但我想这对于你的版本来说是一个非常好的解决方案,不幸和奇怪的是,他的基本包中没有 xxd ......但我不明白你为什么要删除许多带有 tr 或 cut 的字符,只考虑一些带有头部的行
【解决方案2】:

我也会为此使用正则表达式:

文本文件:

$ cat tst.txt 
1234567890x1fgg0x1cfffrr

您可以轻松更改/扩展自己的脚本。

#! /bin/bash
part="$(perl -0pe 's/^((?:(?!0(x|X)[0-9a-fA-F]+).)*)(0(x|X)[0-9a-fA-F]+)(.|\n)*/\1:\3\n/g;' tst.txt)"
tmp=${part/:0x*/}
tmp=${#tmp}
echo ${part/*:0x/$tmp:0x} # Echoes 123456789:0x1f

正则表达式:

^((?:(?!0x[0-9a-fA-F]+).)*) = Search for the first entry that's a hexadecimal number and create a group of it (\1).

(0x[0-9a-fA-F]+) = Make a group of the hexadecimal number (\3).

(.|\n)* = Whatever follows.

请注意,tmp=${part/:0x*/} 可能会导致问题,如果您在捕获的十六进制数字之前有 :0x 之类的文本。

【讨论】:

  • 如果文件已经转换为十六进制就完美了,但文件是普通文件,我需要在搜索前将位转换为十六进制...
  • @SaltyGiampy,到Convert binary data to HEX in a shell script,您可以使用xxdhexdumpod
猜你喜欢
  • 2010-09-27
  • 2016-05-21
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2020-09-25
  • 2012-10-28
相关资源
最近更新 更多