⚠️前言⚠️
本文仅用于学术交流。
学习探讨逆向知识,欢迎私信共享学习心得。
如有侵权,联系博主删除。
请勿商用,否则后果自负。
接口网址
aHR0cHM6Ly9haXFpY2hhLmJhaWR1LmNvbS9hcHAvYWR2YW5jZUZpbHRlckFqYXg=
加密位置分析
app版本:2.27.0
jadx 全局检索一下
结果不多,有两个可疑的位置我们尝试 hook 一下
> 首先第一个位置发现结果存在于形参中,是传递过来的值,先放一放,看一下第二个位置
> 位置2,token.trim() 用于删除 token 首尾的空白字符,结果是由 Entrance.getToken(NewBridgeApplication.context) 得到的
> frida hook - Entrance.getToken, 成功hook到加密结果
Java.perform(function () {send('**********************');var Entrance = Java.use('com.baidu.abymg.Entrance');Entrance.getToken.implementation = function(a1){send('arg1 -> ' + a1);var result = this.getToken.apply(this, arguments);send('result -> ' + result);return result;};
});
> 下面来说一下另一种找加密位置的方式,hook - HashMap 打印堆栈,同样也可以找到这个 f 方法
Java.perform(function () {var linkerHashMap=Java.use('java.util.HashMap');linkerHashMap.put.implementation = function(arg1,arg2){var data=this.put(arg1,arg2);if(arg1=='Abtk'){send("=================linkerHashMap.put====================");send(arg1+"|||||||||||||"+arg2);send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));}return data;}
});
参数分析 + Xposed hook
> getToken 方法只有一个参数是 Context 类型
这种参数类似于app执行上下文,最好获取app本身得到,模拟的话可能会缺失信息
> Xposed hook 逻辑
被动触发: 获取 getToken 上下文参数信息,并保存全局
Xposed 关键代码:
XposedHelpers.findAndHookMethod("com.baidu.abymg.Entrance", lpparam.classLoader, "getToken", Context.class, new XC_MethodHook() {@Override // beforeHookedMethod 刚进入该方法还未执行。。afterHookedMethod 方法执行完毕 return 之前protected void afterHookedMethod(MethodHookParam param) throws Throwable {XposedBridge.log("hook before param--: 进来了");super.afterHookedMethod(param);// 获取 getToken 方法参数, 并赋值为 静态变量 contextHookaqc.context = (Context) param.args[0];}})
主动调用: 使用全局保存的上下文参数信息,主动调用 getToken 获取密值
Xposed 关键代码:
@Action("Abtk")
public class aqcHandler implements RequestHandler {@Overridepublic void handleRequest(SekiroRequest sekiroRequest, SekiroResponse sekiroResponse) {final Class<?> clazz = XposedHelpers.findClass("com.baidu.abymg.Entrance", Hookaqc.loadPackageParam.classLoader);String result = (String) XposedHelpers.callStaticMethod(clazz,"getToken", new Object[]{Hookaqc.context});HashMap<String, String> result_hp = new HashMap<String, String>();result_hp.put("Abtk", result);sekiroResponse.success(result_hp);}
}
效果展示
本人安卓水平有限,有不严谨之处欢迎私信交流 😀 😀 😀 。。。