好久没写东西了,换工作之后忙得一比。你说创业?风太大没听清啊看了看以前写的东西,觉得以前写得太严肃了,从现在开始要轻松一点,要做一名逗逼码农。

  本文不会介绍破解的细节,最终完成破解所编写的代码也不会公开。虽然这个游戏非常无耻,但已经上线运营了,我不想被查水表啊。所以,该文仅以这个游戏为例,讲一下如何使用IDA静态分析破解简单的cocos2dx-lua脚本加密。

  对了,这里说的《舰娘Collection》是一个手游,不是那个舰娘,嗯。

  为什么我要突然去搞破解呢?事情是这样的:某天,一个以前的关系很好的美术同事跟我说,他无意中发现一个手游,里面盗用了部分《舰队Collection》的原画。然后给我看了提取出来的图。

  

  显然开发商就是用舰C的原画,自己稍微润了下色就用进去了。其实这种事在国内手游圈应该是屡见不鲜的吧,之前有个叫《舰娘国服》的页游也干过类似的事,不过他们更直接,功能和界面直接就是原版的了。这个是题外话。

  他又说,他解包了apk,发现美术资源可以直接拿出来用,但是有很多后缀名是lua的文件,不知道是干啥的,是不是也是图片?

  我说,这是代码文件,不是图片的。

  他又说,这些文件用记事本打不开,有没有办法看看里面写了什么?

  我说,打不开肯定是加密了,你研究这个干啥,想转行当码农啊?别和自己青春过不去。

  他继续说,你给破解了看看呗,反正闲着也是闲着。

  “另请高明吧,”我说,“我实在我也不是谦虚,我一个U3D前端码农,怎么就去搞反向工程了呢?” (其实我也挺好奇堂而皇之偷图的公司,写出的代码是什么水准的,但是懒得去折腾)

  他又说:你看,那个游戏里面,他们把你太太画成这样了:

  

  

  ……

  ……

  ……

  太太!!!!!

  你怎么变成死鱼眼了!!!!!!

  

  而且这个神似曾哥的表情是闹哪样!!!!!!!!

  

  I AM ANGRY!

  当时我就念了两首诗:“苟利太太破解以,岂因祸福避趋之”。然后找那位同事要来了APK。

  

  其实一开始的时候我也不敢保证能破解出来,我对反向工程基本上是只懂一点点鸡毛蒜皮,IDA也用得不熟。但是装出来的逼就像泼出去的水啊,强行上吧。想想曾经有人200人口飞龙狗毒爆打120人口都输了,我作为一个新手怎么就不能破出来呢~

  在破解之前还是容我先装上看看这游戏到底是个什么玩意。装上之后:

  

  艾玛这App名和图标真够直接的,还有个“二次元”的角标。

  

  点进去,哟呵还有新手引导呢(而且这引导到后面还有bug,在不合时宜的时候弹出来,或者错位。为了节约篇幅后面不截图了)

  然后就是看电影一样开打了,全自动,尼玛四傻打对面雷爷太太和北方,居然还赢了???

  接下来是选择关卡,妈的还有对话啊,居然是用的舰C的语音,更牛逼的是居然用那些语音组成了剧情!

  虽然全自动战斗的设定和原作一致,但是特效要好看很多啊~打起来的时候的动态也比原作多太多了,看着都比较爽。

  然后不知不觉就打到第二张图了……

  等等……

  我特么不是要破解他们的脚本么,怎么就玩上了还玩得挺嗨?

  好吧,关闭游戏,开始破解。先看看apk。直接解压。在assets/src下面就是所有的lua脚本了(顺便打开res下面看了看原画,简直……):

  

  

  这是cocos2dx-lua(也可能是quick-cocos2dx)做的啊,真是令人怀念的东西。虽然我只用过纯C++的cocos,lua的还没碰过。

  用记事本打开Lua文件的话,可以看到共同点是使用jts开头:

  

  按照常理,解密Lua的逻辑就在编译后的so文件里面了。lib\armeabi下面有两个so,一个100多K,一个10多M,那么肯定大的就是正主。小的那个百度了一下名字,似乎是某个银行的SDK?不管了。接下来分析so文件。祭出神器IDA打开SO文件,可以看到里面cocos自己的类都没有CC的开头,说明是3.x的:

  

  因为明确了这个游戏是cocos做的,所以看IDA生成的反汇编C代码有原版对照了。找了下硬盘,以前写EasyLive时的3.2还在,cocos new一个lua工程辅助分析。依稀记得在C++版的cocos中,如果要读取加密的pvr.ccz图片,一般是在AppDelegate::applicationDidLunchFinished中进行的。于是打开cocos工程中的该方法,在这里就是设置XXTEA加密参数的部分:

  

  然后在IDA中搜索这个方法,F5生成C++代码,对比一下看:

  

  

  是不是非常相似,而且看到了两段关键的字符串?在cocos工程中,LuaStack::luaLoadBuffer里面做了XXTEA解密的操作,心中想:看来这波要解密出脚本轻而易举啊!研发团队根本不敢说什么,复杂的加密算法也没有……哎呀奶不死的,妈的老子是专业程序员好吗?专业程序员,这种代码都看不懂啊?这怎么奶死嘛!有IDA的情况下怎么会解不出你告诉我,直接复制代码都解出来了。开新项目稳破解,复制代码也破了,不可能失败的,不可能的……

  

  于是我把cocos中的xxtea.h、xxtea.c提出来开一个控制台工程,然后照着前面的参数对脚本进行解密试试。结果是爆炸了,根本解不出。很明显的,代码中设置的xxteaSign是一个比较长的字符串,而脚本中的签名只有三个字符(jts)。所以,这个游戏中对脚本的解密不是直接使用xxtea算法的,甚至可能根本就没有使用xxtea。(小色:IDA骑脸是你自己玩得菜,跟我有什么关系)

  因为cocos在读取lua的时候必然要经过LuaStack::luaLoadBuffer方法。所以在IDA中打开LuaEngine::executeScriptFile,一路跟踪进去,最后进到了LuaStack::luaLoadBuffer。把逻辑整理一下就是:

  

  整理的时候我不小心掉进坑里挣扎了半天。strcmp和strncmp这两个函数,字符串相等返回0,不相等返回1。因为我用C#习惯了,所以直接以为相等返回1(true),用XXTEA搞了半天没搞出来……

  

  分析一下加密后的脚本内容,这里会走使用BlowFish解密数据的流程,并没有使用XXTEA,所以自己把自己奶死了……接下来得照着IDA代码的算法写一个解密的工程。有些变量看着不舒服,可以单击选中变量,然后按N键,就可以重命名变量了。写好之后,处理src/main.lua文件试试:(这个文件是cocos生成的,直接放出来也无所谓了)

  

 

  漂亮!一个文件解出了,是不是其他文件也可以用这一套来解密呢?

  在cocos工程中查找LuaStack::luaLoadBuffer的所有引用,发现它在cocos2dx_lua_loader中被调用了一次;再查找cocos2dx_lua_loader,在LuaStack::init中有设置该回调的代码。所以可以肯定,这里就是Lua层调用脚本的入口了。在IDA中查找对应的地方,也是一样的,说明他们没有做特殊处理,所有的Lua脚本读取的时候,都会走LuaStack::luaLoadBuffer进行解密。所以刚才写的解密工程对所有的lua脚本都可用。通过分析IDA代码,可以分析出他们的脚本是这么个文件格式:(一个格子表示一个字节)

  

 

  于是可以写一个GUI,将所有的脚本解密了。GUI想怎么做都可以,我用的C#调用dll的方式。

  

  

  看了下代码,很意外的是对规范比较注重,从游戏体验上,细节处理比较好,也不像小公司的作品。那么是出自哪个公司之手呢?代码中看到了“武将”等词汇,难道是一个换皮游戏?

  再吐槽一下C++层的代码。IDA中可以看到很多加了j_j_前缀的底层方法,比如这个:

  

  点进去:

  

  再点进去:

  

  

  其实这次破解说不上是用了什么牛逼的技术,完全就是参照着cocos源生项目,然后跟着IDA反汇编出来的代码分析。大牛们看了勿喷。

  不过我觉得我还是捍卫了深海提督的尊严!

  最后说一下如何避免自己的项目被这种方式攻破。

  一般来说可以对so文件加壳,使IDA打开这个文件的时候,就报错退出;或者修改一下加密类的名字,这样破解者就找不到你用的什么方式加密了,拿着密钥也没用(不过费点心思还是可以把IDA中的代码整理出来当解密模块用的);再或者使用更高级的加密方式,但是别人可以用动态调试直接hook luaL_loadbuffer拿到解密后的脚本……

  加密方法有一千种,解密方法更有一万种,如何有效保护自己项目的资源是一个值得研究的问题。

  至于对这个游戏的开发商还有没有什么想说的呢?——“我今天得罪了你们一下!”

  如果说还有一句的话,那应该是:——“别抄袭,做个有骨气的开发商。多花点功夫在原画上,至少有机会可以像战舰少女一样成功,而抄袭,注定一辈子上不了台面。”

  很惭愧,就做了一点微小的工作,谢谢大家!

