手游安全之cocos2d-x的源码浅析(手游逆向与防护)

一、cocos2d-x框架结构

图片

二、cocos2d-x引擎架构

图片

三、cocos2d-x源码结构

图片

四、cocos2d-x源码解析

1.luaLoadBuffer函数分析

cocos2d-x-3.16/cocos/scripting/lua-bindings/manual/CCLuaStack.h
cocos2d-x-3.16/cocos/scripting/lua-bindings/manual/CCLuaStack.cpp

图片

2.applicationDidFinishLaunching函数分析

cocos2d-x-3.16/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.h
cocos2d-x-3.16/tools/simulator/frameworks/runtime-src/Classes/AppDelegate.cpp

图片

cocos2d-x-3.16/tests/lua-tests/project/Classes/AppDelegate.h
cocos2d-x-3.16/tests/lua-tests/project/Classes/AppDelegate.cpp
cocos2d-x-3.16/templates/cpp-template-default/Classes/AppDelegate.cpp
cocos2d-x-3.16/templates/js-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp
cocos2d-x-3.16/templates/lua-template-default/frameworks/runtime-src/Classes/AppDelegate.cpp
cocos2d-x-3.16/tests/cpp-empty-test/Classes/AppDelegate.cpp

五、静态分析so的特征函数

1.cocos2d-x lua的版本号

图片

2.cocos2d-x luajit的版本号

图片

3.loadChunksFromZIP函数

图片

4.luaLoadChunksFromZIP函数

图片

5.luaL_loadbuffer、luaL_loadbufferx、lua_dump函数(加密解密手游的lua源码)

(1).在luaL_loadbuffer函数处获取lua源码(cocos引擎的lua加载器为cocos2dx_lua_loader,最终都是调用luaL_loadbuffer函数来加载,lua源码的加密解密等保护是通过对lua_loader为后缀相关的函数为加载器进行封装,实现对lua文件的加密/解密、压缩/解压缩等处理)

(2).在更底层的reader函数处获取lua源码(lua引擎加载lua脚本最底层是到lua_reader函数,该函数负责最底层的脚本buff遍历,因此在此处Hook dump出来的lua脚本是最纯正的lua脚本,所有加密都已经被去除(修改lua opcode或引擎逻辑除外)(该点获取不到足够的文件信息(文件名、buff index等),需要配合上层函数拼凑lua脚本)

(3).定位到luaL_loadbuffer函数,然后往上回溯,分析出解密的过程

(4).打包在App中的lua代码一般是加密过的,程序在加载lua脚本时解密(关键函数luaL_loadbuffer),解密后就能够获取lua源码。如果解密后获取的是luac字节码的话,也可以通过反编译得到lua源码,反编译主要用的工具有unluac和luadec51

图片

jlicht_lua_loader
cocos2dx_lua_loader
jinit_marker_reader
bool AppDelegate::applicationDidFinishLaunching()
AppDelegate::applicationDidFinishLaunching(AppDelegate *__hidden this)
int LuaStack::luaLoadBuffer(lua_State *L, const char *chunk, int chunkSize, const char *chunkName)
cocos2d::CCLuaStack::lua_loadbuffer(lua_State , char const, int, char const*)
int luaL_loadbuffer (lua_State *L, const char *buff, size_t sz, const char *name)
cocos2d::LuaStack::luaLoadBuffer(lua_State *, char const*, int, char const*)
typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz)
typedef int (*lua_Writer) (lua_State *L, const void* p, size_t sz, void* ud)

6.applicationDidFinishLaunching、tgaLoadBuffer、loadBinary、loadBreakConfig、loadBottleModel、loadBoxData、ApplicationProtocol函数

图片

7.initWithImageFile、initWithImageData、initWithImageFile等函数(加密解密手游的资源文件)

