作为新时代爬虫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的数据线哦
像我这种菜鸡做逆向,当然不能硬刚最新的安全产品,所以得按老的来,加上前辈大佬们为我们铺的老路,会让我们的逆向之路更加安稳,刷机前注意备份自己重要的数据。下载自己想要刷的安卓版本的包,这里博主下载的是pixel
7.12的安卓包,
注意!!!要找到自己对应手机的包下载,否则手机变砖我可不负责!!!
注意!!!要找到自己对应手机的包下载,否则手机变砖我可不负责!!!
注意!!!要找到自己对应手机的包下载,否则手机变砖我可不负责!!!
:
https://developers.google.cn/android/images#sailfish
其他机型请自己百度下载对应的包,
在下载好之后,我们使用cmd输入
adb reboot bootloader
进入fastboot
模式,点击下载好解压后的包里的flash-all.bat
等待刷机完毕即可,开机之后进入设置—>关于手机,多次点击版本号,打开开发者模式,打开usb调试,弹出窗口是否同意该计算机控制调试,选择同意
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
版本原因,重刷了好多次
经过了之前的努力,我们终于来到了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
先使用fidller对需要抓取的数据页面抓包
该app使用了腾讯加固保护措施在fdex2
中也能看见,进入fdex
点击该app后会提示脱壳后的东西保存在哪,这里博主使用了mt管理器进入所说的路径看见了若干.dex
为结尾的文件,全部拿出来。
使用jadx打开dex
文件选择搜索文本,搜索signatrue
,找到加密的函数,将函数自己实现,或者使用jpype
在python中调用也行,来达到逆向参数---->抓取数据的目的
全部代码如下:
# 运行jar包
# 引入jpype模块
import time
import requests
from jpype import *
import os
from jpype._core import startJVM, shutdownJVM
from jpype._jvmfinder import getDefaultJVMPath
if __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给弟弟点个赞,求求了!