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()

结果如下

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

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

收到请回复~

我们下次再见。

相关文章
|
25天前
|
安全
【Azure App Service】App service无法使用的情况分析
App Service集成子网后,如果子网网段中的剩余IP地址非常少的情况下,会在App Service实例升级时( 先加入新实例,然后在移除老实例 )。新加入的实例不能被分配到正确的内网IP地址,无法成功的访问内网资源。 解决方法就是为App Service增加子网地址, 最少需要/26 子网网段地址。
|
1月前
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
【Azure Function App】本地运行的Function发布到Azure上无法运行的错误分析
|
1月前
【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?
【Azure Logic App】在逻辑应用中开启或关闭一个工作流是否会对其它工作流产生影响呢?
|
1月前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
1月前
|
API 网络架构
【Azure Logic App】在中国区的微软云服务上,使用逻辑应用是否可以下载SharePoint上的文件呢?
【Azure Logic App】在中国区的微软云服务上,使用逻辑应用是否可以下载SharePoint上的文件呢?
【Azure Logic App】在中国区的微软云服务上,使用逻辑应用是否可以下载SharePoint上的文件呢?
|
1月前
|
安全 API 网络架构
【Azure Logic App】使用 Easy Auth 在标准逻辑应用(Standard Logic App)中触发工作流
【Azure Logic App】使用 Easy Auth 在标准逻辑应用(Standard Logic App)中触发工作流
|
1月前
|
开发者
【Azure Logic App】中国区标准版本的逻辑应用(Standard Logic App)无法查看历史执行记录的解决之道
【Azure Logic App】中国区标准版本的逻辑应用(Standard Logic App)无法查看历史执行记录的解决之道
|
1月前
|
开发框架 缓存 .NET
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack Traces)
|
2天前
|
XML 移动开发 前端开发
使用duxapp开发 React Native App 事半功倍
对于Taro的壳子,或者原生React Native,都会存在 `android` `ios`这两个文件夹,而在duxapp中,这些文件夹的内容是自动生成的,那么对于需要在这些文件夹中修改的配置内容,例如包名、版本号、新架构开关等,都通过配置文件的方式配置了,而不需要需修改具体的文件
|
2天前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。