今天弄了台Win7笔记本,装上了Android虚拟机,打算验证一下Android的游戏修改版。于是从官网下载了最新的Android版游戏。说到这个,我就想骂运营了,为毛Android版免费,而AppStore上下载要收费?你这是歧视谁呢?Android玩家都是穷B?iOS玩家都是冤大头?
打开apk包——好吧,下载下来的是一个zip文件,MBD幸亏我知道apk其实就是zip压缩文件,只是后缀名不同;你说这样其他那些搞不懂这些门门道道的Android玩家怎么玩你的游戏?你还真当自己是大爷了?玩家们就非玩你的游戏不可?不要取得一点成就就骄傲行不?你们的游戏后劲乏力了知道不?——替换补丁文件之前,随手双击打开看了一下,结果看出毛病来了:luac文件们都是以“applicationWillEnterForeground”开头的,接下来就全是乱码,这和iOS上的不同啊。还好,我知道点苗头,这很可能是xxtea加密的。接下来验证下。
老规矩,打开ida反编译libcocos2dlua.so,找到cocos2dx_lua_loader,F5看伪码,发现在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是需要signal和key的,signal这个是明文的,luac中打头的那个“applicationWillEnterForeground”就是。key就是我说的密码。为了让xxtea_decrypt正常工作,需要设置signal和key。正常情况下,对它们的赋值会离得远吗?哈哈,查找字符串“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上的以0x11、0x12、0x13打头的charMap加密是也是如此,明文也同样可以正常加载。啊,真是省了事了。