- 对本书的赞誉
- 前言
- 基础篇
- 第 1 章 Android 中锁屏密码加密算法分析
- 第 2 章 Android 中 NDK 开发
- 第 3 章 Android 中开发与逆向常用命令总结
- 第 4 章 so 文件格式解析
- 第 5 章 AndroidManifest.xml 文件格式解析
- 第 6 章 resource.arsc 文件格式解析
- 第 7 章 dex 文件格式解析
- 防护篇
- 第 8 章 Android 应用安全防护的基本策略
- 第 9 章 Android 中常用权限分析
- 第 10 章 Android 中的 run-as 命令
- 第 11 章 Android 中的 allowBackup 属性
- 第 12 章 Android 中的签名机制
- 第 13 章 Android 应用加固原理
- 第 14 章 Android 中的 so 加固原理
- 工具篇
- 第 15 章 Android 逆向分析基础
- 第 16 章 反编译神器 apktool 和 Jadx
- 第 17 章 Hook 神器 Xposed
- 第 18 章 脱壳神器 ZjDroid
- 第 19 章 Native 层 Hook 神器 Cydia Substrate
- 操作篇
- 第 20 章 静态方式逆向应用
- 第 21 章 动态调试 smali 源码
- 第 22 章 IDA 工具调试 so 源码
- 第 23 章 逆向加固应用
- 第 24 章 逆向应用经典案例分析
- 第 25 章 Android 中常见漏洞分析
- 第 26 章 文件加密病毒 Wannacry 样本分析
4.3 解析 ELF 文件
上面介绍了 ELF 文件格式资料、解析 ELF 文件的工具,下面就来实际操作一下,用 Java 代码动手解析一个 libhello-jni.so 文件。这个 libhello-jni.so 文件可以下载。
提示:libhello-jni.so 下载地址:
http://download.csdn.net/detail/jiangwei0910410003/9204087
1.定义 ELF 文件中各个结构体内容
这需要参考 elf.h 这个头文件的格式,这个文件在 Android 源码目录中:
在看 elf.h 文件中定义的数据结构时,要记得每个字段的占用字节数就可以了。
有了结构定义,下面就来看看如何解析吧。在解析之前需要将 so 文件读取到 byte[]中,定义一个数据结构类型:
2.解析 ELF 文件的头部信息
文件的最开始几个字节给出如何解释文件的提示信息。这些信息独立于处理器,也独立于文件中的其余内容。ELF 头部信息数据结构如下表示:
这里介绍几个重要的字段,后面修改 so 文件的时候也会用到:
·e_phoff:是程序头(Program Header)内容在整个文件的偏移值,可以用这个偏移值来定位程序头的开始位置,用于解析程序头信息。
·e_shoff:是段头(Section Header)内容在这个文件的偏移值,可以用这个偏移值来定位段头的开始位置,用于解析段头信息。
·e_phnum:是程序头的个数。
·e_shnum:是段头的个数。
·e_shstrndx:是 String 段在整个段列表中的索引值,用于后面定位 String 段的位置。
参照图 4-1 可以很容易解析下面代码:
按照对应的每个字段的字节个数,读取字节就可以了。
3.解析段头信息
每个段头部可以用如下数据结构描述:
这个结构中字段就不做解释了。后面会手动构造这样一个数据结构,到时候再详细说明每个字段含义。
按照这个结构,解析也简单了:
这里需要注意的是,看到的 SectionHeader 一般都是多个的,所以这里用一个 List 集合来保存。
4.解析程序头信息
可执行文件或者共享目标文件的程序头部是一个结构数组,每个结构描述了一个段或者系统准备程序执行所必需的其他信息。目标文件的“段”包含一个或者多个“节区”,也就是“段内容”(Segment Contents)。程序头部仅对可执行文件和共享目标文件有意义。可执行目标文件在 ELF 头部的 e_phentsize 和 e_phnum 成员中给出其自身程序头部的大小。
程序头部的数据结构如下:
按照这个结构来进行解析,如下所示:
当然还有其他结构的解析工作,这里就不一一介绍了,因为这些结构在后面的介绍中不会用到,这里只需了解一下。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论