dumpdex+jadx+charles 实现安卓接口签名破解

前言

前几天对某表情包软件抓包,想爬点表情图片下来。发现软件有签名认证,直接丢到jadx看了一下,发现还有360的壳。

charles抓包

分析

数据被保护的前提是接口安全,所以要进一步保护接口不被滥用就需要对接口进行签名和程序的加密。其中常见的加固(即安卓加密)平台有 360加固、爱加密、梆梆加固、腾讯加固、百度加固等。

工具

  1. dumpdex:脱壳,很强大的一个工具。
  2. jadx:反编译、查看dex源码。
  3. charles:抓包,辅助工具。

脱壳

脱壳原理我也不是太懂,具体看一下大佬的源码吧。

https://github.com/WrBug/dumpDex

我是自己编译使用的,因为目标软件dumpdex检测不出来,要手动把包加进去编译使用。

脱完壳会得到一堆dex文件

有些是壳的源码,要一个个拖到jadx分析哪个才是目标软件的源代码,通过关键词搜索很快就能定位了。我的是4005那个。

打码那些是目标软件包名,不知道其他软件加壳是不是也是这样的,如果是的话那直接在源码找包名就行了。

dumpDex编译提示

  1. 一定要用ndk 16!!!一定要用ndk 16!!!一定要用ndk 16!!!设置:File -> Project Structrure

  2. lint语法提示错误时,build.gradle中的andriod节点加入

    lintOptions {
    	abortOnError false
    }
  3. sync project报错,直接删除所有build文件夹,重新sync。

  4. 这是一个xposed插件,加入xposed,如虎添翼。

  5. 没事不要换java版本,推荐java 1.8。

  6. runtime 异常,重启电脑。

还原算法

有了源码就直接检索算法了,进jadx,Ctrl+Shift+F 检索签名字段的名称,我这里是sign。所以我直接检索 "sign",加双引号是为了提高精确度。

因为我要破解的这个软件算法极其简单,所以一搜就很明显了,这是根据时间戳加签的。看上去第二个结果中使用了一个公共方法,点进去看看。

这样一来就很清晰了,这是用时间戳验签的,没有字段加密,经过后面测试,时间戳的阈值非常大,而且阈值只要大于10分钟,那几乎可以为所欲为了。。。。

很显然,m.a()是一个公共方法,所以进m.a()看看

共两个方法相关联,经过百度,第一段和php的md5函数一致,第二段作用暂时不清楚,经测试转换成php

<?php
$timestamp = floor(microtime(true) * 1000);
$str       = "xxxx" . $timestamp;// xxxx表示密钥
echo md5($str);

这个php算出来的结果与上图中的java算法一致,得到的sign套入接口可用。所以第二个方法的位运算不知道是干嘛用的。

接下来的工作就交给php了。

结语

  1. 过程很简单,唯一复杂的地方是脱壳,因为我是自编译的,所以在as折腾了很长时间。。。脱壳的具体原理我也不懂,所以不做详述了,不敢误人子弟。

  2. 如果不想还原算法,直接可以上frida劫持函数,简单粗暴。


dumpdex+jadx+charles 实现安卓接口签名破解
http://blog.icy8.cn/posts/19315/
作者
icy8
发布于
2021年1月27日
许可协议