主要作用:分辨 app 是哪种形式、语言、工具开发的、对于不同方式开发的 app 需要采取不同的方式进行 nx。
原生方式开发的 app,使用 Java 和 C++ 开发,加密用的是 Java 和 C++
H5 的 app,使用 Webview 控件加载网页,加密用的是 JS
app 自动化测试,需要知道控件的 id,或者说需要定位到控件
如何查看呢? 使用 uiautomatorviewer.bat 查看,在 Android SDK 根目录 tools\bin,如下图所示:

双击 uiautomatorviewer.bat 查看某 app 登录控件的 id,如下图所示:

禁止截屏操作:
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
这里以某 app 登录为例,输入账号和密码,点击登录抓包,如下图所示:

观察发现此处是有密文的,所以需要我们逆向分析。
使用软件查看即可,将要判断是否有加固的 app 拖入到软件中,如下图所示:

通过查看界面元素,看是否是原生开发的 app,因为不同形式 app 分析方法不一样,在小节 一、app 界面控件的查看 中已经演示过,这里就不再赘述
局限性: app 可能被反编译 搜不到关键字,如: HTML5 的 APP、字符串被混淆加密(dex 的字符串加密可以用代码自动实现,需要使用到 dexlib2 这个库)、反射调用的相关类、app 被加固了、动态加载的 dex、热修复
由此可见,常规手段有着太多的局限性,hook 系统函数来定位关键代码才是最通用的。
注意:逆向分析不是说非要一步到位,我们需要边分析、边调试、观察怀疑、不断推翻尝试、不断找新关键函数的过程,要慢慢来,铁杵磨成针。
简单我就不赘述了,下载地址:https://www.python.org/downloads/
注意:3.8 64位的任意一个版本都行,不用管最后的小版本。
注意版本匹配:
frida12.3.6 Android5-6 Python3.7
frida12.8.0 Android7-8 Python3.8
frida14+ Android9+ Python3.8
frida15+ Android12 也可以用,待测....
我这里是 Android10,Python3.8,安装命令如下:
pip install frida==14.2.18
pip install frida-tools==9.2.5(装frida-tools时会自动安装frida)
网络不好可能会卡住,安装离线 whl 包,离线安装包百度网盘下载地址:
链接:https://pan.baidu.com/s/1BIOkna2j5ykixqMu2r-53w
提取码:lvks
--来自百度网盘超级会员V8的分享
命令:
pip install frida_tools-9.2.5-py3-none-any.whl
pip install frida-14.2.18-cp38-cp38-win_amd64.whl
注意: 先安装指定版本 frida、再安装指定版本frida-tools,安装的 frida 版本要与 frida-tools 版本对应,如何查看呢?点击链接:frida-tools版本的查看、frida-tools版本的查看
判断 frida 是否安装成功:

卸载命令:
pip uninstall frida==14.2.18
pip uninstall frida-tools==9.2.5
node.js 安装以及 pycharm 中使用 node.js 运行 js 代码参考文章:https://blog.csdn.net/xw1680/article/details/126070030
配置完成之后,进入你的项目目录,执行命令:npm i @types/frida-gum(不要全局安装、我全局安装不生效),如下图所示:

执行完毕之后,在 IDE 中写 frida hook 相关代码就会有相关提示了,如下图所示:

指定版本 frida-server 的获取:https://github.com/frida/frida/releases/tag/14.2.18(换成你自己的版本号)
frida-server(调试) 的运行平台要选对,frida-server 的版本与 frida 的版本要匹配,如下图所示:

通过usb连接真机不需要转发端口,通过ip连接需要转发,连接模拟器也需要转发,命令如下:
adb forward tcp:27042 tcp:27042
将下载好的 frida-server 包先解压,然后推送到手机,如下图所示:

执行完成之后,会有一个光标在闪动,就说明成功了,上述命令如下:
C:\Users\AmoXiang>adb push 你frida-server包的位置 /data/local/tmp/fsarm64
C:\Users\AmoXiang\Desktop\frida-server-14.2.18-a... 0 skipped. 32.9 MB/s (41387312 bytes in 1.201s)
C:\Users\AmoXiang>adb shell
sailfish:/ $ su
sailfish:/ # cd /data/lo
local/ lost+found/
sailfish:/ # cd /data/local/tmp/
sailfish:/data/local/tmp # ls
dalvik-cache fsarm64 uidump.xml
sailfish:/data/local/tmp # chmod 777 fsarm64
sailfish:/data/local/tmp # ./fsarm64
Pycharm 中写 js 代码进行测试,发现是 ok 的,如下图所示:

通过观察找到一些疑似关键函数,通过 frida hook 来确认 app 执行某个操作的时候,是否调用了它们
如果没有触发这些方法,考虑以下问题:
如果触发了这些函数,可以通过 hook 来打印执行过程中传入函数的参数和返回值
frida -U -F -I HookDemo.js:-U 代表远程USB设备、-F 代表附加到最前的这个app、-I 后面指明需要加载的JS脚本(写好的js脚本要注入手机端,并不是在 Node.js 中使用,所以只能用 v8 和 fridaAPI 支持的)
最后,利用以上得到的信息,来进行算法复现。
当需要构造的参数准备完成之后,我们就可以编写脚本去模拟请求,获取相应的数据了。