拿到apk后直接解压,查看了一下里面的文件,包含了大量的lua脚本文件,lib下的so库文件如下: 可以确定这玩意是用cocos2d-lua引擎开发的,接下来随便找了个main.lua文件看看是什么样子,如下: 可以看出,他没有用cocos2dlua自带的XXTea加密方式,用的是lua5.1版本进行编译的,想着用5.1版的luadec就能很快搞定,结果。。。 直接报bad code in precompiled chunk,还是太年轻啊,哈哈 好吧,看到这个错误不要慌,根据经验应该是opcode顺序被改过,看来得分析一下so中的代码了。
二、尝试分析OS代码
把libcocos2dlua.so扔IDA里,打开字符串窗口,再确认一下lua版本: 查一下opcode的字符串顺序,如下: 拿上图的顺序和lua虚拟机源码的对照了一下,这个顺序没有问题,为什么会看字符串顺序呢,主要是因为之前逆向时遇到过一次这种情况,对着字符串的顺序修改opcode就搞定了。不过,显然这次没有这么简单。 于是,打算先定位luaV_execute函数分析一下,搜索“initial value must be a number”字符串,交叉引用跳转到代码处, 按F5查看伪代码,直接报错: 什么鬼,换个姿势试试,这次我们通过调用关系来找luaV_execute函数,通过搜索lua源码,找到了一处调用点在resume函数内,而resume又在lua_resume被用到,如下: 在IDA里搜索一下lua_resume函数,查看伪代码如下: 再定位到sub_606EFC处,sub_606EFC应该就是luaV_execute,但里面的代码却不是应有的内容,而且IDA还出现了红色的错误提示“local variable allocation has failed, the output may be wrong!”,如下: 后续应该怎么弄呢,请教各位大佬?有兴趣的可以发我私信。