爱某查APP - Abtk

⚠️前言⚠️

本文仅用于学术交流。

学习探讨逆向知识,欢迎私信共享学习心得。

如有侵权,联系博主删除。

请勿商用,否则后果自负。

接口网址

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 方法参数, 并赋值为 静态变量 context
           Hookaqc.context = (Context) param.args[0];
           }
 })

主动调用: 使用全局保存的上下文参数信息,主动调用 getToken 获取密值

复制代码
Xposed 关键代码:
@Action("Abtk")
public class aqcHandler  implements RequestHandler {
    @Override
    public 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);
    }
}

效果展示

本人安卓水平有限,有不严谨之处欢迎私信交流 😀 😀 😀 。。。

相关推荐
сокол几秒前
【Python-基础-环境搭建】Ubuntu Python 开发环境搭建:编译、pipenv、pyenv、远程连接
开发语言·python·ubuntu
vx_Biye_Design1 分钟前
springbootNBA数据分析系统平台42434-计算机课程设计、毕业设计
java·vue.js·spring boot·python·django·课程设计·express
Q26433650231 分钟前
【有源码】基于springboot的知识产权管理系统-知识产权咨询问答管理系统-知识产权价值评估管理系统
java·spring boot·mysql·spring·毕业设计·javaweb·课程设计
计算机毕业编程指导师3 分钟前
【计算机毕设选题推荐】基于Spark的多源影视数据整合质量评估与可视化分析系统全解析 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·数据分析·spark·影视
苏离~Hack6 分钟前
惠民云平台开发实战:基于 Vue3 + Django 的社区服务系统设计与实现
后端·python·django
liangshanbo12152 小时前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript
朝朝辞暮i8 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
leikooo9 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
言乐69 小时前
HTML视频审核模型
python·django·virtualenv·pygame·tornado
小师兄吃牛肉9 小时前
C语言篇:宏
c语言·开发语言