神仙道3 lua 虚拟机 opcode 还原
本文最后更新于 557 天前,其中的信息可能已经有所发展或是发生改变。

目标游戏: sxd3

任务:获取该游戏客户端 lua 源码

lua 脚本在 ab 包中 ,游戏每次进入都要重新解压 ab 包读取 lua 脚本
libslua 是该游戏使用的 lua+unity 加载框架 ,在 unity 层有很多和 lua 交互的封装接口
查看官方文档 https://github.com/pangweiwei/slua/blob/master/help.md ,可以知道很多相关的接口调用 。

前期的准备工作到这里差不多了,明白了游戏的开发框架和试玩了游戏的基础逻辑,开始准备逆向

获取加载的lua文件

因为 lua 文件在 ab 包中,还做了简单的文件加密,直接解密很困难,所以拦截 lual_loadbuffer 函数尝试 dump lua文件。
成功获取了 lua 文件, 查看文件内容不是明文,并且加载的文件类型是 luac

解密lua

luac 文件可以尝试用 luadec 或者 对应版本的 unluac 来反编译获取到lua 代码明文。
下载对应版本的 unluac 反编译目标 lua 文件 ,不出意外的执行报错。 报错信息分析来看应该是目标游戏修改了 lua 文件头

查看 lua 文件版本,版本是 5.1.5 ,如果不知道怎么查看的,把 so 丢进 ida ,找一下 lua 相关的字符串就有了

修复lua 文件头

编译一个 官方的 lua5.1.5 版本的luac 出来 ,随便写几行lua 保存成 .lua 文件 ,然后用 luac 执行命令获得 luac 文件,两个文件对比,发现了 header 的区别

修复了文件头之后, unluac 报了另一个报错,类似 arrayindexoutof ,这种一般就是目标游戏的 lua 虚拟机修改了 opcode

定位恢复 opcode

把神仙道3 解包后得到的 libslua.so 丢进 ida,因为只有几百k分析起来很快啊。
首先第一步要确定是不是真的修改了 opcode, 毕竟之前只是猜测
全局搜索函数 checkcode 如果被混淆了 就查找 字符串 “attemp to %s %s %s”,

checkcode 函数内调用的就是目标函数

在目标函数内可以找到 opmodes 数组,正常情况下 5.1.5 的lua 版本数组长度是 48 ,这个数组长度是 64 ,很明显该游戏修改了 lua 虚拟机的 opcode

还原 lua 虚拟机 opcode

想要获得这个游戏的明文的lua逻辑,那就必须要知道 他编译 lua 文件的 opcode ,否则是没有办法的。

在上一步我知道了,这个游戏修改了 lua 虚拟机 opcode,那就用常规的方式尝试能不能还原吧

其实 lua虚拟机 opcode 自吐,网上已经有很多文章写过了,我也是看了这些大佬的文章之后根据我自己的需求修改得到的脚本。

根据这篇文章

https://bbs.kanxue.com/thread-250618.htm

得出虚拟机的部分 opcode,有些 opcode 没有正常获取,需要自己静态分析拿到。

说句题外话,这篇文章需要的是直接注入 明文lua执行 test.lua 然后对比luac字节码 吐出 opcode。这个游戏是不允许执行明文lua的,而且游戏的 lua 代码中

删除了 lua_dump 这个函数,打印 string 对象的函数列表,根本没有 dump 这个函数。所以无法直接执行 string.dump

这个函数,这里我藏一手,用了另一种方法把 目标lua虚拟机的 luac 文件打印了出来,有想知道怎么做的可以积极留言,我会提供思路。

github下载 slua 库,把原版的 libslua.so 丢进 ida,对照游戏的 libslua.so ,分析 luaV_execute 里面的case 逻辑,这样就把所有的 48 个opcode 指令映射信息获得了。

生成 unluac

接着下载 unluac 源码,修改 OpcodeMap.java 。


按照映射关系修改代码。然后生成jar 包,反编译目标文件。非常简单,代码全部出来了。

评论

  1. tt123
    1年前
    2023-9-16 20:00:44

    大佬 luajit也能用类似的方法获取opcode吗

    • 博主
      tt123
      1年前
      2023-12-18 17:18:29

      luajit 据我所知 很少有厂商 有这个技术水平 改luajit 的 opcode,你解不出来可能是工具的问题,或者是 头被加密了,简单修复就行。

  2. MicroCC
    1年前
    2023-9-25 6:40:39

    遇到个 , string.dump 被删除了, IDA看了下 好像也被混淆了 , 不知道怎么才能吐出Opcode , 博主怎么做到的

    • 博主
      MicroCC
      1年前
      2023-12-18 17:23:38

      我今天也刚刚遇到,所以来翻一下我之前写的文章,正好看到了你的留言。 IDA 被混淆好处理,根据 lua 源代码编译对应版本的 so (比如 libslua.so 这个so 是可以自己编译的。正常编译出来就 1M 不到的大小),然后特征字节码去 匹配就能恢复符号,但是 luaU_dump 被去掉就很麻烦,要自己还原一遍 luaU_dump 的逻辑,看看 lua 虚拟机源码对应的lua_dump 代码逻辑,遇到这种除非收益很大,我一般就放弃了,破解的精力花费太大,身体跟不上

  3. boys
    11月前
    2024-1-31 0:59:40

    大佬 有联系方式么 想请教下这个opcode还原

    • 博主
      boys
      10月前
      2024-3-05 13:49:31

      欢迎交流 vx: baimiyishu_zs

  4. t0rch
    待审核
    3月前
    2024-10-11 23:30:26

    如果符号表被去除了,有没有什么好办法快速还原

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