安卓逆向|记录第一次完整安卓逆向过程笔记


文章目录

  • 前言
  • 一、安卓逆向的准备
  • 二、刷机+配置+安装app
    • 1.安卓系统版本
    • 2.手机root+面具安装
    • 3.xposed安装
  • 三.逆向app
  • 总结

前言 作为新时代爬虫er,逆向技能是必不可少的,在博主精心学习了几个月js逆向之后,又把矛头指向了安卓逆向,同为逆向,虽然相同点很多,都是不同点也不少,这里记录一下博主初学安卓逆向步入的几个大坑,和完整逆向的过程,希望能够帮助到安卓逆向新人,望周知!!
一、安卓逆向的准备 工欲善其事,必先利其器,这里给大家推荐一下我在本文中使用过的工具(都在网盘链接里,都给你们安排好了):
  • adb: 操作手机的命令,百度非常多教程,这里我不说了
  • jadx:jadx打开文中.dex的工具,神器
  • apktool: 观察app内容的利器,当然通过改名zip解压也行,但是还是缺少内容,本文用来观测到该app是加固过的
  • fdex2: 脱壳工具,利器
  • xposed: 好东西,不解释
  • magisk: 俗称面具,好东西
  • twrp: 一种大佬开发的东西,不了解,但是要用
链接:https://pan.baidu.com/s/1iQGNsC8pRvBqOici_fjWeg
提取码:pypy
当然了还有我们逆向使用的安卓手机,这里博主的是pixel 1手机 加上一根数据线,注意有些数据线只有充电功能,要确定能连电脑usb的数据线哦
二、刷机+配置+安装app 1.安卓系统版本 像我这种菜鸡做逆向,当然不能硬刚最新的安全产品,所以得按老的来,加上前辈大佬们为我们铺的老路,会让我们的逆向之路更加安稳,刷机前注意备份自己重要的数据。下载自己想要刷的安卓版本的包,这里博主下载的是pixel 7.12的安卓包,
注意!!!要找到自己对应手机的包下载,否则手机变砖我可不负责!!!
注意!!!要找到自己对应手机的包下载,否则手机变砖我可不负责!!!
注意!!!要找到自己对应手机的包下载,否则手机变砖我可不负责!!!:
https://developers.google.cn/android/images#sailfish
安卓逆向|记录第一次完整安卓逆向过程笔记
文章图片

其他机型请自己百度下载对应的包,
在下载好之后,我们使用cmd输入
adb reboot bootloader

进入fastboot 模式,点击下载好解压后的包里的flash-all.bat等待刷机完毕即可,开机之后进入设置—>关于手机,多次点击版本号,打开开发者模式,打开usb调试,弹出窗口是否同意该计算机控制调试,选择同意
2.手机root+面具安装 root是个好东西,所以我们也要弄,再次进入fastboot 模式,然后在对应文件路径下输入
fastboot boot twrp-3.3.0-0-sailfish.img

进入临时TWRP,然后将面具也就是magisk传输到手机中
adb push Magisk-v17.2.zip /sdcard/#或者其他路径

滑动解锁,点击install进入文件夹,选择刚刚传入的包,滑动安装,安装完毕后点击reboot重启,然后cmd输入adb shell,进入之后输入su,这时手机会提示是否同意超级用户权限,同意之后,无报错,即root成功,记住magisk千万千万千万不要更新,不小心点到了就重新来吧,博主因为magisk版本原因,重刷了好多次
3.xposed安装 经过了之前的努力,我们终于来到了xposed面前,到现在才是困难的开始,因为xposed开发者的原因,xposed不支持高版本的安卓系统,这也是博主选择7.12系统的原因,但是博主在安装xposed遇到各种困难的时候,遇见了edxposed
博主又去搞edxposed+magisk的方法逆向学习,又遇见了magisk版本不对的问题,edxposed依赖riru检测不到的问题/版本问题,而且edxposed需要8.0及以上,又得刷8.0的版本。
博主历经千辛万苦终于安装好了edxposed,然而老天又给我开了一个玩笑,fdex2不支持8.0以上版本。。。。。。。。(博主当时想要不安卓逆向算了吧,会js就行了)
博主又一次走向了xposed之路,安装xposed其实很简单,
adb install XposedInstaller_3.1.5.apk

