美文网首页Android逆向笔记
Xposed插件 - 获取某答题app的题目和选项

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

作者: h080294 | 来源:发表于2018-02-01 19:31 被阅读885次

    好久没更新了,最近在看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.参考了陈长生的师兄和四哥的思路。
    *注:本文主要为技术探讨,请勿用于其他目的。

    关注获取更多

    相关文章

      网友评论

        本文标题:Xposed插件 - 获取某答题app的题目和选项

        本文链接:https://www.haomeiwen.com/subject/cqyymxtx.html