qtfreet00 发表于 2017-1-18 09:38

记录某书中的包内容签名值

随便抓了个请求包显示如下:


发现在Header头中多了几个auth参数,后面像是md5,反编译看下具体是怎么计算的

jadx搜索X-Auth,很好找到
      String timestamp = (System.currentTimeMillis() / 1000) + "";
      aa modifiedResponse = chain.a(request.e().a(url).a(headers).a("X-Timestamp", timestamp).a("X-Auth-1", ao.a(JSMainApplication.f() + timestamp)).a("X-AUTH-2", ao.a(userRB.mobile_token + (System.currentTimeMillis() / 1000))).a());
      if (modifiedResponse.d()) {
            return modifiedResponse;
      }
      a(errorMessage);

可以看到第一个auth参数是根据f()函数的值和当前时间戳(此处/1000,所以单位为秒),最后进行了a函数的调用,首先看下a函数
    public static String a(String s) {
      char[] hexDigits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
      try {
            byte[] strTemp = s.getBytes("UTF-8");
            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(strTemp);
            char[] str = new char[(j * 2)];
            int k = 0;
            for (byte b : mdTemp.digest()) {
                int i = k + 1;
                str = hexDigits[(b >> 4) & 15];
                k = i + 1;
                str = hexDigits;
            }
            return new String(str);
      } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return "";
      } catch (UnsupportedEncodingException ue) {
            ue.printStackTrace();
            return "";
      }
    }

很简单的md5,那就关注一下f()函数,
sAppSecurityKey = Safejni.encryptAppKey();

发现f函数的作用就是返回一个encryptAppKey,跟进后发现最终调用了个native函数,ida载入后找到对应函数

f5后发现函数反汇编是不正常的

空格来到流程图模式下,点击remove funtion tail --> force BL call后效果如下


再次f5后即正常显示了

可以看到这里就是简单的字符串复制和拼接,最后返回的就是18ce9f021f1840fb93108ed2a899fb3a

第二个auth参数是根据用户当前token来的,没什么好分析的了

总结:
不太懂他起名为safe-jni的原因是什么

liuhaijiji5807 发表于 2017-1-18 10:12

淡然出尘 发表于 2017-1-18 10:55

本帖最后由 淡然出尘 于 2017-1-18 10:56 编辑

世事繁华皆成空 发表于 2017-1-18 10:46
万一我用了反射呢
用反射得需要传进去对象吧
虽然可以直接获取CurrentApplication,这种情况还是比较少的

小锤子起钉儿 发表于 2017-1-18 09:43

收藏参考了

wyy1818118 发表于 2017-1-18 10:26


厉害了我的哥,十分崇拜

淡然出尘 发表于 2017-1-18 10:31

傻..
看下 JSMainApplication.f() 函数的结构,
Native层没有传参,返回一个String,
显而易燃,一定是固定的,不用分析SO,直接打印就好

qtfreet00 发表于 2017-1-18 10:46

淡然出尘 发表于 2017-1-18 10:31
傻..
看下 JSMainApplication.f() 函数的结构,
Native层没有传参,返回一个String,


{:301_977:}万一我用了反射呢

qtfreet00 发表于 2017-1-18 11:26

淡然出尘 发表于 2017-1-18 10:55
用反射得需要传进去对象吧
虽然可以直接获取CurrentApplication,这种情况还是比较少的

擦 膜拜淡然大神啊

Ericky 发表于 2017-1-18 12:34

过来膜拜,最后的总结亮了
{:17_1060:}

云中岳 发表于 2017-1-18 12:40

吃瓜群众坐看两位大神切磋
页: [1] 2 3
查看完整版本: 记录某书中的包内容签名值