IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 安卓逆向之狐友sig破解 -> 正文阅读

[移动开发]安卓逆向之狐友sig破解


前言

本文主要分析安卓-狐友app v5.2.7
工具: jadx-gui、frida、charles、Pixel3


提示:以下是本篇文章正文内容,下面案例可供参考

一、抓包确定参数sig

1.1 charles抓包

由下图可见body中含有关键字sig
在这里插入图片描述

1.2 apipost验证

为了验证该app校验sig值,用apipost模拟发送请求,去掉sig返回响应异常。
在这里插入图片描述

那么由此可见要想请求成功,必须分析还原出sig值

二、jadx-gui分析

2.1 获取package

首先还是先打开jadx-gui,拖入狐友apk等待片刻。资源文件 > AndroidManifest.xml > 搜索"package"。 如下图package=“com.sohu.sohuhy”,为了下一步hook准备。
在这里插入图片描述

package=“com.sohu.sohuhy”

2.2 分析sig

打开jadx-gui的搜索按钮,搜索"sig",这里有个小技巧为了更加快速的定位到关键参数位置。body、headers里的参数一般都是map.put(“sig”, xxx) ,所以在搜索的时候可以加上"关键参数名"。如下图重点看map.put()这几个方法
在这里插入图片描述

经过动态调试确定sig的加密在这个函数中生成
在这里插入图片描述
在这里插入图片描述

jadx代码如下:

    public final Map<String, Object> getSignMap(Map<String, Object> map) {
        this.sig = u.a(map, hy.sohu.com.app.a.h);
        map.put("sig", this.sig);
        map.remove("S-PID");
        map.remove("S-PPID");
        map.remove("S-CID");
        return map;
    }
2.3 动态调试

this.sig = u.a(map, hy.sohu.com.app.a.h);

上面我们已经知道了sig的加密方法,主要是u.a()方法,参数1. map 参数2. hy.sohu.com.app.a.h
双击追下hy.sohu.com.app.a.h是个什么
在这里插入图片描述

hy.sohu.com.app.a.h = “e30I0052O0l3W6B0”

接着分析map,决定hook下u.a()
在这里插入图片描述
u.a() jadx代码如下:

public class u {
    public static String a(Map<String, Object> map, String str) {
        TreeMap treeMap = new TreeMap();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            Object value = entry.getValue();
            String key = entry.getKey();
            if (!key.equals("sig")) {
                treeMap.put(key, value);
            }
        }
        StringBuilder sb = new StringBuilder();
        for (Map.Entry entry2 : treeMap.entrySet()) {
            Object value2 = entry2.getValue();
            StringBuilder sb2 = new StringBuilder();
            sb2.append((String) entry2.getKey());
            sb2.append("=");
            if (value2 == null) {
                value2 = "";
            }
            sb2.append(value2);
            sb.append(sb2.toString());
        }
        return a(sb.toString() + str).toLowerCase();
    }

hook结果如下图:
在这里插入图片描述
frida hook u.a()jadx代码如下:

 # -*- coding: utf-8 -*-
# @Time    : 2022/03/01 14:07
# @Author  : codeL
# @IDE :PyCharm
import frida, sys

def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

jscode_hook = """
    Java.perform(
        function(){
            var func = Java.use("hy.sohu.com.comm_lib.net.u");
            var HashMap = Java.use('java.util.HashMap');
            func.a.overload('java.util.Map', 'java.lang.String').implementation = function (map, str){
                var args_map = Java.cast(map, HashMap);
                console.log("参数1: "+args_map.toString());
                console.log("参数2: "+str)
                var res = this.a(map, str);
                console.log("返回: "+res);
                return res;
            }
        }

    )
"""

process = frida.get_usb_device().attach('com.sohu.sohuhy')
script = process.create_script(jscode_hook)
script.on('message', on_message)
print('[*] Hook Start Running')
script.load()
sys.stdin.read()

继续分析:

return a(sb.toString() + str).toLowerCase();
在这里插入图片描述
jadx代码如下:


    public static String a(String str) {
        try {
            MessageDigest instance = MessageDigest.getInstance(HashEncrypt.ALG_MD5);
            StringBuilder sb = new StringBuilder();
            byte[] digest = instance.digest(str.getBytes("UTF-8"));
            for (byte b : digest) {
                sb.append(Integer.toHexString((b & 240) >>> 4));
                sb.append(Integer.toHexString(b & a.q));
            }
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

frida hook结果:
在这里插入图片描述

参数1: S-CID=xxxS-PID=xxx-PPID=xxxapp_key_vs=5.26.0appid=330000flyer=1646137089327gid=x011050202ff14cc192e71418000a0124744dd4ad6dflog_user_id=xxxtoken=xxuser_id=xxx30I0052O0l3W6B0
返回: 73df984ebbb4ab56de1e6af1446c1161

由代码可以看出是对map做了处理后的字符串参数1 MD5加密
验证下:
在这里插入图片描述
在这里插入图片描述

总结

代码就不写了,比较简单的一次逆向。
欢迎交流安卓逆向相关的技术。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:44:08  更:2022-03-04 15:45:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:53:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码