【问题标题】:Turning hexadecimal representation of code segment back to binary将代码段的十六进制表示转回二进制
【发布时间】:2016-07-17 22:06:19
【问题描述】:

Microsoft 在 Kaggle 挑战赛 (https://www.kaggle.com/c/malware-classification/data) 中提供的恶意软件样本包含代码段的十六进制表示。一个例子:

    00401000 00 00 80 40 40 28 00 1C 02 42 00 C4 00 20 04 20
    00401010 00 00 20 09 2A 02 00 00 00 00 8E 10 41 0A 21 01
    00401020 40 00 02 01 00 90 21 00 32 40 00 1C 01 40 C8 18
    00401030 40 82 02 63 20 00 00 09 10 01 02 21 00 82 00 04
    00401040 82 20 08 83 00 08 00 00 00 00 02 00 60 80 10 80
    00401050 18 00 00 20 A9 00 00 00 00 04 04 78 01 02 70 90
    00401060 00 02 00 08 20 12 00 00 00 40 10 00 80 00 40 19
    00401070 00 00 00 00 11 20 80 04 80 10 00 20 00 00 25 00
    00401080 00 00 01 00 00 04 00 10 02 C1 80 80 00 20 20 00
    00401090 08 A0 01 01 44 28 00 00 08 10 20 00 02 08 00 00
    ...

我想将它们 back 转换为二进制格式,以便进一步将它们转换为图像(也节省空间)。

我试过xxd -r -p,但输出不正确。 xxd 也以某种方式对地址 00401000 进行了编码,而我想摆脱地址。

有没有快速的方法来做到这一点?

【问题讨论】:

    标签: linux assembly binary hexdump kaggle


    【解决方案1】:

    首先,您需要去掉地址编号,因为它们不是代码本身的一部分;它们就像十六进制代码的行号。我会为此使用 awk 。然后再次尝试使用 xxd -r -p。
    awk 语法窃取自:Using awk to print all columns from the nth to the last
    尝试这样的事情(我没有 xxd 方便所以我无法测试):

    awk '{$1=""; print $0}' yourhexfile |xxd -r -p >aFileContainingActualCode
    

    【讨论】:

    • 二进制文件的大小是否应该为 8*L(L 是 hex 文件中的行数)?我尝试进行转换,但最终的二进制大小总是比 8*L 大 2-3 倍
    • 大小应为 16*L ... 每行有 16 个字节。
    • 二进制代码的大小应该略小于十六进制文件大小的 1/3。 hex文件的57个字节(8+16*3+CR)代表16个字节的二进制,所以hexfile/binfile的因子应该是350%左右。不要将行与文件大小混合
    猜你喜欢
    • 2014-10-30
    • 2012-04-08
    • 2013-12-20
    • 2019-01-01
    • 2012-06-26
    • 2014-01-07
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多