前言
这是“逆向工程”系列文章的开篇,后面会逐渐往深的方面讲解,很多东西当时会了,过一段时间就忘了,又去网上找,很麻烦,而且当时遇到的问题,不一定能找到,所以打算把它写下来。
简介
逆向工程做得好,就是Android里得黑科技,反编译别人发布的应用,找到里面的蛛丝马迹,然后修改成自己想要的样子,简直叼咋天。不过随着开发者不断对应用安全性的提高,现在想要做逆向工程也越来月难了。
学习逆向工程除了可以破解别人的应用,也可以提高自己在安全方面的意识。比如,现在很多开发者都会把敏感的信息或者逻辑做在so层,因为反编译so难度更高,技术难度更大。虽然如此,我们还是可以反编译so,查看里面的代码,通过so动态调试了解so层的执行逻辑等等。如果我们学会了这些,那么便可以找到防止so代码被很直观的查看和阻止开发者的动态调试等等。
说明
这篇文章主要讲解“逆向工程”基本的东西,百度一下就很多,所以会简要讲解。
工具
百度网盘: 逆向工具
-
ApkTool助手
集成了应用反编译,签名,字节对齐等功能。本质也是将命令行操作的步骤集成到可视化工具里,降低逆向难度。
apkstudio
Android-Crack-Tool -
jd-gui
查看jar包可视化工具,后面讲解有那些功能。百度自行下载. -
java2smali
将java文件编译成smali文件,要分析smali文件需要了解smali语法,smali更加接近底层操作的指令。有些bug如果java层看不出,就可以借助smali文件分析。 -
AXMLPrinter2
静态分析工具,后面讲解用法。 -
Apktool
Apk逆向,重新打包等工具包。官网
逆向
工具准备好了,就可以开始逆向了,我拿自己公司的App进行逆向学习。如果应用加固过,用这种方式是不行的,必须先脱壳。
- 直接用Apktool反编译Apk
通过该命令,可以将Apk中的java文件反编译成smali文件,如果不懂smali语法的人,是很难看懂的,所以我们需要把Apk反编译成java文件的形式。apktool d testapp.apk 或者 apktool -f [待反编译的apk] -o [反编译之后存放文件夹] apktool d -f test.apk -o test
- 解压Apk
Apk其实就是一个Zip压缩包,将.apk改成.zip,然后解压。mac下直接点击.zip文件进行解压会报操作不被允许,你需要在命令行执行解压命令:
为了解决65k的限制,解压后会有多个.dex文件,这里我就那其中一个进行逆向。执行前检查是否安装了zip解压软件。 unzip medlinker.zip 或者执行 unzip testapp.apk
- 生成jar
执行命令
如果这个过程报错,很可能是下载的工具有问题,之前也遇到过这样的情况。如果执行成功,将生成一个jar文件./apktool/dex2jar-0.0.9.15/d2j-dex2jar.sh classes3.dex ./dex
-
jd-gui
查看jar文件
屏幕快照 2020-01-18 上午11.34.48.png
这样你就可以查看java文件的内容了,但是现在很多App都是混淆过的,也不好分析里面的逻辑。
- 查看AndroidManifest.xml
通过直接解压Apk得到的AndroidManifest.xml文件,是不能直观看到里面的内容的,这时候就需要用到AXMLPrinter2
然后可以直接查看 AndroidManifest.txtjava -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt
- 解码jar
./apktool/apktool d classes3-dex2jar.jar
- 控制文件的命名方式和存储方式
apktool if framework-res.apk
具体用法参考Apktool
重新打包
通过反编译dex方式是不能够重新打包的,所以需要用 apktool d testapp.apk来得到能够重新打包的反编译文件。然而通过这种方式得到的是smali文件,采用的是unicode编码,所以我们先在class文件找到需要修改的地方,得到相应的unicode,找到同名文件,然后搜索,当然,如果你能看懂逻辑,也可以直接修改。
- 步骤1
//apktool -f [待反编译的apk] -o [反编译之后存放文件夹]
apktool d -f test.apk -o test - 步骤2:
修改源文件 - 步骤3:
重新打包,dist文件内就是我们需要的apk。apktool b dist
- 步骤4:
重新签名jarsigner -verbose -keystore coolapk.keystore -signedjar base-signed.apk base.apk coolapk 或者 ./apksigner sign --ks medlinker.keystore --ks-key-alias medlinker --ks-pass pass:medlinker --key-pass pass:medlinker --out signed.apk un.apk
- 步骤5
字节对齐
检查是否对齐zipalign -v 4 source.apk destination.apk
zipalign -c -v 4 application.apk
- 其它命令参数
参考Apktool
网友评论