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.rhkb.cn/news/352812.html

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

相关文章

全域外卖系统源码部署怎么弄?快速上手指南来了!

作为本地生活下半场的标志性项目&#xff0c;全域外卖的热度随着多家互联网布局力度的加大和相关政策的不断更新而不断飙升。在此背景下&#xff0c;想做全域外卖服务商的人越来越多&#xff0c;全域外卖系统源码部署模式逐渐兴盛。 就在最近&#xff0c;抖音官方发布了关于新增…

分数限制下,选好专业还是选好学校

目录 1.概述 1.1.综合考虑 1.2.个人经验分享 2.专业解析 2.1. 计算机科学与技术 2.2. 英语 2.3. 法学 2.4.专业VS学校 2.5.建议 3.名校效应分析 3.1. 名校声誉&#xff08;品牌效应&#xff09; 3.2. 资源获取 3.3. 学术氛围 3.4. 就业优势 3.5.小结 4.好专业和…

3、matlab单目相机标定原理、流程及实验

1、单目相机标定流程及步骤 单目相机标定是通过确定相机的内部和外部参数&#xff0c;以便准确地在图像空间和物体空间之间建立映射关系。下面是单目相机标定的流程及步骤&#xff1a; 搜集标定图像&#xff1a;使用不同角度、距离和姿态拍摄一组标定图像&#xff0c;并确保标…

家电行业,等待「换机潮」

【潮汐商业评论/原创】 “昨天去超市囤货&#xff0c;你们猜怎么着&#xff1f;”“我买了台冰箱。” 当同事还在调侃Jesse从买菜到买冰箱&#xff0c;在商场就着急完成“保鲜闭环”时&#xff0c;其实Jesse也没想到&#xff0c;怎么买个菜的功夫就把家里冰箱给换了。 “虽然…

基于uni-app和图鸟UI的智慧校园圈子小程序开发实践

摘要&#xff1a; 随着教育信息化和“互联网教育”的快速发展&#xff0c;智慧校园建设已成为推动校园管理现代化、提高教育教学质量的重要手段。本文介绍了基于uni-app和图鸟UI开发的智慧校园圈子小程序&#xff0c;旨在通过一站式服务、个性化定制、数据互通和安全可靠等特点…

Linux自旋锁

面对没有获取锁的现场&#xff0c;通常有两种处理方式。 互斥锁&#xff1a;堵塞自己&#xff0c;等待重新调度请求自旋锁&#xff1a;循环等待该锁是否已经释放 本文主要讲述自旋锁 自旋锁其实是一种很乐观的锁&#xff0c;他认为只要再等一下下锁便能释放&#xff0c;避免…

vue echarts画多柱状图+多折线图

<!--多柱状图折线图--> <div class"echarts-box" id"multiBarPlusLine"></div>import * as echarts from echarts;mounted() {this.getMultiBarPlusLine() },getMultiBarPlusLine() {const container document.getElementById(multiBar…

基于协同过滤算法的电影推荐

基于协同过滤算法的电影推荐 电影推荐系统使用了基于**协同过滤&#xff08;Collaborative Filtering&#xff09;的算法来生成推荐。具体来说&#xff0c;使用了基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&#xff09;**算法&#xff0c;步骤如下&am…

【html】如何利用id选择器实现主题切换

今天给大家介绍一种方法来实现主题切换的效果 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…

MacOS - 3 招快速去除桌面上的图标文件

在平时用 Mac 电脑的时候&#xff0c;会产生许多我们不用的或废弃的图标、文件&#xff0c;在 Mac 桌面上显得很乱&#xff0c;不仅影响美观也直接影响了我们工作的心情。下面我们分享 3 招快速去除桌面上的图标或文件的方法&#xff0c;有需要的朋友可以试一试。 1. 右键删除&…

移动硬盘分区误删?专业恢复策略与预防措施

一、认识移动硬盘分区误删 在使用移动硬盘时&#xff0c;有时我们可能会遇到分区误删的情况。这通常指的是由于某种原因&#xff0c;用户错误地删除了移动硬盘上的某个分区&#xff0c;导致该分区内的所有数据丢失。分区误删是一种常见的数据丢失问题&#xff0c;对于用户来说…

【深度学习】Loss为Nan的可能原因

文章目录 1. 问题情境2. 原因分析3. 导致Loss为Nan的其他可能原因 1. 问题情境 在某个网络架构下&#xff0c;我为某个数据项引入了一个损失函数。 这个数据项是nn.Embedding类型的&#xff0c;我加入的损失函数是对nn.Embedding空间做约束。 因为我在没加入优化loss前&#x…

nodejs爬虫小红书评论区

发现好像还是爬虫的知识热度比较高&#xff0c;最近一直在加强JS这块。这两天脚本模拟爬BOSS的时候也想着怎么用nodejs&#xff0c;昨天都没更新文章&#xff0c;Q-Q&#xff0c;因为一直failed没啥成果。 使用模块 这边可以看到使用的模块其实也挺多&#xff0c;但主要还是ht…

邮件钓鱼--平台框架-优化内容效率-Gophish项目

免责声明:本文仅做技术交流与学习... 目录 邮箱伪造发信人与转发邮箱-不同就会报错 Gophish项目: 1-配置发件接口&#xff08;自定义&#xff09; 2-配置发信模版&#xff08;更逼真&#xff09;? 3-配置触发页面&#xff08;钓鱼用&#xff09; 4-配置用户和组(可单可批…

go context 源码刨析(一)

Context 上下文context.Context 是用来设置截止时间、同步信号&#xff0c;传递请求相关值的结构体。 context.Context 定义了四个需要实现的方法&#xff1a; Deadline: 返回 context.Context 被取消的时间。Done: 返回一个 Channel&#xff0c;这个 Channel 会在当前工作完…

密码学及其应用 —— 密码学概述

1 安全属性和机制 1.1 基本概念 1.1.1 三个核心概念 在讨论信息安全时&#xff0c;我们通常会谈到三个核心概念&#xff1a;保密性、完整性和可用性。这三个概念共同构成了信息安全的基础。 保密性&#xff1a;指的是确保信息只能被授权的人员访问。这就意味着信息在存储、传…

【scrapy】爬虫,从429状态码说起

许久未爬&#xff0c;发现爬不动了&#xff0c;哈哈哈&#xff0c;记录下这次失败的爬取经历 问题描述 针对这样的一个网站&#xff1a; https://www.farfetch.cn/cn/shopping/women/dresses-1/items.aspx?page1&view96&sort3 需求&#xff1a; 1.需要爬取列表页…

任务3.8.3 利用RDD统计每日新增用户

任务目标 统计给定用户访问历史数据中&#xff0c;每日的新增用户数量。 数据准备 原始数据格式&#xff1a;每行包含两个字段&#xff0c;日期和用户名&#xff0c;以逗号分隔。示例数据&#xff1a;2024-05-01,mike 2024-05-01,alice 2024-05-01,brown ...解决方案 使用倒…

解读自然语言处理:技术、应用与未来展望

引言 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是计算机科学、人工智能和语言学的一个跨学科领域&#xff0c;致力于实现人与计算机之间通过自然语言进行有效沟通的能力。NLP 的核心任务是理解、解释和生成人类语言&#xff0c;使计…

C的I/O操作

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