Frida挂钩Java层代码与协议分析

news2024/11/24 4:03:00

Hook类中普通方法

在本文中,我们继续以某嘟牛应用为例,在用户点击登录按钮后,哪个方法会被调用。我们在上一篇文章中提到,搜索关键词 “Encrypt” 后,发现两个包含该字符串的 Java 方法。接下来,我们通过 Frida 分别 Hook 这两个方法,以测试点击登录后会调用哪个方法。以下是 Frida 脚本代码:

function HookMethod() {
    Java.perform(function () {
        var JsonRequest = Java.use("com.dodonew.online.http.JsonRequest");
        console.log("JsonRequest = ", JsonRequest);
        JsonRequest.paraMap.implementation = function (addMap){
            console.log("addMap = ", addMap);
            this.paraMap(addMap);
        }
        JsonRequest.addRequestMap.overload('java.util.Map', 'int').implementation = function (arg0,arg1) {
            console.log("addRequestMap params: ", arg0, arg1);
            var HashMap_arg0 = Java.cast(arg0, Java.use("java.util.HashMap"));
            console.log("addRequestMap params: ", HashMap_arg0.toString());
            this.addRequestMap(arg0, arg1);
        }
    });
}
function main () {
    HookMethod();
}
setImmediate(main);

在终端中执行以下命令以注入我们的 JavaScript 代码:

frida -U -f com.dodonew.online -l .\demo.js --no-pause

执行结果如下所示:
在这里插入图片描述
通过结果我们可以看出,点击登录后最终执行的方法为 addRequestMap。该方法的代码如下:

public void addRequestMap(Map<String, String> addMap, int a) {
    // 获取当前系统时间的时间戳,并将其转换为字符串
    String time = System.currentTimeMillis() + "";
    // 如果传入的 addMap 为空,则初始化一个新的 HashMap
    if (addMap == null) {
        addMap = new HashMap<>();
    }
    // 将时间戳加入到 addMap 中,键为 "timeStamp"
    addMap.put("timeStamp", time);
    // 调用 RequestUtil 类的 paraMap 方法,对 addMap 进行参数处理,生成一个包含签名的字符串
    String code = RequestUtil.paraMap(addMap, Config.BASE_APPEND, "sign"); 
    // 调用 RequestUtil 类的 encodeDesMap 方法,对生成的字符串进行 DES 加密,得到加密后的字符串
    String encrypt = RequestUtil.encodeDesMap(code, this.desKey, this.desIV);
    // 创建一个新的 JSONObject 对象
    JSONObject obj = new JSONObject();
    try {
        // 将加密后的字符串放入 JSON 对象中,键为 "Encrypt"
        obj.put("Encrypt", encrypt);
        // 将 JSON 对象转换为字符串,并赋值给 mRequestBody
        this.mRequestBody = obj + "";
    } catch (JSONException e) {
        // 捕获并打印 JSON 异常
        e.printStackTrace();
    }
}

协议分析

通过以上终端的输出,我们可以得知,输入的手机号码和密码并没有进行加密。因此,我们需要继续跟进代码,首先进入 RequestUtil.paraMap 方法,代码如下:

public static String paraMap(Map<String, String> addMap, String append, String sign) {
    try {
        // 获取传入的 Map 的键集
        Set<String> keyset = addMap.keySet();
        // 用于拼接字符串的 StringBuilder
        StringBuilder builder = new StringBuilder();
        // 用于存储键值对的列表
        List<String> list = new ArrayList<>();
        
        // 遍历键集,将每个键值对以 "key=value" 的形式添加到列表中
        for (String keyName : keyset) {
            list.add(keyName + "=" + addMap.get(keyName));
        } 
        // 对列表进行排序
        Collections.sort(list);
        // 遍历排序后的列表,将每个键值对拼接到 StringBuilder 中,以 "&" 分隔
        for (int i = 0; i < list.size(); i++) {
            builder.append(list.get(i));
            builder.append("&");
        }
        // 将追加字符串(append)拼接到字符串的末尾
        builder.append("key=" + append);
        // 计算字符串的 MD5 哈希值,并转换为大写
        String checkCode = Utils.md5(builder.toString()).toUpperCase();
        // 将计算出的签名(checkCode)放入传入的 Map 中,键为 "sign"
        addMap.put("sign", checkCode);
        // 将 Map 按键排序后转换为 JSON 字符串
        String result = new Gson().toJson(sortMapByKey(addMap));
        // 打印日志,调试用
        Log.w(AppConfig.DEBUG_TAG, result + "   result");
        // 返回生成的 JSON 字符串
        return result;
    } catch (Exception e) {
        // 捕获并打印异常
        e.printStackTrace();
        return "";
    }
}

