cocos2d-x 逆向学习与实战 (观后学习记录)

cocos2d-x 逆向学习与实战 (观后学习记录)

前言:

这几天面临失业,完全无心搞工作突然心血来潮脑子里冒出来了一个很久以前玩的游戏(xxx.ipa)抱着逆向的角度来窥探一波。
带着工具就开始了,工具包如下:
ipa一枚(具体大家根据手头设备来)
hopper (简易分析工具)

开工

拿到包以后先解压出来,丢进hopper分析执行文件,我的习惯是先看一看字符串的相关内容由于事先我并不知道这个游戏使用cocos2d-x写的,我的思维就是开发游戏的引擎关键字我都搜一遍
ue4 unity cocos2d 不出意外 cocos2d进入我的视线,经过一番网上漫游最终,强烈推荐此帖子 看了这个帖子找到了点感觉。

学习开始,带着目标和目的学习。
1、能不能■■改逻辑调试
2、看看别人怎么写游戏
3、看看能不能自动化刷怪什么的

看了帖子后的三板斧就是找加密的密码,就隐藏在执行文件中.这里其实是有问题的这种解密方式只能针对 cocos2d-lua,其实cocos2d-js、cocos2d-c++ 后两种我没有去研究。

游戏的ipa解压文件:

整个包没有太多的第三方框架,我们把注意力都放在 res、src 目录下的东西打开看看

打开src第一眼就看到了 main.lua这就可以确定了是用lua编写的游戏打开看看有什么线索

如果熟读我强力推荐的那篇文章就可以了解到,这个脚本lua脚本加密过了需要解密,帖子大概介绍了一下具体找密码的流程定位方法

1、第一种根据算法签名来,这里指的签名就是 “XXTEA” 字符串搜索

这里一眼就能看出来那个是密码了(打个码),
第一个参数r0:self
第二个参数:密码
第三个参数:密码长度
第四个参数:签名
第五个参数:签名长度

2、第二种根据上边帖子流程去找即可,通过applicationDidFinishLaunching这个函数的调用链条去找

强力推荐帖子介绍的解密方式过于复杂,其实不管什么lua的运行时解密的流程都是一致这个解密函数就隐藏在开源软件的文档中这里介绍几个关于coco2d-x的几个比较好的汇总文档方便大家找资料自学。
资料1
资料2

大家先看资源和lua加密的:文档
加密是通过:EncodeRes.py
我们也可以通过py来解密对不对,上代码

import xxtea
import os


# pip install xxtea-py

def decrypt_xxtea_file(input_dir, output_dir, xxtea_key, xxtea_sign):
    print("Begin to decrypt xxtea files in dir : " + input_dir)

    # is original directory valid
    if not os.path.isdir(input_dir):
        print("Not a valid directory path")
        return

    # is output directory valid
    if os.path.isfile(output_dir):
        os.remove(output_dir)
    if not os.path.isdir(output_dir):
        os.mkdir(output_dir)

    files = os.walk(input_dir)
    for path, dir_list, file_list in files:
        for directory in dir_list:
            relevant_path = os.path.relpath(os.path.join(path, directory), input_dir)
            new_path = os.path.join(output_dir, relevant_path)
            if os.path.isfile(new_path):
                os.remove(new_path)
            if not os.path.isdir(new_path):
                os.mkdir(new_path)

        for file in file_list:
            # 原文件绝对路径
            orig_path = os.path.join(path, file)
            # 源文件相对路径,方便计算解密文件路径
            relevant_path = os.path.relpath(orig_path, input_dir)
            # 解密文件绝对路径
            new_path = os.path.join(output_dir, relevant_path)
            # 读取原文件
            orig_file = open(orig_path, "rb")
            encrypt_bytes = orig_file.read()
            orig_file.close()
            try:
                data_sign = encrypt_bytes[:len(xxtea_sign)].decode()
                if data_sign == xxtea_sign:
                    print(data_sign)
                    print("Done with :{pwd} file sign:{sign}".format(pwd=orig_path, sign=data_sign))

                    # 解密文件
                    decrypt_bytes = xxtea.decrypt(encrypt_bytes[len(xxtea_sign):], xxtea_key)
                    new_file = open(new_path, "wb")
                    new_file.write(decrypt_bytes)
                    new_file.close()
                else:
                    new_file = open(new_path, "wb")
                    new_file.write(encrypt_bytes)
                    new_file.close()

            except Exception:
                pass


            print("Done with " + orig_path)
    # decrypted
    print("\r\ndecrypt done")


if __name__ == '__main__':
    in_dir = ""

    out_dir = ""
    key = ""
    sign = "XXTEA"
    decrypt_xxtea_file(in_dir, out_dir, key, sign)

调试环境:
要想完全调试游戏就得做调试环境,就得自己写个demo例子去看看他是怎么做的吧我具体环境大家根据一下我搜集的文档去找即可,这里补充一下小知识:由于cocos2d-x-lua 是2014年的产物了年代已经久远很多资料不是很全了需要耐心寻找,还有就是cocos2d-x-lua应该是在原有cocos2d-x基础上扩展,cocos2d-x的版本众多大家不要挑花眼了
资料1
资料2

我的思路是,做一个和游戏开发着完全一致的调试环境,就得先了解开发着具体用了cocos2d-x的具体什么版本,经过一番 cocos2d的关键字搜索最终确定使用了一个社区的维护版本:Quick-3.3 大家可以根据自己的环境进行搭建我提供一个帖子 win环境安装
mac环境

做好了demo下一步就是直接做资源替换,用做好的环境进行打包demo然后把我们解密后的游戏资源丢进demo里即可顺利调试了,为什么这么做呢是因为 cocos2d-x 搞出来的项目都是进行源码编译的大家需要找对游戏使用的引擎版本。剩下的就是大家自我发挥和我这里的进度由于是网络游戏,我在lua把请求都转发到了我的代理服务器进行然后转发出去的,中间根据他的加密流程进行了解密输出,过不了多久我觉得完全利用官方客户端进行二次打包做个公益服务器问题不大。这里要感谢一下论坛coco2dx 那篇帖子,学习过后确实可以搞定 90%的游戏亲测有效.
这里抛出一个问题,为什么 楼主 不用frida、而是用了clutch。

1 个赞

今天收到了一份邮件,来观摩一下。不过如果你有心的话可以把我后面没写完的那部分补充上去。4.3 - 5.2那部分

4.3 我没有去细看原理,
5.2 如果是按我后边写的方式完全可以不用在非越狱环境运行,因为cocos2d-x 本身就是跨平台的 手头有什么环境 制作响应环境的demo 进行调试即可

非真机调试很容易被封号的:grimacing:

在编译demo 的时候 可以改cocos 相关api 来屏蔽这事情