记一次App通信协议快速加解密

前言

安装完app,注册的时候,抓包发现有加密,共有三处,一处的是Code的签名值,一处是Post的请求加密,一处是返回包的签名
如下:

分析

App的包名是com.xxxxxx.xxxxxnning。

一般情况下 Android开发,都会将所有的类都写在包名下面,
因此我们可以尝试直接hook该包名下的所有类,通过类下所有方法的参数值以及返回值来定位加解密方法。

这里我们使用HTTPDecrypt的Hooks模块,直接Hook.
在Hooks模块填写包名,然后点击Confirm。
如下:

当hook class enum done… 日志打印之后,HTTPDecrypt就已经帮我们hook了包名下面的所有方法。
接下来我们操作app,在app上输入相应信息,点击注册,这里我们根据抓包的内容在HTTPDecrypt里面查找,看下是否触发了加密函数。
结果如下:

com.xxxxx.encrypt 这个方法可能就是我们要找的解密函数,

com.xxxxx.EncoderByMd5这个方法可能Code签名的算法,其中前面一部分是固定的key,后面一部分是数据包中的时间戳,然后经过该方法加密之后得到Code的值。

同理我们找到返回数据包的解密函数

在Hooks模块,我们看到了com.xxxxx.encrypt有两个参数,一个是对象,一个是字符串,
接着我们需要知道对象参数的对象具体是哪个类型的。
因此,接下来我们要在Finds模块中将com.xxxxx.encrypt 中的com.xxxxx的所有方法打印出来,查看具体的参数值,以及方法的类型(静态方法 or 实例方法)

在Finds模块填写com.xxxxx.encrypt的类名字,也就是com.xxxxx,然后点击Confirm。
如下,

根据HTTPDecrypt打印出来的信息,我们可以看到对象类型是 Android的android.content.Context,方法的类型是static的。

验证

接下来在encrypt下右键发送到toBurp模块,

然后点击Confirm按钮

之后再点击Add按钮,将方法的信息添加到左边的info里面去,因为加解密方法有两个参数,无法使用HTTPDecrypt自动的生成的脚本(自动生成的脚本只能适应一个参数),所以 我们需要自己写一些代码,接下来我们点击Generate export static script按钮。(因为方法类型是静态的所以选择static按钮,动态的选择instance,如果你很熟悉frida,点哪个都无所谓。)

HTTPDecrypt会将一些代码生成在Custom选项卡中,如下:

从类名中 其实就可以看出通信协议使用的是AES的算法。

参数arg0是burp中传递过来的加密字符串,
我们需要构造一个arg1,也就是Android的Context对象。
这里使用Java.use('android.app.ActivityThread').currentApplication().getApplicationContext();
获取Context对象,然后更改encrypt参数的顺序,第一个是context,第二个是要加密的原文,也就是burp传递进来的参数。
如下:

解密方法decrypt同理构造,最终如下:

如果大家觉得编写框太小了 影响到你 编写代码姿势的帅气,请点击编写框,然后按键盘上的F11,瞬间变大屏幕,恢复帅气,从点击F11开始。

然后点击loadScript,配置好Burp插件。

就可以远程调用方法进行加解密了。

HTTPDecrypt 自带的burp插件支持整个body的自动加解密,点击Body Auto即可开启,如下:

如果不是整个body加密的化怎么办呢?不用慌,HTTPDecrypt提供了对外的接口,可以让你编写特定格式的自动化加解密插件,省去了你还原算法的时间。

还有个Code,算法已经在上面了就不再说了,如果Code不正确,服务端会返回{"code":90000,"message":"Code不正确!","success":false}

然后就可以进行 肾透测试了。

流程图

整个加解密的流程,如下:

总结

通过hook包名的方式快速定位加解密点,然后通过HTTPDecrypt 导出App内的方法,进行加解密,节省了分析算法,实现算法,编写插件等一系列时间,实现"真"快速,然后一顿操作,0高0中0低。

参考资料

https://github.com/lyxhh/lxhToolHTTPDecrypt

点击收藏 | 3 关注 | 4
登录 后跟帖