记一次cocos逆向

为什么要想着去做逆向

有一次我在考虑怎么给游戏加密的时候,突发奇想,与其想着怎么加密,不妨看看那些搞逆向的是怎么破解的,正所谓知彼知彼,百战不殆。然后就开始了我的逆向之旅…

何为逆向技术

逆向技术是一项既庞大而又复杂的知识系统,上到密码学,下到各种编程语言系统,若想有大成,没个三年五载难是很难的。因此,我只是去了解了一下关于cocos的逆向,在此我借鉴了一下**https://www.freesion.com/article/1910938019/**这篇博客的一些思路,读者也可以了解一下,但是最后笔者发现这个学习资料太少,又花点时间了解了一下目前主流的逆向技术,最后还是选择了用hook,框架选择了frida,主要frida有不少的学习资料,使用也很方便。

cocos逆向思路

这里我只介绍用xxtea加密的(主要其它自定义的我也不会…)。
1.获取xxtea签名
2.获取xxtea key
3.用xxtea算法解密

准备工作

xxtea的签名能直接获取,主要工作是获取key。xxtea算法的key一般是写在c++层的,所以必须得分析c++的代码,一般我们逆向都是拿人家发布的游戏来做的,而且一般拿安卓的apk(不要问为什么),所以就要分析apk里的so文件。
而分析so文件就必须要反编译,所以我们需要IDA工具。我们主要分析so中xxtea解密算法接口所在的内存偏移地址,然后用hook技术截取到这个key,所以我们还需要搭建hook的环境。
所以需要准备以下工具:
1.下载并安装好IDA【官网链接】
2.一台root手机(笔者主要时间花在了这里…)
3.搭建好frida的hook环境【传送门】
要做到这三步也并非易事,这里关键是搭建frida环境,注意:
1.adb工具版本和手机支持的adb的匹配且能获取adb root(笔者在这里也花了点时间)。
2.frida的服务工具包的架构要和手机的cpu架构匹配,现在的手机基本arm64了吧。
3.注意so使用的指令架构,分thumb和arm指令,看IDA里的反编译的so相邻地址偏移量是多少,大于2是arm,反之都是thumb,thumb指令要在算接口内存中的地址时要+1。
在这里插入图片描述

开始逆向

1.获取xxtea签名:
用记事本随便打开一个加密文件,取前面几位明文,记录下来。
在这里插入图片描述

2.根据手机cpu架构分析so,拿到接口内存偏移地址
做cocos的都很熟悉引擎结构,很容易就能定位到xxtea解密接口的位置。这里的是我的手机是arm指令集,所以就是箭头所指的地址。
居中的图片:
3.写hook脚本获取key:
到这一步前提是手机上已经运行了frida的服务端了,直接上脚本:

import frida
import sys

rdev = frida.get_remote_device()
session = rdev.attach("游戏进程名")
script = session.create_script("""
Java.perform(function(){  
    var soAddr = Module.findBaseAddress("libcocos2dlua.so");//0x04000000;//Module.findBaseAddress("libcocos2dlua.so");
    send("soAddr:"+soAddr);
    var MD5Digest = soAddr.add(0xFE7B94)
    send("MD5Digest:"+MD5Digest)
    console.log("MD5Digest in libcocos2dlua.so addr:"+MD5Digest)
    Interceptor.attach(MD5Digest, {
        onEnter: function(args) {
            send('hooking...');
            send("arg0:"+args[0]+" arg1: "+args[1]+" arg2: "+args[2]+" arg3: "+args[3]+" arg4: "+args[4]+" arg5: "+args[5])
            send(Memory.readCString(args[2],9))	#args[3]的值
        }
        //, onLeave: function(retval) {
        //   retval.replace(0); // Use this to manipulate the return value
        //}
    });
});


""")
def on_message(message, data):
    if message['type'] == 'error':
        print("[!] " + message['stack'])
    elif message['type'] == 'send':
        print("[i] " + message['payload'])
    else:
        print(message)
script.on('message', on_message)
script.load()
sys.stdin.read()

拿到xxtea的key,记录下来:
在这里插入图片描述
4.开始解密
让人激动人心的时刻终于到来了,这里我使用了一个xxtea工具【传送门】
在这里插入图片描述

最后

我是说如果,你还顺利的话,我得提醒你一下,逆向不注意,亲人两行泪。这里所做的其实只算是逆向中皮毛的皮毛,不过逆向也并不是那么得深不可测,逆向的领域也有很多,人生年不过百,希望你能在有限得时间内能在自己的领域有大成。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王富贵9527

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值