[H-College]Ver 3.0

发布于 2019-11-12  109 次阅读


0x00 前言

[+]本文作者:Floeice

今天分析的这一款游戏属于二次元放置类型,cocos2d+luac

0x01 分析资源加密

随便找一个luac脚本文件,用winhex打开看看:

就是你了!weapon_data!
简直明示
思路1:通过观察文件头部,初步判断加密类型

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

palmpi即为key
思路二:dump

参考:破解cocos2dx-lua脚本加密资源加密

使用工具解密或者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%,可以这样写:

实际数值=num/10(%)

之后使用luajit进行回编译:

luajit.exe -b weapon_data.lua weapon_data.luac

0x03 hook luaL_loadbuffer

参考:【放置江湖】LUA手游 基于HOOK 解密修改流程

这里我们还是惯例使用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游戏了..