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)
运行结果: