前言

作为新时代爬虫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 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给弟弟点个赞,求求了!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