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

如何从编译后的C++二进制文件中提取非字符串类型字面量?

提取二进制文件中的非字符串字面量(整数、浮点数)

strings工具只能识别二进制中连续的可打印ASCII字符序列,无法直接提取整数、浮点数这类数值型字面量——因为它们在编译后的二进制文件中是以二进制编码形式存储的,不是文本字符串。

以下是几种可行的提取/查看方法:

1. 用objdump反汇编或查看数据段

  • 反汇编整个程序,查看硬编码的数值:
    objdump -d a.out
    
    汇编代码里会以立即数形式显示硬编码的整数,浮点数则会以十六进制浮点常量的形式出现。
  • 直接查看数据段的二进制内容:
    objdump -s -j .data a.out
    
    输出会包含数据段的十六进制字节和对应的ASCII映射,你可以根据数值类型的字节长度(如int占4字节、double占8字节)和系统字节序(小端/大端)手动解析。

2. 用readelf分析二进制结构

  • 打印指定数据段的十六进制内容:
    readelf -x .data a.out
    
    比如32位无符号整数1234567890的十六进制是0x499602D2,小端系统中会显示为D2 02 96 49;双精度浮点数6.28318530718的十六进制是0x401921FB54442D18,对应小端字节序列为18 2D 44 54 FB 21 19 40。
  • 查看完整的二进制段和符号信息:
    readelf -a a.out
    
    能找到程序中全局数值变量的定义和存储位置。

3. 用gdb调试查看

  • 启动调试器:
    gdb a.out
    
  • 若数值是全局变量,直接打印:
    print 变量名
    
  • 若数值是硬编码在代码中的立即数,反汇编目标函数(比如main):
    disassemble main
    
    汇编指令里会直接显示对应的数值。

需要注意的是,不同类型的数值在二进制中的存储格式和字节长度不同,解析时要匹配对应的类型(如int、float、double)和系统的字节序规则。

内容的提问来源于stack exchange,提问作者Nico Schlömer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:00:55