当前位置:网站首页 > 技术博客 > 正文

安卓so文件反编译工具下载



从今天开始我们正式开始的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域。作为一名开发者,每个人都想去探索这个领域,因为一旦你激活成功教程了别人的内容,成就感肯定爆棚,不过相反的是,我们不仅要研究激活成功教程之道,也要研究加密之道,因为加密和激活成功教程是相生相克的。但是我们在激活成功教程的过程中可能最头疼的是native层,也就是so文件的激活成功教程。所以我们先来详细了解一下so文件的内容下面就来看看我们今天所要介绍的内容。今天我们先来介绍一下elf文件的格式,因为我们知道Android中的so文件就是elf文件,所以需要了解so文件,必须先来了解一下elf文件的格式,对于如何详细了解一个elf文件,就是手动的写一个工具类来解析一个elf文件。

我们需要了解elf文件的格式,关于elf文件格式详解,网上已经有很多介绍资料了。这里我也不做太多的解释了。不过有两个资料还是需要介绍一下的,因为网上的内容真的很多,很杂。这两个资料是最全的,也是最好的。我就是看这两个资料来操作的:

第一个资料是非虫大哥的经典之作:

看吧,是不是超级详细?后面我们用代码来解析elf文件的时候,就是按照这张图来的。但是这张图有些解释的还不是很清楚,所以第二个资料来了。

第二个资料:北京大学实验室出的标准版

这里就不对这个文件做详细解释了,后面在做解析工作的时候,会截图说明。

关于上面的这两个资料,这里还是多数两句:一定要仔细认真的阅读。这个是经典之作。也是后面工作的基础。

当然这里还需要介绍一个工具,因为这个工具在我们下面解析elf文件的时候,也非常有用,而且是检查我们解析elf文件的模板。

就是很出名的:readelf命令

不过Window下这个命令不能用,因为这个命令是的,所以我们还得做个工作就是安装Cygwin。关于这个工具的安装,大家可以看看这篇文章:

不过在下载的过程中,我担心小朋友们会遇到挫折,所以很贴心的,放到的云盘里面:

下载下来之后,需要改一个东西才能用:

该一下这个文件:

这个路径要改成你本地cygwin64中的bin目录的路径,不然运行错误的。改好之后,直接运行Cygwin.bat就可以了。

关于readelf工具我们这里不做太详细的介绍,只介绍我们要用到的命令:

1、readelf -h xxx.so

查看so文件的头部信息

2、readelf -S xxx.so

查看so文件的段(Section)头的信息

3、readelf -l xxx.so

查看so文件的程序段头信息(Program)

4、readelf -a xxx.so

查看so文件的全部内容

还有很多命令用法,这里就不在细说了,网上有很多介绍的~~

上面我们介绍了elf文件格式资料,elf文件的工具,那么下面我们就来实际操作一下,来用Java代码手把手的解析一个libhello-jni.so文件。关于这个libhello-jni.so文件的下载地址:

这个我们需要参考elf.h这个头文件的格式了。这个文件网上也是有的,这里还是给个下载链接吧:

我们看看Java中定义的elf文件的数据结构类:

[java]

这个没什么问题,也没难度,就是在看elf.h文件中定义的数据结构的时候,要记得每个字段的占用字节数就可以了。

有了结构定义,下面就来看看如何解析吧。

在解析之前我们需要将so文件读取到byte[]中,定义一个数据结构类型

[java]

关于这些字段的解释,要看上面提到的那个pdf文件中的描述

这里我们介绍几个重要的字段,也是我们后面修改so文件的时候也会用到:

1)、e_phoff

这个字段是程序头(Program Header)内容在整个文件的偏移值,我们可以用这个偏移值来定位程序头的开始位置,用于解析程序头信息

2)、e_shoff

这个字段是段头(Section Header)内容在这个文件的偏移值,我们可以用这个偏移值来定位段头的开始位置,用于解析段头信息

3)、e_phnum

这个字段是程序头的个数,用于解析程序头信息

4)、e_shnum

这个字段是段头的个数,用于解析段头信息

5)、e_shstrndx

这个字段是String段在整个段列表中的索引值,这个用于后面定位String段的位置

按照上面的图我们就可以很容易的解析

[java]

按照对应的每个字段的字节个数,读取byte就可以了。

这个结构中字段见pdf中的描述吧,这里就不做解释了。后面我们会手动的构造这样的一个数据结构,到时候在详细说明每个字段含义。

按照这个结构。我们解析也简单了:

[java]

这里需要注意的是,我们看到的Section Header一般都是多个的,这里用一个List来保存

这里的字段,这里也不做解释了,看pdf文档。

我们按照这个结构来进行解析:

[java]

当然还有其他结构的解析工作,这里就不在一一介绍了,因为这些结构我们在后面的介绍中不会用到,但是也是需要了解的,详细参见pdf文档。

那么上面我们的解析工作做完了,为了验证我们的解析工作是否正确,我们需要给每个结构定义个打印函数,也就是从写toString方法即可。

然后我们在使用readelf工具来查看so文件的各个结构内容,对比就可以知道解析的是否成功了。

解析代码下载地址:

上面我们用的是Java代码来进行解析的,为了照顾广大程序猿,所以给出一个C++版本的解析类:

[cpp]

看了C++代码解析之后,这里不得不多说两句了,看看C++中的代码多么简单,原因很简单:在做文件字节操作的时候,C++中的指针真的很牛逼的,这个也是Java望成莫及的。。

C++代码下载:

关于Elf文件的格式,就介绍到这里,通过自己写一个解析类的话,可以很深刻的了解elf文件的格式,所以我们在以后遇到一个文件格式的了解过程中,最好的方式就是手动的写一个工具类就好了。那么这篇文章是逆向之旅的第一篇,也是以后篇章的基础,下面一篇文章我们会介绍如何来手动的在elf中添加一个段数据结构,尽情期待~~

版权声明


相关文章:

  • jsp中注释的方法有哪几种2025-07-20 20:01:05
  • 三维数组 js2025-07-20 20:01:05
  • 点云配准数据集2025-07-20 20:01:05
  • 指针图解2025-07-20 20:01:05
  • 断点 调试2025-07-20 20:01:05
  • java内存模型是什么2025-07-20 20:01:05
  • rsa加密规则2025-07-20 20:01:05
  • 红黑树和b树和b+树的区别2025-07-20 20:01:05
  • linux中cp指令2025-07-20 20:01:05
  • 深度信念网络和神经网络2025-07-20 20:01:05