转载于:https://www.cnblogs.com/GuyaWeiren/p/5466182.html

使用IDA静态分析解密《舰娘Collection》的lua脚本相关推荐

  1. 浅析android手游lua脚本的加密与解密

    2018.05.02更新 这段时间在翻备份的硬盘,突然发现了以前的分析项目和代码,从里面提取了之前附件的内容,现在上传给大家,真是柳暗花明又一村啊.附件包括201703版本的梦幻手游里面提取的so文件 ...

  2. 血族手游Lua脚本及资源文件解密

    之前一直和朋友在玩手游血族.有一天朋友问我能不能把里面某个角色的立绘拿下来.当时没多想就答应了,以为只要解压找到图片就行了.但是万万没想到,图片竟然打不开(被加密了). 快速分析 下载最新的血族apk ...

  3. lua脚本的加密与解密简单介绍

    1.lua脚本在手游中的现状 略. 2.lua.luac.luaJIT三种文件的关系 在学习lua手游过程中,本人遇到的lua文件大部分是这3种.其中lua是明文代码,直接用记事本就能打开,luac是 ...

  4. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    前言   去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...

  5. 记一次棋牌游戏 cocos2d-x LUA脚本解密

    1.如何查看luac的key和sign 对一棋牌游戏反编译后,可以在其assets目录下面发现*.luac的脚本,打开下面的luac脚本,可以看到luac是加密的,如下图: 可以看到加密的luac文件 ...

  6. 舰娘 服务器 维护时间,《舰娘Collection》停止运营公告

    <舰娘Collection>游戏从测试开始便一直受到广的支持和喜爱,一点一滴筑造起来的游戏世界给予我们心里的温馨和欢乐. 每一次的更新,都牵动着我们的心扉: 每一次的活动,都激扬着我们的青 ...

  7. IDA静态分析so文件(一)

    本文是记录自己学习IDA的一些总结与归纳,并将其体现成具体功能,便于复习与交流,有不对之处望大家包容并指出,欢迎大家留言收藏 本篇是IDA静态分析的第一篇, 本文讲解非常简单的静态分析so包 , 以便 ...

  8. 【笔记】cocos2dx xxtea逆向获取lua脚本和资源文件

    参考链接: https://blog.csdn.net/cjbbdd/article/details/103583764 使用的一些注意点,链接中未提到的: 1.NDK版本: 使用的ndk版本为r9d ...

  9. cocos2dx xxtea逆向获取lua脚本和资源文件

    第一次写博客,什么格式,排版都很low,大家不要喷我啊... 工具准备: IDA Pro 7,具体大家想用正版还是x版,自行决定. Android SDK 和 NDK AndroidEagleEye, ...

  10. 一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp)...

    一键自动发布ipa(更新svn,拷贝资源,压缩资源,加密图片资源,加密数据文件,加密lua脚本,编译代码,ipa签名,上传ftp) 程序员的生活要一切自动化,更要幸福^_^. 转载请注明出处http: ...