安装xposed之后我们进入软件,会发现爆红,原因有很多,先解决网络问题,这就可能需要开启科学上网,再次进入,如果还不对,看本博主另外一篇文章,解决http和https的问题的:
https://blog.csdn.net/Ig_thehao/article/details/120554696
除了这个问题和网络问题之外,还有错误,比如权限问题:
can't create '/system/xposed.prod':Read-only file system Error 1 occurred
比如xposed重启一直卡开机动画,adb连接不上电脑
直接重刷吧,都可以解决,
到这里再把fdex2安装下就ok了,将xposed模块中的fdex2启用。
参考文章:
https://www.jianshu.com/p/a059b69656f4
https://blog.csdn.net/someby/article/details/110388712
三.逆向app 先使用fidller对需要抓取的数据页面抓包
安卓逆向|记录第一次完整安卓逆向过程笔记
文章图片

发现加密参数signature
该app使用了腾讯加固保护措施在fdex2中也能看见,进入fdex点击该app后会提示脱壳后的东西保存在哪,这里博主使用了mt管理器进入所说的路径看见了若干.dex为结尾的文件,全部拿出来。
使用jadx打开dex文件选择搜索文本,搜索signatrue,找到加密的函数,将函数自己实现,或者使用jpype在python中调用也行,来达到逆向参数---->抓取数据的目的
【安卓逆向|记录第一次完整安卓逆向过程笔记】全部代码如下:
# 运行jar包 # 引入jpype模块 import time import requests from jpype import * import osfrom jpype._core import startJVM, shutdownJVM from jpype._jvmfinder import getDefaultJVMPathif __name__ == '__main__': """ 基本的开发流程如下: ①、使用jpype开启jvm ②、加载java类 ③、调用java方法 ④、关闭jvm(不是真正意义上的关闭,卸载之前加载的类) """ # 加密参数 f = 'f1190aca-d08e-4041-8666-29931cd89dde' t = str(int(time.time())) # print(t) uuid = 'IMEI010000000242147-IMSINNNNNNNN' m = uuid+'&&'+t+'&&'+f # ①、使用jpype开启虚拟机(在开启jvm之前要加载类路径) # 加载刚才打包的jar文件 jarpath = os.path.join(os.path.abspath("."), "自己的jar包路径")#千万别有中文路径,博主死过这 # 获取jvm.dll 的文件路径 jvmPath = getDefaultJVMPath()# 开启jvm:.如果是调用多个jar文件的话,要在jvm启动时指定jar文件路径,jarpath,jarpath2,jarpath3,jarpath4是jar文件路径。# jpype.startJVM(jvmPath,"-ea", "-Djava.class.path=%s; %s; %s; %s" % (jarpath,jarpath2,jarpath3,jarpath4)) startJVM(jvmPath, "-ea", "-Djava.class.path=%s" % (jarpath)) # ②、加载java类(参数是java的长类名) # print("-Djava.class.path=%s" % (jarpath)) javaClass = JClass("C2387a")# 类的全名,这里我只有这一个类,且没有引用其他类 # 实例化java对象 传入加密参数 javaInstance = javaClass() sign = javaInstance.m11218a(m)#m11218a 为类中的方法 print(sign) # ③、调用java方法,由于我写的是静态方法,直接使用类名就可以调用方法 # javaClass.show()headers={'sys': 'Android', 'sysVersion': '6.0.1', 'appVersion': '8.2', 'appVersionCode': '54', 'udid': 'IMEI010000000242147-IMSINNNNNNNN', 'clientType': 'android', 'timestamp': t, 'signature': str(sign),#需要在jvm结束之前调用 'Host': 'app.suzhou-news.cn', 'Connection': 'Keep-Alive', 'Accept-Encoding': 'gzip', 'User-Agent': 'okhttp/3.9.0' } r=requests.get(url,headers=headers,verify=False) print(r.text) # ④、关闭jvm:jvm随着python程序的退出而结束 shutdownJVM()

如何使用jpype,参考其他大佬文章:
https://blog.csdn.net/harvestnight/article/details/83987313
java加密代码如下
import java.security.MessageDigest; public class C2387a {public static String m11218a(String str) {// 加密过程 return '加密结果' } }

代码只是参考,并未实际作用
总结 这是一个非常非常简单的笔记,写的有问题大佬请指出,顺便dddd,有问题可以评论交流,如果该文章有解决你的问题,不求关注,好歹giegie给弟弟点个赞,求求了!

    推荐阅读