反编译 luac

需求: 看到别人的一个插件写的很厉害就像学习一下,遂解压deb包看了一下,发现核心逻辑都是用lua来实现的。问题来了~ 仔细检查以后发现这个tweak 自己释放了一个自定义的lua虚拟机,而且所有的luac文件都是用这个自定义的虚拟机编译出来的,现在我想看看这个luac文件的内容,不知道有没有什么思路

坑巨大,建议放弃

你先确认这个所谓自定义虚拟机是不是只改了一下op code

不是的,如果只是改了一下 opcode 那好办。

现在这个虚拟机连 *.lua 都没法执行。

010Editor 看后缀为 *.luac 的文件, 发现也不是真正的luac 文件。

lua-m.zip (713.2 KB) arm64 上可以跑的 虚拟机

md5.luac (892 Bytes) 特殊格式的luac文件

放弃后准备走另外一条路,分析他的网络协议。。

发现是自定义协议。tcp + tsl1.2 + proto2 更难搞。

现在wiresharktcpproto 包貌似没发现好用的插件

一首祝你平安送给你。反正是我的话我就回家卖红薯 :frowning: :roll_eyes:

没细研究过lua,会不会是在load的时候做了一些解密操作。所以无论明文lua还是bytecode都要被解密了才能执行

这个, 看着像加密了

嗯, 我初步觉得也是这样。

最近刚好遇见这个问题,所一下我的解决方案,不过仅供参考。
你需要分析一下它的lua解释器的

LoadHeader
LoadFunction
LoadCode
LoadUpvalues
LoadDebug
LoadConstants

这几个函数,实现自定义解释器的算法一般就是修改这几个里面的逻辑,比如异或之类的,然后你根据这个,修改一个对应版本的luadec,即可对应解密。

我在上面上传了那个lua 解释器,能解释一下具体分析哪个文件吗?

可执行文件:lua
还是lib:liblua.dylib

接触lua时间不长, 请多包涵。

兄弟 就是DES算法啊 KEY是ljlasjdl

感谢老哥!!

周末没注意看论坛

我尝试解密的时候会报错, 老哥帮忙看下

19 AM

decryption password 我就用的: ljlasjdl

你不能自己调一下那个dylib?

你不能自己调一下那个dylib?

53 AM

在看了,但是奈何技术有限, 看不出来个所以然

兄弟 源码地址都发你了 文件前4个字节下长度 跳过 解密后面8的整数倍

感谢老哥指点!!

我尝试着编译那个源码,然后运行的时候会crash,debug了好久也没有发现为什么。。。

所以我就尝试用pythondecrypt, python代码如下


from pyDes import des
from time import time

t = time()

f = open('md5.luac', 'rb+')
f.seek(4) #跳过前4个字节
data = f.read()
f.close()

k = des('ljlasjdl')

d = k.decrypt(data)
f = open("md5.lua", "wb+")
f.write(d)
f.close()

print ("decrypt file time: %f" % (time() - t))

但是最后得到的文件md5.lua是一堆乱码,既不是lua脚本也不是luac文件

所以想请教一下老哥下面几个问题

  1. 那个des的key是通过什么办法获取的呢?
  2. 老哥能不能教我解密一个文件呀

memcpy(keyBlock,“ljlasjdl”,8);
Char8ToBit64(keyBlock,bKey);
DES_MakeSubKeys(bKey,subKeys);

FILE * fp = fopen("r:\\mime.luac", "rb");
FILE * fp2 = fopen("r:\\2.luac", "wb");
fread(cipherBlock, 1, 4, fp);
while (1)
{
	if(fread(cipherBlock, 1, 8, fp)<=0)
		break;
	DES_DecryptBlock(cipherBlock,subKeys,plainBlock);       
	fwrite(plainBlock, 1, 8, fp2);
}

谢谢啦 老哥 问题解决了。

主要是我之前把 ElemType 定义为 int 类型了。

des 解密之后,直接用luadec 就可以看到原来的明文脚本啦。

但是这个des的key,怎么来的呢