1. 前言
  2. 前置准备
  3. 目标分析
  4. 逆向加密逻辑
  5. 定位sign与key
  6. 解密luac
  7. 反编译luajit的bytecode
  8. 开启上帝模式
  • 前言

    看了fatezero的《阴阳师:一个非酋的逆向旅程》后,受益匪浅。特别是关于opcode映射关系一节,处理的很精妙。

对手头上的游戏不思议迷宫,技痒的不行。于是上周周六花了整个下午的时间进行了研究。注意本文中针对安卓版本。

  • 前置准备

    如果读者也想跟着步骤进行操作,需要准备这些工具:ApkIDE少月版、IDA、python、010editor

  • 目标分析

APKIDE载入之后,首先看一下lib\armeabi\目录下,发现了libcocos2dlua.so

  从字面意思来看,应该是使用cocos2d引擎,并且使用lua脚本,再看assets\src\

  

  发现大量的luac脚本,进一步确认了我们的想法。010editor打开Main.luac,从头来看,并非luac文件的头

  

  正常的luaca的头应该是1B 4C 75 61开头,如下图

  

  所以不思议迷宫必然是对luac进行了加密。

  • 逆向加密逻辑

  通过IDA打开libcocos2dlua.so,一般情况下加密会出现cocos2dx_lua_loader->luaL_loadbuffer的某个过程中

  源码如下:

  

  而在IDA中,luaL_loadbuffer之前出现了srcDecrypt函数,这可是源码中没有出现了。

  

  数据的流向是:从文件读入->v51->v25->luaL_loadbuffer,再分析srcDecrypt函数

  

  当一个文件的头为11 12 13 的时候,就用charMapList进行替换,而charMapList,通过引用查找

  又是从buildEncrypyMap中初始化的,显然这是一组“静态”的置换表,完全可逆而且没有任何难度。

  

  但是回过头来看apk中的luac文件,没有一个的文件头是11 12 13,文件头全部是applicationWillEnterForeground

  并没有给我们带来任何帮助,只能继续分析luaLoadBuffer,看到了第二个加密的地方xxtea_decrypt

  

  google,baidu之后,找到非常类似的一段源码

  

  通过sign对文件进行标记,符合条件用key进行解密,梳理一下luac的整体解密过程

  

  由于没有使用srcDecrypt的流程,所以实际上只有xxtea_decrypt,只要找到sign和key,问题就解决了。

  • 定位sign与key 

  通过分析,可以确定加密的最终文件格式。文件头都有固定长度的sign

xxtea_decrypt(buf+decode->m_xxteaSignLen, (xxtea_long)size -(xxtea_long)decode->m_xxteaSignLen, (unsigned char*)decode->m_xxteaKey, (xxtea_long)decode->m_xxteaKeyLen, &len); 

  再次打开另外一个luac文件,二者相同的文件头如图,所以sign为applicationWillEnterForeground

  

  在IDA中,我们也找到了这个字符串

  

  查找引用之后,这个字符串在initLuaStack中被调用了。

  

  再通过资料搜索,发现一般使用xxtea算法的,都会使用setXXTEAKeyAndSign来设置sign和key,图中v3就是setXXTEAKeyAndSign函数

stack->setXXTEAKeyAndSign("123", strlen("123"), "cloud", strlen("cloud"));  

  那么自然key就是:applicationDidEnterBackground

  • 解密luac

  首先pip install xxtea-py,安装python的xxtea的库

  编写脚本如下:

import xxtea
import os
sign = 'applicationWillEnterForeground'
key = 'applicationDidEnterBackground'
def decode(filename):luacdata = open(filename,'rb').read()decrypt_data = xxtea.decrypt(luacdata[len(sign):],key[:16])open(filename.replace('.luac','.luacx'),'wb').write(decrypt_data)

  解密后如下,出现的文件头为1B 4C 4A 01,也并非luac标准头,难道还有名堂?

  

  经过一番资料查询之后,这是luajit编译的bytecode,并非标准lua。其头为1B 4C 4A


  


  • 反编译luajit的bytecode

  在github上找到用于反编译luajit的项目:https://github.com/NightNord/ljd

  由于该库只能在python3上跑起来,而我懒得改脚本,于是直接通过命令执行方式,在kali中(同时存在python2、python3)运行了如下脚本

