培训阶段的学习一般伴随着考试。这两周要进行一个线上考试,考试题目从题库中随机抽取,因此班主任嘱咐我们一定要大量练习,多刷几遍。这种反复刷题的方式确实能够提高考场题目的命中率,但却十分消耗精力(APP交互生硬也是原因之一)。
为缓解此问题,我最初想通过Python爬虫方法将题库导出,但按照之前的经验,安卓APP抓包较难,更何况是企业微信团队提供技术支持的APP。具体难点包括:网络抓包一般需要受信任的HTTPS证书,APP不会轻易信任用户提供的证书,甚至可能只信任内置证书。就算证书核验通过,数据也有可能采用自定义加密算法,难以破解。
继续探索,深入证书问题,由于需要Root权限,权衡后采用虚拟机继续探索,在使用Android SDK过程中还遇到了arm64/v8安装包与x86架构不兼容的问题。辗转使用旧版Genymotion虚拟机软件(新版会卡机)及translator插件,并装载Android 11 系统,成功安装该APP。但遗憾的是,该软件检测到Root环境,闪退拒绝。可见抓包路上困难重重,软件在环境安全上下了很多功夫。
抓包方向上知难而退,改变思路,还可以从adb模拟点击以及获取屏幕内容的角度进行尝试。此APP禁止截屏,但幸运的是,经测试可以通过无障碍服务获取UI层次结构(XML表、控件树)。代码为:
点击操作:adb shell input tap 200 550
获取屏幕显示对象:adb shell uiautomator dump /sdcard/window.xml && adb pull /sdcard/window.xml . && adb shell rm /sdcard/window.xml
这一步打开了新世界的大门,通过元素查找和定位,再结合模拟点击,完全可以实现题库的提取。因此在Python上安装uiautomator库,与AI友好交流后,经过一下午加晚上的调试以及将近14个小时的提取后,成功实现了题库的导出(连续三套试题,题库无新增题目视为完成导出)
结尾思考,作为该APP的同源软件,我尝试获取了微信的控件树,但没有返回任何结果,如果想要实现微信的屏幕获取,可能要通过截图OCR或者视觉OCR完成了。