H5app逆向总结

H5app是在app里使用webview组件,相当于在app里植入web页面,通过js代码进行操作。

对于这类app,一般需要使用android sdk中自带的工具:android_sdk\tools\bin\uiautomatorviewer.bat可以分析当前app页面的组件,一般最外层的就是webview组件。

H5app一般分为几种:

  • 纯js的,就是加密和发包都是在js代码里的。

  • js和java混合的,就是js中加密java发包或者java加密js发包的,一般需要js和java的相互调用。

  • 纯java的,就是加密和发包都是在java代码里的,也需要js和java的相互调用。

分析方法

1、纯js

可以在chrome://inspect(需挂vpn)来远程调试app,不过app一般默认是不允许webview_debug的,所以chrome默认无法调试,需要先使用frida hook掉相关函数设置debug模式为true再进行抓包调试。

hook代码一般为:(当然有的时候还是需要jadx分析他限制调试的地方,不一定完全是这个)

  • android.webkit.WebView.$init
  • android.webkit.WebView.setWebContentsDebuggingEnabled
  • 在这俩个的implemation里通过this.setWebContentsDebuggingEnabled(true)即可。

通过hook构造函数和set…函数可以启用远程浏览器调试。

之后使用chrome进行抓包调试,找到login的js代码下断点跟进。

2、js和java混合

也是需要先执行上边的过程,不过在断点跟进的时候,如果是js调用的java的代码,是没法继续跟进的,一般可以通过以下代码导入java里的类,然后调用java里的函数来实现加密或发包。

1
2
3
4
5
6
var modu = api.require('class_name')         
//这里的class_name是实际的java中的类名,不过可能不完全一样,加一些前后缀什么的。
arrJson = modu.method_name({
msg: login_name
})
//这里的method_name是实际的java类中的方法名,login_name是参数。

这时没法继续在浏览器js中继续跟进了,就需要到jadx里搜索该类和函数继续分析java代码了。

3、uni-app

uni-app是一款支持多端原生、小程序、Web的开发框架。这种一般浏览器js抓不到包,不过这类产品一般在assets\apps\_UNI_xxxx\www下会有js代码,主要逻辑一般会在app-service.js里,要想实现类似动态调试来查看变量值得效果,可以修改该js文件在里边加入log来输出。

uni-app的发包代码可以搜索uni.request

1
2
3
//这是uni提供的导入其他类的接口,可以导入android里的Log类
var appLog = plus.android.importClass("android.util.Log")
appLog.d("tag ",i) //查看变量i的值

修改完js后,删除META-INF后使用apksigned重签名(当然这里注意是否有签名校验)。

安装后再次运行即可打印出变量i的内容,实现动调效果。