打开 app,是一个登陆的界面
输入账号密码之后点击登录可以看到下面的请求
提交的参数中有一个参数值是 apisign
这个参数就是我们需要分析得加密参数
先查一下壳,没有加固
直接搞到 jadx 里面找找线索
直接检索 apisign 这个关键参数,可以看到下面的结果
追进去,可以看到写着用到了 md5 的加密,参与计算的还有一个 key 以及 data
从 md5.key 追进去可以看到 key 是一个固定的字符串
public static final String MD5_KEY = "d367fxxxxxxxxxxxxxxx3fe05"
可以理解为是一个盐值
所以这里就需要知道后面参数的 data.toString 的值是什么,这里用 frida hook 打印一下
我们直接 hook ToMD5 这个方法
// com.softgarden.baselibrary.utils
function printStack(){
var threadef = Java.use('java.lang.Thread');
var threadinstance = threadef.$new();
var stack = threadinstance.currentThread().getStackTrace();
for(var i = 0;i<stack.length;i++){
send("Full call stack:" + stack[i].toString());
}
}
function main(){
Java.perform(function(){
var md5Class = Java.use("com.softgarden.baselibrary.utils.MD5Util");
md5Class.ToMD5.implementation = function(arg1,arg2){
console.log("arg1 ===> ",arg1);
console.log("arg2 ===> ",arg2);
var result = this.ToMD5(arg1,arg2);
printStack()
console.log('result ===> ',result);
return result;
}
})
}
setImmediate(main)
hook 结果如下
可以清楚的看到 arg2 的参数就是提交的账号和密码
通过加密网站的验证,可以知道这里用到的 MD5 并没有魔改就是简单的加了一个盐
直接使用 Python 实现一个 md5 即可
import requests
from hashlib import md5
headers = {
'Host': 'www.xxx.com',
'User-Agent': 'okhttp/3.9.1',
}
decrypt_text = 'dxxxxxxxxxxxxxxxxxxxxx05'+'{"password":"dddddddddd","phone":"15865865585"}'
apisign = md5(decrypt_text.encode('utf8')).hexdigest()
print(apisign)
data = {
'data': '{"password":"dddddddddd","phone":"15865865585"}',
'apisign': apisign
}
response = requests.post('http://xxxx/App/Login/login', headers=headers, data=data)
print(response.text)
完事~
End.
以上就是全部的内容了,咱们下次再会~