Android逆向之旅---Android中分析某短视频的数据请求加密协议(IDA动态调试SO)第一篇

一、前景回顾

大家会好奇这篇文章感觉有种似曾相识的感觉,标题不一样了?的确之前那篇文章因为某种原因被删了,为什么要删大家懂得!的确是我的过错,标题弄得太明显给某公司带来烦扰,所以就整理再发一次!看过的同学就当回顾,没看过的就认真看一下吧!不过本文会增加一个知识点,就是今天有个同学在看我的博客(博客这篇文章没有删)的时候发现,某音的应用已经做了安全提示了:

看到最新版的应用已经开始检查设备是否安装Xposed了,如果安装就给这个提示,检查的原因就是为了保证应用的安全不会hook操作!但是比较奇怪的是,他只是检查不做任何其他处理!也不知道是不是我之前发的文章导致他们加了这个检测机制还是什么原因?先不管这个了,我们来看看应用对Xposed检测有哪些方法,其实这个在看雪上有大神已经总结了,主要是支付宝先做的策略,而且在很早有人在知乎上提问了:

为了应用安全这个操作是必要的,看雪上的那个大神通过分析支付宝代码得到了检测Xposed策略大致如下:

1、支付宝的Xposed检测原理是: Xposed框架将Hook信息存储在字段fieldCache,methodCache,constructorCache 中, 利用java 反射机制获取这些信息,检测Hook信息中是否含有支付宝App中敏感的方法,字段,构造方法

2、支付宝的SO检测原理是: 检测进程中使用so名中包含关键"hack|inject|hook|call" 的信息

3、支付宝的Root检测原理是:是否含有su程序和ro.secure是否为1


具体方案大家可以网上搜索即可。但是这种方式支付宝做的不好是直接明文的在代码中检查这几个字段,那么解决就太简单了,直接用Jadx打开应用全局搜索代码中包含这几个字段,然后找到关键代码把检测代码给注释即可!所以为了安全可以把这些字段加密放到so中检查安全性会更高。当然检测到应用被hook了就可以给个提示或者某些功能用不了都可以的!


还有一种防止被Hook的方式就是可以查看XposedBridge这个类,有一个全局的hook开关,所有有的应用在启动的时候就用反射把这个值设置成true,这样Xposed的hook功能就是失效了!

有的同学会好奇怎么反射操作呀?因为Xposed的hook原理的就是在程序启动都注入jar功能,所以安装hook模块之后,每个应用内部都包含了这个Xposed功能jar,就相当于你的应用中有了Xposed的所有功能类,所以在应用中反射Xposed的类是可以成功的,当然前提是设备装了Xposed并且有相应的hook模块!而这些方案已经都是公开的,一些应用为了防止被hook做了很强的安全防护策略,大家感兴趣可以去看看"一号店"应用,会发现hook他也是失败的,并且很难找到相应的检测机制!这个我也是没时间一直没研究,后面会研究出文章的,敬请期待!


二、逆向分析

不多说了,赶紧来分析某短视频应用,不过本文不在利用粗暴的静态方式去破解了,应广大同学要求,就介绍IDA动态调试so来进行破解,这样也能给大家带来更多IDA的使用技巧。毕竟我写文章技术都是为了你们。这种分析请求数据的突破口一般都是抓包,这不用多说了。不过都是用了https请求,所以需要手动在设备中安装Fiddler证书,才能抓到正确的数据信息:



打开某音之后,看到数据刷的很快,发现一个feed的接口是返回的首页的数据,在分析它的请求参数中有三个字段是minCursor,maxCursor,count其实这三个字段就是后面他进行数据分页请求的关键,到后面再详细说。不过这里看到还没有什么问题,不过问题往下看他的更多请求参数,会发现两个字段:



这时候会发现其他参数都和本地设备有关或者直接写死的,唯独这两个参数信息是始终变化的。所以猜想这两个字段是用于请求协议数据加密和服务端进行校验的。那么如果我们想单独构造信息去请求,这两个字段的信息一定要正确,不然请求不到正确的数据的。好了,这里简单了,使用Jadx打开app即可,直接全局搜索字段的信息"as=":


看到这里是构造了as和cp两个字段的值,直接点击进入即可:


这里大致的逻辑也比较简单,利用UserInfo.getUserInfo函数获取字符串,然后对半开给as和cp两个字段,右移操作就是除以2的意思。这里不分析代码来看看参数怎么来的,直接用Xposed进行hook这个函数打印参数看结果,粗暴快捷,以后其实这都是快速解决问题的一种方式,hook大法是最无敌的


先来看一下这个加密方法的参数信息,看到是native的,也就是说加密操作是在so中做的,后面需要调试的也是这个so了。也不管了,hook这个方法然后打印信息看参数构造:


直接运行模块,打印日志看信息:


看到三个参数打印的值,发现大致三个参数的意义是:当前时间戳,请求url,请求参数的数组信息。好了,我们现在可以新建一个Android工程,然后构造这三个参数信息,然后调用它的so函数,为了能够快速找到这个so名称可以用万能大法:全局搜索字符串信息"System.loadLibrary" 即可:


这样就找到了这个so名称了,到libs目录下把这个so拷贝出来到我们自己构建的demo工程中,这里先不着急调试去分析native的加密函数功能,还是老规矩拿来主义,直接上层构造一个和他一样的包名的native函数,调用它的so获取结果即可:


然后就开始构造参数信息了,这里为了简单,先把那些公共的参数信息写死比如设备的sid,aid,版本号等信息:


这里我们利用公众参数信息,构造请求字段数组信息,然后还有单独的几个字段值不能参与操作,可以通过之前的打印日志分析出来。当然时间戳也是服务器格式,和本地是少三位的,直接除以1000即可。下面为了简单直接把公众参数写死即可,当然后续优化就是把这些参数值进行动态获取填充即可:


构造好参数之后,然后就开始调用native函数,然后获取返回结果即可:


到这里,我们构造的工作就完成了,下面就开始直接运行吧,不过可惜的是,没有这么顺利,直接运行闪退了:


这里应该进行加载so出现问题了,那么我们在回过头看看我们是不是有些环境没初始化,看看UserInfo类中是不是还有一些初始化方法没调用:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值