00003 不思议迷宫.0001:解密Lua脚本



00003 不思议迷宫.0001:解密Lua脚本

《不思议迷宫》是我想要重点研究的游戏之一。之所以说是重点,是因为我最近一直在玩它,并且花的时间还比较多。虽然严格来说,它并不怎么样。主要的原因是,我自己手贱,在这个游戏上花钱了。这对我这个吊死来说简直不可思议。既然花钱了那就继续玩吧。玩了几天就发现特累,每次副本都得n个小时,而且收获感觉也不怎么样。这个游戏号称能让人“肝到爆”,也就体现在这个副本时间上了。游戏有其不错的地方,但也有不少槽点,甚至是常识性错误。当我感觉到累和不爽之后,就开始研究它,看能不能改改。结果才发现,这居然是个网络游戏、网络游戏、网络游戏。玩家数据这就没办法直接改了,那就继续研究看看吧,也许能够找到什么bug来间接改呢。我的这个愿望落空了,但是我还是想把一些过程和经验给分享出来。另外,我会试图修正游戏中的那些槽点,然后将修正后的文件共享给大家。修正槽点将会消耗较长的时间,中途可能会出现各种意外,游戏停服、游戏大版本更新并加强了程序保护、我的技术储备不够改不了、游戏我腻得透透的不玩也就算了甚至连看一眼都恶心、我失去耐心不改了。总之,对修正槽点大家不要抱太大的期望就是了。

弄出“不思议迷宫.ipa”,解压,到“Payload\slime.app\”目录,我一眼就看到了“res”和“src”这两个目录。我知道cocos2d捣鼓出来的游戏默认会把资源放到res目录中。src从名字看就是源码之类的,进入一看,果然是。

源码是luac文件,也就是说,游戏是cocos2dx-lua开发的。随便打开一个luac文件,一看,意料之中的情况——不是明文:

像乱码又不是乱码——被某种形式地加密了。老方法,下载安卓版游戏,解压,找到libcocos2dlua.so,祭出ida反编译。

cocos2dx-lua在加载lua脚本时,要么使用默认的cocos2dx_lua_loader函数(包括用户扩展版),要么自己创建一个。

先试试查找cocos2dx_lua_loader函数,居然就找到了……来得太容易了,都不怎么真实。游戏公司大概是觉得这个网络游戏玩家是没办法直接修改玩家数据的,也就不怎么在意了吧。直接就找到了固然是幸福的,但万一没找到呢,该怎么办?

好在默认的cocos2dx_lua_loader函数会引用文件名后缀“.lua”和“.luac”。正常情况下,前者表示普通的lua文件,后者表示lua字节码文件(LuaJIT生成)。万一通过函数名称找不到,那就可以试着跟踪字符串“.lua”和“.luac”的引用。引用可能会非常多,这个时候就需要耐心了,或者根据具体情况,看看能不能从其他的字符串入手。

得到的cocos2dx_lua_loader伪码很长,但我们还是一眼就定位了一个非常可疑的函数调用,就在局部变量之后的第二行,想不发现都难:

signed int__fastcall cocos2dx_lua_loader(int a1)

{

  ……

  一大堆局部变量

  ……

 

  v1 = a1;

  buildEncryptMap();

  if ( !(byte_9B4E5C & 1) &&j_j___cxa_guard_acquire(&byte_9B4E5C))

  {

    sub_63E9BC((int)&dword_9B4E58,(int)".luac", (int)&v57);

    j_j___cxa_atexit(sub_7856B8,&dword_9B4E58, &unk_9A3000);

    j_j___cxa_guard_release(&byte_9B4E5C);

  }

  if ( !(byte_9B4E64 & 1) &&j_j___cxa_guard_acquire(&byte_9B4E64) )

  {

    sub_63E9BC((int)&dword_9B4E60,(int)".lua", (int)&v56);

    j_j___cxa_atexit(sub_7856B8,&dword_9B4E60, &unk_9A3000);

    j_j___cxa_guard_release(&byte_9B4E64);

  }

  v2 = j_j_luaL_checklstring(v1, 1, 0);

……

真的,幸福来得太容易了,太不真实了。

跟进buildEncryptMap看看:

void *buildEncryptMap()

{

  void *result; // r0@1

  unsigned int v1; // r1@1

 

  result = (void *)0xFFFFB65C;

  v1 = 0;

  if ( !charMapInited )

  {

    do

    {

      charMapList[charMaps[v1 + 1]] = charMaps[v1];

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值