在 paraMap 方法中,调用了 Utils.md5 方法(调用 Utils.md5 之前都是明文)。为了了解传入的值如何进行 MD5 加密,我们需要 Hook 这个方法,查看传入的数据和加密后的结果,代码如下:

var utils = Java.use("com.dodonew.online.util.Utils");
utils.md5.implementation = function (arg0) {
    console.log("md5 params: ", arg0);
    var retval = this.md5(arg0);
    console.log("md5 retval: ", retval);
    return retval;
}

运行结果如下:
在这里插入图片描述
通过测试可知,Utils.md5 为标准的 MD5 算法。

在执行完成 RequestUtil.paraMap 方法后,返回的为 JSON 格式的字符串。接着我们 Hook RequestUtil.encodeDesMap 方法,代码如下:

var RequestUtil = Java.use("com.dodonew.online.http.RequestUtil");
RequestUtil.encodeDesMap.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (arg0,arg1,arg2) {
    console.log("encodeDesMap arg0: ", arg0);
    console.log("encodeDesMap arg1: ", arg1);
    console.log("encodeDesMap arg2: ", arg2);
    var ret = this.encodeDesMap(arg0,arg1,arg2);
    console.log("ret = ",ret);
    return ret;
}

此时我们可以看到传入的三个参数,如下图:
在这里插入图片描述
至此我们已经看到了输入的明文账号和密码,以及加密后的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1973573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AGI思考探究的意义、价值与乐趣Ⅳ

探究in context或Prompt对于LLM来说其根本意义&#xff0c;in context & Prompt Learning带给我们更深一层的提示是什么&#xff1f; 文章里的探索希望能够将in context或Prompt置身于一个更全局的视角来看待&#xff1a;将其视为在真实世界中时空认知流形所映射为数据流形…

路由器IP互联无线对讲系统解决方案

一、项目概况 随着信息化的全面深入发展&#xff0c;各行各业的通信需求日益增长&#xff0c;传统的通信方式无法满足跨网络、跨系统、跨媒介的通信互联互通&#xff0c;打破信息孤岛、提高协同效率&#xff0c;成为当前各行业融合通信的首要任务。尤其大型企业、学校、医院等…

第14课 Scratch少儿编程 入门篇:抓蝴蝶

开车自驾去旅行 故事背景&#xff1a; 春天到了&#xff0c;让我们一起春游&#xff01;公园的草坪上有五颜六色的花朵和翩翩起舞的蝴蝶&#xff0c;让我们拿起工具&#xff0c;去捉蝴蝶吧&#xff01;&#xff01; 程序原理: 添加绿色的草地角色和蝴蝶的角色&#xff0c;给…

【C++程序设计】——利用数组处理批量数据(一)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4…

使用 Python 制作一个属于自己的 AI 搜索引擎

1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…

5G三大场景:eMBB、mMTC、uRLLC

1G,2G,3G,4G,5G有什么区别&#xff1f;5G的优势在哪&#xff1f;有什么应用&#xff1f; 1G,2G,3G,4G,5G有什么区别&#xff1f;5G的优势在哪&#xff1f;有什么应用&#xff1f;_3g4g5g的区别和作用-CSDN博客 从1G到4G&#xff0c;移动通信的核心是人与人之间的通信&#xff0…

Spring Cache框架(AOP思想)+ Redis实现数据缓存

文章目录 1 简介1.1 基本介绍1.2 为什么要用 Spring Cache&#xff1f; 2 使用方法2.1 依赖导入&#xff08;Maven&#xff09;2.2 常用注解2.3 使用步骤2.4 常用注解说明1&#xff09;EnableCaching2&#xff09;CachePut3&#xff09;Cacheable4&#xff09;CacheEvict 3 注意…

【云服务器】vscode + onethingAi + SSH远程连接

