X巴克登录

巴克登录逆向   如有侵权 深感抱歉,找我删除:

本文章仅供学习如有 非法获得, 与本人无关

抓包

先进行body逆向

x-signature算法


巴克登录逆向   如有侵权 深感抱歉,找我删除:

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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值