C++游戏分析与破解方法介绍

1、C++游戏简介

目前手机游戏直接用C++开发的已经不多,使用C++开发的多是早期的基于cocos2dx的游戏,因此我们这里就以cocos2d-x为例讲解C++游戏的分析与破解方法。

Cocos2d-x是一个移动端游戏开发框架,可以使用C++或者lua进行开发,也可以混合使用。在使用C++开发时,游戏主逻辑模块默认名字是“libgame.so”,跟其他的native模块一样,放在游戏的“lib”目录下。也就是Android手机上的“/data/app-lib/包名/”目录,或者直接apk解包后的“lib\armeabi-v7a”目录,其中“armeabi-v7a”取决于当前CPU架构。

为了进一步确定游戏引擎,可以把“libgame.so”载入IDA分析,搜索是否有包含“cocos2dx”字符串的函数名,如图:
在这里插入图片描述
由于cocos2d-x引擎也支持lua,可以继续搜索lua相关函数,如果没有搜到,基本可以确定这个游戏是基于cocos2d-x引擎且使用C++编写的游戏。

2、C++基础

C++语言以及C++程序的逆向分析是很大的话题,这里仅简单提一下,如果读者很欠缺C++相关的知识,应该先找相关书籍学习,不可急于求成。

2.1 类指针

C++语言是兼容C语言的偏底层语言,因此在介绍C++的面向对象的概念之前首先需要了解一下指针。

通常语境下,我们说“指针”其实全称是“指针变量”,也就是说它其实是一个变量,“指针”其实就是“内存地址”的意思,所以“指针变量”就可以理解为“内存地址变量”,就是一个保存内存地址的变量。对应的,不同类型的指针,说的就是那个内存地址保存的变量的类型,比如“函数指针”,我们就可以理解为,这是一个变量,这个变量保存的是一个地址,这个地址指向的位置是一个函数。

“类指针”就是一种指针变量,这个指针的类型不是C++的基本类型,而是我们自定义的“类”。类指针通常用来作为基址,索引类的成员变量,或者虚函数。所谓“基址”,跟汇编中说的基址是一个意思。

2.2 虚表

如果一个类有虚函数,那么它的内存结构中,头部就首先会有4个字节用来存储一个指针变量。这个指针变量就叫“虚表指针”,它指向的位置是一个函数指针数组,这个数组就叫“虚表”,也就是一连串的函数地址。这个数组里的每一个元素,都是这个类的虚函数的地址。同一个类的所有对象共享一个虚表。如果两个类的虚函数不同,那么就会有不同的虚表。

虚表稍微了解即可,它的存在主要是为了实现多态。这里介绍是方便大家了解类的内存结构,如果一个类有虚函数,则它实例的头部4个字节留给虚表指针,其余位置放置成员变量;如果没有虚函数,则内存全放置成员变量。

2.3 类的成员函数

类的成员函数与一般的全局函数或者静态函数唯一的区别在于,它的第一个参数是一个“隐式”的参数,这个参数就是它所属的对象的this指针。“隐式”说的其实是在语言层面看不见,但是在汇编代码中可以看到。

所以在分析的时候如果看到函数的第一个参数是一个指针,那它可能就是一个对象的指针,而这个函数就有可能是个成员函数。

3、C++游戏分析方法

C++编写的游戏分析起来会相对要难,但具体修改起来就会相对简单,因此破解的重点还是在如何找到关键的函数,或者关键的数据。这是一个逆向发散的过程,因此有许多方法都可以尝试。

这里仅讨论无符号或者仅有少数与游戏逻辑无关的符号下的游戏逻辑模块的分析。区分一个游戏逻辑模块有无符号,可以简单地通过在IDA的函数列表中搜索关键字符串看结束,比如“HP”、“Boss”、“Player”等。

有符号的情况相对就会简单很多,因此如有可能,最好拿到有符号的样本进行分析。有符号的模块样本通常会出现在游戏早期版本,或者某个特定的版本由于开发人员的疏忽而遗漏出来。尽管版本会不一致,但还是有很多可以借鉴的地方。

常规的C++程序逆向分析就是通过看汇编代码,从而理解函数的功能。也可以通过函数的参数以及返回值去猜测函数功能,最后通过理解一个个函数功能而把整个程序的流程厘清,再找到关键点。这是一个费时费力的过程,因此一般仅用在关键函数分析处。整个分析过程还是有许多其他的技巧和方法可以提高效率,下面就介绍几个常用的方法。

3.1 借助字符串信息

