从已编译库的反汇编中仅获取十六进制字节值
Getting only hexa decimal byte values from the disassembly of a compiled library
我已经使用objdump
反汇编编译库文件中的所有函数并将输出写入text
文件。在 text
文件中,名为 clear_bit
的函数的输出如下。
Disassembly of section .text.stm32f30x::spi1::cr1::_CRCENW::clear_bit:
0: 80 b5 84 b0 addlt r11, r4, r0, lsl #11
4: 01 46 03 90 andls r4, r3, r1, lsl #12
8: 03 98 00 22 andhs r9, r0, #196608
c: 02 91 11 46 ldrmi r9, [r1], -r2, lsl #2
10: ff f7 fe ff <unknown>
14: 01 90 ff e7 ldrb r9, [pc, r1]!
18: 01 98 04 b0 andlt r9, r4, r1, lsl #16
1c: 80 <unknown>
1d: bd <unknown>
另一个函数set_bit
的输出如下-:
Disassembly of section .text.stm32f30x::spi1::cr1::_CRCNEXTW::set_bit:
0: 80 b5 84 b0 addlt r11, r4, r0, lsl #11
4: 01 46 03 90 andls r4, r3, r1, lsl #12
8: 03 98 01 22 andhs r9, r1, #196608
c: 02 91 11 46 ldrmi r9, [r1], -r2, lsl #2
10: ff f7 fe ff <unknown>
14: 01 90 ff e7 ldrb r9, [pc, r1]!
18: 01 98 04 b0 andlt r9, r4, r1, lsl #16
1c: 80 <unknown>
1d: bd <unknown>
和上面两个函数类似,这个output.txt
包含了100多个这样的函数的反汇编。但是,我在这里需要实现的是仅提取与每个函数相关的十六进制字节值 [80,b5,84,b0,01,..,b0,80,bd]
,而无需汇编指令、函数名称、偏移量等。我正在尝试提取这些字节序列对应于每个函数 而不是单个序列 以便在机器学习中开发模型。以下是我对两个功能的期望。(评论只是为了理解目的,我不需要任何这些在我的预期输出中)
// byte sequence related to first function
80 b5 84 b0 01 46 03 90 03 98 00 22 02 91 11 46 ff f7 fe ff 01 90 ff
e7 01 98 04 b0 80 bd
// byte sequence related to second function separated by a line
80 b5 84 b0 01 46 03 90 03 98 01 22 02 91 11 46 ff f7 fe ff 01 90 ff
e7 01 98 04 b0 80 bd
我使用了 xxd -g 1
命令,但它给了我一个字节序列,如下所示,带有偏移量,字节值右侧的一些其他值,似乎它包含所有部分的反汇编。(不是只有文本部分中的代码)。
00000000: 21 3c 61 72 63 68 3e 0a 2f 20 20 20 20 20 20 20 !<arch>./
00000010: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 0
00000020: 20 20 20 20 30 20 20 20 20 20 30 20 20 20 20 20 0 0
00000030: 30 20 20 20 20 20 20 20 34 37 33 32 34 30 20 20 0 473240
00000040: 20 20 60 0a 00 00 1c 8c 00 07 aa ea 00 07 aa ea `.............
00000050: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
00000060: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
00000070: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
00000080: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
00000090: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
000000a0: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
000000b0: 00 08 1a 1a 00 08 1a 1a 00 08 1a 1a 00 08 1a 1a ................
000000c0: 00 08 1a 1a 00 08 1a 1a 00 08 3a ee 00 08 3a ee ..........:...:.
我一直在尝试不同的工具并解决了其他类似的堆栈溢出问题,但到目前为止都失败了。我不知道我是否以错误的方式使用 xxd
,或者还有其他工具可以实现我的目标。任何帮助将不胜感激。谢谢!
请您尝试以下操作:
# fold $str, print and clear
flush() {
if [[ -n $str ]]; then
fold -w 69 <<< "$str"
echo
str=""
fi
}
header='^Disassembly of section'
body='^[[:blank:]]*[0-9a-fA-f]+:[[:blank:]]+(([0-9a-fA-f]{2} )+)'
while IFS= read -r line; do
if [[ $line =~ $header ]]; then
flush
echo "// $line"
elif [[ $line =~ $body ]]; then
# concatenate the byte sequence on $str
str+="${BASH_REMATCH[1]}"
fi
done < output.txt
flush
output.txt(作为上述脚本的输入):
Disassembly of section .text.stm32f30x::spi1::cr1::_CRCENW::clear_bit:
0: 80 b5 84 b0 addlt r11, r4, r0, lsl #11
4: 01 46 03 90 andls r4, r3, r1, lsl #12
8: 03 98 00 22 andhs r9, r0, #196608
c: 02 91 11 46 ldrmi r9, [r1], -r2, lsl #2
10: ff f7 fe ff <unknown>
14: 01 90 ff e7 ldrb r9, [pc, r1]!
18: 01 98 04 b0 andlt r9, r4, r1, lsl #16
1c: 80 <unknown>
1d: bd <unknown>
Disassembly of section .text.stm32f30x::spi1::cr1::_CRCNEXTW::set_bit:
0: 80 b5 84 b0 addlt r11, r4, r0, lsl #11
4: 01 46 03 90 andls r4, r3, r1, lsl #12
8: 03 98 01 22 andhs r9, r1, #196608
c: 02 91 11 46 ldrmi r9, [r1], -r2, lsl #2
10: ff f7 fe ff <unknown>
14: 01 90 ff e7 ldrb r9, [pc, r1]!
18: 01 98 04 b0 andlt r9, r4, r1, lsl #16
1c: 80 <unknown>
1d: bd <unknown>
结果:
// Disassembly of section .text.stm32f30x::spi1::cr1::_CRCENW::clear_bit:
80 b5 84 b0 01 46 03 90 03 98 00 22 02 91 11 46 ff f7 fe ff 01 90 ff
e7 01 98 04 b0 80 bd
// Disassembly of section .text.stm32f30x::spi1::cr1::_CRCNEXTW::set_bit:
80 b5 84 b0 01 46 03 90 03 98 01 22 02 91 11 46 ff f7 fe ff 01 90 ff
e7 01 98 04 b0 80 bd
- 它使用正则表达式检测 header 行和 body(字节值)行。
- 如果找到 body 行,则通过正则表达式提取字节序列并将其存储在 bash 变量中
${BASH_REMATCH[1]}
.
- 在每个部分的末尾,它通过在指定宽度处放置换行符来打印序列。
希望这就是你想要的。
我已经使用objdump
反汇编编译库文件中的所有函数并将输出写入text
文件。在 text
文件中,名为 clear_bit
的函数的输出如下。
Disassembly of section .text.stm32f30x::spi1::cr1::_CRCENW::clear_bit:
0: 80 b5 84 b0 addlt r11, r4, r0, lsl #11
4: 01 46 03 90 andls r4, r3, r1, lsl #12
8: 03 98 00 22 andhs r9, r0, #196608
c: 02 91 11 46 ldrmi r9, [r1], -r2, lsl #2
10: ff f7 fe ff <unknown>
14: 01 90 ff e7 ldrb r9, [pc, r1]!
18: 01 98 04 b0 andlt r9, r4, r1, lsl #16
1c: 80 <unknown>
1d: bd <unknown>
另一个函数set_bit
的输出如下-:
Disassembly of section .text.stm32f30x::spi1::cr1::_CRCNEXTW::set_bit:
0: 80 b5 84 b0 addlt r11, r4, r0, lsl #11
4: 01 46 03 90 andls r4, r3, r1, lsl #12
8: 03 98 01 22 andhs r9, r1, #196608
c: 02 91 11 46 ldrmi r9, [r1], -r2, lsl #2
10: ff f7 fe ff <unknown>
14: 01 90 ff e7 ldrb r9, [pc, r1]!
18: 01 98 04 b0 andlt r9, r4, r1, lsl #16
1c: 80 <unknown>
1d: bd <unknown>
和上面两个函数类似,这个output.txt
包含了100多个这样的函数的反汇编。但是,我在这里需要实现的是仅提取与每个函数相关的十六进制字节值 [80,b5,84,b0,01,..,b0,80,bd]
,而无需汇编指令、函数名称、偏移量等。我正在尝试提取这些字节序列对应于每个函数 而不是单个序列 以便在机器学习中开发模型。以下是我对两个功能的期望。(评论只是为了理解目的,我不需要任何这些在我的预期输出中)
// byte sequence related to first function
80 b5 84 b0 01 46 03 90 03 98 00 22 02 91 11 46 ff f7 fe ff 01 90 ff
e7 01 98 04 b0 80 bd
// byte sequence related to second function separated by a line
80 b5 84 b0 01 46 03 90 03 98 01 22 02 91 11 46 ff f7 fe ff 01 90 ff
e7 01 98 04 b0 80 bd
我使用了 xxd -g 1
命令,但它给了我一个字节序列,如下所示,带有偏移量,字节值右侧的一些其他值,似乎它包含所有部分的反汇编。(不是只有文本部分中的代码)。
00000000: 21 3c 61 72 63 68 3e 0a 2f 20 20 20 20 20 20 20 !<arch>./
00000010: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 0
00000020: 20 20 20 20 30 20 20 20 20 20 30 20 20 20 20 20 0 0
00000030: 30 20 20 20 20 20 20 20 34 37 33 32 34 30 20 20 0 473240
00000040: 20 20 60 0a 00 00 1c 8c 00 07 aa ea 00 07 aa ea `.............
00000050: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
00000060: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
00000070: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
00000080: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
00000090: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
000000a0: 00 07 aa ea 00 07 aa ea 00 07 aa ea 00 07 aa ea ................
000000b0: 00 08 1a 1a 00 08 1a 1a 00 08 1a 1a 00 08 1a 1a ................
000000c0: 00 08 1a 1a 00 08 1a 1a 00 08 3a ee 00 08 3a ee ..........:...:.
我一直在尝试不同的工具并解决了其他类似的堆栈溢出问题,但到目前为止都失败了。我不知道我是否以错误的方式使用 xxd
,或者还有其他工具可以实现我的目标。任何帮助将不胜感激。谢谢!
请您尝试以下操作:
# fold $str, print and clear
flush() {
if [[ -n $str ]]; then
fold -w 69 <<< "$str"
echo
str=""
fi
}
header='^Disassembly of section'
body='^[[:blank:]]*[0-9a-fA-f]+:[[:blank:]]+(([0-9a-fA-f]{2} )+)'
while IFS= read -r line; do
if [[ $line =~ $header ]]; then
flush
echo "// $line"
elif [[ $line =~ $body ]]; then
# concatenate the byte sequence on $str
str+="${BASH_REMATCH[1]}"
fi
done < output.txt
flush
output.txt(作为上述脚本的输入):
Disassembly of section .text.stm32f30x::spi1::cr1::_CRCENW::clear_bit:
0: 80 b5 84 b0 addlt r11, r4, r0, lsl #11
4: 01 46 03 90 andls r4, r3, r1, lsl #12
8: 03 98 00 22 andhs r9, r0, #196608
c: 02 91 11 46 ldrmi r9, [r1], -r2, lsl #2
10: ff f7 fe ff <unknown>
14: 01 90 ff e7 ldrb r9, [pc, r1]!
18: 01 98 04 b0 andlt r9, r4, r1, lsl #16
1c: 80 <unknown>
1d: bd <unknown>
Disassembly of section .text.stm32f30x::spi1::cr1::_CRCNEXTW::set_bit:
0: 80 b5 84 b0 addlt r11, r4, r0, lsl #11
4: 01 46 03 90 andls r4, r3, r1, lsl #12
8: 03 98 01 22 andhs r9, r1, #196608
c: 02 91 11 46 ldrmi r9, [r1], -r2, lsl #2
10: ff f7 fe ff <unknown>
14: 01 90 ff e7 ldrb r9, [pc, r1]!
18: 01 98 04 b0 andlt r9, r4, r1, lsl #16
1c: 80 <unknown>
1d: bd <unknown>
结果:
// Disassembly of section .text.stm32f30x::spi1::cr1::_CRCENW::clear_bit:
80 b5 84 b0 01 46 03 90 03 98 00 22 02 91 11 46 ff f7 fe ff 01 90 ff
e7 01 98 04 b0 80 bd
// Disassembly of section .text.stm32f30x::spi1::cr1::_CRCNEXTW::set_bit:
80 b5 84 b0 01 46 03 90 03 98 01 22 02 91 11 46 ff f7 fe ff 01 90 ff
e7 01 98 04 b0 80 bd
- 它使用正则表达式检测 header 行和 body(字节值)行。
- 如果找到 body 行,则通过正则表达式提取字节序列并将其存储在 bash 变量中
${BASH_REMATCH[1]}
. - 在每个部分的末尾,它通过在指定宽度处放置换行符来打印序列。
希望这就是你想要的。