启xin宝app的token算法破解

本文详细解析了启xin宝APP的Token算法破解过程,包括抓包分析、逆向工程、Token静态分析及使用Frida提取加密密钥。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

启xin宝app的token算法破解——抓包分析篇(一)

转:https://blog.youkuaiyun.com/qq_34067821/article/details/100050472

为了提升逆向技术,最近几日研究了企cha查的sign和启xin宝的token算法,目前已经成功破解,两个app均是最新版,并将企cha查写成爬虫小demo,放在github上,详情查看 https://juejin.im/post/5d609fd26fb9a06acb3eab29 具体不在多说,今日继续启xin宝的token破解。
启xin宝的token破解可谓是有点小难,秘钥在ndk里面,比较难取,不过用一个比较火的技术就很快搞定了,后边详细说。
对于启xin宝我么就需要先进行抓包了,这里使用Charles进行手机端抓包:


这里随便抓了一个url,我们看到有token、push-registration、imei等等,那这么多的请求头里面是都需要吗??
我们做一个验证,使用requests或者就Charles重发验证,这里使用Charles重发验证,需要先进行更改请求头,然后重新发送即可。

1.右键在url上选择撰写
2.点击请求头
3.对请求头进行更改
4.执行(还可以进行还原操作)

经过我的验证发现只有token、appversion是最重要的,其他都没有太大作用,有兴趣的小伙伴可以自己试试。


对于app-version我们直接就可以拿来用,但是对于token怎么办,下一篇继续分析吧。
 

启xin宝app的token算法破解——逆向篇(二)


对于一个app而言,我们要逆向app,需要知道什么呢?

逆向工具
Java基础,甚至c和汇编基础
加固类型和脱壳工具
安卓开发基础
对安卓系统的认知
对xposed的认知
smali基础
以上这些是必须了解甚至掌握的,爬虫逆向路上越走越远了。
回归正题,该app是怎样一种app呢??
如何去查看app是否加固(加壳)呢?
我们要借助易开发这款app进行检验(同时带有脱壳功能)

可以看到该app是360加固,我们直接脱壳,然后导出脱壳数据分享到电脑上,导出数据为dex。

dex又是什么呢?
这篇文章可以了解一下浅谈 Android Dex 文件
本文不做相关基础的书写。还需要读者自己进行学习。
我们现在有了安卓apk的dex,现在就需要对dex进行逆向了。
这里推荐的工具有gda(中国人自己写的)、jeb(功能强大,需要付费)、jadx(逆向出更利于阅读的代码),如果涉及到ndk,我们还需要ida,工具的具体用法这里就不详细说了。本次使用jadx进行逆向dex文件,然后保存成Java源代码进行分析,Java源码代码分析,这里使用idea(Java开发工具)。
在使用jadx反编译dex的时候,内存使用比较大,请注意内存的大小。


上图保存成Java源代码之后,使用idea打开,然后继续分析token,下一篇继续。
 

启xin宝app的token算法破解——token分析篇(三)


本篇就爱你是对token静态分析,其实很简单就可以搞定那种。通过idea的全局搜索,直接搜索"token"直接找到token在哪里,上图。

 

找到了,进去看看,这是MessageUtil类里面,可以看下MessageUtil的具体方法:

具体代码就不贴了,分析到这里发现使用ndk,也就是c编译之后的so文件,这就有点难办了,先不管这个,继续分析下。
static {
    System.loadLibrary("encrypt-lib");
    }

在该类里面有这个return b.a(str);方法,该方法是具体的算法分析。

    /* renamed from: a reason: collision with root package name */
    public static String f1288a = "CryptoTool_KEY";
    public static String b = "CryptoTool_IV";
    public static String c = MessageUtil.getKey();
    public static String d = MessageUtil.getIV();
    private static final String e = "AES/CBC/PKCS5Padding";
    private static byte[] f = a.a(c);
    private static SecretKeySpec g = new SecretKeySpec({}, "AES");
    private static Cipher h;
    

    public static String a(String str) {
        try {
            if (h == null) {
                f = a.a(c);
                g = new SecretKeySpec(f, "AES");
                h = Cipher.getInstance(e);
                h.init(1, g, new IvParameterSpec(a.a(d)));
            }
            byte[] bytes = str.getBytes("UTF-8");
            byte[] bArr = new byte[h.getOutputSize(bytes.length)];
            h.doFinal(bArr, h.update(bytes, 0, bytes.length, bArr, 0));
            return Base64.encodeToString(bArr, 2);
        } catch (Exception e2) {
            e2.printStackTrace();
            return null;
        }
    }

看到该token使用的是AES进行加密,具体的秘钥和偏移则在encrypt-lib里面。
如何能拿到秘钥和偏移呢?这里可以借助frida和xposed的hook进行提取,下一篇进行frida的hook提取。

启xin宝app的token算法破解——frida篇(四)

本篇就将对token的秘钥进行hook,使用上篇提到的frida进行hook,hooknative方法,获取到秘钥和偏移。

