API接口:http://appapi.feigua.cn/api/v1/user/loginByPhoneNew
使用charles抓包结果:
通过抓包可以看到请求头中包含sign参数,点击登录之后发现sign参数发生变化
使用jadx反编译该apk,通过搜索接口关键词查找(loginByPhoneNew),如图所示:
点进去查看:
通过观察发现,在com.feigua.androiddy.d.k.e().g(com.feigua.androiddy.b.a.b(“v1/user/loginByPhoneNew”)这里进行了该请求,点击进入:
通过观察g方法,发现了与请求头相关的信息,
其中,builder2.addHeader(“Sign”, com.feigua.androiddy.b.a.a(hashMap, d2, currentTimeMillis + “”));该方法实现了sign参数的封装。点击进入a方法。
到这里我们可以使用frida对a方法进行hook查看出入的参数是什么,frida代码如下:
var a = Java.use('com.feigua.androiddy.b.a');
a.a.implementation = function(arg1,arg2,arg3){
console.log(arg1,arg2,arg3);
var result = this.a(arg1,arg2,arg3);
console.log(result);
return result;
}
hook结果:
到这里可以猜测该加密可能是md5加密,返回继续查看a方法其中返回值为i.a(stringBuffer.toString()),继续进入返回值中的a方法:
这里就很清楚的知道时使用了md5加密,继续用frida hook该方法:
var i = Java.use('com.feigua.androiddy.d.i');
i.a.implementation = function(a){
console.log(a);
var result = this.a(a);
console.log(result);
return result;
}
hook结果:
到这里就清楚知道sign参数的生成过程了,对CCd35181!!6445btrrtBBertert===&phone=18235015508&platform=Android&pwd=123456&ts=1672494804进行md5加密并且转大写,其中ts为时间戳,phone和pwd为用户名和密码,其余都为固定参数。
接下来使用python进行模拟请求
import requests,time,execjs
url = 'http://appapi.feigua.cn/api/v1/user/loginByPhoneNew'
ts = int(time.time())
ctx = execjs.compile(open('./sign.js',encoding='utf-8').read())
md5_arg = 'CCd35181!!6445btrrtBBertert===&phone=18235015508&platform=Android&pwd=123456&ts='+str(ts)
sign = (ctx.call('md5',md5_arg)).upper()
headers ={
"Platform": "Android",
"Imei": "5277a742-0307-4c35-a995-60626971d081",
"Version": "162-1.6.2",
"LoginType": "",
"LoginId": "",
"ts": str(ts),
"Sign": sign,
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": "28",
"Host": "appapi.feigua.cn",
"Connection": "Keep-Alive",
"Accept-Encoding": "gzip",
"User-Agent": "okhttp/3.12.0"
}
params = {
'Phone':'18235015508',
'Pwd' : '123456'
}
response = requests.post(url,headers=headers,data=params).text
print(response)
运行结果:
本文含有隐藏内容,请 开通VIP 后查看