如何通过objdump或其他工具仅输出函数的十六进制内容?
嘿,这个需求我之前做逆向分析的时候经常碰到,给你分享几个实用的解决办法:
方法一:objdump + 文本处理工具(最直接)
首先得说,objdump本身没有专门只输出函数机器码十六进制的参数,但我们可以先让它输出目标函数的完整反汇编,再用awk、sed这类文本工具精准提取机器码部分。
假设你的函数名叫my_func,可以试试下面这些命令:
用awk快速提取(我最常用的方式)
objdump -d f.o | awk '/<my_func>:/,/^$/ { if ($2 != "") print $2 }'
简单解释下逻辑:
/<my_func>:/,/^$/:awk的范围匹配语法,从包含<my_func>:的行开始,一直处理到空行(objdump的反汇编里,每个函数块结束后都会有个空行)if ($2 != "") print $2:只打印每行的第二列(也就是机器码的十六进制部分),跳过函数名那一行(那一行的第二列是空的)和空行
如果想把所有机器码连在一起输出(没有换行,变成一串连续的十六进制字符串),可以改成:
objdump -d f.o | awk '/<my_func>:/,/^$/ { if ($2 != "") printf "%s", $2 }'
用sed精准提取
如果你更习惯用sed,也可以用这个命令:
objdump -d f.o | sed -n '/<my_func>:/,/^[0-9a-f]* <.*>:/{/^[0-9a-f]*:/{s/^[0-9a-f]*\t\([0-9a-f ]*\)\t.*/\1/;s/ //g;p}}'
这个命令会自动定位到目标函数的代码块,去掉地址、汇编指令这些无关内容,直接输出无空格的连续十六进制机器码。
方法二:提取整个.text段的机器码(如果需要整个代码段)
如果你不需要单独某个函数,而是想提取整个代码段的机器码,可以用objcopy把.text段导出成二进制文件,再用xxd转成十六进制:
objcopy -O binary -j .text f.o f.bin xxd -p f.bin
xxd -p参数会输出纯十六进制字符串,没有多余的地址、空格或注释。
小提示
- 要确保你用的函数名是objdump输出里的准确名称:C函数有时候会被编译器做名称修饰(比如变成
_my_func或者my_func@PLT),可以先跑一遍objdump -d f.o确认下函数的实际名称 - 如果是静态链接的可执行文件,可能需要加上
--disassemble-all参数(也就是objdump -d --disassemble-all),确保所有函数都被反汇编出来
内容的提问来源于stack exchange,提问作者MD XF
相关产品推荐
相关产品推荐

