Lar*_*idi 5 c++ binary 64-bit hexdump reverse-engineering
我目前正在处理一些二进制数据。为了检查和调试我的应用程序先前生成的数据,我使用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;
}
Run Code Online (Sandbox Code Playgroud)
我在我的系统上执行一个简单的十六进制转储:
hexdump tmp.bin
> 0000000: 0007 0000 0000 0000
> 0000008:
Run Code Online (Sandbox Code Playgroud)
现在尝试提取 64 位宽度的 unsigned int 产生:
hexdump -e '/8 "%u"' tmp.bin
> hexdump: bad byte count for conversion character u
Run Code Online (Sandbox Code Playgroud)
根据David Mair写得很好的hexdump-manual应该可以做到,但我没有成功。
我错过了什么?
我们最终的解决方法如下:
x=`hexdump -n 8 -e '2/4 "%08X " "\n"' {FILENAME} | awk 'BEGIN{printf "0x"}{print $2$1}'`
echo $(($x))
Run Code Online (Sandbox Code Playgroud)
各部分解释:
从文件 {FILENAME} 中提取 64 位整数值的八个字节作为两个四字节块,打印为十六进制编码值。
hexdump -n 8 -e '2/4 "%08X " "\n"' {FILENAME}
Run Code Online (Sandbox Code Playgroud)反转两个块的字节顺序并将其打印为表示二进制值的单个八字节块。前面加上0x以进行后续处理。
awk 'BEGIN{printf "0x"}{print $2$1}
Run Code Online (Sandbox Code Playgroud)将十六进制表示形式保存到 x 中以供 bash 求值。
x=`....`
Run Code Online (Sandbox Code Playgroud)让 bourne shell 解释并输出 64 位整型变量的十六进制编码值(这里需要前面加上0x )。
echo $(($x))
Run Code Online (Sandbox Code Playgroud)