最右协议分析part1

最右app协议分析以及使用unicorn调用

看了四哥的帖子,有点手痒,就来自己试一试分析下最右的协议

#抓包与初步分析

image_1dej0csri1k8urop4lknv91sa29.png-167.2kB

可以看到在登录页面发送的请求中,有一个sign值,在post的字段中,有手机号,密码的md5值,以及设备的部分信息,具体情况马上继续分析,拖入jadx中,无壳无混淆(只能挑这种软柿子捏了),搜索sign,找到生成签名的java层函数

image_1dej0hjo815at9endbqo6k1q1rm.png-94.2kB

可以看到,sign主要来自于native层的generateSign函数,先不分析so,继续摸索摸索

image_1dej0jqs6r2n1bjoauc1id718hs13.png-18kB
image_1dej0k51h17f51ggs10f51qhq1qol1g.png-49.2kB

可以看出只是对密码进行了md5操作

image_1dej0ld34pva1ic71p85h051lp71t.png-32.5kB

各个字段的具体含义也知道了,在分析过程中,只需要关心每次登陆过程中变化的值,先写段hook代码,将NetCrypto类的a函数的参数与运算结果hook出来,确认下结果

image_1dej0un801tssrkl1j4idsm7lr2a.png-64.3kB

可以看到,在两次发送登陆请求包的过程中,主要的不同是h_ts字段,这个字段的值来源于currentTimeMillis,别的字段在登录过程中目前是不变的,经过验证,我们确定了这个函数就是签名生成的函数

public class RightHook implements IXposedHookLoadPackage{
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

        XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook()
        { @Override
        protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
            ClassLoader cl = ((Context)param.args[0]).getClassLoader();
            Class<?> hookclass = null;
            try {
                hookclass = cl.loadClass("cn.xiaochuankeji.netcrypto.NetCrypto");
            }
                catch (Exception e)
                {
                    Log.e("123", "寻找报错", e);
                return;
            }
            Log.i("123", "寻找成功");
            XposedHelpers.findAndHookMethod(hookclass, "a",
                    String.class,
                    String.class,
                    new XC_MethodHook()
            { //进行hook操作
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                super.beforeHookedMethod(param);
                 XposedBridge.log("xposed  str :" + param.args[0]);
                 XposedBridge.log("xposed  str2 :" + param.args[1]);
            }

            });
            XposedHelpers.findAndHookMethod(hookclass, "a",
                    String.class,
                    String.class,
                    new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    super.afterHookedMethod(param);
                    XposedBridge.log("xposed getSign :"+param.getResult());
                }
            });
        }
        });
    }
}

Hook代码也没什么好说的,主要就是这个app属于multiDex,需要先hook attach拿到上下文才能hook到目标函数,接下来就可以去so层分析函数了

#分析so
将app解压并且取出里面的libnet-crypto.so并拖入ida分析,直接去看jniOnload函数

image_1dej32bst8o74c013l21o6po782n.png-88.4kB

没有看到registNative的参数,可以直接去汇编里观察下

image_1dej342q814e3gi31sn31i1h1t2d34.png-21.5kB
image_1dej3576ol1i5e1tfd1g3ipoi3h.png-17.9kB

注册的generateSign函数地址为4976

image_1dejujnlv1nc11hoh359iif3r3u.png-77.4kB

初步把加密算法的核心部分定位在sub50,算法的具体分析可以看四哥的帖子,这里主要还是练手下unicorn?反正只要能在pc端获取到签名数值就行了(摊手),鸽了,这几天有点事,过几天回来讲下unicorn的调用