1.cocos2d介绍
2.最受欢迎的游戏源码游戏源码3D游戏引擎Unity VS 国内开源 2D 游戏引擎Cocos
3.逆向入门cocos2d游戏逆向分析
4.关于Cocos2dx-js游戏的jsc文件解密
5.Cocos2d-xä¹è·åå¾ååç´ å¼
cocos2d介绍
Cocos2D是一款在多平台游戏开发中极具价值的工具,它能够大幅度节省开发者的游戏源码游戏源码时间,支持多种平台,游戏源码游戏源码包括Windows Phone、游戏源码游戏源码Windows 商店应用、游戏源码游戏源码iOS和Android。游戏源码游戏源码android 手势解锁源码它集成了丰富的游戏源码游戏源码功能,如精灵管理、游戏源码游戏源码酷炫的游戏源码游戏源码图形渲染、动画特效、游戏源码游戏源码物理引擎以及音频处理等,游戏源码游戏源码为游戏开发者提供了全方位的游戏源码游戏源码支持。 特别值得一提的游戏源码游戏源码是,Cocos2d-iPhone基于GNU LGPL v3 license,游戏源码游戏源码考虑到iPhone平台的游戏源码游戏源码特殊性,即无法发布第三方动态链接库,Cocos2d-iPhone对此进行了扩展。开发者可以选择静态链接库或者直接使用源代码的方式,无需公开源代码即可在项目中使用,确保了项目的灵活性和商业价值。尽管如此,Cocos2D-iPhone的性能和稳定性是毋庸置疑的,因为已有超过个基于此引擎的游戏在AppStore上成功发布,其中包括3款游戏曾进入过TOP 的排行榜,如StickWars甚至曾荣登榜首,这无疑证明了其在实际应用中的手写底层的源码高效和强大。扩展资料
cocos2d是一个开源框架,用于构建2D游戏、演示程序和其他图形界面交互应用等。最受欢迎的3D游戏引擎Unity VS 国内开源 2D 游戏引擎Cocos
国内开源2D游戏引擎Cocos的发展与特点
Cocos2d-x,作为一个轻量、高性能、跨平台的2D游戏开发框架,支持多种开发语言,其早期版本在引擎编辑器方面存在一些不足,如Cocos Builder/Cocos Studio功能有限,难以使用。当前版本Cocos2d-x停留在3..2,不再更新,其发展重点转向Cocos Creator,分为2.x和3.x两条路线,前者专注于2D游戏开发,后者计划向3D游戏发展,同时兼容2D游戏功能。Cocos Creator 2.x版本已非常成熟稳定,是国内2D游戏市场占有率最高的游戏引擎之一,受到中小企业欢迎,市场份额约为国内2D游戏市场的%左右。TS和C++为主要编程语言,性能在V8引擎的加持下已经非常不错,V8默认开启jit,手机源码转换网站对于大多数休闲和轻中度手游来说性能已经足够。Cocos Creator引擎源码为MIT许可开源,编辑器部分则不开源,与Unreal引擎相似。
Cocos Creator作为国内开源2D游戏引擎的后起之秀,与Laya、Eget并称国产引擎三剑客,目前已成为行业领头羊,使用Cocos Creator开发的游戏非常广泛,包括《刀塔传奇》、《剑与家园》、《天天爱消除》等。
Unity:全球最受欢迎的3D游戏引擎
Unity是由美国Unity Technologies公司开发的跨平台2D/3D游戏引擎。尽管受到了最近的收费许可协议争议影响,Unity仍然是全球游戏开发者中最受欢迎的3D游戏引擎。据The Info报道,年Unity在全球游戏引擎市场占有率超过%,在Steam上更是超过了%。Unity拥有出色的跨平台性能、较低的开发难度、强大的社区生态,是各类3D游戏项目,尤其是移动游戏的首选引擎。Unity的一个显著特点是“干净”的引擎设计,除了通用基础设施外,雨后初晴指标源码它没有提供太多Gameplay模块,这使得开发者可以高度自由地定制游戏逻辑,学习成本较低。Unity在写实渲染技术和动画技术方面略有落后于Unreal Engine,动画控制仍然较为基础,尽管新推出的Playable API试图解决该问题,但仍存在一些问题。在更换渲染管道方面,Unity相对容易一些。在移动端适配方面,Unity在中低端设备上表现更好。Unity的写实渲染技术和动画技术虽不及Unreal Engine,但在更换渲染管道的便利性和移动端适配方面具有优势。Unity的收费模式包括个人版、Pro或企业版,以及基于开发者收入和客户端安装量的新型收费模式。C#是Unity引擎的主要编程语言,性能在IL2CPP的加持下已经接近C++,在TIOBE编程语言排行榜上常年位于前5名。Unity使得开发者有机会接触微软的C#语言,这是很多开发者可能未曾接触过的偏向桌面开发的语言。Unity支持的游戏应用商店数量众多,包括《原神》、《崩坏3》、《王者荣耀》等。肇庆微分销源码
总结:Cocos与Unity是游戏开发领域中的两个重要选择,它们在2D与3D游戏开发方面各有优势与特点。Cocos Creator以其成熟稳定的性能和相对较低的开发成本,在国内2D游戏市场占据领先地位,而Unity则以其出色的技术支持、广泛的应用场景以及丰富的社区资源,成为全球游戏开发者首选的3D游戏引擎。开发者在选择引擎时应根据项目需求、团队技术水平以及成本预算等因素综合考虑。
逆向入门cocos2d游戏逆向分析
深入剖析cocos2d-x游戏逆向分析
cocos2d-x是一个开源的移动2D游戏框架,它底层支持各种平台,核心用c++封装了各种库,外部则提供了lua和c++接口。关键代码可能隐藏在lua脚本中,许多安卓游戏的逻辑也主要在lua脚本里运行。通过官网示意图了解从c++进入lua世界的路径。
探索cocos2d-x的lua虚拟机相关代码,包括CCLuaEngine.h和CCLuaStack.h。在应用结束加载中进入lua虚拟机,具体由applicationDidFinishLaunching函数调用engine->executeScriptFile("main.lua")实现。
在luaLoadBuffer函数中,使用xxtea_decrypt解密了lua脚本,并通过luaL_loadbuffer加载解密后的脚本内容。因此,通过hook这个函数,可以将(char*)content字符dump出来,获取解密后的lua脚本。
然而,luaL_loadbuffer的源码无法直接获取,它位于编译过的库cocos2d-x\external\lua\luajit\prebuilt\android\armeabi-v7a\libluajit.a中。要找到实现细节,需要下载luajit源代码进行深入分析。
总结关键点:
1. 从c++进入lua世界的调用逻辑。
2. 使用xxtea加密算法,sign和key为XXTEA和2dxlua。
3. 无论是否加密,都会调用luaL_loadbuffer函数,通过hook这个函数获取解密后的lua脚本,但需运行游戏一次。
4. cocos2d-x\external\xxtea\xxtea.cpp中有加密解密算法,逻辑清晰,可使用python脚本本地解密或hook获取key、sign或解密后脚本。
实战案例:
以某捕鱼游戏为例,下载apk后内部集成十余款小游戏。通过分析游戏源码,找到luac加密文件,解密key和sign。使用ida打开libqpry_lua.so,定位到AppDelegate::applicationDidFinishLaunching函数,找到加密调用。对比源码,解密后可直接运行游戏。
深入lua脚本分析,如子弹击中鱼的逻辑,直接查找src\views\layer\BulletLayer.luac文件。通过修改相关函数参数,实现特定功能。其他功能逻辑获取源码后易于理解,修改代码后重新加密,实现游戏破解。
思考如何实现cocos2d-x反逆向,从浅至深可采用以下方法:
1. 修改xxtea的key和sign,需分析so文件。
2. 直接修改xxtea算法,增加逆向难度。
3. 更改luajit源码,调整字节码指令顺序或数据读取顺序。
4. 将关键代码封装到其他cpp或so文件,增加解密步骤。
5. 使用ollvm混淆代码,需分析混淆或vm。
关于Cocos2dx-js游戏的jsc文件解密
上期关于Cocos2dx-js游戏的jsc文件解密教程引发了一些疑问,本文将解答一些常见问题。
首先,我们通过CocosCreator开发工具构建并编译一个案例js工程,发现游戏中存在脚本加密选项。构建后,得到一个简单的样本APK。在APK中,我们通过Jadx-gui工具解析Java层源码,关注assets目录下二进制源代码的加载情况。在入口Cocos2dxActivity的onLoadNativeLibraries函数中,我们找到了加载libcocos2djs.so文件的步骤,该文件位于AndroidManifest.xml中。
初步分析显示,加载Assets目录资源的操作不在Java层进行。接着,我们参考“jsc反编译工具编写探索之路”一文,将注意力转移到libcocos2djs.so文件上。在Cocos2dx源码中,我们发现其使用的是xxtea加密和解密算法,与Cocos2dx-lua的加密解密过程类似。
在游戏实例分析部分,我们以两个游戏案例为例进行解密。对于游戏A,通过十六进制编辑器搜索libcocos2djs.so文件中的Cocos Game字符串,未发现相关信息。使用IDA分析工具对libcocos2djs.so进行深入研究,发现导出函数名清晰,没有添加额外的安全手段。通过搜索xxtea / key相关函数,我们找到了几个相关函数。在jsb_set_xxtea_key函数中,我们尝试直接设置key值,并发现一个可疑的参数v,用于解密jsc文件。通过回溯该函数的调用路径,我们成功获取了Key值,并成功解密游戏文件。
对于游戏B,虽然Key值不像游戏A那样明文显示,但通过搜索附近的字符串,我们发现可疑的Key值与常规的Cocos Game字符串共存。尝试使用此Key值解密游戏文件,同样取得了成功。对比游戏A和游戏B的关键代码,我们发现密匙都在applicationDidFinishLaunching函数内部体现。此函数在Cocos2d-x应用入口中,当应用环境加载完成时回调。理解CocosCreator构建项目的过程后,我们知道游戏应用环境加载完毕后,该函数内部将Key值传入解密函数中,解密函数将jsc文件转换为js文件,并拷贝到内存中,游戏开始调用js文件,进入游戏界面。
在其他关键函数的分析中,我们注意到在xxtea_decrypt函数中存在memcpy和memset操作,表明在进行内存拷贝数据。通过CocosCreator源代码jsb_global.cpp文件,我们得知传入xxtea_decrypt函数的第三个参数即为解密的Key值。因此,我们可以通过Hook libcocos2djs.so文件加载时的xxtea_decrypt函数来获取Key值。使用Frida框架编写简单的js脚本进行Hook操作,可以成功获取Key值。在获取Key值后,可以参照CocosCreator源代码实现解密逻辑,或者利用封装好的解密程序进行文件解密。
最后,对于解密工具的选择,我们推荐使用一些已封装的加解密程序,例如jsc解密v1.,它能够满足当前Cocos2dx版本的文件加解密需求,并提供较为简单的操作方法。同时,欢迎各位分享自己的解密方法和见解,共同推动社区的发展。
Cocos2d-xä¹è·åå¾ååç´ å¼
å¶ä½æ¸¸ææ¶ï¼æ们æ常ç¨çå¾çæ ¼å¼æ¯pngï¼å 为pngå¯ä»¥æéæçèæ¯ï¼è¿æ ·å¨æ¸¸ææ¾ç¤ºå¾çæ¯ï¼éæçé¨åä¸ä¼æ¾ç¤ºï¼åªæ¾ç¤ºæ们è¦çé£é¨åãä½æ¯ï¼éæçé¨åä¾ç¶æ¯å¾ççä¸é¨åï¼å½ä½ å¶ä½äºä¸ä¸ªéç©å½¢çæé®ï¼ä¼æç¸å½å¤çéæé¨åç¹å»ææï¼é£ä¹å¦ä½åå°ç¹å»éæé¨åæ æå¢ï¼è¿å°±æ¯æ¬çæç« è¦è®²çï¼è·åå¾ååç´ å¼ãå½ç¶ä¸ä» ä» å¨å¶ä½éç©å½¢æé®æ¶æç¨ï¼å¨æ¸¸æä¸çå¾å¤æ¶åå¾çå¤çåè½çå°æ¹ä¹å¤§æç¨éã
åºè¯ä¸å¤è¯´ï¼ç´æ¥è´´æºç ï¼Cocos2d-x 3.xçæ¬ï¼ï¼
HelloWorldScene.hæ件
HelloWorldScene.cppæ件ï¼
å¨GetRGBAå½æ°ä¸ï¼è°ç¨äºOpenGLçæ¥å£glReadPixelsï¼å®ç¨äºè¯»åä¸äºåç´ ãå½åå¯ä»¥ç®åç解为âæå·²ç»ç»å¶å¥½çåç´ ï¼å®å¯è½å·²ç»è¢«ä¿åå°æ¾å¡çæ¾åä¸ï¼è¯»åå°å åâã
glReadPixelså½æ°æ»å ±æä¸ä¸ªåæ°ãåå个åæ°å¯ä»¥å¾å°ä¸ä¸ªç©å½¢ï¼è¯¥ç©å½¢æå æ¬çåç´ é½ä¼è¢«è¯»ååºæ¥ãï¼ç¬¬ä¸ãäºä¸ªåæ°è¡¨ç¤ºäºç©å½¢çå·¦ä¸è§æ¨ªã纵åæ ï¼åæ 以çªå£æå·¦ä¸è§ä¸ºé¶ï¼æå³ä¸è§ä¸ºæ大å¼ï¼ç¬¬ä¸ãå个åæ°è¡¨ç¤ºäºç©å½¢ç宽度åé«åº¦ï¼
第äºä¸ªåæ°è¡¨ç¤ºè¯»åçå 容ï¼ä¾å¦ï¼GL_RGBå°±ä¼ä¾æ¬¡è¯»ååç´ ç红ã绿ãèä¸ç§æ°æ®ï¼GL_RGBAåä¼ä¾æ¬¡è¯»ååç´ ç红ã绿ãèãalphaåç§æ°æ®ï¼GL_REDååªè¯»ååç´ ç红è²æ°æ®ï¼ç±»ä¼¼çè¿æGL_GREENï¼GL_BLUEï¼ä»¥åGL_ALPHAï¼ãå¦æéç¨çä¸æ¯RGBAé¢è²æ¨¡å¼ï¼èæ¯éç¨é¢è²ç´¢å¼æ¨¡å¼ï¼åä¹å¯ä»¥ä½¿ç¨GL_COLOR_INDEXæ¥è¯»ååç´ çé¢è²ç´¢å¼ãç®åä» éè¦ç¥éè¿äºï¼ä½å®é ä¸è¿å¯ä»¥è¯»åå ¶å®å 容ï¼ä¾å¦æ·±åº¦ç¼å²åºç深度æ°æ®çã
第å 个åæ°è¡¨ç¤ºè¯»åçå 容ä¿åå°å åæ¶æ使ç¨çæ ¼å¼ï¼ä¾å¦ï¼GL_UNSIGNED_BYTEä¼æåç§æ°æ®ä¿å为GLubyteï¼GL_FLOATä¼æåç§æ°æ®ä¿å为GLfloatçã
第ä¸ä¸ªåæ°è¡¨ç¤ºä¸ä¸ªæéï¼åç´ æ°æ®è¢«è¯»ååï¼å°è¢«ä¿åå°è¿ä¸ªæéæ表示çå°åã注æï¼éè¦ä¿è¯è¯¥å°åæ足å¤çå¯ä»¥ä½¿ç¨ç空é´ï¼ä»¥å®¹çº³è¯»åçåç´ æ°æ®ãä¾å¦ä¸å¹ 大å°ä¸º*çå¾è±¡ï¼å¦æ读åå ¶RGBæ°æ®ï¼ä¸æ¯ä¸æ°æ®è¢«ä¿å为GLubyteï¼æ»å¤§å°å°±æ¯ï¼**3 = åèï¼å³ååèãå¦ææ¯è¯»åRGBAæ°æ®ï¼åæ»å¤§å°å°±æ¯**4 = åèï¼å³ååèã
注æï¼glReadPixelså®é ä¸æ¯ä»ç¼å²åºä¸è¯»åæ°æ®ï¼å¦æ使ç¨äºåç¼å²åºï¼åé»è®¤æ¯ä»æ£å¨æ¾ç¤ºçç¼å²ï¼å³åç¼å²ï¼ä¸è¯»åï¼èç»å¶å·¥ä½æ¯é»è®¤ç»å¶å°åç¼å²åºçãå æ¤ï¼å¦æéè¦è¯»åå·²ç»ç»å¶å¥½çåç´ ï¼å¾å¾éè¦å 交æ¢ååç¼å²ã