由于游戏开发过程中免不了要打印Log用于调试,或者由于别的原因在程序中保留了敏感字符串信息。因此直接在IDA中按快捷键“Shift+F12”列出所有字符串就可以获取到相当多的信息。如图:
在这里插入图片描述
根据字符串信息,可以索引到相关函数,方便对函数的功能进行分析。

3.2 send函数回溯

游戏总会进行网络通信,而Android系统底层处理网络通信的函数就是send函数。动态调试的时候可以在send函数处下断,就可以断到游戏与服务器的交互数据。但send函数过于底层,一般游戏都会有加密,这里断到的数据通常都是加密后的数据,因此需要向上回溯。

在向上回溯的过程中同时注意分析各层函数的作用,有些只是send函数的封装,有些就可能会涉及到加密,或者组包。我们的目的是找到组包函数和它的上层。在组包函数处修改,就可以影响游戏与服务器的底层通信数据;组包函数的上层一般就是功能函数,直接修改功能函数就可以影响游戏逻辑,最终可以更“自然”地影响到游戏的封包。

这个过程中可以借助IDA脚本,过滤一些频繁调用的函数,比如心跳函数;也可以打印log,分析调用来源和它们的调用频率。

3.3 输出log

在一些频繁被调用的函数,或者是有明文信息的函数处,如果有必要,也可以采用IDA脚本编程的方式打印log进行分析。如果调用过于频繁,脚本的速度跟不上,也可以采用注入进程并下Hook的方式打印log,速度就会快很多。具体的注入方法详见其他篇,这里不多说。

4、破解

C++游戏的破解相对比较简单,通常都是注入游戏进程,然后干涉游戏逻辑,具体来说可以用以下几种方法:

   1、Hook关键函数,修改传入参数。比如存在一个set_MaxHP函数,可以修改传入的参数,修改怪物或者玩家的血量。

   2、Hook关键函数,修改返回值。比如存在一个computeDamge函数,可以修改函数的返回值,实现秒怪或者无敌的功能。

   3、Hook关键函数,多次调用。比如存在一个hit函数,可以多次调用该函数实现多次打击。

   4、Hook关键函数,直接返回。比如存在一个dead函数,直接跳过执行,可以实现不死效果。

   5、直接修改判断逻辑。注入到进程,或者远程ptrace后直接在二进制层面直接修改汇编指令。比如存在一个判断,杀怪数大于10则通关,可以修改为杀怪数小于10则通关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot事件的选取原理

有四个事件启动监听器: 事件1会被监听吗?答案不会 容器发布一个正在启动的事件 org.springframework.context.event.AbstractApplicationEventMulticaster#retrieveApplicationListeners 遍历我们注册的监听器,但这里有个判断条件&#xff…

众人围剿,GPT-5招惹了谁

目录千人呼吁暂停AI训练代表人物分析反对原因分析信息安全人身安全失业利益总结GPT-4 火爆全球,引发了人工智能大浪潮。过去的一个月,OpenAI、微软、谷歌加上百度不断释放王炸,所有人都相信,AI 的就是未来的生产力。俗话说&#x…

Android动画进阶

在Android中,实现动画的方式通常有两种:视图动画和属性动画。然而这两种方式只能实现一些较为简单动画,仅仅通过改变这些控件属性的方式实现一些复杂的动画效果是比较有难度的,那么我们该如何实现复杂的动画。这里介绍两种实现方式…

Android配置Jetpack-Compose环境

