1.lua脚本在手游中的现状
略。
2.lua、luac、luaJIT三种文件的关系
在学习lua手游过程中,本人遇到的lua文件大部分是这3种。其中lua是明文代码,直接用记事本就能打开,luac是lua编译后的字节码,文件头为0x1B 0x4C 0x75 0x61 0x51,lua虚拟机能够直接解析lua和luac脚本文件,而luaJIT是另一个lua的实现版本(不是原作者写的),JIT是指Just-In-Time(即时解析运行),luaJIT相比lua和luac更加高效,文件头是0x1B 0x4C 0x4A。
3.lua脚本的保护
一般有安全意识的游戏厂商都不会直接把lua源码脚本打包到APK中发布,所以一般对lua脚本的保护有下面3种:

3.1 普通的对称加密,在加载脚本之前解密
这种情况是指打包在APK中的lua代码是加密过的,程序在加载lua脚本时解密(关键函数luaL_loadbuffer ),解密后就能够获取lua源码。如果解密后获取的是luac字节码的话,也可以通过反编译得到lua源码,反编译主要用的工具有unluac和luadec51,后面会具体分析。

3.2 将lua脚本编译成luaJIT字节码并且加密打包
因为反编译的结果并不容易查看,所以这种情况能够较好的保护lua源码。这个情况主要是先解密后反编译,反编译主要是通过luajit-decomp项目,它能够将luajit字节码反编译成伪lua代码。

3.3 修改lua虚拟机中opcode的顺序
这种情况主要是修改lua虚拟机源码,再通过修改过的虚拟机将lua脚本编译成luac字节码,达到保护的目的。这种情况如果直接用上面的反编译工具是不能将luac反编译的,需要在程序中分析出相对应的opcode,然后修改lua项目的opcode的顺序并重新编译生成反编译工具,就能反编译了,后面会具体分析。

 一般上面的情况都会交叉遇到。

4.获取lua源码的一般方法
这里主要介绍4种方法,都会在第5节中用实例说明。

4.1 静态分析so解密方法
这种方法需要把解密的过程全部分析出来,比较费时费力,主要是通过ida定位到luaL_loadbuffer函数,然后往上回溯,分析出解密的过程。

4.2 动态调试:ida + idc + dump
这里主要通过ida动态调试so文件,然后是定位到luaL_loadbuffer地址,游戏会在启动的时候通过调用luaL_loadbuffer函数加载必要的lua脚本,通过在luaL_loadbuffer下断点 ,断下后就可以运行idc脚本将lua代码导出(程序调用一次luaL_loadbuffer加载一个lua脚本,不写idc脚本的话需要手动导N多遍…)。

4.3 hook so
跟4.2原理一样,就是通过hook函数luaL_loadbuffer地址,将代码保存,相比4.2的好处是有些lua脚本需要在玩游戏的过程中才加载,如果用了4.2的方法,游戏过程中 中断一次就需要手动运行一次idc脚本,而且往往每次只加载一个lua文件,如果是hook的话,就不需要那么麻烦,直接玩一遍游戏,全部lua脚本就已经保存好了。

4.4 分析lua虚拟机的opcode的顺序
这里主要是opcode的顺序被修改了,需要用ida定位到虚拟机执行luac字节码的地方,然后对比原来lua虚拟机的执行过程,获取修改后的opcode顺序,最后还原lua脚本。

5.三个游戏的lua脚本解密实例
好了,下面用3个例子来说明上面的情况。

5.1 54捕鱼
首先用AndroidKiller 加载,然后查看lib目录下的so文件,发现libcocos2dlua.so文件,基本可以确定是lua脚本编写的了。这里有个小技巧,当有很多so文件的时候,一般最大的文件是我们的目标(文件大是因为集成了lua引擎)。既然有lua引擎,肯定有lua脚本了,接着找lua脚本。资源文件和lua脚本文件都是在assets目录下。发现游戏的资源文件和配置文件都是明文,这里直接修改游戏的配置文件就可以作弊(比如修改升级炮台所需的金币和钻石,就可以达到快速升级炮台的目的),然后并没有发现类似lua脚本的文件。
顺手解压了一下res目录下的liveupdate_precompiled.zip,发现解压失败,看来是加密了(看名字就知道是更新游戏的代码)这里说明一下,一般遇到xxxx_precompiled.zip的这种文件,都是quick-cocos2d-x框架(quick简单来说就是对lua的拓展实现),在quick-cocos2d-x框架下可以用compile_scripts命令将lua文件加密打包成xxxx_precompiled.zip,游戏运行时再解密加载。注意,这种方式打包的lua脚本一般都会被编译成luaJIT,加载的关键函数是loadChunksFromZIP,可以在IDA中直接搜索该函数,如果找不到可以搜索字符串luaLoadChunksFromZIP来定位到函数
OK,了解了原理接下来开始动手分析,将libcocos2dlua.so拖到IDA中加载,函数中直接搜索loadChunksFromZIP,定位后F5。

