吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4530|回复: 2
收起左侧

[会员申请] 申请会员ID:pianpu【申请通过】

[复制链接]
吾爱游客  发表于 2020-3-25 19:07
1、申 请 I D:pianpu
2、个人邮箱:1058275023@qq.com

3、原创技术文章:某运动助手sign值分析

大家好,是刚入门的小白,想一起学习一下安卓逆向,今天给大家演示一下如何分析一款刷步软件的加密sign值
此贴在看雪已经发布一次,且评为:优秀,申请会员正是本人。
截图为证
证明.png



找到了一款刷步数的软件,可以刷 微信支付宝QQ 步数。
挺强哈,那我就抓包看看。发现抓包失败了。

禁止抓包.jpg

那么软件肯定 禁止抓包了,所以我们另谋出路吧。
先看看软件。发现软件被加固了,需要脱壳下,这里就不演示脱壳过程了。
(论坛上有大佬分享的脱壳机,大家可以去尝试下 如fdex2 反射大师)

脱壳完,通过分析com包下的e4aruntime 发现这是一款E4A编写的安卓软件。
那么就好办了,因为我接触过E4A,了解其中的编写的语言。
E4A编写的软件,都只有只有activity,而核心代码则打包在包名,以中文命名的。

1.png
2.png

我们发现在代码存储在jshare.steps下
所以我们看下主窗口和程序页的源代码
这里,我们可以清晰的看到,他检测了抓包是否开启的功能。
如果开启则禁止访问,如果没有开启,则进行获取网络数据。这也就解释了,我们一开始为什么抓包失败了。


而我们又继续看到,有一个请求,有一个sign值
3.png
可以看到,他传入了编辑1-3个组件的内容,相对于我们来说也就是 账号 密码 步数 一一对应

也就是通过AppUtils.ENCODE进行加密后返回密文,我们点击进去看看这个类的写法。
4.png
JNI.EnCode(),在上面一个方法的DECODE 会去调用到这个
也就是Authcode解密的密码,所以我们等会只需要hook这个authcode的密码即可得到 encode的值
5.png

加密的代码在so层。我也不会看so层呀  (继续看后面的操作)


但是,今天我讲一个另类的解密
我们可以这样。因为E4A是一个封装化的软件。所有代码都是封装在e4aruntime中。
所以我们只需要通过Xposed Hook 神器 对这些命令进行hook,就可以知道参数和返回值啦。
但是还有一个点,软件加固了,是腾讯的加固。我们需要hook到这个类加载器才可以hook这些方法成功。
这里告诉大家一个技巧 如何快速找类加载器的方法,通常类加载器的方法下有system.loadlibrary命令,因为加固后都是调用so文件的。
现在最新的 腾讯加固类加载器在  com.stub.StubApp下的attachBaseContext方法
我们通过上图,可以得知这些命令分别是 开始取网页源码,开始发送网络数据4  Authcode加密 我们找下方法。
因为我们只需要知道 请求链接 post请求的data数据 authcode的值

网络操作.png 加密操作.png

我们直接导入这个E4Aruntime类,就可以看到他很多封装方法,只需要去hook这些类即可。

hook的代码给大家贴一下

代码给大家贴一下

[Java] 纯文本查看 复制代码
 //hook e4a 发送网络数据4
                XposedBridge.hookAllMethods(XposedHelpers.findClass("com.e4a.runtime.网络操作", classLoader),
                        "发送网络数据4",
                        new XC_MethodHook() {
 
                            protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
 
 
                                String  data = (String) param.args[0];
                                String  key = (String) param.args[1];
 
                                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.网络操作", classLoader),
                        "取网页源码",
                        new XC_MethodHook() {
 
                            protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
 
 
                                String  data = (String) param.args[0];
                                String  key = (String) param.args[1];
 
                                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,"取网页源码");
                            }
                        });



[Java] 纯文本查看 复制代码
                //e4a Authcode 加密获得的数据
                XposedBridge.hookAllMethods(XposedHelpers.findClass("com.e4a.runtime.加密操作", classLoader),
                        "Authcode加密",
                        new XC_MethodHook() {
 
                            protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
                                String  data = (String) param.args[0];
                                String  key = (String) param.args[1];
                                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.加密操作", classLoader),
                        "Authcode解密",
                        new XC_MethodHook() {
 
                            protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
                                String  data = (String) param.args[0];
                                String  key = (String) param.args[1];
                                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这4个就行。其中无论他咋加密,我们都不需要去管他。只需要看过程 和 加密类型 方法即可。
运行后,我们可以看到已经把核心代码hook下来且输出到本地文件了。
hook代码分析.png hook代码分析2.png



因为我不会so层分析,所以暂时对这个sign值没方法获取加密方法。(最近正在学习frIDA hook so层的)
据此,sign值,我确实不知道咋加密的,但是看上去像是md5加密。刚好测试了一下,这个md5没有另外的加盐处理。嘻嘻
明文的sign =Jni.encode()  + 账号 + 密码 + 步数 +   Jni.encode()  例子就是  jshare6661234561234568888jshare666
其中jshare666 是在java层传输,我们可以知道。其中的是账号 密码 步数。所以我们md5加密一下看看,与这个sign值一样不。
sign值 对比.png

测试了一下,sign值是相同的,被我猜中了。属实是运气好。
这个作者也不在so层 再次加盐了。以至于被我们猜中。如加盐了,我们只需要再用frida hook 进行hook so层的加密方法即可。
那么这些提交的网址 数据 sign 我们都知道了,且加密类型 密码我们都知道。就可以调用啦。
可以看出,提交后返回的密文,进行了解密,再次返回一个链接,我们访问看看

返回的网址.png
因为我们是乱写的参数,所以自然登陆失败。
返回的网址2.png

返回的提示.png




可以看到,进行一些列网页请求后返回提示给app。

据此 分析完毕。

总结:

sig值加密方式 =  jshare666 + 账号 + 密码 + 步数 +  jshare666 组合起来进行md5加密

同时我们又得到了 请求的接口,而不用开启抓包软件。

这样,我们就可以模拟数据进行请求。










发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Hmily 发表于 2020-3-27 13:37
I D:pianpu
邮箱:1058275023@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

ps:登陆后把文章整理一下发到移动安全区。
pianpu 发表于 2020-3-28 00:44
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表