对于frida是什么?

Frida是一个动态代码插桩框架,这里的介绍主要以应用在Android平台应用程序上。动态二进制插桩(DBI)是将外部代码注入到现有的正在运行的二进制文件中,从而让它执行额外操作。DBI可以:

1.访问进程内存
2.在应用程序运行时覆盖函数
3.从导入的类调用函数
4.在堆上查找对象实例并使用
5.Hook、跟踪和拦截函数等

怎么使用呢?

pip install frida (python环境)
1.下载服务器二进制文件frida-server要和pip的版本相同
2.$ adb push frida-server-10.0.1-android-arm /data/local/tmp/frida-server
3.$ adb shell
4.cd /data/local/tmp
5.chmod 755 frida-server
6../frida-server
查看frida-server是否启动成功:
frida-ps -U能看到安卓的应用进程就行

启动成功后开始写python和具体的hook代码。
python代码:

import sys
import frida
def onmsg(msg, data):
    print(msg)
jscode = open('qxb.js', 'r', encoding='utf8').read()
session = frida.get_usb_device().attach("com.bertadata.qxb")
script = session.create_script(jscode)
script.on('message', onmsg)
script.load()
sys.stdin.read()

现在可以对该app的具体方法hook
需要hook是MessageUtil类下的具体方(该代码为参考代码,并不是该app的实际应用代码)

setImmediate(function () {
//延迟1秒调用Hook方法
    console.log('start----')
    setInterval(test, 1000);
    // test()
});

function test() {
    Java.perform(function () {

        var hook = Java.use('com.类名');
        hook.方法.overload('传参类型', 'java.lang.String', 'java.lang.String').implementation = function (a1, a2, a3) {
            var ss = this.方法(a1, a2, a3);//调用是本方法
            console.log('a1参数1 =' + a1);//打印
            console.log('a2参数2 =' + a2);
            console.log('a3参数3 =' + a3);
            console.log('res=' + ss);
            return ss;
        };

执行python代码就可以直接打印出需要秘钥和偏移

拿到秘钥之后我们就需要验证该秘钥了,使用第一篇的token进行解密就可以咯。在实际中需要对改密要进行byte数组转换,更具体的转换方法。
 

### apptoken在IT系统或应用中的使用方法及实现方式 #### 一、apptoken的概念及其分类 apptoken通常是指用于应用程序间通信的身份验证令牌,其核心作用是在分布式环境中确认客户端身份并授予相应权限。根据具体应用场景的不同,apptoken可以分为多种类型,例如原始账号密码类别(用户名和密码)、API应用ID/KEY类别、会话ID类别以及接口调用类别等[^1]。 #### 二、apptoken的技术实现基础 apptoken的设计往往依赖于OAuth 2.0框架或者OpenID Connect协议。其中,OAuth 2.0提供了标准化的授权机制,而OpenID Connect则进一步扩展了OAuth 2.0的功能,使其能够支持更复杂的认证场景,比如单点登录(SSO)[^3]。这两种技术都强调通过安全的方式传递token,并确保用户的隐私不受侵犯。 #### 三、具体的实现步骤和技术要点 以下是几种常见的apptoken实现方案: 1. **基于OAuth 2.0的应用程序授权** - 客户端向授权服务器发起请求获取access token。 - 授权服务器验证客户端凭证后返回一个短期有效的access token给客户端。 - 客户端携带此token访问受保护资源。 ```java public String getAccessToken(String clientId, String clientSecret){ //模拟从远程服务获取accessToken的过程 return "your_access_token"; } ``` 2. **利用JWT(JSON Web Token)作为承载形式** JWT因其轻量级特性成为构建apptokens的理想选择之一。它可以通过头部(header),载荷(payload)和签名(signature)三个部分组成,便于跨平台解析与验证。 ```javascript const jwt = require('jsonwebtoken'); let token = jwt.sign({data: 'payload'}, 'secret', { expiresIn: '1h' }); console.log(token); ``` 3. **结合OpenID Connect完成联合登录** 当涉及到多个系统的统一身份管理时,采用OpenID Connect能简化操作流程。用户只需在一个地方注册账户便可在其他关联站点无缝切换。 ```html <!-- 示例HTML片段 --> <a href="https://example.com/auth?response_type=id_token&client_id=CLIENT_ID">Login</a> ``` 4. **针对移动设备优化的安全措施** 对于移动端而言,考虑到网络环境复杂多变等因素影响,建议实施额外防护手段如TLS加密通道传输敏感数据;定期轮换refresh tokens以防长期暴露风险等等[^2]。 #### 四、实际案例分析——Android APP进程保活下的Token维护策略 当面对像安卓操作系统这样可能存在频繁清理后台任务的情况时,为了保持长时间在线状态,则需特别注意如何妥善保存及更新apptoken。例如,在设计APP进程保活白名单功能的同时也要兼顾到token的有效期管理和异常情况处理逻辑[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值