一直向上回溯(交叉引用 ),来到下图,发现解密的密钥和签名,其中xiaoxian为密钥,XXFISH为签名
进去函数里面看看,其实会发现调用了XXTea算法,这里我们也可以直接分析loadChunksFromZIP函数的源码(所以配置一个cocos2d的开发环境还是非常有必要的)。查看源码里的lua_loadChunksFromZIP函数的原型:

接下来直接写解密函数(在cocos2d-x项目里面写的解密函数,很多工具直接可以调用)

解密后的文件如下:

lua脚本的加密与解密简单介绍相关推荐

  1. 浅析android手游lua脚本的加密与解密(番外篇之反编译的对抗)

    前言   去年在看雪论坛写了一篇<浅析android手游lua脚本的加密与解密>的精华文章,今年写一篇番外篇,将一些lua反编译对抗的内容整合一起,并以3个实例作为说明(包括2018腾讯游 ...

  2. 浅析android手游lua脚本的加密与解密

    2018.05.02更新 这段时间在翻备份的硬盘,突然发现了以前的分析项目和代码,从里面提取了之前附件的内容,现在上传给大家,真是柳暗花明又一村啊.附件包括201703版本的梦幻手游里面提取的so文件 ...

  3. 血族手游Lua脚本及资源文件解密

    之前一直和朋友在玩手游血族.有一天朋友问我能不能把里面某个角色的立绘拿下来.当时没多想就答应了,以为只要解压找到图片就行了.但是万万没想到,图片竟然打不开(被加密了). 快速分析 下载最新的血族apk ...

  4. des加密 lua_Windows下为Lua脚本进行加密处理

    缘由# 想对Lua脚本进行安全性处理,可惜一直没有想到很好的解决方案,考虑过用原生Lua将脚本编译成二进制代码,也考虑过用zlib将文件进行加密压缩处理,但是感觉都不是最佳方案,今天忽然想到有个东西叫 ...

  5. RSA加密与解密简单实现

    非对称密钥加密概述 使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥.这样,如果一个网络中有n个用户,他们之间彼此都可能进行秘密通信,这时网络中将需要n(n-1)/2 ...

  6. lua版本base64加密和解密

    特别注意 Base64 主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输.由于一些二进制字符在传输协议中属于控制字符,不能直接传送需要转换一下就可以了 原理 将文件读入内存,由于读入 ...

  7. Caesar加密与解密简单实现

    默认密钥K=3, 加密程序 #include <cstdio> #include <iostream> #include <string> using namesp ...

  8. Base64 算法原理,以及编码、解码【加密、解密】 介绍

    Base64编码,是我们程序开发中经常使用到的编码方法.它是一种基于用64个可打印字符来表示二进制数据的表示方法.它通常用作存储.传输一些二进制数据编码方法!也是MIME(多用途互联网邮件扩展,主要用 ...

  9. 记一次棋牌游戏 cocos2d-x LUA脚本解密

    1.如何查看luac的key和sign 对一棋牌游戏反编译后,可以在其assets目录下面发现*.luac的脚本,打开下面的luac脚本,可以看到luac是加密的,如下图: 可以看到加密的luac文件 ...

最新文章

  1. jquery autocomplete demo
  2. ISME:水库蓝藻水华发生和消退后浮游生物群落的动态变化
  3. 递归和非递归实现二叉排序树(BST)的查找操作
  4. Python:如何仅用递归函数和栈操作逆序一个栈
  5. change from a ppt to the report
  6. nmap结果导出html,nmap的简单使用 - osc_ijgldkz9的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. linux下c标准库位置,C 标准库 IO 使用详解
  8. 16速 java_不停歇的 Java 即将发布 JDK 16,新特性速览!
  9. python一切皆对象_Python中一切皆为对象
  10. Android四级缓存,RecyclerView的四级缓存-初探
  11. 用c语言实现循环神经网络,浅谈LSTM循环神经网络
  12. 一加7T Pro渲染图曝光:后置相机出乎意料
  13. QTcpSocket 发送和接收数据的几种方法
  14. [ CQOI 2014 ] 数三角形
  15. 微信小程序实现网络请求API获取数据
  16. ‘primordial is not defined‘ node 报错解决方法 终极篇!!
  17. 大四学年软件公司实习感悟
  18. 【三维CAD设计经验分享】CrownCAD设计:生成工程图
  19. 计算机文件怎么取消隐藏文件,隐藏文件夹,教您电脑隐藏文件夹怎么恢复
  20. html中figure怎么调图片位置,HTMLfigure figcaption 标签定义图文并茂

热门文章

  1. 招聘小程序搭建教程-首页的制作
  2. 简单计算器——JavaScript小实例
  3. 安装好tomcat后,启动tomcat点击 startup.bat 窗口一闪而过怎么解决
  4. 公务员考试题汇集之判数学运算
  5. C语言指针详解(全解)—— 前篇
  6. 缺少对公共可见类型或成员“XXX”的 XML 注释
  7. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java基于java的中小企业物料需求计划管理系统wiik1
  8. 个人目标的OKR方法
  9. Leetcode上测试用例测试结果正确,但提交后有错的问题
  10. element自定义图标;element自定义icon;element-ui自定义tab栏图标;