之前在接触到frida之后就对这个工具印象特别深刻, 虽说每次调试都得需要电脑的辅助调控, 但是胜在轻量级且不用总是重启, 接口的使用也比较方便. 因为在之前见过有人使用gg修改器配合软件的绘制来进行对鹅肠的某款moba手游进行方框透视, 所有突然来了灵感, 尝试使用frida读取内存, 并且实现同时对读取的数据用python绘制.
在这里我对所有敏感的特征码进行了删减处理, 只进行技术的交流, 不传播脚本的使用.
frida的使用基于python, 所以在开始前先安装好最新版的python.然后执行 pip install frida 和 pip install frida-tools , 就安装好frida了. 此外还需要有adb工具, 具体的基础使用不在这里赘述, 百度上有很多. 在frida的官网下载frida-server并且使用adb push命令将其置于data/local/tmp目录下, 并且赋予777权限.
工具准备就绪后如图依次输入指令 adb shell , su , ./data/local/tmp/frida-server 命令运行frida-server:
图1: 启动frida-server
之后将该窗口最小化, 开启另一个窗口输入frida-ps -U命令检测模块是否正常连接, 如图所示则一切正常:
图2: 检测连接情况
我们在这里主要使用frida的内存操作指令, 而不使用拦截器. 首先我们配合gg修改器附加一个进程进行指令的测试, 我们选用一个进程, 我挑的进程的pid为10080,使用 frida -p 10080 -U 附加或者查看该进程的包名使用 frida -n xxx -U 附加, 附加后我们用gg修改器选一个地址, 修改为一个数字, frida读取验证一下:
Memory.readInt() 指令是读取指针所指的地址取int类型的值, ptr(0xc404bf30) 的意思是将0xc404bf30转化为native指针, 在frida的内存操作都是基于这个native指针来进行的. 上面两图我们可以看到工具能够正常工作.
我们的绘图操作使用python的tkinter包. 相关的参考资料可以如下:
主要的js代码如下:
js代码主要的流程是先扫描特征码, 然后基于特征码偏移找到玩家的坐标数据, 之后将读取的坐标数据以字符串的形式传递给python代码. 首先特征码的查找是必要的, 其次对于内存的读取有一个坑, 玩家要不断点击移动按钮内存才会刷新, 倘若拖动摇杆则会造成内存无法刷新的问题, 具体解决方案我查了很多资料也没有找到原因. 希望有大佬可以指点一下.
我对python的功能进行了分类, 主要的原因在于无论采用多线程还是多进程, tkinter在绘图的过程中要么画不出图像, 要么报main thread is not in main loop的错误, 所以我索性将绘图另外放置一个脚本之中,开两个shell进行工作, 数据的传输使用socket进行传输. 接收数据的服务端代码如下:
这个py文件主要完成了js数据的接收和转发至绘图脚本的工作. 绘图脚本代码如下:
最终实现的效果如图:
从开始有这个想法到最后的勉强算成功花了两天的时间, 真的是踩了无数的坑, 也学到了挺多的东西. 令我印象最深刻的还是js读出内存不更新以及画图的问题, 我到现在也搞不懂, 难道是frida还对读过的内存进行了缓存吗, 移动摇杆就是不更新内存, 只有点击才有反应. 还有python的绘图, 一边传数据一边画图按理说用多线程就可以解决的, 可多线程多进程都试过才发现不行. 最后绘图的帧率很低, 一卡一卡的,人物坐标莫名其妙会飘, 手机也很热, 也就做研究可以试试, 实际的使用根本不行=.=
以下是我个人觉得比较好的相关参考资料:
[<FONT color='blue'>frida文档</FONT>][https://frida.re/docs/javascript-api/]
[<FONT color='blue'>frida入门教程</FONT>][https://www.jianshu.com/p/b833fba1bffe]
[<FONT color='blue'>tkinter画图</FONT>][https://www.cnblogs.com/OctoptusLian/p/6366351.html]