通过VS code远程连接服务器&#xff0c;并进行上传和下载文件操作_vs code 上传制定文件-CSDN博客 vscode远程连接服务器&#xff08;remote ssh&#xff09;上传本地文件到服务器(sftp)_vscode上传文件到服务器-CSDN博客 vscode连接远程服务器&#xff08;傻瓜式教学&#x…

批发行业手机开单-手机开单 电子单 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、手机开单的好处 批发行业的业务拓展总是在路上&#xff0c;而手机开单的出现成为了业务人员的得力助手。无论身处何地&#xff0c;都能轻松操作&#xff0c;迅速完成开单流程&#xff0c;大幅提高工作效率。而且&#xff0c;通过手机还能明确开单人身份&#xff0c;自动完…

KaiwuDB 产品总监李月飞:让中国物联网用上放心的数据库产品

​2024年7月17日&#xff0c;KaiwuDB 产品总监李月飞受邀于 2024 可信数据库发展大会“能源与政务数据库应用创新”分论坛发表演讲。以下是李月飞主题演讲《深耕数据良田&#xff0c;KaiwuDB 洞见能源产业数字新生力》精华实录。 数据&#xff0c;给能源变革带来新的可能 众所…

基于SpringCloud alibaba的流媒体视频点播平台

基于SpringCloud alibaba的流媒体视频点播平台 前言整体架构具体实现视频播放 总结 先把项目地址放这 》基于SpringCloud alibaba的流媒体视频点播平台《 然后咱们来看看这个项目是干啥的。 前言 今天和大家分享一个项目&#xff0c;基于SpringCloud alibaba的流媒体视频点…

46 集合对象的创建与删除

集合&#xff08;set&#xff09;属于 Python 无序可变序列&#xff0c;使用一对大括号作为定界符&#xff0c;元素之间使用逗号分隔&#xff0c;同一个集合内的每个元素都是唯一的&#xff0c;元素之间不允许重复。 集合中只能包含数字、字符串、元组等不可变类型&#xff08;…

吴恩达老师机器学习作业-ex7

导入库&#xff0c;读取数据&#xff0c;查看数据类型等进行分析&#xff0c;可视化数据 import matplotlib.pyplot as plt import numpy as np import scipy.io as sio#读取数据 path "./ex7data2.mat" data sio.loadmat(path) # print(type(data)) # print(data…

安防监控平台智能边缘分析一体机视频智能分析客流统计检测算法详细介绍

在当今数字化时代&#xff0c;数据的重要性不言而喻。特别是在零售、交通、安防等行业中&#xff0c;准确的客流统计数据对于业务决策、资源优化和安全管理至关重要。随着技术的进步&#xff0c;智能边缘分析一体机的出现为客流统计提供了一种高效、实时的解决方案。本文将详细…

【教育宝-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

windows下设置java环境变量

1.打开window的环境变量设置 右键开始菜单选择系统 选择高级系统设置&#xff1a; 点击环境变量 2.在系统变量 新增 JAVA_HOME&#xff1b;该变量的值 选择jdk所在的目录即可。 JAVA_HOME: D:\Program Files\Java\jdk1.8.0_131 3. 在系统变量新增 classpath; 该变量的值设置…

校园水电费管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;教师管理&#xff0c;宿舍信息管理&#xff0c;学生缴费管理&#xff0c;教师缴费管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我的 开发系统…

MSA+抑郁症模型总结(三)(论文复现)

MSA抑郁症模型总结&#xff08;三&#xff09;&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 MSA抑郁症模型总结&#xff08;三&#xff09;&#xff08;论文复现&#xff09;热门研究领域&#xff1a;情感计算的横向发展一、概述二、论…

了解关于标准化的知识

1.标准化组织 1.1国家标准化管理委员会(Standardization Administration of the Peoples Republic of China&#xff0c;简称SAC) TC--(Technical Committee) 技术委员会. SAC/TC,就是“国家标准化管理委员会”下属的一个专项或一个行业的“技术委员会或技术小组”&a…

MySQL--查询数据

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、基本查询语句 MySQL从数据表中查询数据的基本语句为SELECT语句。其基本格式为&#xff1a; select {* | <字段列表>}[from <表1>,&l…