Cocos2dlua棋牌Lua解密

点击上方蓝字[协议分析与还原]关注我们


 介绍使用libcocos2dlua.so库的游戏的解密分析方法。

Cocos2dlua是一款流行的游戏引擎,常用于开发棋牌游戏。为了保护游戏代码,Cocos2dlua通常会对游戏脚本lua文件进行加密,生成Luac文件,内容一般长这样,前面会有几个固定字符串,对比几个文件就能确定它的内容:

6dd348112c45032aecec92e7437391ba.png

上面这个luac文件的固定字符串就是tianlianmjXXTEA。

对cocos2dlua游戏进行分析,获取里面的算法或者一些参数,首先需要做的是对这个文件进行解密。

01

找密钥

使用Android Killer打开APK,看下文件的结构,很容易lib目录下看到armeabi目录,里面有几个so文件,其中,libcocos2dlua.so就是luac文件解密的关键所在,我们需要从这个so里面搞定加密密钥和算法。

71107783d5fd2f0b51dc6d26b7f6b436.png

如果这个APK使用的密钥是在cocos2d里面常规配置的,则很容易在so文件里面找到,使用IDA打开so,直接搜前面看到的luac文件前面的固定字符串,它是文件的签名,我们把它叫sign,这个例子里面是:tianlianmjXXTEA。前后看看,一般如果有一串比较长的无规律字符串,我们需要找的密钥key就是它了。但是,有的时候这个密钥key找不到,因为它不是常规配置的,这个时候密钥key的取法需要知道加密算法,我们后面再说,这里先说加密算法。

虽然so分析很耗时且繁琐,这里就直接上结论,cocos2d对lua文件的加密使用的是xxtea算法,在ida对so自动分析完之后,直接搜xxtea_decrypt即可定位函数位置,看下算法,不用担心,这就是你想要的解密算法了,你不用去抠它,它的核心是常规的xxtea,大部分编程语言都有很好的实现供你使用,看函数的上下文,读取luac文件,对sign进行对比,对文件去sign之后的内容使用密钥key进行xxtea解密,对解密结果进行处理。这个解密,不仅仅解密luac文件,还解密各种其它文件。

一个简单的python解密函数实现如下:

dec_data = xxtea.decrypt(data=data[len(sign):], key=key, padding=False)

接下来,需要的是解密的密钥key,当在so里面不容易找到的时候,我们需要使用hook来找了,我们可以使用frida来实现hook,如果不会,上frida官网去学习学习,基础的很简单,我们不需要学习复杂的花哨知识,够用就行,百分之八十的人只需要掌握基础的百分之八十就可以了。

我们需要hook的是libcocos2dlua.so这个文件里面的xxtea_decrypt,我们在前面已经找到了它,知道了它在ida里面的偏移地址,这里分析的样本应用的地址是0x4E1ECA,但是我们还要注意一点Thumb指令集模式和Arm指令集模式的区别,如果是Thumb指令集,inline hook的偏移地址需要进行+1,很巧,样本应用就是Thumb指令集,所以我们的偏移地址是0x4E1ECB,hook跑起来,刷刷的刷屏,这就是我们需要的东西:

343fe929b58fe2e1f510ded10359afb2.png

上面的arg2里面就是我们我们需要的解密密钥key,arg3是key的长度,在打印出的内存里面,紧跟着key的内容是sign,很容易识别它。

至此,解密算法,解密的sign,key都找到了,接下来就是写程序实现算法批量解密luac文件了。

02


文件解密

现在回来继续关注我们要解密的luac文件,从apk里面解出的目录下,有很多luac,我们需要实现的是自动化的解密,而不是将luac文件一个个找出来解密输出。这里当然是使用python来实现解密。

首先需要实现的是单个luac文件的解密,读取文件,解密,输出解密结果。

def read_jsc_file(path):f = open(path, "rb")data = f.read()f.close()return data
def decrypt(filePath, key,sign):data = read_jsc_file(path=filePath)if data.startswith(sign):if(len(data)>len(sign)):dec_data = xxtea.decrypt(data=data[len(sign):], key=key, padding=False)else:return b''else:dec_data = xxtea.decrypt(data=data, key=key, padding=False)if dec_data[:2] == b"PK":fio = BytesIO(dec_data)fzip = zipfile.ZipFile(file=fio)dec_data = fzip.read(fzip.namelist()[0])elif dec_data[:2] == b"\x1f\x8b":dec_data = bytes(zlib.decompress(dec_data, 16 + zlib.MAX_WBITS))#.decode("utf-8")else:l=dec_data[-4:]l=int.from_bytes(l, byteorder='little', signed=False)dec_data = bytes(dec_data[0:l])return dec_data

接下来,外面再套一层遍历文件夹里的合格文件。

