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加密是也是如此,明文也同样可以正常加载。啊,真是省了事了。

更多相关文章

  1. Android遍历本地视频文件加过滤
  2. Android生成pdf文件之PdfDocument及踩过的坑
  3. Android(Java):jni写文件打印调试信息
  4. Android配置----DDMS 连接真机(己ROOT),用file explore看不到data/
  5. 浅析Android下的Android.mk文件
  6. 在Android下创建文件夹
  7. Android Launcher开发(一)LiveFolder(实时文件夹) 完全解析
  8. android工程中的R.java文件

随机推荐

  1. ASM + Transform 在android中的使用
  2. 【Arcgis for android】程序运行出错原因
  3. Android定制RadioButton样式三种实现方法
  4. Android快速实现发送邮件
  5. Unity加入Android广告小结
  6. Android ContentProvider、ContentResolv
  7. ActivityManagerService解读之Activity启
  8. 谷歌强推 AndroidX ,你还在应Support?
  9. Retrofit2.0+网络框架HTTP实战
  10. 如何在不同Android设备中得到有效的Audio