luac文件解密还原
近日逆向一个app的时候发现它的主要功能都是用lua实现的,查看资源文件时发现,文件后缀是luac而非lua,打开一看全是乱码。那么毫无疑问,这是一个被加密过的文件,我们需要把它逆向还原出来,或者说解密出来更为合适。
luac加密有两个关键元素,key和sign。sign是加密标记,用于判断脚本是否加密,key是xxtea解密时候的秘钥。我们要做的,就是从apk中找到这两个元素。
从apk中获取线索
apk逆向的事这里就不多说了,这个app没有任何加固,直接apktool就一键逆向了。
首先查看lib文件夹,找出加密lua用的so文件,看到了一个libcocos2dlua.so
,毫无疑问它就是我们要找的犯罪嫌疑人。so文件直接用编辑器打开肯定是难搞的,所以直接在linux中执行了一行strings -a libcocos2dlua.so > a.txt
,然后把a.txt
文件保存下来。我们要找的key和sign就保存在这个文件中,怎么把他们找出来,暂时按下不提,先往下看。
接着,随便找一个luac文件,用编辑器打开它,大概长这样
kldk2019vf�6
q�U�����BA�4n��|<i��P�r�Ql�9#��UQD\ga�<M)�oF$rL$�
��L�l���z���l��7�^�z� O7a�,�.���}\�y���6`�ƥ�B��@�5�����>�(�����Ѷ{|'�Ň����2�e@Wvno�D
......
luac文件的开头处,就是sign,那么这里是kldk2019
还是kldk2019vf
,我也不知道,先把kldk复制下来,然后去刚才保存的a.txt
文件中搜索。于是搜索到了如下内容:
......
APP_RESIGN_ACTIVE_EVENT
APP_BECOME_ACTIVE_EVENT
klnn2019
kldk2019
main.lua
Native OpenUDID = %s
yvcc.YVTool:speechVoice
......
那么很显然,我们要找的sign就是kldk2019
,它的上面,就是key了。如此一来,两个关键元素就找到了,非常轻松加愉快。
使用key和sign解密luac文件
虽然造轮子趣味无穷,但我还是更喜欢大佬的现成代码。github地址如下:
https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin/tree/v3/xxtea
Tips: 把xxtea.cpp
重命名成xxtea.c
下载两个文件之后,执行如下命令:
gcc main.c xxtea.c -o unluac
然后你就会收获一个unluac文件。找一个luac文件来,执行:
lua_decrypt main.luac main.lua kldk2019 klnn2019
然后你就会收获一个main.lua文件,打开一看,清晰明了的源码,完事儿!
附赠批量执行代码
import os
def batch_process(file_dir: str) -> None:
for root, dirs, files in os.walk(file_dir):
for f in files:
if f.endswith("luac"):
path_src = os.path.join(root, f)
path_targ = path.replace("luac", "lua")
os.system(f"lua_decrypt {path_src} {path_targ} kldk2019 klnn2019")
要在linux环境中执行哦,windows下破事儿一大堆。