先聊聊为什么学习安卓逆向
大数据的普及,好像没有一手数据收集能力就要落伍了似得,不少无关开发的岗位都加上需要初级数据采集的能力要求,越来越多的 title 加上 数据 的字眼提升逼格。
渐渐初级爬虫工程师的饭越来越不好吃,中高级的爬虫的招聘需求也因为各式各样的加密协议反爬而添加上 JS 逆向+ APP 逆向的要求,所以有一手破签逆向的技术也越来越吃香。(个人看法)
APP逆向其实已经属于安全方面的内容,而我们爬虫工程师要做的其实远没有逆向工程师那么多和精,只要拿到请求中加密参数的加密方法,再用 Python 模拟加密即可。
为了面包,学习吧。
学习资源推荐
关于逆向的前置知识,可以参考之前发过的几篇基础文章,同时咸鱼也推荐下面这些学习资源,希望能帮助你快速入门(伸手党福利???):
吾爱破解入门教程集合贴:http://t.cn/Ai8hXHzs
推荐关注的博客:
尼古拉斯·赵四
https://blog.csdn.net/jiangwei0910410003
鬼哥
https://blog.csdn.net/guiguzi1110?viewmode=contents
天天记小本子上的lilac
https://blog.csdn.net/qq_38851536
推荐逆向书籍:
《Android软件安全与逆向分析》
《Android应用安全防护和逆向分析》
《JAVA加密与解密的艺术》第二版
推荐关注的APP逆向公众号:
小周码字
编码美丽
妄为写代码
逆向菜鸟
以上仅为我的个人推荐,大佬请无视~
接下来是咸鱼动手跟着做的第一个项目,某个小游戏的付费破解,了解AndriodKiller逆向工具的使用。
AndriodKiller的简单使用和实战
在使用这个逆向工具,需要先检查本地的 JAVA 开发环境是否安装。
命令行下输入:
java -version -- 输出JAVA jdk 版本
如果出现无版本信息输出或其他报错,请参照相关博客
或
后台回复
「逆向环境搭建」
获取相关搭建视频。
接下来是 AndriodKiller 的安装了,在吾爱破解的网站上提供了相关的绿色免安装版本,找到软件可以直接点击使用。
打开界面后是下面这样的:
打开后第一件事是在 AndriodKiller 的配置中配置 jdk 的安装路径之后既可以通过拖入需要反编译的受害者,即可打开进行分析:
我们这次要完成一款小游戏的付费破解,我们先安装未破解的APP看看能不能通过未破解的APP找到思路。
通过一番把玩,发现进入支付流程后取消支付会弹出相应提示语,顺着这个思路我们在反编译后的文件中检索一下看能不能找到对应的代码:
我们点击进去看看,发现了我们搜索的字符串:
反编译的代码不太方便查看,我们可以通过查看还原为java代码理解相关的逻辑:
可以看到,还原后的代码中支付失败,支付取消在同一个方法中,支付成功的逻辑为单独一个方法。
所以我们可以试试通过直接把支付成功的代码逻辑直接替换到支付失败的那个方法中来破解支付
替换过后查看字符串,发现整个类文件中就只剩下支付成功的方法了。
保存文件之后我们编译一下试试是否成功吧。
编译后,控制台输入如下代表编译成功。
打开 APP - 商店 随便购买一个道具,但是不完成支付,点击取消支付,可以看到上面的道具数量增加了。
说明我们的操作是成功的。(为避免破解不成功或误操作导致的扣费,请使用未插卡的机器测试)
OK,到这里我们就完成了第一个安卓APP的逆向破解,当然这个是非常简单的逆向项目,我们爬取的时候是不可能遇到这样的demo的。
所以请抱着学习玩玩的想法阅读本文。
Tip
1. AndriodKiller 并不是万能的,有些项目是没办法反编译成功的,所以需要搭配其他的逆向工具使用
2. AndriodKiller 在第一次导入项目时,会一直卡在反编译成功,xxxx
但是没有打开项目,需要收到重启AndriodKiller ,在工程
中打开刚刚的项目。
3. AndriodKiller 转化为 java 代码时在 java 代码中是无法编辑的,需要返回到 smali 中修改,所以 smali语法相当关键,需要好好研究不要对 软件自带的 转换功能过多依赖,且在 smali 中修改后要记得 ctrl + s保存,之后再编译。
在编译过程中出现报错,报错日志大致如下:
当前 Apktool 使用版本:apktool_2.3.0
正在编译 APK,请稍等…
I: Using Apktool 2.3.0
I: Smaling smali folder into classes.dex…
I: Building resources…
S: WARNING: Could not write to (C:\Users\i\AppData\Local\apktool\framework), using C:\Users\i\AppData\Local\Temp\ instead…
S: Please be aware this is a volatile directory and frameworks could go missing, please utilize --frame-path if the default storage directory is unavailable
W: E:\AndroidKiller_v1.3.1\projects\idm下载\Project\res\values-v23\styles.xml:8: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/WindowTitle'.
W:
W: E:\AndroidKiller_v1.3.1\projects\idm下载\Project\res\values-v23\styles.xml:9: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/WindowTitleBackground'.
W:
W: E:\AndroidKiller_v1.3.1\projects\idm下载\Project\res\values-v24\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/Animation.DropDownUp'.
W:
W: E:\AndroidKiller_v1.3.1\projects\idm下载\Project\res\values-v24\styles.xml:8: error: Error retrieving parent for item: No resource found that matches the given name '@android:style/Animation.DropDownDown'.
W:
Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\i\AppData\Local\Temp\brut_util_Jar_6839346043621878032.tmp, p, --min-sdk-version, 16, --target-sdk-version, 26, --version-code, 1, --version-name, 1.0, --no-version-vectors, -F, C:\Users\i\AppData\Local\Temp\APKTOOL8354570300607898895.tmp, -0, resources.arsc, -0, arsc, -I, C:\Users\i\AppData\Local\Temp\1.apk, -S, E:\AndroidKiller_v1.3.1\projects\idm下载\Project\res, -M, E:\AndroidKiller_v1.3.1\projects\idm下载\Project\AndroidManifest.xml]
at brut.androlib.Androlib.buildResourcesFull(Androlib.java:485)
at brut.androlib.Androlib.buildResources(Androlib.java:419)
at brut.androlib.Androlib.build(Androlib.java:318)
at brut.androlib.Androlib.build(Androlib.java:270)
at brut.apktool.Main.cmdBuild(Main.java:224)
at brut.apktool.Main.main(Main.java:75)
Caused by: brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\i\AppData\Local\Temp\brut_util_Jar_6839346043621878032.tmp, p, --min-sdk-version, 16, --target-sdk-version, 26, --version-code, 1, --version-name, 1.0, --no-version-vectors, -F, C:\Users\i\AppData\Local\Temp\APKTOOL8354570300607898895.tmp, -0, resources.arsc, -0, arsc, -I, C:\Users\i\AppData\Local\Temp\1.apk, -S, E:\AndroidKiller_v1.3.1\projects\idm下载\Project\res, -M, E:\AndroidKiller_v1.3.1\projects\idm下载\Project\AndroidManifest.xml]
at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:454)
at brut.androlib.Androlib.buildResourcesFull(Androlib.java:471)
… 5 more
Caused by: brut.common.BrutException: could not exec (exit code = 1): [C:\Users\i\AppData\Local\Temp\brut_util_Jar_6839346043621878032.tmp, p, --min-sdk-version, 16, --target-sdk-version, 26, --version-code, 1, --version-name, 1.0, --no-version-vectors, -F, C:\Users\i\AppData\Local\Temp\APKTOOL8354570300607898895.tmp, -0, resources.arsc, -0, arsc, -I, C:\Users\i\AppData\Local\Temp\1.apk, -S, E:\AndroidKiller_v1.3.1\projects\idm下载\Project\res, -M, E:\AndroidKiller_v1.3.1\projects\idm下载\Project\AndroidManifest.xml]
at brut.util.OS.exec(OS.java:95)
at brut.androlib.res.AndrolibResources.aaptPackage(AndrolibResources.java:448)
… 6 more
APK 编译失败,无法继续下一步签名!
我的解决方案是:替换 AndriodKiller 目录下 bin\apktool\apktool 中的 ShakaApktool.jar 为更新的版本即可成功编译,签名。
本文完。
咱也不知道,也不敢问。