OWASP MASTG 安卓逆向实践:从 Android ELF 二进制中提取调试信息与符号表
文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载导读在 Android 应用的逆向工程与漏洞分析中native 层.so动态库往往是安全测试的关键战场而符号与调试信息则是解读 native 代码的第一把钥匙它们能直接暴露函数名、变量名、源文件行号甚至还原出 JNI 桥接函数的完整签名。本文基于 OWASP Mobile Application Security Testing GuideMASTG的 MASTG-TECH-0140系统讲解如何利用 radare2、objdump、nm 三套工具判断 ELF 二进制是否被 strip剥离符号并从中提取调试符号、导入/导出符号与 JNI 符号。读完本文你将掌握一套不依赖任何图形界面、可复现的纯命令行符号提取工作流能够快速判断一个 Android native 库的可读性为后续反汇编与动态调试打下基础。背景为什么符号信息对 Android 逆向如此重要Android 的 native 代码C/C被编译为 ELF 格式的动态库.so并由 Java 层通过System.loadLibrary在运行时加载。这些库中的符号表记录了函数与全局变量的名称、类型、绑定属性GLOBAL/WEAK/LOCAL以及地址信息。对于逆向分析者而言未剥离unstripped的二进制保留了完整的符号表Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI这类 JNI 符号可以直接告诉我们 Java 方法与 native 函数的对应关系剥离stripped的二进制删除了符号表只剩下地址和指令流分析难度显著上升。因此拿到一个 APK 后第一步往往不是直接反汇编而是先回答三个问题这个.so是否被 strip它保留了哪些符号行号信息是否还在这正是本文要解决的核心问题。MASTG 仓库提供了可直接用于实验的样本 Samples/Android/01_HelloWorld-JNI/HelloWord-JNI.apk其lib/armeabi-v7a/libnative-lib.so中导出的Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI是贯穿全文的示例符号该样本的完整反汇编分析见 MASTG-TECH-0018。方法一radare2 符号检查与导出符号枚举radare2r2是 MASTG 推荐的通用二进制分析框架支持 Android 的 DEX、ELF可执行文件、.so、ART及 JavaJNI 与 Java 类等多种格式详见工具页 MASTG-TOOL-0028。它既能以r2交互式 shell 使用也能通过rabin2等独立 CLI 工具完成信息提取MASTG-TOOL-0129。快速判断二进制是否被 strip在 r2 shell 中加载目标库后执行以下命令即可一次性查看三项关键属性[0x0003e360] i~stripped,linenum,lsyms linenum true lsyms true stripped false对输出逐项解读stripped为false表示调试符号存在二进制未被剥离linenum为true表示行号信息可用即编译时保留了与源文件的对应关系lsyms为true表示本地局部符号存在。这三个字段全部来自 ELF 文件头与符号段.symtab/.dynsym的元信息r2 在加载文件时即可解析无需执行耗时的代码分析。用is枚举导入/导出符号r2 的is命令用于列出从 ELF 符号表解析出的导入与导出符号。先使用-A参数加载并分析示例库再执行isr2 -A libnative-lib.so [0x00000e3c] is nth paddr vaddr bind type size lib name demangled ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― 3 0x00000e78 0x00000e78 GLOBAL FUNC 16 Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI 4 0x00001578 0x00001578 GLOBAL FUNC 4 __aeabi_unwind_cpp_pr0 5 ---------- 0x00003004 GLOBAL NOTYPE 0 _edata 6 ---------- 0x00003004 GLOBAL NOTYPE 0 _end 7 ---------- 0x00003004 GLOBAL NOTYPE 0 __bss_start 10 0x0000157c 0x0000157c WEAK FUNC 4 __aeabi_unwind_cpp_pr1 11 0x00001580 0x00001580 WEAK FUNC 4 __aeabi_unwind_cpp_pr2 13 0x000017dc 0x000017dc GLOBAL FUNC 0 __gnu_Unwind_Restore_VFP_D ...输出列的含义nth符号在符号表中的序号paddr/vaddr物理地址文件偏移与虚拟地址加载后地址bind绑定类型GLOBAL全局、WEAK弱等type符号类型FUNC函数、NOTYPE无类型如段边界标记size符号占用的字节大小name符号名本例中的Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI正是 JNI 层导出的入口函数。注意_edata、_end、__bss_start这类 NOTYPE 符号是链接器生成的段边界标记并非业务函数分析时可将其与__aeabi_unwind_cpp_pr*等运行时辅助函数一并忽略。聚焦 JNI 符号逆向 Android 应用时JNI 符号的价值最高——它直接揭示 Java 类与方法与 native 函数的映射。r2 支持用~管道符对命令输出做过滤~JNI即可只保留含 JNI 的行[0x00000e3c] is~JNI同样的需求也可以直接在 shell 中使用rabin2 -s完成rabin2 -s libnative-lib.so | grep JNIMASTG-TECH-0018 中给出了该命令在 HelloWorld-JNI 样本上的实际输出可与 r2 内部结果互相印证$ rabin2 -s HelloWord-JNI/lib/armeabi-v7a/libnative-lib.so | grep -i Java 003 0x00000e78 0x00000e78 GLOBAL FUNC 16 Java_sg_vantagepoint_helloworldjni_MainActivity_stringFromJNI提示rabin2是 radare2 框架中的独立二进制信息提取工具支持 ELF、Mach-O、PE、Java CLASS 等多种格式能输出符号导入/导出、库依赖、字符串、交叉引用、入口点与架构类型等信息输出格式可与 radare2 及其他工具对接MASTG-TOOL-0129。方法二objdump 检查调试符号GNU binutils 中的objdump提供--syms选项用于展示 ELF 文件的符号表。对比两个示例文件的输出可以直观看出有无符号的差别objdump --syms libnative-lib.so libnative-lib.so: file format elf32-littlearm SYMBOL TABLE:libnative-lib.so的符号表为空说明该二进制已被 strip没有任何可用的调试符号。再看未剥离的版本objdump --syms libunstripped.so libunstripped.so: file format elf32-littlearm SYMBOL TABLE: 00000000 l df *ABS* 00000000 crtbegin_so.c 000315d8 l .text 00000000 $a.0 000315e8 l .text 00000000 $a.2 0003161c l .text 00000000 $a.4 000315e4 l .text 00000000 $d.1 00031614 l .text 00000000 $d.3 ...这里l表示局部local符号df表示调试文件debug file后面的crtbegin_so.c等源文件名直接证明调试符号含源文件信息仍然存在。方法三nm 提取符号表并对比判断剥离状态nm是 GNU binutils 中专门显示二进制符号表name list的工具MASTG 为其建立了独立的工具页 MASTG-TOOL-0003。它可以从 ELF 文件中检索符号表并区分全局可见符号与仅存在于.symtab中的本地static符号。对已剥离的库nm直接报告无符号nm libnative-lib.so libnative-lib.so: no symbols如果二进制保留符号nm会列出全局可见的函数名与变量名而nm -a会额外显示所有符号包括本地static符号——但前提是.symtab段仍然存在。因此比较nm与nm -a的输出差异是判断是否剥离了调试符号的经典方法diff (nm libnative-lib.so) (nm -a libnative-lib.so)如果输出为空调试符号已被剥离如果出现带函数名或源文件引用的条目符号仍然存在。对未剥离库执行同样的比较差异行会包含源文件信息例如diff (nm libunstripped.so) (nm -a libunstripped.so) | tail 3871a31083,31086 00000000 a stdexcept.cpp 00000000 a stdlib_exception.cpp 00000000 a stdlib_stdexcept.cpp 00000000 a stdlib_typeinfo.cpp 3875a31091 00000000 a string.cpp 3888a31105,31106 00000000 a system_error.cpp 00000000 a thread.cpp输出中a表示绝对符号absolute symbol这些*.cpp条目是 C 标准库的源文件引用它们的出现说明.symtab中保留了丰富的调试符号信息。三种方法的选型与互补工具命令典型用途优势radare2ii~stripped,linenum,lsyms一键判断剥离状态、行号、本地符号交互式可无缝衔接后续反汇编radare2is/ rabin2is/rabin2 -s枚举导入/导出符号过滤 JNI 符号与反汇编工作流一体objdumpobjdump --syms查看完整符号表含局部符号GNU binutils 自带无需额外安装nmnm与nm -a对比区分全局/本地符号、判断是否剥离输出简洁便于脚本化三者都只做静态解析成本低、速度快适合在开始正式反汇编之前快速摸清目标库的底细。radare2 的优势在于它是完整的逆向框架拿到符号信息后可直接在同一 shell 中继续反汇编objdump 与 nm 则适合在 shell 脚本或自动化检查中批量使用。实战要点与仓库内延伸阅读实验样本使用 Samples/Android/01_HelloWorld-JNI/HelloWord-JNI.apk 可完整复现本文所有命令。该 APK 的lib目录下按 ABIarmeabi、armeabi-v7a、arm64-v8a 等分目录存放libnative-lib.so各架构版本编译自同一份源码功能一致若计划后续在真机调试建议优先选择 ARM 架构版本详见 MASTG-TECH-0018。符号信息与安全特性检查符号表不仅能帮助逆向还能用于安全测试。例如 MASTG-TEST-0044 使用rabin2 -I检查 native 库的canary栈保护与pic位置无关代码加固属性这与符号提取属于同一类二进制元信息审计思路。下一步反汇编确认符号存在后可在 r2 中继续使用pd/pdf查看反汇编或进入 Visual Mode、Graph Mode 追踪代码流程参见 MASTG-TOOL-0028 与 MASTG-TECH-0018。小结判定一个 Android ELF 库的可读性并不需要复杂的工具链radare2 的i与is、objdump 的--syms、nm 的-a对比三套方案互相印证即可完整回答是否被 strip、保留哪些符号、是否含行号信息这三个核心问题。掌握这一工作流是 Android native 逆向的第一步也是评估应用加固与混淆效果剥离符号是最基础的缓解手段的重要依据。赞分享文档教程网络安全【免费下载链接】mastgThe OWASP Mobile Application Security Testing Guide (MASTG) is a comprehensive manual for mobile app security testing and reverse engineering. It describes technical processes for verifying the OWASP Mobile Security Weakness Enumeration (MASWE) weaknesses, which are in alignment with the OWASP MASVS.项目地址https://gitcode.com/gh_mirrors/ow/mastg点击查看免费下载相关推荐OWASP MASTG 技术指南Android 二进制字符串提取Retrieving Strings实战OWASP MASTG 技术指南Android 二进制字符串提取Retrieving Strings实战 在 Android 应用安全测试与逆向工程中字文档教程网络安全OWASP MASTG 系列Android 原生库调试信息与调试符号Debug Symbols检测指南OWASP MASTG 系列Android 原生库调试信息与调试符号Debug Symbols检测指南 本文对应 OWASP MASTG 知识条目 MAS文档教程网络安全从 iOS 二进制中提取调试符号radare2、objdump 与 nm 实战指南从 iOS 二进制中提取调试符号radare2、objdump 与 nm 实战指南 调试符号Debug Symbols是 iOS 安全测试与逆向工程中的关文档教程网络安全上一篇Kaggler数据I/O高效处理CSV、LibSVM和HDF5格式的终极指南 下一篇5 分钟在终端跑起 AI 编程助手OpenCode 快速部署完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Zeek 对 Linux Cooked Capture(SLL/SLL2)链路的解析:`base/packet-protocols/linux_sll` 包深度剖析

