You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:25:04