Android 配置 Jetpack Compose 环境 记录配置Jetpack Compose环境的一些坑~ 本文同步更新于博客: 链接 直接创建kotlin项目或创建java项目后再配置均可 根目录 build.gradle 配置kotlin环境构建脚本 buildscript {ext.kotlin_version 1.4.32dependencies {clas…

大模型时代,AI模型开源还能这么玩?模型空间内测邀请(含重磅福利)

‍人工智能学习与实训社区飞桨 AI Studio自2019年以来,持续吸纳众多开发者于平台内开源贡献、实训提升,分享项目经验、共享自研模型等。 随着 AI Studio 开发者规模的增长、开发者开发能力的提升,我们收到许多期待与建议,经过一段…

企业OA管理系统需具备哪些功能?

OA也就是办公自动化,是通过将计算机、通信等现代化技术运用到传统办公方式而形成的一种新型办公方式。OA办公管理系统能够更加高效优质的处理办公事务以及进行企业管理业务,实现对资源的高效利用,进而达到提高生产力,提升管理水平…

详解vue各种权限控制与管理的实现思路

一、 菜单权限 菜单权限:控制用户在系统中能够看到哪些菜单项菜单权限指的就是后台系统中的左侧的菜单栏,前端可以根据后端接口返回的权限数据结合element-ui菜单组件循环拼接而成即可,有什么权限就展示什么菜单通过vuex持久化插件(本地存储…

Linux系统【centos7】常用基础命令教程

今天我来介绍一下Linux系统的基础知识。 首先,我们需要了解Linux是什么。Linux是一种免费且开放源代码的操作系统,它被广泛用于服务器、移动设备和嵌入式系统。 接下来,我们需要了解基本的Linux命令。其中一些基本命令包括: 1.…

项目 TO 的自我修养

最近作为项目 TO 在公司内完成了一个涉及面比较广的项目,对于如何推动项目上线有一些经验和大家分享。希望刚毕业几年、没有参与过大型项目的同学,从中能学到一些方法,为今后担任项目主力做一些准备。所谓的 TO,是 Technical Owne…

java和mysql进行排序和排名

目录 一、基于java排序和排名 1、数值相同,排名相同,排名连续 2、数值相同,排名相同,排名不连续 3、数值相同,排名不相同,排名连续 二、基于mysql排序和排名 1、准备一张表 2、插入数据 3、设置临时变量,方便后续查询 4、数值相同,排名相同,排名连续 5、数值相同,排名…

天猫食品饮料数据分析:2月份茶饮料品牌销量TOP10排行榜!

近年来,茶饮料品类逐渐丰富,也在潜移默化中激发消费者的购物欲望,茶饮料行业的整体市场规模也不断增长。 根据鲸参谋电商数据显示,2023年2月份在天猫平台上,茶饮料相关产品的月销量将近149万件,环比增长约…

ADAS-GPS定位原理概述

前言 “GPS传感器在无人机、室外物流车以及诸多机器人应用中经常出现,它们机器人的定位、导航中发挥着重要的作用,而今天的L2~L5级别自动驾驶系统更是离不开它们,今天我们走进它们的世界,探索其背后原理以及本质。” …

MySQL之事务和锁机制

文章目录一、事务1.1 事务特征1.2 隔离级别1.3 开启事务二、锁机制2.1 读锁、写锁2.2 全局锁、表锁、行锁2.3 记录锁、间隙锁、临键锁提示:以下是本篇文章正文内容,MySQL 系列学习将会持续更新 一、事务 在数据库里面,我们希望有些操作能够以…

leaflet实现波动的marker效果(131)

第131个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中显示波动的marker效果。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共76行)安装插件相关API参考:专栏目标示例效果 配置方式 1)查看基础设置…

chatgpt 变现思路

教学 为用户提供ChatGPT的培训课程,教授如何使用和掌握ChatGPT的基本功能和高级技巧。课程可以通过在线平台或实体培训形式进行。 各种设计 ChatGPT可以为设计师提供创意灵感,包括平面设计、UI/UX设计、建筑设计等。此外,它还可以协助设计…

MySQL主从复制之多主多从部署流程—2023.04

文章目录一、多主多从实现架构图二、准备工作三、MySQL多主多从搭建流程1、修改2个主节点配置文件2、修改2个从节点配置文件3、2个主节点相互复制4、2个从节点分别复制主节点5、测试记录:一、多主多从实现架构图 这里是2主2从,下图基本例举出来的实现的…

电脑安装Ubuntu系统(非虚拟机)步骤简述

由于我的笔记本电脑比较古老(近10年),已经过了质保期,甚至续保时间都过了,所以本着能用则用的想法就在上面改安装Ubuntu系统。下面简单介绍下安装过程,自己留笔记,如果有碰到同样问题的能参考更…

信息收集之WAF绕过

信息收集之WAF绕过前言一、工具进行目录扫描1. 工具的下载2. 工具的使用二、Python代码进行目录扫描前言 对于web安全无WAF的信息收集,大家可以查看如下链接的文章: web安全之信息收集 对于有WAF信息收集,看如下所示:(…

opencv学习(二)图像阈值和平滑处理

图像阈值ret, dst cv2.threshold(src, thresh, maxval, type)src: 输入图,只能输入单通道图像,通常来说为灰度图dst: 输出图thresh: 阈值maxval: 当像素值超过了阈值(或者小于阈值,…

(数字图像处理MATLAB+Python)第四章图像正交变换-第一节:离散傅里叶变换

文章目录一:一维离散傅里叶变换(1)定义(2)实例二:一维快速傅里叶变换(1)定义(2)实例三:二维离散傅里叶变换(1)定义&#x…