Zeek 对 Linux Cooked Capture(SLL/SLL2)链路的解析:`base/packet-protocols/linux_sll` 包深度剖析

网络安全网络IDS 【免费下载链接】zeek Zeek is a powerful network analysis framework that is much different from the typical IDS you may know. 项目地址: https://gitcode.com/gh_mirrors/ze/zeek 点击查看 免费下载 本指南围绕 Zeek 仓库中的 base/packet…

2026/10/11 7:52:04 阅读更多 →
SeaTunnel Ogg JSON 格式全解析:Oracle GoldenGate 变更日志的消费、过滤与序列化实战

SeaTunnel Ogg JSON 格式全解析:Oracle GoldenGate 变更日志的消费、过滤与序列化实战

数据工程大数据批处理流处理 【免费下载链接】seatunnel SeaTunnel is a next-generation super high-performance, distributed, massive data integration tool. 项目地址: https://gitcode.com/gh_mirrors/sea/seatunnel 点击查看 免费下载 本文基于 SeaTunnel …

2026/10/11 4:27:40 阅读更多 →
PCIe Gen5协议升级与调试实战:从通道预算到链路训练

PCIe Gen5协议升级与调试实战:从通道预算到链路训练

1. PCIe Gen5 协议到底升级了什么PCIe Gen5 这两年在服务器、AI 加速卡、高端存储领域几乎是绕不开的话题。我最早接触它是在一块 FPGA 加速卡的项目上,当时从 Gen3 直接跳到 Gen5,踩的坑比想象中多得多。很多人以为 Gen5 就是"带宽翻倍"这么简…

