*东-sign签名获取
看评论里面对茅台脚本和sign签名比较感兴趣,先在此写一篇sign签名的获取。茅台脚本我会在今晚上传到g**hub上(如果来得及的话{:301_1001:})。首先要感谢作者@公过水蚊的所做工作,我在此基础上写的更加详细明白一点。
本文主要目的是阐述如何通过python脚本获取到sign签名,以用于各种请求的提交。
工具:模拟器(夜神和网易MuMu),我在mac和win10平台均测试过。
前戏:
1. 模拟器上需要安装frida-server模块(模拟器安装frida-server有很多教程),在模拟器上安装完frida-server后,python也要安装frida模块。需要注意的是模拟器和python上的版本好最好一致。
2. 安装京东App,建议安装版本9.2.0,高版本的app会检测frida,而版本过低不能抢茅台。
3. 运行模拟器上的frida-server
4. 运行京东App
完成上述步骤后,运行以下脚本
import frida import json rpc_sign = """ rpc.exports = { getsign: function(function_id, body_string, uuid){ var sig = ""; Java.perform( function(){ //拿到context上下文 var currentApplication = Java.use('android.app.ActivityThread').currentApplication(); var context = currentApplication.getApplicationContext(); var BitmapkitUtils = Java.use('com.jingdong.common.utils.BitmapkitUtils'); sig = BitmapkitUtils.getSignFromJni(context, function_id, body_string, uuid, 'android', '9.2.0'); //console.log(context, uuid) } ) return sig; } }; """ def get_sign(function_id, body_string, u): process = frida.get_remote_device().attach('com.jingdong.app.mall') script = process.create_script(rpc_sign) script.load() sign = script.exports.getsign(function_id, body_string, u) return sign if __name__ == '__main__': body_data = {"appId": "jd.mall", "content": "tbV8seY199tCdw6GllmkWyCNNENuGsgwLByA7svt5HbPXvlI9wQhHMk3dT7f0ldfpq6M0MCiUD+A\nVrY390Yct0FSub03INUml9n1bS9rZSF3XT0q1kQdehKPO4CccMiEA6NQXYiqYn9wLsDDYEIjmkVA\nEbXI88CwO0K7uhwemdhQMZrcIFj6jMmyiDNDxSA1OjFw88hR0oSCF0m8ll9o9iU2MVSHDipF5ZDn\nFR4E+82mwfRYIxamafB+nWG8GuHcKhiQOWGbChTcG3TxcGT053wfcc6uuMD7+L4PcsNRQjM9syFc\nXR6FBu/sCV/kH/3rT8w/m3zV1c9JpW9lq/7WVzCVvAIj7RNt2zzYFisymCE="} body_string = json.dumps(body_data, ensure_ascii=False).replace(" ", "") function_id = 'liveauth' u = '-a08d16f38776' sign = get_sign(function_id, body_string, u) print(sign)
运行后返回
st=1621657345424&sign=438ba149d2c6a7958a028e4bac757261&sv=102
代表sign签名成功,值的注意的是sign签名每次运行都会不一样的{:301_998:}。
如果报错的话,则是前戏中的四个步骤出错,请认真核对。
最后我给大家一个实际的例子,来说明如何使用方法get_sign(function_id, body_string, u)
function_id可以任意选择,我这里以function_id为genToken为例,我们看这样一个post类型请求:
https://api.m.jd.com/client.action?functionId=genToken&clientVersion=9.2.0&build=85134&client=android&d_brand=HUAWEI&d_model=LIO-AN00&osVersion=7.1.2&screen=1920*1080&partner=hhqj02&aid=38af3fc36a99f737&oaid=&eid=eidAcbd281217fsds90FMZ**********************pndb4UddGOyrt0Z1mN4AkQ/9CUAQFAp+PnQY5raGSEnBC&sdkVersion=25&lang=zh_CN&uuid=863064425269521-080027d76df4&area=15_1255_1258_51608&networkType=wifi&wifiBssid=43236c80b42dbe2ba**********************IrvpVNHXtnDGiAtxo16XtDlLP72vz7EVd5Tyv%2BmQpUjyRkKBoym0u%2BwFm2%2Bx9****************ZHXLOhGlI4Wmi4pXJgauDlcWv7Zx20kZO%2BdXkyn3601UvHAc52hlwcbYFCa5V1vo4i4MzHRNI0G5bOjODrkfP7CXQzCv7ZxBA%3D%3D&st=1621594850112&sign=17861f5b1791b36d99aeb7e479cba11d&sv=101
分解后,请求的链接为:
https://api.m.jd.com/client.action?
Query Params 参数为
query_params = { 'functionId': self.function_id, 'clientVersion': '9.2.0', 'build': '85134', 'client': 'android', 'd_brand': 'HUAWEI', 'd_model': 'LIO-AN00', 'osVersion': '7.1.2', 'screen': '1920*1080', 'partner': 'hhqj02', 'aid': '38af3fc36a99f737', 'eid': eid, 'sdkVersion': '25', 'lang': 'zh_CN', 'uuid': self.uuid, 'area': '2_2830_51811_0', 'networkType': 'wifi', 'wifiBssid': '43236c80b42dbe2ba38bd9ab1ae41eb7', 'uts': '0f31TVRjBSsqndu4/jg*JxhCAuLrGelkGqZ7vmHNN/jFolcDLqtEBSFY7Fou5xPR7en5iaWp6tQJpCvsAaneoaYw==', 'st': '1621657345424', 'sign': '438ba149d2c6a7958a028e4bac757261', 'sv': '102', }
post提交的data为:
body_string = '{"action":"to","to":"https%3A%2F%2Fh5.m.jd.com%2FbabelDiy%2FZeus%2F2NUvze9e1uWf4amBhe1AV6ynmSuH%2Findex.html"}'
data = {'body': body_string}
get_sign(function_id, body_string, u)中的三个参数说明:
function_id为genToken
body_string为post里面data['body']值,如果body_string传错,sign签名肯定无法通过核验
u参数为query_params里面的uuid
最后重新提交post请求,带上你自己生成的sign签名,如果获取到tokenKey,代表sign签名是正确的。
那个frida的脚本我重新发一下,之前没编辑好,抱歉
import frida
import json
rpc_sign = """
rpc.exports = {
getsign: function(function_id, body_string, uuid){
var sig = "";
Java.perform(
function(){
//拿到context上下文
var currentApplication = Java.use('android.app.ActivityThread').currentApplication();
var context = currentApplication.getApplicationContext();
var BitmapkitUtils = Java.use('com.jingdong.common.utils.BitmapkitUtils');
sig = BitmapkitUtils.getSignFromJni(context, function_id, body_string, uuid, 'android', '9.2.0');
//console.log(context, uuid)
}
)
return sig;
}
};
"""
def get_sign(function_id, body_string, u):
process = frida.get_remote_device().attach('com.jingdong.app.mall')
script = process.create_script(rpc_sign)
script.load()
sign = script.exports.getsign(function_id, body_string, u)
return sign
if __name__ == '__main__':
body_data = {"appId": "jd.mall",
"content": "tbV8seY199tCdw6GllmkWyCNNENuGsgwLByA7svt5HbPXvlI9wQhHMk3dT7f0ldfpq6M0MCiUD+A\nVrY390Yct0FSub03INUml9n1bS9rZSF3XT0q1kQdehKPO4CccMiEA6NQXYiqYn9wLsDDYEIjmkVA\nEbXI88CwO0K7uhwemdhQMZrcIFj6jMmyiDNDxSA1OjFw88hR0oSCF0m8ll9o9iU2MVSHDipF5ZDn\nFR4E+82mwfRYIxamafB+nWG8GuHcKhiQOWGbChTcG3TxcGT053wfcc6uuMD7+L4PcsNRQjM9syFc\nXR6FBu/sCV/kH/3rT8w/m3zV1c9JpW9lq/7WVzCVvAIj7RNt2zzYFisymCE="}
body_string = json.dumps(body_data, ensure_ascii=False).replace(" ", "")
function_id = 'liveauth'
u = '-a08d16f38776'
sign = get_sign(function_id, body_string, u)
print(sign)
沙发大佬给力 我body填错了 怪不得呢 茅台脚本已经上传了哈,g**hub收一下关键字即可 本帖最后由 djxding 于 2021-5-23 14:32 编辑
学习一下。
感觉难度对我来说,还是难了一点。
搞不懂,为什么那么多人喜欢茅台,是理财产品吗 茅台可遇不可求啊 1129038572 发表于 2021-5-23 21:29
每次提取的sign都不一样,是不是都能用
sign和时间等一些随机变量有关系,现抓现用。 1129038572 发表于 2021-5-23 21:29
每次提取的sign都不一样,是不是都能用
对,都可以用。sign时效性很长的,至少超过24小时