Android apk反编译学习

screenshot

动机

本周要和竞品做下对比,所以对软件破解需要了解下,简单的写下用到的工具和基本流程,方便同学们用的时候使用。除此之外,学习下破解知识还有以下好处:

  • 深入了解android底层代码实现,有的时候做性能分析、或者学习多线程编程的时候,经常需要了解底层代码结构,但仅仅知道原理,没有自己动手做一次,还是很难有一个深切的感受。
  • 学习下别人优秀的东西
  • 竞品分析

这里我分两个层次来学习反编译,一个是仅仅反编译代码,看里面或者拿里面的代码&资源。另一个方向是进行代码注入,改变源程序运行逻辑。

apk包结构

screenshot
首先了解下基本结构,apk本身是个压缩包,可以直接解压,其中META-INF是签名之后生成的签名内容,classes.dex是编译后的源代码,dex对接口个数、文件大小有限制,所以有的包里面会看到classes2.dex、classes3.dex等多个。
接下来按照顺序了解下破解流程,其中每个工具在最后统一列出来。

反编译代码

jadx工具可以直接打开apk进行查看代码。
screenshot

反编译成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

代码注入

screenshot
通过工具可得到jar、smali文件,但Android编译最终的代码不是java的class,而是针对虚拟机Dalvik优化过的smali。反编译出来的jar会有一些错误和警告,在这里不适用,而反编译出来的smali和源代码基本完全一致。

反编译成smali

screenshot
java -jar ../t/baksmali-2.1.1.jar -o classout_test classes.dex
解压出来的目录结构和java包结构一致,我们通过jadx阅读理解代码逻辑之后,再在smali文件中找到对应的代码行,然后根据自己目标进行修改
screenshot
在修改代码之前,需要对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代码也能很好的感受到多线程中一条语句内部真的会执行很多步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值