Xposed插件 - 获取某答题app的题目和选项

好久没更新了,最近在看Android的xposed框架。虽然之前也一直在用,却没自己写过,这次尝试自己写一个简单的插件。

目标应用是现在比较的火的一款在线答题应用,练习的目的是获取到题目和题目选项。当然可以用截图然后orc识别,但终究会有一定的延时以及识别问题。网上有许多项目,就不再赘述。

一、分析目标apk

这种实时联网的app我们可以先抓包看看。我这里的用的mac版的charles,最新破解版可以在这里下载我提供的jar包 Charles 4.2.1 破解for Mac and Win

这里我们可以发现我们需要的信息在websocket中,以json的形式来传递。当然拿题至少有两种方式。一种是hook 答题的控件,另一种从socket数据下手。本文采用hoot socket处理。

二、分析代码

首先反编译apk,可以明显的看到应用使用了360加固。那么就得先把壳脱下来,我们只需要找到关键的代码即可,不必修复onCreate函数。(主要是搞不定。。。)

脱壳的部分省略,拿到smali后开始分析。我们通过socket中的关键词showQuestion字段,最终在Lcom/chongdingdahui/app/socket/MessageManager$7类里面发现了处理数据的代码。

三、编写xposed插件

步骤很简单,先hook壳应用,然后再拿到题目和选项。后面也可以再加一个搜索,然后推荐出得分最高的答案。

hook带壳app并拿到信息

这里用了四哥的方法

// 应用被加壳,采用这种方式加载类
try {
                XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        context = (Context) param.args[0];
                        ClassLoader loader = context.getClassLoader();

                      // 获取题目和答案
                        try {
                            Class clazz = loader.loadClass("com.chongdingdahui.app.socket.MessageManager$7");
                            if (clazz != null){

                                XposedHelpers.findAndHookMethod(clazz, "call", Object[].class, new XC_MethodHook() {
                                    @Override
                                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                        super.beforeHookedMethod(param);
                                        Object[] obj = (Object[]) param.args[0];
                                        String content = obj[0].toString();
                                        Log.d(TAG, content);
                                        question = Util.getQuestion(content);
                                        answers = Util.getAnswer(content);
                                    }
                                });
                            }
                        }catch (Exception e){
                            Log.e(TAG, "socket.MessageManager$7 clazz not found" + Log.getStackTraceString(e));
                        }

这样就能得到题目和答案了。智能搜索就先不加了,毕竟主要是为了练习编写xposed插件。
最后我们把拿到的题用toast的形式展示在app中。前面我们的hook的时候,已经取到了context,这里面我们直接用这个context弹起toast即可。

//showMsg为题目或者选项或者通过网络搜索出的最优解
Toast.makeText(context.getApplicationContext(), showMsg, Toast.LENGTH_LONG).show();

实际的效果就不演示了,因为并没实现搜索--无卵用,只是弹了题目和选项而已。。。

本次练习收获:

1、对加固应用进行脱壳
2、结合网络请求分析关键代码
3、使用xposed hook带壳应用
4、自主码出一个能用xposed插件

ps.参考了陈长生的师兄和四哥的思路。
*注:本文主要为技术探讨,请勿用于其他目的。

关注获取更多