手游安全之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/87006Lua程序逆向之Luac字节码与反汇编
https://www.anquanke.com/post/id/87262Lua程序逆向之Luajit文件格式
https://www.anquanke.com/post/id/87281
手游安全之cocos2d-x的源码浅析(手游逆向与防护)
手游安全之cocos2d-x的源码浅析(手游逆向与防护)相关推荐
- cocos2dx+JAVA手游《全民挂机》全套源码支持安卓+IOS双端
cocos2dx+JAVA手游<全民挂机>全套源码支持安卓+IOS双端,客户端用cocos2dx 2.2.3实现,服务端用java,支持安卓+IOS双端,一款很不错的挂机游戏源码! 源码下 ...
- LayBox官斗精品手游《勇者名录》完整源码下载 前端laybox typeScipt脚本开发 后端php开发
LayBox官斗精品手游<勇者名录>完整源码下载 前端laybox typeScipt脚本开发 后端php开发 数据库mysql redies等 含有详细说明文档. 勇者名录是一款三国题材 ...
- JAVA计算机毕业设计腾讯网游辅助小助手(附源码、数据库)
JAVA计算机毕业设计腾讯网游辅助小助手(附源码.数据库) 目运行 环境项配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe ...
- PHP开发的93手赚网手机赚钱任务平台源码
特此声明:源码来自网络分享,如有侵反到你的权益,联系删除,本店所售程序只供娱乐模拟测试研究,不得使用于非法用途,不得违反国家法律,否则后果自负!购买以后用作他用附带的一切法律责任后果都由购买者承担于本 ...
- 易语言模拟器中控源码 全新手游模拟器通用中控源码, 适用于各种游戏, 源码现成的只需要更换游戏就可以用哦
易语言模拟器中控源码 全新手游模拟器通用中控源码, 适用于各种游戏, 源码现成的只需要更换游戏就可以用哦, 带修改教程,带讲解说明, 简单易懂不需要别人指导在家可以自学. 降低新手编写多线程中控的门槛 ...
- Java外卖点餐送餐平台源码带手机端带文档(源码分享)
Java仿饿了么外卖点餐送餐平台源码带手机端带文档(源码分享) 一个简单的外卖系统,包括手机端,后台管理,api基于spring boot和vue的前后端分离的外卖系统.包含手机端,后台管理功能. 核 ...
- 基于JAVA携手同游旅游社交平台计算机毕业设计源码+系统+数据库+lw文档+部署
基于JAVA携手同游旅游社交平台计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA携手同游旅游社交平台计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S架构 ...
- 易优cms海报画册印刷设计公司网站模板源码 带手机端
易优cms海报画册印刷设计公司网站模板源码 带手机端 带后台 模板基于eyoucms内核制作,模板编码为UTF8 ,适合行业:广告设计类企业. 文件:n459.com/file/25127180-47 ...
- Vue 源码之手写Vue Router
Vue 源码之手写Vue Router 源码地址:https://github.com/CONOR007/Handwritten-routing 一.Vue Router的两种模式 hash模式实现原 ...
最新文章
- Redis数据结构:字典(hash表)
- 二分查找之搜索插入位置
- asp.net core 使用 Redis 和 Protobuf 进行 Session 缓存
- s3c6410 ddr初始化
- 使用Google WebP图片格式帮助控制网站页面大小
- 关于mqtt+js前端中mqtt服务器关闭重连服务器后js前端接收不到消息的问题
- 自动驾驶(五十八)---------自动驾驶2019年终盘点
- 富爸爸穷爸爸-读书笔记
- 为什么要参加hadoop培训
- C语言——文件操作(读取文件保存到结构体)
- SQL高级查询—实验报告
- 机器学习告诉你,新型冠状病毒接下来将如何变异?
- 图像处理之K-Means算法演示
- 基于SSM的婚纱影楼系统
- 以太坊MPT数据结构
- 做无盘网吧系统的详细步骤(四)
- Element-Ui input只允许输入数字和两位小数,保留两位小数(四舍五入)
- 2022年电赛 声源定位跟踪系统(E题)
- Git 版本控制管理(一)
- vue绑定快捷键实现上下翻页
热门文章
- pyqtgraph基础入门(三):同一个widget绘制多个坐标轴
- OpenCASCADE BRep vs. OpenNURBS BRep
- iOS 7新漏洞:不用输密码就能关闭“找到我的iPhone”并移除iCloud账户
- 微信小程序|动态时钟
- 中国21世纪20年代生活录
- 目标检测算法——收藏|小目标检测解决方案(三)
- Bathroom terminal——tril树
- 【机器学习】5:谱聚类算法原理介绍
- Python入门小项目-计算阶乘n的三种方法+常见练习(含代码示例)
- 数据结构 第10讲 好玩贪吃蛇——数字矩阵