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

简介: 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()

结果如下

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

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

收到请回复~

我们下次再见。

相关文章
|
11月前
|
JSON 监控 数据格式
1688 item_search_app 关键字搜索商品接口深度分析及 Python 实现
1688开放平台item_search_app接口专为移动端优化,支持关键词搜索、多维度筛选与排序,可获取商品详情及供应商信息,适用于货源采集、价格监控与竞品分析,助力采购决策。
|
10月前
|
小程序 搜索推荐 JavaScript
引入小程序平台对app有啥好处
引入小程序平台对app有啥好处
645 155
|
11月前
|
缓存 监控 Android开发
京东 item_get_app 接口深度分析及 Python 实现
京东item_get_app接口可获取商品原始详情数据,包含更丰富的字段和细节,适用于电商分析、价格追踪等场景。需通过认证获取权限,支持字段筛选和区域化数据查询。
|
12月前
|
缓存 数据挖掘 API
淘宝 item_get_app 接口深度分析及 Python 实现
淘宝item_get_app接口是淘宝开放平台提供的移动端商品详情数据获取接口,相较PC端更贴近APP展示效果,支持获取APP专属价格、促销活动及详情页结构,适用于电商导购、比价工具、数据分析等场景。接口采用appkey+appsecret+session认证机制,需申请相应权限。本文提供Python调用示例及使用注意事项,帮助开发者高效对接移动端商品数据。
|
移动开发 前端开发 JavaScript
鸿蒙NEXT时代你所不知道的全平台跨端框架:CMP、Kuikly、Lynx、uni-app x等
本篇基于当前各大活跃的跨端框架的现状,对比当前它们的情况和未来的可能,帮助你在选择框架时更好理解它们的特点和差异。
1308 0
|
JavaScript
TypeOrmModule 从 app.module.ts 抽离到 database.module.ts 后出现错误的原因分析
本文分析了TypeORM实体元数据错误的成因,主要涉及实体注册方式、路径解析差异及模块结构变化导致的关系解析问题,并提供了具体解决方案和最佳实践建议。
311 56
|
11月前
|
缓存 供应链 开发者
1688 item_get_app 接口深度分析及 Python 实现
1688平台item_get_app接口专为移动端设计,提供商品原始详情数据,包含批发价格、起订量、供应商信息等B2B特有字段,适用于采购决策、供应链分析等场景。接口需通过appkey+access_token认证,并支持字段筛选,返回结构化数据,助力企业实现智能采购与供应商评估。
|
12月前
|
数据采集 数据可视化 API
驱动业务决策:基于Python的App用户行为分析与可视化方案
驱动业务决策:基于Python的App用户行为分析与可视化方案
|
存储 缓存 前端开发
《仿盒马》app开发技术分享-- 用户登录页(业务逻辑)(21)
上一节我们实现了静态的用户登录页,这一节我们需要给他添加上业务逻辑,实现跟云数据库的互通,同时跟整个应用关联起来,因为我们还没有实现用户的注册页面,所以这里我们在云数据库的用户数据插入暂时先不做同用户名的校验,我们在云端先插入几条数据,暂时专注于查询即可
280 5