我又来找虐了,唉。。。需要解密的是dart+flutter开发的apk应用,通过百度得知,目前没有什么好的逆向flutter的so动态库的方法,除了动态的调试打断点,输出数据,需要新的技术来支撑(汇编+c),一想到这里头发又少了几根
分类:android
一个长期贴(技术向)(3)
按理说,数据请求的基本要素都有了,就可以直接模拟请求了。但是这个app的接口有签名参数校验token。
简单来说。客户端和服务端会约定一套相同的加密算法(当然,实现的编程语言可能不同)。加密的参数由请求参数组成,通常还会算上一个实时变化的参数,如时间戳,和一个固定的混淆参数(一般称为盐),
举个例子,服务端和客户端实现一套相同的hash算法,比如说将请求参数先按键名排序 然后按 键=值&拼接成字符串,然后拼接上 timestamp=当前时间戳,再拼接上固定的盐,双md5,计算出一个32位的随机字符串作为token,一起发送给后端。后端对请求参数做相同处理,然后得出token,与前端发来的token对比,如果一致则放行,否则就拦截,下面看具体的例子:
<?php $timestamp = time(); // 时间戳 $query_params = [ // 请求参数 'a' => 1, 'c' => 2, 'b' => 'jons' ]; $salt = "this is the salt ,you cant guess it. right?"; // 盐 function signature($params, $timestamp, $salt){ ksort($params, SORT_STRING); // 按键名升序排列 $str = http_build_query($params); // a=1&b=jons&c=2 $token = md5(md5($str . $salt . $timestamp)); return $token; } function curl($url, $data){ // 发起curl请求,这里忽略。 } $token = signature($query_params, $timestamp, $salt); //3c70cacb73d99ad9ca1b682f33c341e1 $sign_params = [ 'timestamp' => $timestamp, 'token' => $token ]; $url = 'https://image.baidu.com/api/login'; // 请求api $real_params = array_merge($query_params, $sign_params); // 实际的请求参数 curl($url, $real_params); //发起请求
所以,我们可以从三方面考虑请求的合法性:
一,当客户端传过来的token与服务端计算出的token不一致时,必然是参数被人修改过,或加密规则不一致,或盐不一致,即不可被信任,需要拦截。
二,即使token一致,当传过来的时间戳与服务端时间戳相差太大的,可以认为是有人抓了包,但是没有修改,只是重复请求。也可以根据时间戳的实时性来拦截请求。
三,高手可以通过逆向反编译源码的方式获取apk客户端的源码,从而获取加密的规则,实时生成时间戳和请求参数,伪造加密过程。但是盐是前后端约定过的。这个如果被编译成二进制文件,则很难反汇编出来,从而无法从逆向的代码中获取。保证加密的最后一道防线的安全性。如果拿不到盐,一样无法获取最终的token。
现在,我就被卡在这一步加密算法。已经确定的加密方法是md5(不确定几次),加密参数中由时间戳timestamp这个参数,加密方法未知,是否有盐未知。而且加密方法不在安卓逆向的源码中,而是在被编译成so的二进制动态库中,无法反汇编
一个长期贴(技术向)(2)
当我抓出第一个数据包,然后企图通过fiddler的界面查看参数,url地址等信息时,我发现出现了奇怪的事情,数据是加过密的。我记得fiddler的证书可以解密请求啊(代理其实是通过中间人攻击的方式获取https的加密数据并解密的),why?
接着百度,然后我发现了问题。之前安装抓包工具的证书,的确是可以解密一些app的https的请求结果的。但是在android7.0以后,有些app不再置信用户自己安装的证书,而只信任操作系统下面的根证书(没错,自己安装的证书只会出现在用户目录下,不会出现在系统目录下),而且,除了root手机获得最高权限,否则根本无法在操作系统的高权限目录下安装证书。
所有,我闲置多年的小米5手机又被翻了出来,插电,还好还呢开机,经过了几个小时的折腾,成功root。一通鼓捣,终于把抓包工具的证书安装到了操作系统下面。重启手机和抓包工具,成功抓包,也能看到明文的url地址,参数,请求头,返回值了。就这么结束了没,还很遥远,否则就不会出现这个长期的帖子了
一个长期贴(技术向)(1)
最近铆上了一个app的抓包,android apk,如果破解成功,也许能赚点小钱。嗯,果然赚钱是技术的第一动力,没错。但是对于我这个没有丝毫android开发经验的来说还是挺难的。立体为证吧,希望不要最终不要已以放弃告终。
app嘛,无非就是调用接口。如果能抓出请求参数,url接口地址,header头,那么其实剩下的就比较简单了,curl直接拼凑就能请求接口,完成模拟app的操作。当初我的想法就是这么简单直接(没错,其实我研究快2周了,当我写到这里的时候所以,这篇文章主要是现总结一下当前的情况和遇到的问题)。
第一步,抓包,我首先想到的就是charles(俗称花瓶)或fiddler 抓包工具,一般的https包都可以抓,只要导出抓包工具的证书安装到手机上,然后wifi设置和抓包工具在同一个网络环境下的代理端口,然后操作app,就能够抓到数据包了,然鹅,事情并没有这么简单。
坑一:我已经很确定我的证书安装,代理设置没有问题,甚至我打开手机自带的浏览器访问百度首页,抓包工具里面都有数据包开始出现,然而,无论我怎么摆弄要抓的app,怎么点,都没有任何和该app有关的包出现,嗯?难道这个app走的是其他协议?不可能,其他协议并不适合app做常规的业务开发,所以一定是哪里出了问题。
万能的百度解决了我的疑惑,原来,有些app会检测代理,如果本机有代理,则该app会自己启动一个代理程序(类似vue的本地反向代理),让所有请求都走自己的代理。这样抓包工具就没法通过设置代理的方式抓到应用程序的包了
解决方法:安装drony。drony可以启动一个虚拟私有网络(vpn),劫持所有流量,强制所有请求都被这个vpn接管,当然包括app自己的代理请求。
drony可以设置只拦截某个具体app的请求,然后配合抓包工具,就能够抓到这类app的请求数据了