最新文章

  1. HDOJ_ACM_超级楼梯
  2. Java 学习之网络编程案例
  3. 不是所有的事情都要达成共识
  4. WdatePicker()时间控制方式(转载+原创)
  5. 大型分布式网站架构设计与实践 第一章《面向服务的体系架构(SOA)》
  6. 【分享】虹软人脸识别应用开发过程
  7. Linux 关机/关闭主机/关闭系统/重启系统/注销系统的命令
  8. 前端学习(1806):前端调试之列表伪类练习二
  9. 《手把手教你》系列基础篇之1-python+ selenium自动化测试-环境搭建(详细)
  10. 大数据市场交易趋旺物联网平台争夺加剧
  11. appium环境搭建android版,【appium】自动化测试appium教程(环境搭建上)
  12. 解决ios微信小程序弹框点击穿透问题
  13. Rosalind工具库: Entrez搜索NCBI资源库
  14. zoj 2476 Total Amount
  15. java自行车内走线,科普向 公路车有几种全内走线方式?
  16. svg基础--基本语法与标签
  17. 吴恩达机器学习课后作业ex1(python实现)
  18. java输出数学和英语成绩_java 计算班里每个同学3门课(英语、数学、数据库)的平均成绩和总成绩,编写一个成绩类来实现这些功能。...
  19. jQuery学习小征途
  20. Java中的建造者模式

热门文章

  1. STM32学习——矩阵键盘
  2. 计算机英语单词大全txt,计算机英语词汇大全.txt
  3. 解决NBSI安装显示“MSINET.OCX组件无法加载或其中有组件失败”
  4. 数学建模入门-matlab实现偏微分方程数值解
  5. OLAP工具在企业决策支持系统中的应用
  6. matlab的电子线路仿真,高频电子线路Matlab仿真实验
  7. oracle数据库:恢复delete的数据
  8. 【转】一文带你了解800万像素车载摄像头
  9. U盘解决 日立硬盘 c1门
  10. linux系统刷机教程,在 Linux 刷 BIOS