吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5145|回复: 9
收起左侧

[Android 原创] 某快药签名算法分析

  [复制链接]
路人LLD 发表于 2017-12-18 09:57
本帖最后由 路人LLD 于 2017-12-20 13:30 编辑

前言:很早之前导师安排让学习进行签名算法分析,目的是学习android逆向。程序签名的目的是为了保证数据包的完整性,假如对数据包进行篡改,则数据包的签名必然会和原始的签名不同。其实道理和数字签名是一样的。
正文:接下来就需要进行一些列分析了。
首先下载XX快药app,拿到程序安装包。
接下来就需要进行信息提取,信息提取主要从以下几个步骤入手:
第一步:      
运行程序,判断程序中有什么功能,运行时有没有显示一些敏感字符串一类的(比如:用户名密码错误信息,比如要找的sign信息等等),如果有则可以直接使用androidkiller的搜索功能快速定位到关键位置。
第二步:      
使用fiddler抓包,抓包的目的是查看包的形式。下图展示了包的参数信息:sign是签名信息,v对应版本,t代表时间,其他的一看就明白。那么本文的目的就是分析如何得到sign。
1.png
第三步:      
获取到一些基础信息之后,接下来就需要进行深入分析。在深入分析之前首先看一下是否有加壳。加壳检测使用安卓右键工具(很好的右键工具,据说是网易的人才研发的)。经过检查发现是没有加壳的,这样就可以直接进行分析。androidkiller,JEB都可以进行分析,具体使用哪个根据个人爱好。
第四步:      
最后就是需要进行关键位置定位。定位的最终结果是能找到加密的位置。在进行定位的时候,起初想着直接搜索sign来找到sign初始化的地方,可是发现搜出来一大堆。没有办法开始找程序登录处,因为在登录处一定会有sign初始化的地方。
通过查看,发现在程序中有一个login目录,点击进去可以看到存在LoginActivity.class文件。在 LoginActivity,存在快速登录的函数,普通登录函数(使用用户名和密码信息):如下图所示。看到这里明显知道只要跟进去肯定能找到sign初始化的地方。
2.png
ok,接下来继续跟踪。跟踪DataSerer.asycGetData函数,进去查看以后没直观的发现自己想要的,就继续跟踪参数信息。最后在BasicRequest.class里面;找到了sign参数。在这个里面查找,发现localHashMap.put("sign",a.a(localHashMap, (String)localHashMap.get("method")));这段代码很简单,就是讲sign值放到对应的hashmap中。hashmap是一种键值对容器,存放key和对应的key值。好了,到这里以后,剩下思路就简单了,跟进a.a(localHashMap, (String)localHashMap.get("method")去查看是如何设置的。
3.png
经过层层调用,最终追溯到一个native层so库:libNoodleMD5.so,在这里面进行一些列的转化得到sign值。
publicstatic String a(Map<String, String> paramMap, String paramString)  {
    return MD5.encryptByMD5(paramString,a(paramMap)).toUpperCase();
  }
privatestatic String a(Map<String, String> paramMap)//容器
  {
    Object localObject2 = paramMap.keySet();
    Object localObject1 = new ArrayList();
    localObject2 =((Set)localObject2).iterator();
    String str;
    while (((Iterator)localObject2).hasNext())
    {
      str =(String)((Iterator)localObject2).next();
      if(!"sign".equalsIgnoreCase(str))
        ((List)localObject1).add(str);
    }
    Collections.sort((List)localObject1, newb());
    localObject2 = new StringBuffer();
    localObject1 =((List)localObject1).iterator();
    while (((Iterator)localObject1).hasNext())
    {
      str =(String)((Iterator)localObject1).next();
      ((StringBuffer)localObject2).append(str);
      ((StringBuffer)localObject2).append((String)paramMap.get(str));
    }
    return((StringBuffer)localObject2).toString();
}
publicstatic String encryptByMD5(String paramString1, String paramString2)
  {
    String str = paramString1;
    if (paramString1 == null)
      str = "null";
    paramString1 = paramString2;
    if (paramString2 == null)
      paramString1 = "null";
    return nativeEncryptByMD5(str,paramString1);
  }
publicstatic native String nativeEncryptByMD5(String paramString1, StringparamString2);
最后一步,需要跟踪native层so库。so文件分析,使用IDA。直接拖拽文件到IDA,然后定位到加密函数处nativeEncryptByMD5。进去可以看到是smail代码,看着比较难看,为了方便将其转化为c代码(需要说明的是这里为了便于分析需要导入jni.h文件),jni的作用是识别一些jni函数。需要说明的是c代码不可全信,具体的执行可能还是需要跟踪smail代码的。
4.png
看到上图中所示的代码是不是很熟悉。剩下的就简单了,可以静态分析也可以进行动态分析。

经过一些列分析吧,最后发现该签名算法的原理是这样的(算法的编程实现没写,大致说一下逻辑):
5.png
第一步:程序首先获取以上的参数信息,并将以上参数拼接起来,拼接后结果是:

ddsy.user.reg.loginmethodddsy.user.reg.loginpasswordXXXXXXXXXXXXXXXt2017-12-14 15:01:30userNameXXXXXXXXv1.06C57AB91A1308E26B797F4CD382AC79D
第二步:然后再拼接一个字符串:6C57AB91A1308E26B797F4CD382AC79D
得到如下结果:ddsy.user.reg.loginmethodddsy.user.reg.loginpasswordXXXXXXXXXXXXXXXt2017-12-14 15:01:30userNameXXXXXXXXv1.06C57AB91A1308E26B797F4CD382AC79D
第三步:最后对这个数据进行MD值加密,获取最终的签名信息sign



总结:其实sign签名的思路很简单,任何app都是这样。先获取参数,然后对参数进行一定的处理。差别就在如何处理部分。但是只要掌握一个方法,万变不离其宗,总能找到sign的签名算法。由于本人表达能力有限,写的有不清楚的地方请多多包涵。本人也是菜鸟一个,在Android学习的路上,希望和大家一起学习,一起进步。

免费评分

参与人数 4吾爱币 +3 热心值 +4 收起 理由
yjhidtf + 1 + 1 我很赞同!
dzhzcyh + 1 + 1 已答复!
jaffa + 1 谢谢@Thanks!
?﹏從此沉默 + 1 + 1 我很赞同!

查看全部评分

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

Hmily 发表于 2017-12-18 12:26
@路人LLD 图片不能直接粘贴,需要先上传,看这里有操作教程https://www.52pojie.cn/misc.php? ... 29&messageid=36
_知鱼之乐 发表于 2017-12-18 18:19
冰海浮云 发表于 2017-12-19 06:33
流水 发表于 2017-12-19 08:39
先标记一下~
小灰灰~ 发表于 2017-12-19 10:37
学习了,正好现在我学习如何破解算法,不足是图片一直加载不出来
yjhidtf 发表于 2017-12-19 13:44
可以留一个联系方式吗
Hmily 发表于 2017-12-19 15:49
@路人LLD 修改一下图片吧,不然帖子没法看。
 楼主| 路人LLD 发表于 2017-12-20 13:41
yjhidtf 发表于 2017-12-19 13:44
可以留一个联系方式吗

貌似不能留qq,有什么可以直接问,相互学习
wabanana 发表于 2017-12-24 21:57
楼主厉害了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 18:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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