Android apk反编译学习
动机
本周要和竞品做下对比,所以对软件破解需要了解下,简单的写下用到的工具和基本流程,方便同学们用的时候使用。除此之外,学习下破解知识还有以下好处:
- 深入了解android底层代码实现,有的时候做性能分析、或者学习多线程编程的时候,经常需要了解底层代码结构,但仅仅知道原理,没有自己动手做一次,还是很难有一个深切的感受。
- 学习下别人优秀的东西
- 竞品分析
这里我分两个层次来学习反编译,一个是仅仅反编译代码,看里面或者拿里面的代码&资源。另一个方向是进行代码注入,改变源程序运行逻辑。
apk包结构
首先了解下基本结构,apk本身是个压缩包,可以直接解压,其中META-INF是签名之后生成的签名内容,classes.dex是编译后的源代码,dex对接口个数、文件大小有限制,所以有的包里面会看到classes2.dex、classes3.dex等多个。
接下来按照顺序了解下破解流程,其中每个工具在最后统一列出来。
反编译代码
jadx工具可以直接打开apk进行查看代码。
反编译成java
有的时候使用jadx会比较慢,尤其是搜索的时候都不是很方便,我们破解成class文件之后
提取dex文件
unzip xx.apk -d destfolder classes.dex
提取到Jar
dex2jar-2.0/d2j-dex2jar.sh classes.dex
会生成一个jar包classes-dex2jar.jar, 可以直接使用JD-GUI查看jar包,或者解压之后反编译成java文件使用IDE查看。
提取java文件
首先解压jar包unzip classes-dex2jar.jar -d destJar
然后提取java代码,这里用到jad工具,期间可能会有部分代码反编译失败有些警告。find destJar -name *.class | xargs ../t/jad -s .java -r -ff -clear -dead -debug -space -b -d destJava
代码注入
通过工具可得到jar、smali文件,但Android编译最终的代码不是java的class,而是针对虚拟机Dalvik优化过的smali。反编译出来的jar会有一些错误和警告,在这里不适用,而反编译出来的smali和源代码基本完全一致。
反编译成smali
java -jar ../t/baksmali-2.1.1.jar -o classout_test classes.dex
解压出来的目录结构和java包结构一致,我们通过jadx阅读理解代码逻辑之后,再在smali文件中找到对应的代码行,然后根据自己目标进行修改
在修改代码之前,需要对smali语法有个简单的理解,具体指令含义可以参考Dalvik opcodes,有过JNI开发经验的人可能更容易理解一些。初学者参照相关文档,一步步走,从简单的修改开始熟悉,比如打印一个log出来。
`const-string v0, "tag"
invoke-static {v0, v0} Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I`
修改代码之后,我们需要把smali代码编译成dex文件,然后再重新添加到apk压缩包里面。
`java -jar ../t/smali-2.1.1.jar classout_test -o classes.dex
zip -u xx.apk classes.dex`
一般情况,使用刚编译的结果安装会失败、或者运行会崩溃,原因很简单,大多数apk都做了反破解,防止别人修改自己的代码。
反破解
所谓道高一尺,魔高一丈。软件不断的加密、也不断的被破解。下面是基本的几种反破解技术,因为不是专门做安全的,具体如何破解就不深入了。内网也有很多反破解文章,大家自行参考了:
ProGuard
主要作用就是混淆、缩包、优化等,属于最初层次的反破解,基本上通过对比一些文档、常量、字符串等信息,还是可以捋清程序的思路的。
Android APK 签名比对
发布的apk都有一个签名,程序执行过程中通过验证获取到的签名信息是不是自己的签名来进行防止被反编译。不过,反编译的时候我们直接修改代码,绕过判断语句即可。
NDK编译.so动态库
直接使用C、C++语言写一些核心代码,效率高、安全系数也高。
c和Java混合加密
在C层封装核心的加密逻辑、解密逻辑,反过来控制java层代码的运行逻辑。这个可以通过hook等方面进行着手。
签名
以签名为例,对于简单的应用,没有过多的做反破解,只添加了签名,这里就需要用你自己的签名进行替换。
生成签名
`openssl genrsa -out key.pem 1024
openssl req -new -key key.pem -out request.pem
openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem
openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt`
对apk进行签名
java -jar ../t/signapk.jar ../key/certificate.pem ../key/key.pk8 xx.apk xx_signed.apk
再进行安装应该就可以运行了。不过,对于保护做得比较好的apk,一般都会做一些保护,防止用户重新打包,这部分的破解我暂时没有深入研究,这部分也是破解的难点,需要更加专业的同学来科普了。
工具简介
- apktool apk打包工具,里面包含了一系列小工具,用于破解。
- dex2jar dex转化jar工具
- unzip zip解压缩工具,$upzip [src_path] -d [dst_path]
- jad .class文件反编译工具
- jadx, 可以直接查看apk包里面的代码
- baksmali dex->smali
- smali smali->dex
- signapk apk签名工具
总结
以上是这次任务中用到的一些简单的反编译技术,旨在给大家提供个破解思路,普及下基本知识,通过看smali代码也能很好的感受到多线程中一条语句内部真的会执行很多步。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java应用异常状态监测
老板最近分派了一个任务,说线上客户在部署应用的时候发生了系统级别的OOM,触发了OOM Killer杀掉了应用,让我们解决这个问题。 对于这个任务,我从如下几点开始调研、分析与解决。 1、什么是系统级别的OOM(Out-Of-Memory)? 当创建进程时,进程都会建立起自己的虚拟地址空间(对于32位系统来说为4g)。这些虚拟地址空间并不等同于物理内存,只有进程访问这些地址空间时,操作系统才会为其分配物理内存并建立映射。关于虚拟内存和物理内存有很多资料,这里不再赘述,这篇文章写的通俗易懂,可以看下。 通过虚拟内存技术,操作系统可以允许多个进程同时运行,即便它们的虚拟内存加起来远超过系统的物理内存(和swap空间)。如果这些进程不断访问其虚拟地址,操作系统不得不为它们分配物理内存,当到达一个临界点时,操作系统耗尽了所有的物理内存和swap空间,此时OOM就发生了。 2、系统发生了OOM会怎么样? 当发生了OOM,操作系统有两个选择:1)重启系统;2)根据策略杀死特定的进程并且释放其内存空间。这两种策略当然是第二种影响面较小,由于我们线上系统也是采取杀死特定进程的策略,因此这里只展开第二种...
- 下一篇
Form表单 JSON Content-type解析
1 表单Form概述 在Form表单中,参数一般有: action 表单提交的url method 提交方式:post get name 表单的属性名 enctype 提交数据的编码格式 2 常见的编码方式与语法 在Form表单中,enctype表明提交数据的格式 用 enctype 属性指定将数据回发到服务器时浏览器使用的编码类型. 常见的编码方式: 1 application/x-www-form-urlencoded: 概述: 当action为get,数据被编码为名称/值对,是标准的编码格式,也是默认的编码格式 格式:name1=value1&name2&value2 把form数据转换成一个字串,然后把 这个字串append到url后面,用?分割,加载这个新的url 2 multipart/form-data: 概述:当action为post时,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控 件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=fi...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS6,7,8上安装Nginx,支持https2.0的开启