某运动助手接口协议分析
本帖最后由 pianpu 于 2020-3-28 23:33 编辑找到了一款刷步数的软件,可以刷 微信支付宝QQ 步数。
挺强哈,那我就抓包看看。发现抓包失败了。
https://attach.52pojie.cn/forum/202003/25/183134o44666616ictots4.jpg
那么软件肯定 禁止抓包了,所以我们另谋出路吧。
先看看软件。发现软件被加固了,需要脱壳下,这里就不演示脱壳过程了。
(论坛上有大佬分享的脱壳机,大家可以去尝试下 如fdex2 反射大师)
当然我没用过此类软件。大家自己去尝试下。
脱壳完,通过分析com包下的e4aruntime 发现这是一款E4A编写的安卓软件。
那么就好办了,因为我接触过E4A,了解其中的编写的语言。
E4A编写的软件,都只有只有activity,而核心代码则打包在包名,以中文命名的。
https://attach.52pojie.cn/forum/202003/25/183446svrmrdrssqm1rpmp.png
https://attach.52pojie.cn/forum/202003/25/183818fpqwq4ymapzwgdlb.png
我们发现在代码存储在jshare.steps下
所以我们看下主窗口和程序页的源代码
这里,我们可以清晰的看到,他检测了抓包是否开启的功能。
如果开启则禁止访问,如果没有开启,则进行获取网络数据。这也就解释了,我们一开始为什么抓包失败了。
而我们又继续看到,有一个请求,有一个sign值
https://attach.52pojie.cn/forum/202003/25/184127i4nnxgooffzfq8de.png
可以看到,他传入了编辑1-3个组件的内容,相对于我们来说也就是 账号 密码 步数 一一对应
也就是通过AppUtils.ENCODE进行加密后返回密文,我们点击进去看看这个类的写法。
https://attach.52pojie.cn/forum/202003/25/184528q13zx11hzq3928z1.png
而JNI.EnCode(),在上面一个方法的DECODE 会去调用到这个
也就是Authcode解密的密码,所以我们等会只需要hook这个authcode的密码即可得到 encode的值
https://attach.52pojie.cn/forum/202003/25/184909kukxkl2kvu8x15nq.png
加密的代码在so层。我也不会看so层呀(继续看后面的操作)
但是,今天我讲一个另类的解密
我们可以这样。因为E4A是一个封装化的软件。所有代码都是封装在e4aruntime中。
所以我们只需要通过Xposed Hook 神器 对这些命令进行hook,就可以知道参数和返回值啦。
但是还有一个点,软件加固了,是腾讯的加固。我们需要hook到这个类加载器才可以hook这些方法成功。
这里告诉大家一个技巧 如何快速找类加载器的方法,通常类加载器的方法下有system.loadlibrary命令,因为加固后都是调用so文件的。
现在最新的 360加固类加载器在com.stub.StubApp下的attachBaseContext方法
我们通过上图,可以得知这些命令分别是 开始取网页源码,开始发送网络数据4Authcode加密 我们找下方法。
因为我们只需要知道 请求链接 post请求的data数据 authcode的值
https://attach.52pojie.cn/forum/202003/25/185144qcrqcrcuucgccx10.pnghttps://attach.52pojie.cn/forum/202003/25/185157fayzyqgamuem1ylq.png
我们直接导入这个E4Aruntime类,就可以看到他很多封装方法,只需要去hook这些类即可。
hook的代码给大家贴一下
代码给大家贴一下
//e4a Authcode 加密获得的数据
XposedBridge.hookAllMethods(XposedHelpers.findClass("com.e4a.runtime.加密操作", loadclassLoader),
"Authcode加密",
new XC_MethodHook() {
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
String data = (String) param.args;
String key = (String) param.args;
Log.d("pianpu", "|=========================Authcode加密========================|");
Log.d("pianpu", "data:" + data);
Log.d("pianpu", "key:" + key);
String path = "/sdcard/PP_Hook/" + packagename + "/Decrypt.txt";
String data2 = "data:" + data + "\n" + "key:" + key;
tools.writefilebefore(path, data2, "Authcode加密");
}
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
String result = "" + (String) param.getResult();
Log.d("pianpu", "result:" + result);
String path = "/sdcard/PP_Hook/" + packagename + "/Decrypt.txt";
String data2 = "result:" + result;
tools.writefileafter(path, data2, "Authcode加密");
}
});
//e4a Authcode 解密获得的数据
XposedBridge.hookAllMethods(XposedHelpers.findClass("com.e4a.runtime.加密操作", loadclassLoader),
"Authcode解密",
new XC_MethodHook() {
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
String data = (String) param.args;
String key = (String) param.args;
Log.d("pianpu", "|=========================Authcode解密========================|");
Log.d("pianpu", "data:" + data);
Log.d("pianpu", "key:" + key);
String path = "/sdcard/PP_Hook/" + packagename + "/Decrypt.txt";
String data2 = "data:" + data + "\n" + "key:" + key;
tools.writefilebefore(path, data2, "Authcode解密");
}
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
String result = "" + (String) param.getResult();
Log.d("pianpu", "result:" + result);
String path = "/sdcard/PP_Hook/" + packagename + "/Decrypt.txt";
String data2 = "result:" + result;
tools.writefileafter(path, data2, "Authcode解密");
}
});
//hook e4a 发送网络数据4
XposedBridge.hookAllMethods(XposedHelpers.findClass("com.e4a.runtime.网络操作", loadclassLoader),
"发送网络数据4",
new XC_MethodHook() {
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
String data = (String) param.args;
String key = (String) param.args;
Log.d("pianpu", "=========================发送网络请求参数========================");
Log.d("pianpu", "data:" + data);
Log.d("pianpu", "key:" + key);
String path = "/sdcard/PP_Hook/" + packagename + "/Decrypt.txt";
String data2 = "url:" + data + "\n" + "data:" + key;
tools.writefilebefore(path, data2, "发送网络数据4");
}
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
String result = "" + (String) param.getResult();
Log.d("pianpu", "result:" + result);
String path = "/sdcard/PP_Hook/" + packagename + "/Decrypt.txt";
String data2 = "result:" + result;
tools.writefileafter(path, data2, "发送网络数据4");
}
});
//hook e4a 取网页源码
XposedBridge.hookAllMethods(XposedHelpers.findClass("com.e4a.runtime.网络操作", loadclassLoader),
"取网页源码",
new XC_MethodHook() {
protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
String data = (String) param.args;
String key = (String) param.args;
Log.d("pianpu", "=========================取网页源码========================");
Log.d("pianpu", "data:" + data);
Log.d("pianpu", "key:" + key);
String path = "/sdcard/PP_Hook/" + packagename + "/Decrypt.txt";
String data2 = "url:" + data + "\n" + "data:" + key;
tools.writefilebefore(path, data2, "取网页源码");
}
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
String result = "" + (String) param.getResult();
Log.d("pianpu", "result:" + result);
String path = "/sdcard/PP_Hook/" + packagename + "/Decrypt.txt";
String data2 = "result:" + result;
tools.writefileafter(path, data2, "取网页源码");
}
});
我们只需要hook这4个就行。其中无论他咋加密,我们都不需要去管他。只需要看过程 和 加密类型 方法即可。
运行后,我们可以看到已经把核心代码hook下来且输出到本地文件了。
https://attach.52pojie.cn/forum/202003/25/185410edcdtyetp58p68pt.pnghttps://attach.52pojie.cn/forum/202003/25/185504m0wgi49p4931lcig.png
因为我不会so层分析,所以暂时对这个sign值没方法获取加密方法。(目前要分析so层,只差一个真机。)
据此,sign值,我确实不知道咋加密的,但是看上去像是md5加密。刚好测试了一下,这个md5没有另外的加盐处理。嘻嘻
明文的sign =Jni.encode()+ 账号 + 密码 + 步数 + Jni.encode()例子就是jshare6661234561234568888jshare666
其中jshare666 是在java层传输,我们可以知道。其中的是账号 密码 步数。所以我们md5加密一下看看,与这个sign值一样不。
https://attach.52pojie.cn/forum/202003/25/185650wifoxb8ididjlali.png
测试了一下,sign值是相同的,被我猜中了。属实是运气好。
这个作者也不在so层 再次加盐了。以至于被我们猜中。如加盐了,我们只需要再用frida hook 进行hook so层的加密方法即可。
那么这些提交的网址 数据 sign 我们都知道了,且加密类型 密码我们都知道。就可以调用啦。
可以看出,提交后返回的密文,进行了解密,再次返回一个链接,我们访问看看
https://attach.52pojie.cn/forum/202003/25/185816j334fnbg2e2z3obr.png
因为我们是乱写的参数,所以自然登陆失败。
https://attach.52pojie.cn/forum/202003/25/185838vmyd4toiizrto5zo.png
https://attach.52pojie.cn/forum/202003/25/185931xmfkvf63df2hf334.png
可以看到,进行一些列网页请求后返回提示给app。
据此 分析完毕。
总结:
sig值加密方式 =jshare666 + 账号 + 密码 + 步数 +jshare666 组合起来进行md5加密
同时我们又得到了 请求的接口,而不用开启抓包软件。
这样,我们就可以模拟数据进行请求。
最后 此类软件为引流软件,后台有开关设置,我通过代码分析出来的。大家如果感兴趣可以安装我上面的方法提取接口自己使用,别用软件。
否则到时候需要分享QQ群的,给他打广告还不如自己分析接口。
没看懂 不知道咋搞接口 本帖最后由 赤座灯里 于 2020-3-29 01:48 编辑
在隔壁论坛看了你这个帖子,进步就是把mt换成了jd,该学学用frida和分析native了。不需要所谓缺一个真机的理由(在隔壁论坛可不是这么说的:D),静态分析so的话把so拖进IDA就行,而且模拟器一样可以用frida辅助分析,还是感谢楼主的分享精神 中间代码复制的好乱,处理一下吧。 Hmily 发表于 2020-3-28 23:22
中间代码复制的好乱,处理一下吧。
好的,已经处理好了! 不分析算法,就靠打印函数返回值猜?这次成功了,换个app或是简单的换个算法又会是怎样呢,不能每次都靠hook取数据吧{:301_1008:}另外进行分析的时候frida明显比xposed好用的多,不用hook classloader,去学习 frida怎么用吧,楼主加油 感谢楼主分享 这是大牛的菜 赤座灯里 发表于 2020-3-29 01:29
在隔壁论坛看了你这个帖子,进步就是把mt换成了jd,该学学用frida和分析native了。不需要所谓缺一个真机的 ...
哈哈,下次继续努力 唉,废了。乐心要求使用验证码登录了,软件获取不了验证码了{:1_937:}
页:
[1]
2