def save_file(fileDir, outData):rootPath = os.path.split(fileDir)[0]try:os.makedirs(rootPath)except OSError:if not os.path.exists(rootPath):raise Exception("Error: create directory %s failed." % rootPath)if fileDir.endswith("c"):file = fileDir[:-1]with open(file, "wb") as fd:fd.write(outData)fd.close()
def dir_decrypt(srcDir, xxtea_key,signkey):if not os.path.exists(srcDir):ColorPrinter.print_white_text("Error:FileNotFound")exit(1)rootDir = os.path.split(srcDir)[0]outDir = rootDirif len(outDir)>0 and outDir[-2:-1] != "\\":outDir += "\\"outDir += "out\\"traveDir.deep_iterate_dir(srcDir)files_list = traveDir.getfileslist()for file_path in files_list:ColorPrinter.print_green_text("Decrypting flie:{0}".format(file_path))decData = decrypt(filePath=file_path, key=xxtea_key,sign=signkey)outFile = outDir + file_path[len(rootDir + os.path.split(srcDir)[1]) + 1:]save_file(fileDir=outFile, outData=decData)print("        Save flie:{0}".format(outFile))

最后,需要写整个功能的入口。

def main():instruct = sys.argv[1]xxtea_key = sys.argv[2]bsignkey=sys.argv[3].encode()srcDir = sys.argv[4]if len(xxtea_key)<16:taillen=16-len(xxtea_key)bxxtea_key=xxtea_key.encode().ljust(16,b'\0')else:bxxtea_key = xxtea_key.encode()[0:16]if instruct[1:2] == "d":dir_decrypt(srcDir=srcDir, xxtea_key=bxxtea_key,signkey=bsignkey)
if __name__ == "__main__":main()

拼拼凑凑,就将luac文件的解密完成了,不难。

03


结束

整个luac解密过程的重点是获取解密key,而sign可以用来帮助我们定位它,如果大家有什么需要,可以一起交流交流,high起来。

别忘点“在看”、“赞”和“分享”

新的规则,及时收推文要先给公号星标

别忘了星标一下,不然就错过了

926b0b32452de4ea2b9f457d417b467a.jpeg

长按进行关注,时刻进行交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑已删除的文件在回收站找不到怎么办?数据恢复办法分享!

电脑中的数据已经成为了我们生活和工作的重要部分。无论是珍贵的照片、重要的文档&#xff0c;还是日常的工作文件&#xff0c;我们都希望能够妥善保存很久。 然而&#xff0c;误删除文件的情况时有发生&#xff0c;而当我们急切地打开回收站试图找回这些文件时&#xff0c;却…

这些已经死去的软件,依旧无可替代

互联网这条长河里&#xff0c;软件们就像流星一样&#xff0c;一闪而过。有的软件火过一段时间&#xff0c;然后就慢慢消失了。 说不定有些软件你以前天天用&#xff0c;但不知道从什么时候开始就不再用了。时间一天天过去&#xff0c;我们的热情、记忆都在消退&#xff0c;还…

windows11 ssh 无法连接问题解决方法

问题描述 ssh wjxxx 报一下错误 CreateProcessW failed error:2 posix_spawn: No such file or directory 问题分析 原理 &#xff1a; known_hosts公钥文件客户端第一次访问服务器时候返回给客户端的密文&#xff0c;它生成的原则是根据名称和ip生成密文,连接时候客户端自…

[巨详细]使用HBuilder-X新建uniapp项目教程

文章目录 安装HBuilder-X启动uniapp项目其他&#xff1a;下载预览浏览器下载终端插件 安装HBuilder-X 详细步骤可看上文》》 启动uniapp项目 先打开HBuilder-X 点击新建项目 选择uniapp侧边栏&#xff0c;mian中的点击浏览 选择已经安装到本地的uniapp项目&#xff0c;并输…

数据分析中的数学:从基础到应用20240617

数据分析中的数学&#xff1a;从基础到应用 数据分析离不开数学的支持&#xff0c;统计学和概率论是其重要组成部分。本文将通过几个具体的实例&#xff0c;详细讲解数据分析中常用的数学知识&#xff0c;并通过Python代码演示如何应用这些知识。 1. 描述性统计 基本概念和用…

力扣1206--跳表

1206. 设计跳表 - 力扣&#xff08;LeetCode&#xff09; 挑战一下hard,果然难搞 参考 跳表的原理与实现 [图解]_跳表实现-CSDN博客 代码如下&#xff1a; struct Node{Node(Node* _right, Node* _down, int _val) :right(_right), down(_down), val(_val){}Node* right;No…

运营一个商城网站需要办理什么许可证?

搭建一个商城网站以下资质是必须要办理的&#xff1a;网站ICP备案以及增值电信业务经营许可证。 一、网站ICP备案 国家对提供互联网信息服务的ICP实行许可证制度。从而&#xff0c;ICP证成为网络经营的许可证&#xff0c;经营性网站必须办理ICP证&#xff0c;否则就属于非法经营…

[python日常]获取指定文件夹下,指定后缀的文件

