Crack App | 某练习平台 App 第 5 题参数 Token 加密逻辑分析

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: Crack App | 某练习平台 App 第 5 题参数 Token 加密逻辑分析

今日目标

这里以崔大爬虫练习站 app 的第 5 题作为逆向题目

aHR0cHM6Ly9zY3JhcGUuY2VudGVyLw==

抓包分析

先下载 app ,然后简单抓个包看看

可以看到请求中带有一个加密的参数token

返回的是一个json字符串

下拉刷新可以看到token是不断变化的,现在用jadx反编译看看,找找token的逻辑

静态分析定位逻辑

通过检索"token"

在结果处查找用例

可以找到下面的代码处

然后这里的Encrypt可以看到使用了shaEncrypt这个方法

通过shaEncrypt的逻辑可以知道这里进行了一次sha1加密

未知的就是传入的str的值,这一步可以通过frida hook得到结果

动态调试确认逻辑

简单写一个frida脚本,打印一下shaEncrypt的入参和返回值

console.log("脚本加载成功");
function main(){
    Java.perform(function(){
        var Encrypt = Java.use("com.goldze.mvvmhabit.utils.Encrypt");
        Encrypt.shaEncrypt.implementation = function (arg1){
            console.log("\Encrypt.shaEncrypt\n");
            console.log("Input str=" + arg1 + "\n");
            var shaEncrypt_result = this.shaEncrypt(arg1);
            console.log("\nOut Rc=" + shaEncrypt_result);
            return shaEncrypt_result;
        }
    })
}
setImmediate(main)

可以看到入参的参数的就是url + , + 时间戳

算法是sha1,这一点可以通过加密站来验证

接下来将结果和时间戳经过了一次base64,得到最终的结果

我们来测试一下看看是不是一样的

console.log("脚本加载成功");
function main(){
    Java.perform(function(){
        var Encrypt = Java.use("com.goldze.mvvmhabit.utils.Encrypt");
        Encrypt.shaEncrypt.implementation = function (arg1){
            console.log("\Encrypt.shaEncrypt\n");
            console.log("Input str=" + arg1 + "\n");
            var shaEncrypt_result = this.shaEncrypt(arg1);
            console.log("\nOut Rc=" + shaEncrypt_result);
            return shaEncrypt_result;
        }
        var Base64 = Java.use("android.util.Base64");
        Base64.encodeToString.overload('[B', 'int').implementation = function (arg1,arg2){
            var encodeToString_result = this.encodeToString(arg1,arg2);
            console.log("\nOut Rc=" + encodeToString_result);
            return encodeToString_result;
        }
    })
}
setImmediate(main)

可以看到这里打印的结果验证了我们的猜想。

所以token的生成算法就是base64(sha1(path,时间戳),时间戳)

写一段代码测试一下

import requests
import hashlib
import base64
import time
def encode_sha1(data, encode_method="utf-8"):
    """
    sha1加密
    :param data: 待加密字符串
    :param encode_method: 编码方法,默认utf-8
    :return: 40长度字符串
    """
    bytes_data = data.encode(encode_method)
    m = hashlib.sha1()
    m.update(bytes_data)
    return m.hexdigest()
def encode_base64(data, encode_method="utf-8"):
    """
    base64加密
    :param data: 待加密字符串
    :param encode_method: 编码方法,默认utf-8
    :return:
    """
    bytes_data = data.encode(encode_method)
    result = base64.b64encode(bytes_data).decode()
    return result
def get_params():
    # base64(sha1(path,时间戳),时间戳)
    path = "/api/movie,"
    time_str = str(int(time.time()))
    sha1_result = encode_sha1( path + time_str)
    base64_params = sha1_result + ',' + time_str
    base64_result = encode_base64(base64_params)
    # print(base64_result)
    return base64_result
def main():
    headers = {
        'log-header': 'I am the log request header.',
        'Host': 'app5.scrape.center',
        'Connection': 'Keep-Alive',
        'Accept-Encoding': 'gzip',
        'User-Agent': 'okhttp/3.10.0',
    }
    params = (
        ('offset', '20'),
        ('limit', '10'),
        ('token', get_params()),
    )
    response = requests.get('https://app5.scrape.center/api/movie/', headers=headers, params=params)
    print(response.text)
if __name__ == '__main__':
    main()

结果如下

好了,以上就是今天的全部内容了。

我是没有更新就在摸鱼的咸鱼

收到请回复~

我们下次再见。

相关文章
|
2月前
|
UED
|
26天前
|
安全 网络协议 网络安全
【Azure 环境】从网络包中分析出TLS加密套件信息
An TLS 1.2 connection request was received from a remote client application, but non of the cipher suites supported by the client application are supported by the server. The connection request has failed. 从远程客户端应用程序收到 TLS 1.2 连接请求,但服务器不支持客户端应用程序支持的任何密码套件。连接请求失败。
|
4月前
|
数据采集 数据可视化 数据挖掘
基于python django的scrapy去哪儿网数据采集与分析,包括登录注册和可视化大屏,有md5加密
本文介绍了一个基于Python和Django框架,使用Scrapy进行去哪儿网数据采集与分析的项目,包括实现登录注册功能、MD5加密以及通过可视化大屏展示分析结果的综合系统。
基于python django的scrapy去哪儿网数据采集与分析,包括登录注册和可视化大屏,有md5加密
|
4月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
4月前
|
缓存 前端开发 Java
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
|
Java
app令牌的一个token实现
app登陆验证不能使用session来判断了。然后查资料都说用令牌,没找到合适的方法,我的眼界太小。另外,越来越感觉基础的重要,比如,session是什么,我竟无言以对。不知道session是什么,怎么来做验证呢。
969 0
|
2月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
678 7
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
740 1
|
1天前
|
供应链 搜索推荐 API
1688APP原数据API接口的开发、应用与收益(一篇文章全明白)
1688作为全球知名的B2B电商平台,通过开放的原数据API接口,为开发者提供了丰富的数据资源,涵盖商品信息、交易数据、店铺信息、物流信息和用户信息等。本文将深入探讨1688 APP原数据API接口的开发、应用及其带来的商业收益,包括提升流量、优化库存管理、增强用户体验等方面。
17 6