需求: 看到别人的一个插件写的很厉害就像学习一下,遂解压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
更难搞。
现在wireshark
抓 tcp
的 proto
包貌似没发现好用的插件
一首祝你平安送给你。反正是我的话我就回家卖红薯
没细研究过lua,会不会是在load的时候做了一些解密操作。所以无论明文lua还是bytecode都要被解密了才能执行
这个, 看着像加密了
嗯, 我初步觉得也是这样。
最近刚好遇见这个问题,所一下我的解决方案,不过仅供参考。
你需要分析一下它的lua解释器的
LoadHeader
LoadFunction
LoadCode
LoadUpvalues
LoadDebug
LoadConstants
这几个函数,实现自定义解释器的算法一般就是修改这几个里面的逻辑,比如异或之类的,然后你根据这个,修改一个对应版本的luadec,即可对应解密。
我在上面上传了那个lua 解释器,能解释一下具体分析哪个文件吗?
可执行文件:lua
还是lib:liblua.dylib
接触lua时间不长, 请多包涵。
兄弟 就是DES算法啊 KEY是ljlasjdl
感谢老哥!!
周末没注意看论坛
我尝试解密的时候会报错, 老哥帮忙看下
decryption password 我就用的: ljlasjdl
你不能自己调一下那个dylib?
你不能自己调一下那个dylib?
在看了,但是奈何技术有限, 看不出来个所以然
兄弟 源码地址都发你了 文件前4个字节下长度 跳过 解密后面8的整数倍
感谢老哥指点!!
我尝试着编译那个源码,然后运行的时候会crash,debug了好久也没有发现为什么。。。
所以我就尝试用python
来decrypt
, 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
文件
所以想请教一下老哥下面几个问题
- 那个des的key是通过什么办法获取的呢?
- 老哥能不能教我解密一个文件呀
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,怎么来的呢