一种注入到unity游戏进程获取FPS的方法

最近在实现inject+hook获取目标游戏进程的相关信息,包括系统资源占用及FPS等信息,就了解了下目前获取目标进程的FPS的方法。
摘要由CSDN通过智能技术生成

获取FPS的几种方式

最近在实现inject+hook获取目标游戏进程的相关信息,包括系统资源占用及FPS等信息,就了解了下目前获取目标进程的FPS的方法。主要有三种:

  1. 通过dumpsysSurfaceFlinger | grep flips命令来获取当前系统的FPS,如果只有游戏进程在前台,也能够获取到正确的FPS信息,此方法最为简单,无需hook及inject等;
  2. 通过注入so到surfacelinger进程,hook eglSwapBuffers函数,记录该函数调用频率也可以获得FPS信息;
  3. 注入so到目标进程,并在目标进程的unity gameobject中加载脚本,记录update的调用频度来获取FPS;

第三种最为复杂,第一种最为简单,但本文着重介绍的就是第三种获取FPS的原理及实现简介。其原因为:通过在目标游戏进程注入so及cs脚本,除了可以获取FPS外,还可以实现其它更多的功能。

原理

使用inject将so文件注入到目标游戏进程后,该so调用mono相关接口,将cs编译后的dll文件加载到进程中,同时调用gameobject.AddComponent方法,此脚本就被动态加载到游戏进程中了,脚本中的update和OnGUI等都会被游戏进程调用到,只需记录update的调用频度即可获取FPS信息(当然也可以在目标游戏进程中画UI)。

步骤简介

  1. 准备inject进程(ATTACH到目标进程,然后在目标进程申请内存,并将一段机器指令写入目标进程,在该机器指令段内加载待注入的so文件);
  2. So被加载到目标进程后,调用dlsym获取mono相关接口;
  3. 调用mono相关接口获取到mscorlib中的System.Reflection:Assembly的class信息,并获取该class中的Load及GetType方法;
  4. 调用mono相关接口获取UnityEngine中GameObject的class,并获取该class中的ctor及AddComponent方法;
  5. 将待注入的脚本文件编译后的dll二进制内容全部读入内存code_buffer中;
  6. 调用3中的Load方法将code_buffer内容加载到进程;
  7. 加载后其会被compile;
  8. 获取加载后的主类的class的type信息(调用3中的GetType);
  9. 调用mono_object_new创建一个GameObject(使用4中获取到的class信息);
  10. 调用AddComponent将创建的对象加载到unity中;

至此&

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值