注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除
注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除
注:本篇博客仅供学习使用,请勿用做其他商业用途,如有侵权,请联系本菜鸟删除
写在前面:本菜鸟以及好久好久没更新过逆向文章了,这段时间一直在研究安卓app逆向,从零开始,这是一个极其繁琐的过程,各种环境设备的问题更是层出不穷,感觉每一个困难都能轻易将我克服,爬虫这个行业真是太卷了,搞不好还得戴银手镯吃公家饭,这特么谁还受得了。
好了 前面废话一大推,下面我们从刷机开始研究研究某团app的这两个参数
一、刷机和安装必要的工具
1.机型:小米civi2
2.工具:面具(Magisk)
3.小米工具:MIFlash,miflash_unlock
4.安卓调试桥:adb
5.安装Packet Capture
其实这个刷机教程网上很多,所以这里我只做简单的介绍
1.1 解BL锁
如果我们要刷入第三方的recovery或者第三方的刷机包就必须进行这一步
小米解Bootloader锁需要我们先去小米官方网站下载:https://www.miui.com/unlock/download.html
下载好上面工具后,输入小米账号,手机按着音量键和开关机键 进入FASTBOOT模式
然后点击解锁
解锁步骤需要注意的点:
1.首次解锁账号需要7天
(网上那些提示可以提前通过申请的方式都不靠谱,老实等待七天)
2.解锁前手机有数据的需要数据备份
上面是解锁成功后截图,解锁成功后查看手机开发者选项中的设备解锁状态显示已解锁
1.2下载面具 Magisk
地址:https://github.com/topjohnwu/Magisk/releases/tag/v26.3
下载apk安装包到手机
然后下载boot.img
进入小米ROM官网下载自己手机型号的线刷包:https://xiaomirom.com/series/
下载完成后在images文件下找到boot.img
文件
然后打开Magisk
点击安装,选择并修补一个文件(选择上面选择的boot.img)然后选择开始,完成后会出现日志:
Output file is written to
/storage/emulated/0/Download/Magisk_patched-xxx_WSS
All done ! 就OK了
最后在手机中找到这个img fastboot刷入手机即可。
#运行刷新命令
.\fastboot flash boot Magisk_patched-xxx_WSS.img
#完成后运行重启手机命令
.\fastboot reboot
最后呈现这种效果就行了
注意:手机如果在刷机的过程中变搬砖了 可以用MIFlash工具刷回原来的系统
最后运行截图这样就可以了:
1.3安装adb
ADB 全称为 Android Debug Bridge,通常我们称之为安卓调试桥,adb是安卓手机和pc的桥梁,可以在电脑上对手机进行操作包括文件的上传下载和应用的安装卸载等等。
安装方法:下载android-sdk 网站:https://www.androiddevtools.cn/
添加环境变量
cmd 输入adb 出现版本信息代表安装成功
1.4 安装Packet Capture
上面的刷机root都是为了能抓包,因此很多大佬会选择常规的小黄鸟来抓包,但是如果root失败就意味着无法抓包,而Packet Capture这个抓包工具使用简单,操作方便,可以在没有root权限的情况下抓取到网络数据内容,并保存记录。所以呢,这个对于新手来说比较友好的,这是博主比较推荐的。
二、安装frida
Python和Frida以及Android对应的版本大概如下
安装frida 和frida-tools
本小菜鸟python版本是3.8而且Android版本是12,所以安装的是16.1.11这个版本,自己pip install 一下就OK了
安装frida-server
gihub地址:https://github.com/frida/frida/releases?page=1
找到frida对应的版本,然后查找与手机对应的frida-server
不知道手机cpu架构的同学可以用下面命令查询:
与本小菜鸟对应的版本就是frida-server-16.1.11-android-arm64
下载这个文件到本地然后解压 推送到/data/local/tmp
目录下
# adb push frida-server路径 /data/local/tmp 下面是本小菜鸟的
adb push C:\Users\Administrator\Downloads\frida-server-16.1.11-android-arm64 /data/local/tmp
# 可以给frida-server文件改个名字,并且赋予777的权限 chmod 777 文件名
输入./fsarm64
就可启动服务,切记 不可关掉cmd窗口
好了,frida的环境我们就搭建好了
app反编译工具:GDA
GGJoy Dex Analysizer(GDA),中国第一款也是唯一一款全交互式的现代反编译器,同时也是世界上最早实现的dalvik字节码反编译器,目前为止是世界上分析速度最快、占用内存最低、体积最小、功能最丰富的Android反编译器。 GDA不仅只是一款基础的反编译器,同时也是一款轻便且功能强大的综合性逆向分析利器,其不依赖java环境即可进行反编译,且支持apk、dex、odex、oat、jar、aar、class文件的反编译, 支持python,java脚本自动化分析。
这段话是从某乎CV的
github地址:https://github.com/charles2gan/GDA-android-reversing-Tool
安装完成后直接将apk文件拖入GDA反编译成java代码
太累了 ,不想写了,工具都安装了一大堆。。。。。
三、frida java层hook简单介绍
1.frida常用命令及参数
frida -UF -l hookdemo.js
-U usb模式
-F 手机最上层应用
-l 加载脚本
-o 输出到文件
-f spawn模式
2. frida hook js代码模板
Java.perform(function() {
var xxx = Java.use("package_name.class_name");
xxx.hook_method_name.overload(<arg1,arg2,arg3,...>).implementation = function(<arg1,arg2,arg3,...>) {
/*
自定义代码 如下:
consol.log(xxxx)
let return_str = this.hook_method_name(<arg1,arg2,arg3,...>)
return return_str
*/
}
})
说明:
1.Java.perform()
是一个和Android应用程序中的java代码交互的入口,可以让程序猿们访问程序中的java类来观察程序传入的参数以及一些操作和最后返回的结果等等。。。
2.Java.use()
要具体hook Android程序中的某个具体的package下面的某个类
3.xxx.hook_method_name.overload(<arg1,arg2,arg3,...>).implementation
类下面某个具体的函数以及该函数要传递的参数
上面不太了解的自己去看看文档 本小菜鸟就不做过多的解释了
四、mtgsig和waimai_sign参数的hook
前面做了那么多准备工作,终于可以开始进入正题了。。。不容易啊
1.waimai_sign参数
通过抓包工具Packet Capture获取到请求商品列表有加密参数waimai_sign,所以我们就直接在GDA中搜索该关键字
由上面两个截图可清楚明白的发现:waimai_sign
是由oobject1+str+b.D().j()+str+l+str+i5
这个字符串通过RSA加密得到,看到这里我们就得找这几个相加的参数分别是啥了
跟着上面的代码找很容易就找到str l i5 oobject1
这几个参数,但是oobject1
是通过参数传进c函数
的,所以我们就得hook c函数
下面是一个最简单的hook代码:
Java.perform(function () {
let dd = Java.use("com.xxx.xxx.platform.net.g");
dd["c"].overload('android.content.Context', 'java.lang.String', 'boolean', 'boolean', 'boolean', 'java.util.HashMap').implementation = function (p0,p1, p2, p3, p4, p5) {
console.log('p1: ' + p1)
let rett = this.c(p0,p1, p2, p3, p4, p5);
return rett;
};
})
所以这个参数的加密不就一目了然了。。
下面就是这个参数的Python代码
import base64
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA
def get_waimai_sign(base_url, times,wm_seq):
uBigInteger = int(
"AC14E4A51F1B8E11A95971CA4EBD7E2314631F137596A66A43FA2D792B2FD8447CBD6553D591F00A8B9D58E8BA33C2"
"29317A0D122C965D84A286114A963C3AE2694C81665D5AF04C80A71CBF350CD4C66280DC8FADBE6B8EDA7B2EC3D0"
"C50E150850445EF84D3A4192662AC135D912C2CA2C68176D79EC64CACFF34089482B69",
16)
obj1 = int("010001", 16)
rsa_key = RSA.construct((uBigInteger, obj1))
cipher = PKCS1_v1_5.new(rsa_key.publickey())
message = base_url + '//' + str(times) + '/' + wm_seq
encrypted_message = cipher.encrypt(message.encode())
sign = base64.b64encode(encrypted_message).decode()
return sign
2.mtgsig参数
这个参数和上面的waimai_sign的hook相差不多,本小菜鸟就不详细阐述了
将p6参数拿到java中转成明文:
好了好了 不写了 真是太麻烦了 剩下的你们自己去琢磨
以后再也不写这么麻烦的文章了。。。。
写在最后:感谢给予我帮助的同事及大佬 小菜鸟在此给你们鞠躬了