#coding=utf-8
import os
sign = 'applicationWillEnterForeground'
key = 'applicationDidEnterBackground'
path = os.path.join(os.getcwd(),'src')
def decode(filename):luacdata = open(filename,'rb').read()decrypt_data = xxtea.decrypt(luacdata[len(sign):],key[:16])open(filename.replace('.luac','.luacx'),'wb').write(decrypt_data)def decomplie(filename):os.system('python3 ./ljdm/main.py '+filename+' > '+filename.replace('.luacx','.luacxs'))for path,d,filelist in os.walk(path):  for filename in filelist:filename = os.path.join(path, filename)if filename.endswith('.luac') and not os.path.isfile(filename.replace('.luac','.luac')):print( filename)decode(filename)if filename.endswith('.luacx') and (not os.path.isfile(filename.replace('.luacx','.luacxs')) or os.path.getsize(filename.replace('.luacx','.luacxs'))==0):print(filename)decomplie(filename)

  src目录对应生成的luacxs就是最终反编译好的lua源代码了。

  • 开启上帝模式

  通过大量的分析之后,我发现程序员在代码中,没有去掉测试用的上帝模式,只是简单的隐藏

  我在UIAccountBind.luacxs:380行中加入打开上帝模式的一行代码openGdUI().

  这样当我点击复制账号id的时候就会弹出上帝模式窗口

    local function onCopyClick(sender, eventType)if eventType == ccui.TouchEventType.ended thencopyToClipBoard(rid, getLocStr("text_copied"))endopenGdUI()return end

  以及GDM.luacxs:24中的check_mode,让其始终返回为true,保证上帝模式功能可正常开启

function check_mode()return true
end

  然后通过luajit编译,再进行xxtea加密,打包成APK放入手机。

  最终效果图为:全自动放置play,程序员已经实现了自动加天赋,自动捡东西,自动打怪,自动进入下一层等等

  

转载于:https://www.cnblogs.com/howmp/p/6528355.html

