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