得物APP破解

原文件下载路径:
【移动安全与逆向工程】得物app破解
【移动安全与逆向工程】得物app破解源码
【移动安全与逆向工程】得物app破解所需软件及插件

说明:文中所示案例仅供学习使用,请勿进行商业用途!!!

1 得物目标

# 采集推荐信息
# 版本
	-4.74.5

在这里插入图片描述

2 绕过强制更新

# 先断网,打开app,再联网即可

在这里插入图片描述

3 抓包

3.1 使用SocksDroid

# 该app禁用了手机端代理,所以我们使用SocksDroid代理
# 操作步骤
    - 手机系统代理删除
    - 基本配置

切记:在使用前删除手机上设置的系统代理。


# 根据抓包分析,我们发现/sns-rec/v1/recommend  地址为首页推荐接口
# 地址如下:https://app.dewu.com/sns-rec/v1/recommend/all/feed
	-地址:https://app.dewu.com/sns-rec/v1/recommend/all/feed
    -请求方式:get
    -请求头:
    	-X-Auth-Token:必须带
    -请求参数:
    	-newSign:这个接口不需要带,学习破解它,后续别的接口需要带

在这里插入图片描述

image-20230801161344280

4 破解newSign

4.1 反编译搜索newSign

# 1 把app拖入 jadx中,反编译,搜索     "newSign
# 2 搜出8个,但实际上只有5个有效,5个都在同一个类中---》随便点一个进去看--》hook验证
# 3 发现它是写在拦截器中---》所有请求,都会带这个newSign
# 4 最终调用了RequestUtils.c
# 5 hook一下 RequestUtils.c, 确认有没有走

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.2 Hook-RequestUtils.c

import frida
import sys

rdev = frida.get_remote_device()
session = rdev.attach("得物(毒)")

scr = """
Java.perform(function () {
    var RequestUtils = Java.use("com.shizhuang.duapp.common.utils.RequestUtils");
    RequestUtils.c.implementation = function(map,j){
        console.log("----------------------------------------");
        console.log('1.参数字典为:',map); // 此处直接打印map,发现打印的是对象,我们需要转换一下
        console.log('1.参数字典为:',JSON.stringify(map));  // 查看一下类型 :<instance: java.util.Map, $className: java.util.HashMap>,把HashMap值取出来,做个转换,如下
        var Map = Java.use('java.util.HashMap');
        var obj = Java.cast(map, Map);
        console.log('1.参数字典为:',obj.toString());
        var res = this.c(map,j);
        console.log("4.newSign结果:", res);
        return res;
    }
});
"""
script = session.create_script(scr)


def on_message(message, data):
    print(message, data)


script.on("message", on_message)

script.load()
sys.stdin.read()

'''

### 参数字典为: 
{abValue=1, deliveryProjectId=0, abRectagFengge=0, abType=social_brand_strategy_v454, limit=20, lastId=, abRecReason=0, abVideoCover=2}

### newSign结果: 
16aa2e250ac6c28c3166cce3d0561be8


### 拿到newSign和 抓包抓包的newSign比较发现是一样的,确定位置
'''

*/

在这里插入图片描述

在这里插入图片描述

4.3 分析RequestUtils.c核心逻辑

public static synchronized String c(Map<String, String> map, long j2) throws UnsupportedEncodingException {
   
   
    synchronized (RequestUtils.class) {
   
   
        PatchProxyResult proxy = PatchProxy.proxy(new Object[]{
   
   map, new Long(j2)}, null, changeQuickRedirect, true, 6612, new Class[]{
   
   Map.class, Long.TYPE}, String.class);
        if (proxy.isSupported) {
   
   
            return (String) proxy.result;
        } else if (map == null) {
   
   
            return "";
        } else {
   
   
            // 1 参数拼接
            // 把uuid,platform,v,loginToken,timestamp放入map中
            map.put("uuid", DuHttpConfig.d.getUUID());
            map.put("platform", "android");
            map.put("v", DuHttpConfig.d.getAppVersion());
            map.put("loginToken", DuHttpConfig.d.getLoginToken());
            map.put("timestamp", String.valueOf(j2));
            ArrayList arrayList = new ArrayList(map.entrySet());
            // 2 把map转成ArrayList,并进行排序
            Collections.sort(arrayList, new Comparator<Map.Entry<String, String>>() {
   
    
                public static ChangeQuickRedirect changeQuickRedirect;
                @Override 
                public int compare(Map.Entry<String, String> entry, Map.Entry<String, String> entry2) {
   
   
                    PatchProxyResult proxy2 = PatchProxy.proxy(new Object[]{
   
   entry, entry2}, this, changeQuickRedirect, false, 6618, new Class[]{
   
   Map.Entry.class, Map.Entry.class}, Integer.TYPE);
                    return proxy2.isSupported ? ((Integer) proxy2.result).intValue() : entry.getKey().toString().compareTo(entry2.getKey());
                }
            });
            // 3 构建字符串
            StringBuilder sb = new StringBuilder();
            for (int i2 = 0; i2 < arrayList.size(); i2++) {
   
   
                Map.Entry entry = (Map.Entry) arrayList.get(i2);
                sb.append(((String) entry.getKey()) + ((String) entry.getValue()));
            }
            String sb2 = sb.toString();
            DuHttpConfig.LogConfig logConfig = DuHttpConfig.f15800h;
            String str = f16243a;
            logConfig.d(str, "StringToSign " + sb2)
### CleanMyMac macOS 系统清理优化工具下载与使用教程 #### 一、关于CleanMyMac CleanMyMac X 是一款专为 macOS 设计的专业级系统清理和优化工具,提供超过30种实用的功能来维护 Mac 的健康状态。这些功能涵盖了从基本的垃圾文件清除到更复杂的隐私保护措施等多个方面[^1]。 #### 二、获取CleanMyMac 为了获得最佳用户体验并确保软件的安全性和合法性,建议通过官方网站购买正版授权版本。虽然网络上可能存在所谓的“免费”资源链接,但它们往往伴随着潜在风险,如恶意程序感染或版权侵犯等问题。因此,在考虑任何第三方提供的所谓破解版之前,请三思而后行。 对于希望试用该产品的用户来说,官方通常会提供一定期限内的免费试用期,这期间可以充分体验所有特性而无需支付费用。访问官网后按照提示操作即可轻松完成安装过程[^2]。 #### 三、初次运行设置向导 首次启动应用程序时会出现简单的引导界面,指导新用户熟悉主要组件及其用途。此部分旨在让用户快速掌握如何利用各项服务改善设备表现;同时也允许自定义某些偏好选项以适应个性化需求[^4]。 #### 四、核心功能概览 - **智能扫描器**:一键检测整个硬盘上的冗余数据项(包括但不限于临时互联网文件夹内容、已损坏的应用残留以及过期的日志条目),随后给出具体分析报告以便进一步处理。 - **磁盘医生模块**:专门针对存储介质健康状况进行评估,并修复可能存在的错误分区表记录或是丢失簇链路等低级别问题。 - **隐私防护中心**:全面审查浏览器历史痕迹、剪贴板缓存以及其他敏感信息源,防止意外泄露给未经授权方知晓的机会。 - **扩展管理面板**:集中展示当前加载的所有插件列表,支持便捷地启用/禁用特定项目从而减少不必要的开销消耗。 - **自动化计划任务调度器**:设定周期性的执行策略,使日常维护工作变得更加省心高效[^3]。 ```bash # 打开终端输入命令打开CleanMyMac X open /Applications/CleanMyMac\ X.app/ ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生而自由爱而无畏

你的打赏是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值