不思议迷宫:逆向后的放置play相关推荐

  1. 不可思议有氧机器人_不思议迷宫奇怪的机器人 不思议迷宫奇怪的机器人获取方式一览...

    不思议迷宫中奇怪的机器人怎么才能获得呢?奇怪的机器人是不思议迷宫周年庆活动副本埃拉西亚副本中的一个彩蛋,很多玩家都想知道如何才能获得这个奇怪的机器人,今天小编便给大家带来不思议迷宫奇怪的机器人获取方式 ...

  2. 不可思议有氧机器人_不思议迷宫奇怪的机器人怎么得?不思议迷宫奇怪的机器人获取一览...

    在不思议迷宫的游戏当中,大家都知道奇怪的机器人的获取方法吗?奇怪的机器人是要怎么去获得的呢?小编这里就为大家带来了不思议迷宫奇怪的机器人的获取介绍,一起来看看吧. 不思议迷宫奇怪的机器人怎么得? 机器 ...

  3. 00003 不思议迷宫.0009.9:命运之链

    00003 不思议迷宫.0009.9:命运之链 我不知道别人的怎么样,反正在我的手机们上,仅在该功能刚出来时找到过其他玩家.然后,官方说部分玩家该功能不能用,修复了.可惜的是,自从这个"修复 ...

  4. 不思议迷宫量子计算机,不思议迷宫男巫刷法及男巫的猫形态详解

    不思议迷宫男巫刷法及男巫的猫形态详解,不思议迷宫男巫怎么刷,奥刃阵营,冒险者之森隐藏冈布奥.出站时,携带三张失明术.每俩层抄写一张.进入迷宫时携带一只阿兹猫. 阿兹猫死亡后可无限次复活(消耗100探索 ...

  5. 00003 不思议迷宫.0008:分析了半天我们能干什么?

    00003 不思议迷宫.0008:分析了半天我们能干什么? 玩家数据不能直接修改,间接的似乎也不行,那我们还能干什么? 能干的有很多. 比如,我先问问,大家是如何在炼金坊捡钱的?除开玩模拟器使用按键精 ...

  6. android 卷轴动画效果,不思议迷宫五阶卷轴效果是什么 不思议迷宫五阶卷轴效果详情...

    不思议迷宫五阶卷轴效果是什么?很多玩家都还不知道在不思议迷宫手游中五阶卷轴有哪些效果,这些效果应该怎么使用?下面小编为大家带来了不思议迷宫五阶卷轴效果详情,一起来看看吧. 不思议迷宫五阶卷轴效果 五阶 ...

  7. 不可思议有氧机器人_不思议迷宫蒸汽之都8个隐藏机器人拿法攻略

    现在是8个.4个蜘蛛+桑尼+2汽车人+傀儡.具体说明我都会写在下面,不思议迷宫蒸汽之都8个隐藏机器人拿法攻略. 1) 机器人属性: 共计4个,都是6000战力外加1点火力/护甲/机动/幸运. 3) 组 ...

  8. qpython 3h怎么使用_不思议迷宫M15怎么玩 不思议迷宫M15攻略

    不思议迷宫M15怎么玩?不思议迷宫最新秩序域M15即将上线,大家知道M15星域中的新冈布奥.新飞艇.新克隆体.新奇观,以及星域探索.奖励等内容吗?下面小编为大家带来了不思议迷宫M15攻略,一起来看看吧 ...

  9. 库德尔机器人密码_不思议迷宫德库尔怎么获得 埃拉西亚机器人获取攻略

    不思议迷宫新的主线副本埃拉西亚上线,新的副本中有不少的彩蛋,其中玩家就可以获得隐藏机器人德库尔,那么不思议迷宫德库尔怎么获得呢,今天小编就为大家带来了埃拉西亚副本机器人的获取攻略. 埃拉西亚机器人攻略 ...

最新文章

  1. 3D车道线检测:Gen-LaneNet
  2. 高速串行总线的设计基础(一)同步时序模型介绍
  3. db_mysql.so_vsftpd在mysql上配置虚拟用户指南
  4. 公司的费用报销系统【为什么不好用】?做业务系统软件的可以参考一下
  5. 查看MS-SQL的安装版本及补丁
  6. 借呗利息为什么比银行信用贷款高很多?
  7. [Mac] php安装protobuf扩展
  8. Kali Linux 2019.1 发布,Metasploit 更新到 5.0 版本
  9. 提高SQL执行效率的几点建议
  10. Java-Hashmap
  11. android菜单动画,利用 android studio 制作一个菜单动画
  12. 测试数据库日期格式转换
  13. 关于insert语句的插入问题
  14. 重写 geturl Openlayers中使用TileCache加载预切割图片作为基础地图图层
  15. 字体和font-family对照表
  16. 天天生鲜商品详情页HTML+css
  17. Zabbix 5.0版本的详细安装教程
  18. java dagger2_mvp+dagger2+retrofit2+rxjava 项目框架 最佳实践
  19. 计算机软件著作权源码要求,计算机软件著作权登记源代码-20210527121530.docx-原创力文档...
  20. 智能打印SDK---官方博客

热门文章

  1. 【linux】can‘t set line discipline
  2. Databricks文档04----使用 Azure Databricks 提取、转换和加载数据
  3. ios点击大头针气泡不弹出_高德 ios 自定义气泡添加点击事件无效问题
  4. ES中 同时使用should和must 导致只有must生效 解决方案
  5. python tkinter label标签_Python Tkinter详解 (二)Label标签的使用
  6. Codeforces Round #406 (Div. 1) A. Berzerk 记忆化搜索
  7. Codeforces 786A Berzerk(博弈)
  8. java可以编写siri_打造Android的中文Siri语音助手(一)
  9. 线性方程组之二:三元一次方程组
  10. 无剑100SOC(wujian100)挂UART外设之④修改SDK