cocos2d Speed调研
一.搭建cocos2d-x 4.0项目
主要是纯c++和纯Lua游戏(4.0里面已经没有JS模板了,分析应该是因为已经创建了cocos creator(更强的可以开发3d游戏的JS引擎)
二.光环加速器
口袋-flash (特征:游戏内开发文件为.swf后缀)
御剑三国-lua(特征:游戏内开发文件为.lua)
新斗罗大陆-lua
圣斗士星矢-unity3d(特征:游戏内文件压缩比很大,并且资源文件为res.asset这种格式)
三国杀名将-lua
少年三国志-lua
少年三国志2-lua
光环加速器分析:
1.首先光滑加速器的引擎大致分为三类.
game_engine - 0 为 口袋(两款游戏)-flash
game_engine - 1 为 新斗罗大陆-lua等 几款lua游戏 当然大部分他们都使用了lua_hook这个函数
game_engine - 2 为 圣斗士星矢-unity3d
他们利用开发工具生成下面的配置文件,根据配置的json来加载hook方法.
{
"gh_plugin_version": "1.3.0",
"game_engine": 2,
"scheduler_update": "0x100394720",
"set_timescale": "0x100F68CC0",
"lua_hook": false,
"luaL_loadbuffer": "0x1008A9610",
"lua_func": {
"lua_pcall": "0x169814",
"lua_pushcclosure": "0x1686B4",
"lua_tolstring": "0x167BC8",
"lua_setfield": "0x169080",
"lua_toboolean": "0x200000",
"lua_pushnumber": "0x200000",
"lua_setglobal": "0x200000"
},
"lua_inject_position":"",
"game_id": "60cff8ed2ef495cd9a83c96b",
"game_platform": "appstore",
"ori_packagename": "com.hoolai.saintseiya",
"cur_packagename": "com.gh.sdsxszycsappstore",
"bundleid_hook": true,
"show_type": 1,
"min_speed": 0.5
}
其中新斗罗大陆虽然是lua游戏但是没有使用luahook函数.
2.从逆向代码看
分析:
initNormalHook—> timeScale或者scheduler_update这个函数
initCocos2dlHook---> luahook 使用lua脚本写的
initUnity3dHook—>scheduler_update或者是set_timeScale这个函数或者其他特殊方法
动态调试这几个游戏
实际调试:
Lua--->initLuaHook [函数名:-[GHGamePluginManager initLuaHook]]
Unity **2021-11-23 20:36:22.087719+0800 mhblol[20257:4446308] hook set_TimeScale ------------------ 3.571429 canSpeedUp 1 **
当然光环的没有集成cocos2d-js游戏(可能是因为性能上面js游戏不如lua的游戏)
所以我们现在要做的是luahook的角度来普通进行hook加速或者说是像光环的使用函数的地址进行hook.
如果使用函数的地址进行hook的话,需要对每个游戏里面的函数方法进行地址偏移计算拿到编译前的地址.
下面的小七的游戏是有js_hook的
三.小七的
阿修罗之眼-lua
大圣不取经-unity3d
秦时明月-lua
道友请留步-js(特征:游戏内文件为.jsc 一般为加密的js文件)
[图片上传失败...(image-6283fc-1638147429012)]
[图片上传失败...(image-294580-1638147429012)]
小七的也是有config.json但是小七的他加密了看不到里面的内容,太狗了.
1.Dump
光环游戏:斗罗大陆lua—>找不到 CCDiretor 类 但是可以找到CCDirectorCaller这样无用的类, 应该是暴露出来CCDiretor就可以直接控制速度了
Dump
自己创建的testLua(cocos2dx-4.0是目前最新的版本)
testLua一样的
里面写的是随机创建一个全局精灵的,循环10000次更新位置,并没有依赖时间函数.但是使用C调用CCDiretor直接可以控制加速效果.在Lua里面控制CCDiretor 也可以控制加速效果
2.反编译和调试:斗罗大陆lua 日志显示并没有hook_timeScale函数 .是hookLua.
这几个也就是印证了为什么我们一直纠结的gettimeofday里面hook修改系统时间函数无效.(实质是hook timeScale, 部分游戏直接开的定时器可以控制ccTime变量也就是直接修改系统时间可以有效)
当然我也试过fishhook去hook update函数或者其他一些相关控制时间或者speed的类,但是lua是拿不到相关对象的.(没有试过其他hook工具)
总结:
目前不知道光环的LuaHook里面做了什么
猜想1:注入的SDK里面集成了cocos2d引擎,通过控制时间函数gettimeofday,从而实时控制速度.
猜想2:注入Lua代码在gettimeofday函数里面实时注入CCDiretor对象变量值从而控制速度
.
下次进一步验证几个猜想...