使用hexdump输出64位整数

时间:2015-06-26 20:07:32

标签: c++ binary 64-bit reverse-engineering hexdump

我目前正在处理一些二进制数据。 为了检查和调试我的应用程序先前生成的数据,我使用 hexdump ,面对hexdump的障碍,似乎无法提取64位整数字段。 给出以下最小的例子:

#include <iostream>
#include <fstream>
#include <cstdint>

int main(int argc, char** argv){
    std::ofstream os("tmp.bin", std::ios::out | std::ios::binary);
    uint64_t x = 7;
    os.write((char*)&x,sizeof(uint64_t));
    os.close();
    return 0;
}

我在我的系统上执行一个简单的hexdump:

hexdump tmp.bin

> 0000000: 0007 0000 0000 0000
> 0000008:

现在尝试提取64位宽度的无符号整数:

hexdump -e '/8 "%u"' tmp.bin

> hexdump: bad byte count for conversion character u

根据写得好的hexdump-manual by David Mair,应该可以做到,但我没有成功。

我错过了什么?

4 个答案:

答案 0 :(得分:3)

我们的最终解决方法如下:

x=`hexdump -n 8 -e '2/4 "%08X " "\n"' {FILENAME} | awk 'BEGIN{printf "0x"}{print $2$1}'`
echo $(($x))

每个部分的解释:

  • 从文件{FILENAME}中提取64位整数值的八个字节 将两个四字节块打印为十六进制编码值。

    hexdump -n 8 -e '2/4 "%08X " "\n"' {FILENAME}
    
  • 反转两个块的字节顺序,并将其打印为表示二进制值的单个八字节块。在 0x 前面进行以下处理。

    awk 'BEGIN{printf "0x"}{print $2$1}
    
  • 将十六进制表示保存到x中以供bash评估。

    x=`....`
    
  • 让bourne shell解释并输出64位整数变量的十六进制编码值(这里需要先前加上 0x )。

    echo $(($x))
    

答案 1 :(得分:1)

也可以使用sed。以下匹配8字节十六进制整数并交换它们。同样,这仅适用于无符号整数。

hexdump ... | sed 's/0x\([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\)\([0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]\)/0x\2\1/'

AFAICT应该能够写得更清楚

hexdump ... | sed 's/0x\([0-9a-f]{8,8}\)\([0-9a-f]{8,8}\)/0x\2\1/'

通常使用某些命令行选项(如-E)来启用扩展正则表达式,但至少在Mac OS X 10.10上这不起作用。

答案 2 :(得分:0)

我不明白为什么这不能立即使用,但是我在打印64位整数时遇到了同样的问题,最终从util-linux编译了一个更好的版本:{ {3}}。最初,我尝试在Ubuntu中安装该软件包,但并未更新hexdump,因此我决定尝试“手动”进行安装。

需要一些工作,但还算不错。只需使用git来获取源代码,运行autogen.sh脚本,然后依次运行./configuremake hexdump即可编译该程序。在我的笔记本电脑上,编译只花了4秒钟。

答案 3 :(得分:0)

请尝试使用“ od”命令。 od -xL输出长整数