秒拍APP短视频逆向分析:最新版version ===7.2.98 :
抓一个用户主页包看下:
这个是我抓的科普中国用户的主页,经过分析发现请求头有变化参数。
rt : 暂时分析微时间戳 pk:固定 ov : 固定
变化:si ,ti, sk, p
开始正式逆向路程========
jadx 查看下入口:
这不啥也找不到,加壳了,不说了 直接脱壳:
网上各种脱壳工具或者脱壳机,自动回填修复dex:
定位加密地方:当前包名: package e.f.a.l.v;
valueOf: 当前时间 String valueOf = String.valueOf(System.currentTimeMillis());
str2: str2 = deviceBean; 设备数据
str, strArr 传进来的
静态分析后:
linkedList.add(new h("si", g.getKey()));
linkedList.add(new h("ti", g.getTrace()));
linkedList.add(new h("sk", g.getSignature()));
是通过走了一个g方法后:将所有参数回写。
这是一个 native 同步锁的操作,将参数传进so加密结果返回到 bean 对象里。
frida hook下查看传入传出:
# -*- coding: utf-8 -*-
# @Author : Codeooo
# @Time : 2022/04/29
import sys
import frida
code = """
Java.perform(function(){
var lk = Java.use("com.dubmic.basic.e");
lk.g.implementation = function(a,b,c,d,e){
//var b1 = String((new Date()).valueOf());
//console.log(typeof b)
//console.log(typeof b1)
//console.log('参数b1 ' + b1)
console.log('参数str ' + a)
console.log('参数str1 '+ b)
console.log('参数str2 ' + c)
//var c1 = '{"dpi":420,"did":"b81b219fcafc7d50e652e0d80ff12985","dname":"QW5kcm9pZA\u003d\u003d","sl":"zh","sv":"7.1.2","os":"android","av":"7.2.87","bv":"6790000","dm":"AOSP on msm8996","dmid":"AB:44:48:4P:3R:19","daid":"89d9abcd39014bfd","network":1,"dw":1440,"dh":2434,"lon":0.0,"lag":0.0,"channel":"xiaomi_market","rt":1639052393988,"carrier":0}'
console.log('参数str3 ' + d)
console.log('参数str4 ', JSON.stringify(e))
var e2 = [["userId","78143099"],["type","1"],["page","1"],["limit","20"]]
console.log('==== ' + this.g(a,b,c,d,e2))
return this.g(a,b,c,d,e2)
}
var EncryptUtils = Java.use("com.dubmic.basic.bean.HttpEncryptionBean");
var EncryptUtils = Java.use("com.dubmic.basic.bean.HttpEncryptionBean");
EncryptUtils.getKey.implementation = function(){
//console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
console.log("Codeoooo " + this.getCode())
console.log("si " + this.getKey())
console.log("ti " + this.getTrace())
console.log("sk " + this.getSignature())
console.log("p " + this.getP())
return this.getKey()
}
});
"""
process = frida.get_remote_device().attach('com.yixia.videoeditor')
script = process.create_script(code)
script.load()
sys.stdin.read()
再搭建个frida_RPC + flask 一个动态刷用户服务即可调用。
接下来咱们分析下so文件:
在 IDA 打开的时候发现报错,该so文件为加密so,需要在内存中dump修复elf文件,这个需要了解elf文件结构。
我们可以用 010Editor 或者 其他medit 去看下so文件到底是什么文件。
参考:https://blog.csdn.net/weixin_38927522/article/details/120164359
以后面试再问到这么基础的题,可不要不会了啊,多了解下NDK开发及so文件elf结构。
解决思路:
1.可以用IDA中的plugins下修改so插件 内存dump脚本
2.frida dump内存
3.SoFixer_Rel
4.xAnSo
5.大佬手动修复
当然修复的so可能并不一定成功,需要自己去回填指定等。
由于frida 不稳定的因素,这里我编写了一个xposed 主动调用去调用so文件进行解密:
部分代码公开: