ELF文件解析
近期正在进行Android的逆向。自己写出好代码是一个方面,而破解别人的代码则会给人另一种感受。因Java层的Android开发是如此不安全,越来越多的公司把重要的东西写入Native层,逻辑处理均由Native层完成,而Java层只负责进行结果显示。这样便要求对Native层的so文件进行逆向解析,而so文件是linux系统下的ELF(Excutable and Linkable File)文件。而要对so文件进行解析,必须先要了解ELF文件的格式。
网上有很多关于ELF文件格式的介绍文章,比较推荐的是北京大学操作系统实验室标准版 ELF文件格式分析。文章里面详细介绍了ELF文件的格式,但是只看文档是完全不明所以的,要从真正意义上了解ELF文件,还是要自己亲手做一下ELF文件解析才可以。
既然是自己做一个解析器,怎么才能知道自己解析的是正确的呢?这里我们就要用到一个非常有用的工具,即linux下的readelf
。如果是Windows 10的用户,可以在 控制面版- 程序和功能- 启用或关闭Windows功能 中启用 适用于Linux的Windows子系统(beta) 来启用Windows 10的bash功能,启用bash后,可能readelf
命令并未安装,可以通过sudo apt-get readelf
进行安装。如果是其它版本的Windows,则要先装Cywin才能使用此命令。当然如果是Linux或者macOS则可以直接使用。
一、简略的介绍:
详细的readelf的命令可以通过man readelf
命令查看命令手册
示例命令:比如我们从手机上面把/system/bin/app_process这个bin文件(linux下的bin文件是ELF格式文件)导出来后
1.Header信息:readelf -h app_process
2.所有节区:readelf -S app_process
3.字符串表:readelf -x 24 app_process
或者readelf -x .shtratab app_process
所有节区的名称均是通过指定在这个字符串表的偏移量来得到的,通过解析节区表拿到节区名称在此表中的偏移量并查此表,拿到节区名称的字符串。与目标节区名称比较,相同则读出节区的sh_offset(偏移),sh_size(大小)就可以据此从文件中dump下来节区的所有内容。
二、文件的完整性较验
要知道dump下来的节区内容是否正确,比如dump出了.text节区的内容,怎么确定dump下来文件的正确性呢,用同样的命令readelf -x .text app_process
中间红色部分便是.text节区的十六进制表示。当然,dump下来的文件是二进制的,通过一些软件(比如UltraEdit)也可以查看它的十六进制,看dump下来文件的正确性,