0x00 前言
[+]本文作者:Floeice
今天分析的这一款游戏属于二次元放置类型,cocos2d+luac
0x01 分析资源加密
随便找一个luac脚本文件,用winhex打开看看:


思路1:通过观察文件头部,初步判断加密类型
如图,基本上可以判断为xxtea加密或其变种,这一块的文章实在太多,就不展开说了。bogehcollege
即为签名值sign,解密所需的key直接在ida中搜索对应上下文即可获得:

思路二:dump
使用工具解密或者dump后可获得原始luajit字节码文件:

0x02 反编译luac
这里我们使用ljd:https://github.com/NightNord/ljd
我的ljd自用版本 + LuaJit-2.1.0-beta3:ljd.7z
python main.py weapon_data.luac > weapon_data.lua
得到lua如下:

这个文件就是魂智能武器升级的属性配置表,假设我们想把1级属性改成攻击x300%,血量x300%,可以这样写:

之后使用luajit进行回编译:
luajit.exe -b weapon_data.lua weapon_data.luac
0x03 hook luaL_loadbuffer
这里我们还是惯例使用HookZz来进行hook。
int (*old_luaL_loadbuffer)(void *L, const char *buff, size_t size, const char *name);
int new_luaL_loadbuffer(void *L, const char *buff, size_t size, const char *name)
{
const char *wp = "data/weapon_data.luac";
if (strstr(name, wp)) {
const char *lua = "/sdcard/hqxy/weapon_data.luac";
FILE *file = fopen(lua, "r");
if (file != NULL) {
fseek(file, 0 ,SEEK_END);
size_t new_size = ftell(file);
fseek(file, 0, SEEK_SET);
char *new_buffer = (char *)malloc(new_size + 1);
fread(new_buffer, new_size, 1, file);
fclose(file);
return old_luaL_loadbuffer(L, new_buffer, new_size, name);
}
//LOGI("name is : %s, len: %d", name, size);
}
return old_luaL_loadbuffer(L, buff, size, name);
}
void patch(long base_addr) {
long loadbuffer = base_addr + 0x00386630;
ZzHook((void *)loadbuffer, (void *)new_luaL_loadbuffer, (void **)&old_luaL_loadbuffer, NULL, NULL, false);
}
将修改好的luac文件置于/sdcard/hqxy/
下即可生效。
0x04 写在最后
闲来没事儿看看GSLAB也挺好...下一篇整活得找个unity游戏了..
Comments | NOTHING