00003 不思议迷宫.0011:Android新版中的Lua加密

    xiaoxiao2021-03-25  126

    00003 不思议迷宫.0011Android新版中的Lua加密

             今天弄了台Win7笔记本,装上了Android虚拟机,打算验证一下Android的游戏修改版。于是从官网下载了最新的Android版游戏。说到这个,我就想骂运营了,为毛Android版免费,而AppStore上下载要收费?你这是歧视谁呢?Android玩家都是穷BiOS玩家都是冤大头?

             打开apk包——好吧,下载下来的是一个zip文件,MBD幸亏我知道apk其实就是zip压缩文件,只是后缀名不同;你说这样其他那些搞不懂这些门门道道的Android玩家怎么玩你的游戏?你还真当自己是大爷了?玩家们就非玩你的游戏不可?不要取得一点成就就骄傲行不?你们的游戏后劲乏力了知道不?——替换补丁文件之前,随手双击打开看了一下,结果看出毛病来了:luac文件们都是以“applicationWillEnterForeground”开头的,接下来就全是乱码,这和iOS上的不同啊。还好,我知道点苗头,这很可能是xxtea加密的。接下来验证下。

             老规矩,打开ida反编译libcocos2dlua.so,找到cocos2dx_lua_loaderF5看伪码,发现在cocos2d::LuaStack::luaLoadBuffer之前有一个srcDecrypt,进去一看,得,和以前的相同。然后进到cocos2d::LuaStack::luaLoadBuffer,发现它调用了xxtea_decrypt

    int __fastcall cocos2d::LuaStack::luaLoadBuffer(int a1, int a2, char *s1, int a4, int a5)

    {

      ……

      if ( *(_BYTE *)(a1 + 24)

        && (v8 = *(_DWORD *)(a1 + 40), !j_j_strncmp(s1, *(const char **)(a1 + 36), *(_DWORD *)(a1 + 40))) )

      {

        v13 = 0;

        v10 = (void *)xxtea_decrypt(

                        (unsigned __int8 *)&v6[v8],

                        v5 - v8,

                        *(unsigned __int8 **)(v7 + 28),

                        *(_DWORD *)(v7 + 32),

                        &v13);

        v9 = j_j_luaL_loadbuffer(v12, v10, v13, a5);

        j_j_free(v10);

      }

      else

      {

        v9 = j_j_luaL_loadbuffer(v12, v6, v5, a5);

      }

      return v9;

    }

             想看一下xxtea的密码,于是在函数中找一下xxtea,结果只出来一个cocos2d::LuaStack::setXXTEAKeyAndSign,查找它的引用,还是和以前一样:没有。看来密码不是用这个函数设置的,或者是被保护了。那就换种方法。xxtea是需要signalkey的,signal这个是明文的,luac中打头的那个“applicationWillEnterForeground”就是。key就是我说的密码。为了让xxtea_decrypt正常工作,需要设置signalkey。正常情况下,对它们的赋值会离得远吗?哈哈,查找字符串“applicationWillEnterForeground”的引用,然后:

    int __fastcall initLuaStack(cocos2d::LuaStack *a1)

    {

      ……

     

      v1 = a1;

      v2 = *((_DWORD *)a1 + 4);

      lua_module_register(*((_DWORD *)a1 + 4));

      register_verify_function(v2);

      register_cocos_override_function(v2);

      sub_63EF8C(v11, "applicationDidEnterBackground", &v10);

      sub_63EF8C(&v9, "applicationWillEnterForeground", &v8);

      v3 = *(void (__fastcall **)(cocos2d::LuaStack *, const char *, size_t, const char *))(*(_DWORD *)v1 + 116);

      v4 = v11[0];

      v5 = j_j_strlen(v11[0]);

      v6 = v9;

      j_j_strlen(v9);

      v3(v1, v4, v5, v6);

      sub_63EFAC(v9 - 12, &v13);

      return sub_63EFAC(v11[0] - 12, &v12);

    }

             这个很可疑,但到底是不是呢?大伙自己去验证吧。我只想说,我不关心这个,因为luaLoadBuffer已经很明确地告诉我,不是xxtea加密的luac文件(也就是明文的)也一样可以被加载。其实iOS上的以0x110x120x13打头的charMap加密是也是如此,明文也同样可以正常加载。啊,真是省了事了。

    转载请注明原文地址: https://ju.6miu.com/read-6757.html

    最新回复(0)