cocos2d::CCImage::initWithImageFile(char const*, cocos2d::CCImage::EImageFormat
cocos2d::CCImage::initWithImageData(void *, int, cocos2d::CCImage::EImageFormat, int, int, int)
jlicht::Image::initWithImageFile(std::string const&, bool)
lua_cocos2dx_Image_initWithImageFile(lua_State *)
cocos2d::Image::initWithImageFile(std::string const&)
int lua_cocos2dx_Image_initWithImageFile(lua_State* tolua_S)
bool initWithImageFile(const char * strPath, EImageFormat imageType = kFmtPng)
bool initWithImageData(void * pData, int nDataLen, EImageFormat eFmt = kFmtUnKnown, int nWidth = 0, int nHeight = 0, int nBitsPerComponent = 8)
bool Image::initWithImageFile(const std::string& path)
bool CCImage::initWithImageFile(const char * strPath, EImageFormat eImgFmt/* = eFmtPng*/)
bool js_cocos2dx_Image_initWithImageFile(JSContext *cx, uint32_t argc, jsval *vp)
static int tolua_Cocos2d_CCImage_initWithImageFile00(lua_State* tolua_S)
static int tolua_Cocos2d_CCImage_initWithImageData00(lua_State* tolua_S)

六、cocos2dx lua脚本的保护浅谈

1.lua、luac、luaJIT三种文件的关系

其中lua是明文代码,直接用记事本就能打开,luac是lua编译后的字节码,文件头为0x1B 0x4C 0x75 0x61 0x51,lua虚拟机能够直接解析lua和luac脚本文件,而luaJIT是另一个lua的实现版本,JIT是指Just-In-Time(即时解析运行),luaJIT相比lua和luac更加高效,文件头是0x1B 0x4C 0x4A

2.游戏厂商一般都不会直接把lua源码脚本打包到App中发布,一般对lua脚本的保护大致有下面3种,如下所示:

(1).cocos2dx lua脚本加密、在加载脚本之前解密

该方案很容易通过hook cocos的关键接口获取到lua源码

(2).将cocos2dx lua脚本编译成luaJIT字节码并且加密打包

该方案能够较好的保护lua源码,主要是先解密后反编译,反编译主要是通过luajit-decomp项目,它能够将luajit字节码反编译成伪lua代码

(3).修改cocos2dx lua虚拟机中opcode的顺序,指令抽取等

该方案主要是修改lua虚拟机源码,再通过修改过的虚拟机将lua脚本编译成luac字节码,达到保护lua源码的目的。这种情况如果直接用上面的反编译工具是不能将luac反编译的,需要在程序中分析出相对应的opcode,然后修改lua项目的opcode的顺序并重新编译生成反编译工具,才可以反编译

3.Cocos2d-x对于lua脚本加密提供了一种轻量级解决方案

七、常用的手游逆向分析工具

bamen.apk
GameKiller_v2.3.apk
GameGuardian.8.36.1.apk
Cheat Engine 6.5
NET.Reflector
ILSpy

八、参考文章

Lua程序逆向之Luac文件格式分析
https://www.anquanke.com/post/id/87006

Lua程序逆向之Luac字节码与反汇编
https://www.anquanke.com/post/id/87262

Lua程序逆向之Luajit文件格式
https://www.anquanke.com/post/id/87281



手游安全之cocos2d-x的源码浅析(手游逆向与防护)

图片

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: cocos2d-x是一款流行的开源游戏引擎,它可以用作开发本地移动游戏和桌面游戏。利用cocos2d-x游戏源码,开发人员可以快速构建流畅、高效、具有吸引力的游戏。该引擎使用C ++语言和脚本语言Lua来实现游戏开发,用户可以根据自己的需要进行选择。 cocos2d-x游戏源码包含许多强大的功能和工具,例如精灵、动画、场景管理、碰撞检测和音频控制等。通过这些功能,开发人员可以方便地创建各种类型的游戏,例如动作游戏、射击游戏、冒险游戏和益智游戏等。 此外,cocos2d-x游戏源码还具有高度定制化的特性,允许开发人员根据他们的需求自定义游戏元素。这种定制化可以通过改进游戏画面,添加新的模式和关卡,甚至整个新的游戏玩法来完成。 总之,cocos2d-x游戏源码是一款功能强大、易于使用和高度定制的游戏引擎,它可以帮助开发人员快速开发各种类型的游戏。无论你是专业开发人员还是无经验的游戏制作者,cocos2d-x都是一个极好的选择。 ### 回答2: Cocos2d-x游戏源码是使用Cocos2d-x引擎进行开发的游戏程序代码。Cocos2d-x引擎是一个开源的跨平台游戏引擎,可以支持iOS、Android、Windows Phone、Windows、MacOS和Linux等多个平台,并且提供了丰富的游戏开发API和工具集。Cocos2d-x游戏源码包含了游戏的核心逻辑、UI设计、动画效果、音频效果等各方面的代码,可以作为开发者学习和借鉴的重要资料。 由于Cocos2d-x引擎支持多种编程语言(如C++、Lua等),因此Cocos2d-x游戏源码也会有对应的编程语言版本。开发者可以通过阅读Cocos2d-x游戏源码,了解游戏开发过程中的技术细节,学习如何使用Cocos2d-x引擎进行游戏开发。同时,开发者也可以通过对Cocos2d-x游戏源码进行修改和优化,来满足游戏的特定需求,提升游戏的性能和用户体验。 总之,Cocos2d-x游戏源码是游戏开发者必备的重要资源,可以帮助开发者更好地了解游戏开发技术,提升游戏开发水平。 ### 回答3: cocos2d-x是一款优秀的游戏开发引擎,其源码包含了许多功能强大的游戏开发工具和API。使用cocos2d-x可以帮助开发者更快速更高效地开发出优秀的游戏作品。 cocos2d-x的游戏源码非常丰富,其包含了许多不同类型的游戏示例和模板,如平面射击、塔防、解谜等,这些示例可以帮助开发者更好地了解cocos2d-x的使用方法和原理。 cocos2d-x源码还包含了许多强大的API和工具,例如场景管理、动画控制、音频引擎等,这些工具和API能够帮助开发者更好地完成游戏的开发和调试。 此外,cocos2d-x源码还提供了完整的游戏开发框架,包括资源管理、内存管理、事件机制等,这些框架可以帮助开发者更好地组织代码和提高代码的可维护性。 总的来说,cocos2d-x游戏源码提供了丰富的工具和API,可以帮助开发者更高效地进行游戏开发,大大降低了开发难度和成本,是一款非常适合游戏开发者使用的引擎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值