2026/10/11 7:09:44 阅读更多 →

最新新闻

2025年AI IDE实战测评榜:从个人开发到企业部署的完整选型攻略(TaoToken统一API接入篇)

2025年AI IDE实战测评榜:从个人开发到企业部署的完整选型攻略(TaoToken统一API接入篇)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:24:10 阅读更多 →
付了GPT-5的钱,用的是开源模型?用TaoToken统一Key看清每次调用

付了GPT-5的钱,用的是开源模型?用TaoToken统一Key看清每次调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:24:10 阅读更多 →
装完这16个Skills,我的OpenClaw终于会自己查文档了:TaoToken统一Key接入实录

装完这16个Skills,我的OpenClaw终于会自己查文档了:TaoToken统一Key接入实录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:24:10 阅读更多 →
用 Java 5 分钟写一个 MCP Server:基于开源 MCP Java SDK 接入 TaoToken 统一 Key

用 Java 5 分钟写一个 MCP Server:基于开源 MCP Java SDK 接入 TaoToken 统一 Key

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:24:10 阅读更多 →
免越狱批量控制iPhone:基于Accessibility API的合规自动化方案

免越狱批量控制iPhone:基于Accessibility API的合规自动化方案

1. 为什么“免越狱批量控制iPhone”这件事,过去十年几乎没人真正做成?“不用越狱也能批量控制 iPhone”——这句话放在2024年之前,对绝大多数iOS开发者、自动化测试工程师甚至企业IT管理员来说,都像一句带点讽刺意味的行业黑话。不…

2026/10/11 10:24:10 阅读更多 →
从“impeccable”到工程实践:代码格式化、静态检查与CI流水线

从“impeccable”到工程实践:代码格式化、静态检查与CI流水线

“impeccable”这个词,按读音是 /ɪmˈpɛkəbəl/,意思是“无可挑剔、毫无瑕疵”。我见过不少人把它当成代码注释里的形容词,写“keep the code impeccable”。说实话,第一次看到某公司前端代码仓库的提交规范里,用这…

2026/10/11 10:23:09 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →