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;还…

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

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

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

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

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

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

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

六西格玛作为一种数据驱动、客户为中心的持续改进方法&#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;使用颇不方便。 正好老朋友揽睿…

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

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

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

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

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

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

MyBatis Plus Generator代码生成

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

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;本篇内容主要讲解…

计算机网络5:运输层

概述 进程间基于网络的通信 计算机网络中实际进行通信的真正实体&#xff0c;是位于通信两端主机中的进程。 如何为运行在不同主机上的应用进程提供直接的逻辑通信服务&#xff0c;就是运输层的主要任务。运输层协议又称为端到端协议。 运输层向应用层实体屏蔽了下面网络核心…

【机器学习】机器学习重要分支——集成学习:理论、算法与实践

文章目录 引言第一章 集成学习的基本概念1.1 什么是集成学习1.2 集成学习的类型1.3 集成学习的优势 第二章 集成学习的核心算法2.1 Bagging方法2.2 Boosting方法2.3 Stacking方法 第三章 集成学习的应用实例3.1 图像分类3.2 文本分类 第四章 集成学习的未来发展与挑战4.1 模型多…

【前端项目笔记】2 主页布局

主页布局 element-ui提供的组件名称就是它的类名 ☆☆ CSS选择器&#xff1a; &#xff08;1&#xff09;基本选择器 类型选择器 p/span/div…… 类选择器 (.classname) ID选择器 (#idname) 通配选择器 ( * ) &#xff08;2&#xff09;属性选择器 选择具有特定属性或属性值的…

【C语言】解决C语言报错:Uninitialized Variable

文章目录 简介什么是Uninitialized VariableUninitialized Variable的常见原因如何检测和调试Uninitialized Variable解决Uninitialized Variable的最佳实践详细实例解析示例1&#xff1a;局部变量未初始化示例2&#xff1a;数组未初始化示例3&#xff1a;指针未初始化示例4&am…

C的I/O操作

目录 引言 一、文件与目录操作 1. 打开与关闭文件 2. 文件读写操作 3. 文件定位与错误处理 二、字符流与字节流 1. 字符流处理 2. 字节流处理 三、序列化与反序列化 1. 序列化 2. 反序列化 四、新的I/O&#xff08;NIO&#xff09; 表格总结 文件与目录操作 字符…

Java基础学习-数组

目录 数组定义 注意点&#xff1a; 地址值是数组在内存中实际存储的地址。 案例遍历&#xff1a;遍历数组得到每一个元素&#xff0c;求数组里面所有数据和 案例&#xff1a;定义数组&#xff0c;遍历能被3整除的数字 案例&#xff1a;遍历一个数组&#xff0c;奇数将当前…