要读取指定路径下所有以.mp3为后缀的文件名&#xff0c;并将它们存储在一个列表中 关键代码&#xff1a; os.path.splitext(“文件路径”) 分离文件名与扩展名&#xff1b;默认返回(fname,fextension)元组&#xff0c;可做分片操作filename.endswith(.mp3) 使用os.listdir…

做好六西格玛项目,效率翻倍不是事!——张驰咨询

六西格玛作为一种数据驱动、客户为中心的持续改进方法&#xff0c;旨在通过减少过程变异和缺陷&#xff0c;提升业务效率和产品质量。以下是六西格玛项目执行的专业流程&#xff1a; 1. 定义阶段&#xff08;Define&#xff09; 识别机会&#xff1a;明确项目范围和目标&#…

Stable Diffusion 3 Medium 正式开源,用户对此产品评价如何?

前两天 Stability.AI 终于开源了 Stable Diffusion 3&#xff0c;虽然只是中杯的 Medium 版本&#xff0c;没有放出当初宣布的 8B 版本[1]&#xff0c;但也在很多方面取得了进步。本想第一时间尝鲜测试&#xff0c;但这几天出差在外&#xff0c;使用颇不方便。 正好老朋友揽睿…

Web前端三大主流框架详解及应用

在现代Web开发中&#xff0c;前端框架的选择对于项目的成功至关重要。本文将介绍目前最流行的三大前端框架&#xff1a;Vue.js、React和Angular&#xff0c;分析它们的特点、优势以及如何在实际项目中应用。 1. Vue.js Vue.js 是一款轻量级、高效的前端框架&#xff0c;由尤雨…

【大分享05】动态容差归档,打通不动产登记管理“最后一公里”

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章&#xff0c;来自上海涵妍档案信息技术有限责任公司&#xff0c;作者&#xff1a;陈雪。 一、政策背景 在“互联网政务服务”的浪潮下&#xff0c;各级政府机构…

镭眸T51三维深度成像激光雷达为移动叉车导航及避障保驾护航

如今&#xff0c;移动叉车在智慧工厂里应用非常广泛&#xff0c;因此移动叉车如何做到准确导航及精准避障显得至关重要&#xff01;镭眸 T51 三维深度成像激光雷达为移动叉车的导航及避障提供了解决方案&#xff01; 镭眸 T51 三维深度成像激光雷达具有高精度、自适应自动曝光、…

ChatGPT原理及其应用场景

ChatGPT的原理及应用场景 一、ChatGPT的原理 ChatGPT&#xff0c;全名Chat Generative Pre-trained Transformer&#xff0c;是OpenAI研发的一款聊天机器人程序&#xff0c;其背后依托的是人工智能技术和自然语言处理&#xff08;NLP&#xff09;的深厚功底。其工作原理可以从…

如何使用ChatGPT等大模型翻译视频?2024最新翻译技巧分享

随着全球化的浪潮&#xff0c;跨语言沟通的需求日益增长。视频&#xff0c;作为一种生动直观的表达方式&#xff0c;也越来越需要跨越语言的障碍&#xff0c;触达更广泛的受众。因此&#xff0c;视频翻译成为了一个重要的领域&#xff0c;为不同语言背景的人们打开了理解彼此、…

MyBatis Plus Generator代码生成

一、MyBatis Plus Generator MyBatis Plus是一个功能强大的持久层框架&#xff0c;它简化了MyBatis的使用&#xff0c;提供了许多便捷的功能。其中&#xff0c;MyBatis Plus Generator是一个强大的代码生成器&#xff0c;可以帮助我们快速地根据数据库表结构生成对应的实体类、…

C语言中的预处理指令(如#include, #define等)是什么

C语言中的预处理指令是特殊的命令&#xff0c;它们在编译程序的实际编译阶段之前由预处理器&#xff08;preprocessor&#xff09;处理。这些指令用于在编译之前修改源代码&#xff0c;例如包含其他文件、定义常量或宏等。以下是C语言中常见的预处理指令&#xff1a; #include&…

Java基础-案例练习-全是干货

目录 案例&#xff1a;卖飞机票 案例&#xff1a;找质数&#xff1a; 案例&#xff1a;开发验证码 案例&#xff1a;评委打分 案例&#xff1a;卖飞机票 package anlixunlian;import java.util.Scanner;/*机票价格按照淡季旺季、头等舱和经济舱收费、 输入机票原价、月份和…

使用Ollama+OpenWebUI本地部署阿里通义千问Qwen2 AI大模型

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;AI大模型部署与应用专栏&#xff1a;点击&#xff01; &#x1f916;Ollama部署LLM专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月17日22点50分 &#x1f004;️文章质量&#xff…

探索设计模式——单例模式详解

前言&#xff1a;设计模式的作用主要是为了——利用设计方式的重用来自动地提高代码的重新利用、提高代码的灵活性、节省时间&#xff0c; 提高开发效率、低耦合&#xff0c;封装特性显著&#xff0c; 接口预留有利于扩展。 设计模式的种类有很多种&#xff0c;本篇内容主要讲解…