学习笔记——Android逆向中快速定位关键代码

给自己新增一个任务,每天学习和记录一篇Android逆向相关的文章。
今天分享的是《OPPO安全应急响应中心》公众号里的一篇文章——移动APP测试中关键代码定位
思路明确,干货不少,现在App防护的整体难度越来越大,单纯静态分析掉头发太多,因此都是动静态结合。静态分析即使用Jadx反编译App(最新版Jadx好用又不占内存),动态分析过去用Xposed,但现在多半用Frida,因为Frida强大(native/java通吃)、跨平台(android/ios/win/mac)、学习成本低(Hook脚本以Js和py为载体),敏捷(边写Hook代码边出结果),什么叫真正的国际Hook巨星啊,我和IDA都谈笑风生(战术后仰)。
仔细一品会发现,Frida给人带来的最大畅爽点,就是敏捷,Js脚本敏捷,Frida的Api也敏捷,Hook脚本允许热加载等等,都是让它更快更好用,但如果做持久化Hook,比如公司的稳定调用,还是Xposed好用。
文中分享了几个不错的定位方法

一、Hook加密库

这指的是Hook Java官方提供的各种加解密算法实现函数,如果加解密发生在Java层,就会被因为直接暴露出来,这个思路十分常见,在Xposed时代,Inspeckage就是这么做的,效果也不错。https://github.com/ac-pm/Inspeckage。在Frida上,也有不少类似的脚本,比如Frida Hook AES——https://11x256.github.io/Frida-hooking-android-part-5/但是总体上来说Hook Java加密库现在用处不多,把加解密放到native层已经是基本操作,但如果业务需求需要时不时破解防护简单的App,那不妨试一下这个思路,搞一个Hook集合,把Java层的各种加解密Api都Hook了。

二.Hook网络请求库

这样做用处有二,一是Hook网络请求+打印堆栈,从而找到加解密函数,二是代替Fiddler/Charles抓包。既然要做这些事,首先就需要了解Android会使用哪些网络库。
1. Android原生自带的网络通信库

  • HttpURLConnection
    标准的Java接口(java.NET),HttpURLConnection基于http协议,支持get,post,put,delete等各种请求方式。。
  • HttpClient
    Apache的HttpClient模块(org.apache.http),这个模块被放在Android的SDK(软件开发工具包)中,它旨在提供高效的、最新的、功能丰富的HTTP 服务。

这里需要讲一下这两大通信库的前世今生,在Android 2(2010年)的远古版本中,HttpURLConnection有个重大 Bug,所以那个时候推 荐使用HttpClient。时光荏苒,BUG被修复了,HttpURLConnection也不断得到优化和完善。从Android 5(2014年)开始,Android官方不再推荐使用Apache模块, Android 6.0的SDK中去掉了HttpCien,到了最新的Android 9版本中,Android更是彻底取消了对Apache HTTPClient的支持。因此原声库现在主要指HttpUrlConnection。

2. 封装好的网络通信工具/框架
在Android实际开发中,一般都会使用别人封装好的第三方网络请求框架,原因也很简单,网络操作涉及到很多东西,别人封装的东西好用。

  • Volley
    在2013年的Google I/O大会上,Google推出了这款异步网络请求框架和图片加载框架。它特别适合数据量小,通信频繁的网络操作。它基于HttpUrlConnection,目前也有一定的使用量。
  • Android-Async-Http
    基于Apache HttpClient库之上的一个异步网络请求处理库,现在已经不怎么用了。一是因为HttpClient被Android弃用,二是框架作者已停止维护,这个库知道即可。
  • OkHttp
    OkHttp是大名鼎鼎的Square公司的开源网络请求框架,需要注意的一点是,它并非是基于HttpURLConnection和HttpClient的封装或者补充,事实上,它们是平级的,三者构成竞争关系。从Android 4.4开始,HttpURLConnection的底层实现也已经基于OkHttp,由此可见OkHttp是时下当之无愧最热门的HTTP框架。OKhttp简单、快速、高效。
  • Retrofit
    同样出自于Square公司,Retrofit是对Okhttp的封装,网络请求的工作本质上是 OkHttp 完成。

因此如果Hook网络请求的话,目前App的主要流量都来自Okhttp和Retrofit,Hook Okhttp即可,如果有余力,HttpURLConnection+Volley也可以Hook上,作者在文中提供了Volley的Demo。
Hook Okhttp已经有不少的资料,简单的只有几行代码,复杂的近千行,可是为什么要费这个劲去Hook网络请求库?Charles抓包不香吗?Postern不香吗?——还真是,有时候有些难言之隐。现在防抓包会做各种防范,双向验证啦,证书啦,禁止Proxy等等,分析代码后Hook或者装证书也是可以的,但比较麻烦,直接Hook Okhttp吐出请求有的时候还是挺有用的。
要想Hook Okhttp,操作中主要有几个问题。
1.App高度混淆后,Okhttp相关类的类名被混淆,找不到相关类。
2.Hook的方法和时机选择

对这方面感兴趣的可以看一下这几篇文章,说实话都还不是很完善,感兴趣的话欢迎私聊我加wx逆向群讨论。
https://bbs.pediy.com/thread-252129.htm yang大佬有Frida Hook 拦截器实现的OkHttp Hook,评论区有处理加固的版本
https://bbs.pediy.com/user-819934.htm 珍惜大佬关于Okhttp是三篇文章

三、查看日志或Hook日志启动开关

越是完善的App,日志就越充分和完整,敏感信息往往会在Release发行版中抹掉,但逻辑还是在的。有时候会设置一个开关,诸如

if(version==release){
	open = false;
}

可以去静态搜索找到这个开关,开启后暴露大量日志。
除此之外,Android开发中还存在判空类,同样是Hook的好时机,分析App焦头烂额但无果的时候,不妨试试找一下App的工具类,将工具类的方法进行Hook,App诸多逻辑都会使用工具类中的方法。

除此之外,这篇文章也是很好的参考。https://blog.csdn.net/qq_34149335/article/details/97289757

你可能感兴趣的:(每日一文)