目录
- 前言
- 一、抓包确定参数sig
-
-
-
-
-
- 1.1 charles抓包
- 1.2 apipost验证
-
-
-
-
- 二、jadx-gui分析
-
-
-
-
-
- 2.1 获取package
- 2.2 分析sig
- 2.3 动态调试
-
-
-
-
- 总结
前言 本文主要分析安卓-狐友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, Object> getSignMap(Map, 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, Object> map, String str) {
TreeMap treeMap = new TreeMap();
for (Map.Entry, Object> entry : map.entrySet()) {
Object value = https://www.it610.com/article/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, sysdef 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由代码可以看出是对map做了处理后的字符串参数1 MD5加密
返回: 73df984ebbb4ab56de1e6af1446c1161
验证下:
文章图片
文章图片
总结 代码就不写了,比较简单的一次逆向。
欢迎交流安卓逆向相关的技术。
推荐阅读
- 安卓逆向|安卓逆向之蝉妈妈sign破解
- python|Python游戏开发,pygame模块,Python实现过迷宫小游戏
- 算法|2022届秋招算法岗将何去何从()
- 面试|【面试记录】微软暑期实习生提前批一面 2022.01.17
- Spring|七十四、Spring与DAO操作 query()
- Spring|七十三、Spring与DAO操作 update()
- 微信红包|微信红包 java_教你用java做个微信红包,自己做运气王!
- 操作系统|【杂谈】为什么说Linux和服务器是天生一对()
- 剑指offer编程题解法汇总|力扣解法汇总1706-球会落何处