入门:h-college(Ver 3.0)

发布于 1 天前  40 次阅读


0x01 前言

[+]本文作者: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游戏了..


平凡的人.