导语:样本xlua,简单涉及到解密、hook等部分基础逆向。补足个人学习路上该路线的教程贴

本次样本算是一个比较标准的基础xlua样本,没有涉及到复杂的op还原,以及对dat等关键untiy文件的保护逆向。
简单介绍lua与untiy结合的背景,方便代码进行热更新从服务端拉取下发,unity做好相关承接即可也就是热更新
大部分逻辑将在lua中写明,unity基本为一个空壳
国内常见的是,我的老乡小腾腾公司的xlua,近年版本多为5.3的lua版本

简单执行支持流程dump出dll文件,拉进分析。不出意外没啥有用的东西,毕竟我们逆向方向不在这里

此类游戏,前面提到unityandlua,那么unity肯定有存在相关的注册函数来与lua建立联系就如同jni一样(java的native交互),这类函数一般都是固定的loadbuffer,可能根据不同框架函数名字略有区别比如本次的xlua他在ida中具体的实现为int32_t XLua_LuaDLL_Lua__xluaL_loadbuffer(intptr_t L, System_Byte_array buff, int32_t size, System_String_o name, const MethodInfo *method),最重要的参数是字节流buff,和脚本名字name。
关键函数拿下,直接手搓Frida的jshook脚本,核心代码逻辑为,hook该函数读写出buff的参数值,根据name作为文件名写入文件存储到我们的路径上

xlua存储后,我们发现常规的lua反编译使用unluac进行反编译失败,字节码验证不对。
在无进行op重写,以及魔改lua的情况下。我们针对lua框架只需进行字节码的一定修复,原为1B 4C 75 61 53 01 19 93
0D 0A 1A 0A 04 04,需将其改为1B 4C 75 61 53 00 19 93
0D 0A 1A 0A 04 04 04,然后再拖入jar进行反编译即可完成。
结合以上思路,编写Python、js两个Frida脚本将整个流程自动化,js复制hook字节流发送给Python端,Python端完成字节码验证、字节码修复、文件写入、拉起jar修复的完整流程即可获得下面的lua文件
获取完成后仅就只需进行正常的逆向改代码,以及hook替换字节流(配合c方向)
本次教程结束,逆向小白啥也不懂。部分名词有误的地方还请见谅。欢迎更多对uniy+lua、游戏引擎、游戏安全方面的有识之士加入初夏团队 到技术军团中找我交流[滑稽]
本篇文章,全篇只交代核心逻辑思路,不提供其他脚本代码。希望还未了解此方向的朋友带来一点微不足道的光芒[呵呵]


