1、防网络代理抓包
网络请求配置Proxy.NO_PROXY,可以保证app的网络数据不经过wifi设置的代理工具(最常见的抓包方式)
webview,HttpURLConnection,okhttp等框架均可以配置NO_PROXY
2、网络请求数据加上签名
原始请求 http://xxx.com/xx.php?p1=v1&p2=v2
加签名后 http://xxx.com/xx.php?p1=v1&p2=v2&sign=md5(p1=v1&p2=v2&secret)
所有网络请求数据加签后,重复发包就变得相对麻烦。
这里的问题在于secret及签名算法保存在app本地,还需要对抗静态分析,则可以使用native方式实现加签逻辑
另外公司业务涉及到PC客户端,android&ios客户端,小程序,h5,web等多个端,各个端静态分析难度不一样。android(ollvm混淆so代码)和ios分析相当较困难,而其他端(如果采用了加签机制)使用的secret被分析出来就比较容易。
若服务器端使用通用的校验签名接口,可能出现使用PC客户端的密钥去加签APP的网络数据,校签接口区别对待各端接口与加签密钥。
校验签名接口可以配置(api0, client_id, client_secret)(api1, client_id, client_secret)类似的对应关系
3、防止native so库被任意调用
加签逻辑及加签密钥写在so库里面且使用ollvm混淆过,难于分析。但是默认可以被其他app加载,加载之后调用加签函数直接获得加签结果
可以在JNI_OnLoad中判断宿主app的签名公钥信息是否合理
获取宿主packagename,然后getInstalledPackages找到对应的包获取signingInfo进行对比
4、防止重打包
重打包可以破坏app的防御机制、钓鱼用户密码等
app被重打包后,新的apk需要重新签名才可以安装到android系统,可在so中获取宿主app的签名信息是否合理,然后决定是否运行下去。应在程序刚启动就立刻判断是否重打包
5、使用SSL Pinnig
Proxy.NO_PROXY可以防止代理抓包,但不能防止本地抓包(推荐app.greyshirts.sslcapture,不需要root的android本地抓包工具,且解密SSL)
SSL Pinnig 即https证书绑定,可以保证app与服务器的https连接没有中间人嗅探,通过重载SSLSocketFactory实现
(通常app会重载SSLSocketFactory来实现ssl忽略证书错误(webview也忽略SSL错误),十分不可取)
6、webview jsbridge判断请求来源域名
app越来越H5化,所以app中的webview会开放许多jsbridge,供h5中的javascript调用java实现的功能。
对于敏感的java功能,应该首先判断webview.getUrl()是否为公司的子域名(譬如.*\.taobao.com)
持续更新中
PS:本地hook(xposed,firda)技术会使以上技巧变得不辣么有效
fiddler抓不到PC客户端流量时,可以结合proxifier(设置其代理指向fiddler)抓包