巴克登录逆向 如有侵权 深感抱歉,找我删除:
wx : abcEGF618
本文章仅供学习如有 非法获得, 与本人无关
抓包
首先进行抓取登录包
他有校验 , 算法助手直接过。。
查看请求头(x-signature)与请求体(body) + 逆向
先进行body逆向
通过 jadx 反编译搜索 出来了很多 但是都不是
所以我直接用 Friday hook java base64 通杀脚本
# 在应用启动的早期进行hook 如果已经运行app 则会自动重启
# 这个名称: spawn
import frida
import sys
# 连接手机设备
rdev = frida.get_remote_device()
# apk的包名
pid = rdev.spawn(['com.starbucks.cn'])
session = rdev.attach(pid)
src = """
Java.perform(function () {
var base64=Java.use('android.util.Base64');
var string=Java.use('java.lang.String');
base64.encode.overload('[B', 'int', 'int', 'int').implementation = function(){
send("=================base64 encode====================");
send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
send(arguments[0]);
send(arguments[1]);
send(arguments[2]);
send(arguments[3]);
var data=this.encode(arguments[0],arguments[1],arguments[2],arguments[3])
send("base64:"+string.$new(data));
return data;
}
});
"""
script = session.create_script(src)
def on_message(message, data):
print(message, data)
script.on("message", on_message)
script.load()
rdev.resume(pid)
# hook住 等待操作输出
sys.stdin.read()
hook 结果 可以看到通过抓包 然后抽取一部分结果 在hook中搜索 定位到了加密值
接下来就是要看 调用栈 调用栈 前几个不必看(一看就是base64一些操作) 看后面的 o.x.a.z.z.x.e 这个调用信息 在 jadx里搜索查看
这就是他的方法 不罗嗦了 就是他 hook测测就知道
他是什么加密呢,怎么查看 ???
其实他在 刚才调用栈 和 jadx 里都告诉你了 就根据逆向经验都该测测 也不罗嗦了
既然是 AES256 他的key iv是什么呢
在当前方法的上面 有个方法他调用当前 AES256 传了 2 个值 非常的可疑
进来之后 讲实话 我就看前两行 一个 key 一个iv 给了 Intrinsics.m81892i 方法 我就直接去测 是不是 key和iv了
不出意外 他没出意外 成功 了
import json
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import base64
def aes_256_encrypt_cbc(plain_text, key, iv):
key_bytes = key.encode('utf-8')
iv_bytes = iv.encode('utf-8')
cipher = Cipher(algorithms.AES(key_bytes), modes.CBC(iv_bytes), backend=default_backend())
encryptor = cipher.encryptor()
padded_data = _pad(plain_text.encode('utf-8'), 16) # 使用 PKCS7 填充方式
cipher_text = encryptor.update(padded_data)
return base64.b64encode(cipher_text).decode('utf-8')
def _pad(data, block_size):
padding_length = block_size - (len(data) % block_size)
padding = bytes([padding_length] * padding_length)
return data + padding
# 示例用法
plain_text = '{"device":{"app_version":"9.22.0","device_external_code":"cNZ1UCyX812lfenGGrzlQS7aSNffTvfy7Otm98kGVlvkrBzjpfFmEgjcVbVOW5NRY2QIZBOwn5Yk9cHGfK4LuUiTiyqfKBExLP2m5rNxiJ9sjEy1XdgQxaQzweiCaR_AulULfkqlo1ptb_ZjmwjZj_DpSxhFyHEo","id":"c8f79e4d9748402a90eea36459e92704","language":"zh","latitude":"0","longitude":"0","manufacturer":"Xiaomi","model":"Redmi K30 5G","os_name":"Android","os_version":"11","timezone":"Asia/Shanghai","user_agent":"Android com.starbucks.cn.baselib/9.22.0 (Redmi K30 5G; 11)"},"password":"123456","userName":"dadawdaw"}'
key = "lUhIC6cYFVCTCGRdgdNK4nC1hAFORjZg"
iv = "DTsVbqw8xd4QRWOB"
encrypted_text = aes_256_encrypt_cbc(plain_text, key, iv)
print("Encrypted Text:", encrypted_text)
之所以不讲讲 明文是什么 自己hook 之前调用栈方法 就好了 固定就好 账号密码换就行
加密结果
x-signature算法
jadx 全局搜索 搜索出来没几个 其实就是第一个
进去后看 他 个给okhttp3的拦截器 在下面方法里在header里添加了 x-signature的值 后面就是他的加密方法
进去后逆着看 在return 中 基本是对的上密文的
前2个值的加密 p currentTimeMillis 会点java基础的都可以看懂
直接讲 rs 他是so方法加密的 先看 他形参是啥
str3 参数
主要看最后一个 m1382a(request.body()) 这个其实是去取了request的body内容 进行了 url编码
hook 出内容
url解码 发现 和 之前分析的 body 账号密码加密内容 一模一样 只是哪到这里转了url编码
分析 后面的参数(固定) 它似乎是通过懒加载模式进行初始化的 具体他里面干了什么 有兴趣可以去分析
这里他是固定的 我就不分析了
String str2 = "7s0s9iICAADeTy7o7Mws9GzMLfZkqSsYP7ZSSG4Sf6EvX966uPRjH0jKiSqwNXwB7jjXAibiB0hFxEH9r7kEASllS1uXX+s/nUboMaCVNCI0UcCjUu1EZDpcACc1KGn2y1sBbtg5FXPJUHzkwLRO+uTKO+EHt46xkAE/VU7cseEEkYaHQv8hE+YZJibx7LLzRauH2rQbNigccX5Da7DeH++cdXBRWOPf/I86EY4QOuJWCt2T8ysaKo78BtVbYjAaMZAyB4sTdIXHqXr2Ny/xsAYshmBGHLBpLjgQi1f6knP/Jxf2sG+qGgqdaMQ6HTjrASV6Pq8FNYDa0bfIEIHpFZeVUonmrN6omNGWqoARW00t7UDf7Mwt9GzMLLmnU2VlxVHHJYfvSnY8kMrGNrsCpMEoKRC28n4uV4PVxmHK2cnUtEiqeMMwvLGhhNQ00KBW5kCyNBvOjRdeyp70TeELUb7DNZSoOED/QNu4e1H6NJplmX78D1A90P7+yksTZV/tB4AIdT7cVnRcE0FCoWXPXg672cHOLnSdSZzVVAGkAfBgQKTOxZiByxvfT3/QRrsWPEEQtuj1O881tNM3vnFd+mueJ2zHpjxbAMaStiimsBAKP4JIK5H6OgfMMl3JD4LQTHsfq7Ajk3AN3NnsvmtfSD5tgU9QFZkbgK0qUNFynpuo/JKRA7GtqqLuDD3lwKDjWJwfPpAqWT4V+Ir078wu9+/PLffszC3078wwAAAAY1VzNWMxUm1VbnBNY0ZneXI5eDNhN0tBTm95RUVmTDcxdmREcGFKVk9LNk15dz09";
欧克 基本结束了 剩下的是unidbg 补环境 我直接 贴补环境代码吧 因为他就校验了app的包名 哈哈哈哈哈
// 补环境
@Override
public DvmObject<?> callStaticObjectMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
if (signature.equals("android/app/ActivityThread->currentPackageName()Ljava/lang/String;")){
return new StringObject(vm,"com.starbucks.cn");
}
return super.callStaticObjectMethod(vm, dvmClass, signature, varArg);
}