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则通关。

C++游戏分析与破解方法介绍相关推荐

  1. Unity游戏逆向及破解方法介绍

    背景介绍 随着手游的发展,Unity3D引擎逐渐成为主流的游戏开发解决方案,传统cocos的2D游戏逐渐被取代,一些公司在Unity3D游戏方面的产出也越来越多,如天天飞车,天天来战,全民破坏神,全民 ...

  2. Lua游戏逆向及破解方法介绍

    背景介绍 随着手游的发展,越来越多的Cocos-lua端游开发者转移到手游平台.Lua脚本编写逻辑的手游也是越来越多,如梦幻西游.刀塔传奇.开心消消乐.游龙英雄.奇迹暖暖.疾风猎人.万万没想到等手游. ...

  3. CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了

    CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了 其实看过 windows 核心编程那本书的人都知道 计算机编程领域 那些所谓的游戏保护 真的只是为难菜鸟而已,对于大鸟基本不起作用. 游戏无 ...

  4. 寻仙手游服务器无响应,寻仙手游游戏中常见问题解决方法介绍

    寻仙手游游戏中常见问题解决方法介绍九游小编已经整理好了,现第一时间把寻仙手游游戏中常见问题解决方法介绍分享给大家.希望由九游小编所提供的这篇攻略玩家朋友们喜欢,也希望能对大家有所帮助,下面就请大家一起 ...

  5. CE+OD无法附加游戏进程的破解方法

    CE+OD无法附加游戏进程的破解方法 来吧 别在为这烦恼了 其实看过 windows 核心编程那本书的人都知道 计算机编程领域 那些所谓的游戏保护 真的只是为难菜鸟而已,对于大鸟基本不起作用. 游戏无 ...

  6. 计算机启动硬盘响,电脑开机时硬盘响个不停是什么原因?原因分析与解决方法介绍...

    本文主要和广大电脑用户分享开机硬盘响个不停是怎么回事?在日常使用电脑当中,大家应该能意识到一般硬盘在开机的时候都会发出正常明显的声音,这是由于硬盘在通电以后,音圈马达会带动硬盘磁头从止动器(硬盘断电后 ...

  7. 计算机无法创建dota2账号,电脑无法进行DOTA2游戏更新的解决方法介绍

    ? 最近有不少DOTA2的玩家发现电脑无法进行DOTA2的游戏更新,无论尝试重启DOTA2.更改设置.删除package文件夹都无法完成更新.很多用户都有这样的烦恼,如果我们遇到相同的问题该怎么办呢? ...

  8. win10系统装服务器2008蓝屏,升级安装Win10正式版后出现蓝屏怎么办?Win10蓝屏原因分析及解决方法...

    最近有不少人都升级了Win10系统,但是有一些人Win10安装好了以后,总是蓝屏和不停地重启,根本不能好好体验新版Win10了.那么升级安装Win10正式版后出现蓝屏怎么办?下面就分享Win10蓝屏原 ...

  9. 皇室战争android换到苹果嘛,皇室战争怎么切换账号 苹果端和安卓端切换账号方法介绍...

    皇室战争怎么切换账号 苹果端: 一般情况下切换账号,只要点击ios系统[设置]进入界面可以看到[Game Center]. 1.点击进入,先注销掉所登录Apple ID账号. 2.打开Game Cen ...

最新文章

  1. C++ Opengl 显示列表源码
  2. 只出现一次的数字—leetcode136
  3. jQuery获取input复选框的值
  4. java面向对象封装之有参无返与有参有返
  5. sql 时间 没有日期_SQL-补充:日期和时间戳互转
  6. java 二叉树迭代器_C,为二叉树实现自定义迭代器(长)
  7. 超大容量文本的单词统计(洛谷P1308题题解,Java语言描述)
  8. Linux基础(7)--串口编程
  9. Instant Client 配置
  10. Zabbix 如何动态执行监控采集脚本
  11. Keras指定GPU训练模式,设置GPU的使用量
  12. 有道词典 Chrome取词插件
  13. rancher 修改IP
  14. idea繁体字-中文输入法变繁体字
  15. csdn文章中首行缩进两个字符的命令
  16. JS提升:Promise中reject与then之间的关系
  17. 信息系统面临的安全威胁
  18. 穹顶灯打不出阴暗面_微服务的阴暗面,解释
  19. 微信公众号java开发教程
  20. 量化交易 米筐 财务数据与定时器

热门文章

  1. 兄弟Brother HL-3150CDN 驱动
  2. iOS 结构体和类的区别
  3. C语言:【入门】冷饮的价格?
  4. 一加7pro 鸿蒙,屏幕亮了!一加7 Pro海外版发布:2K分辨率 90Hz刷新率
  5. react fiber架构学习
  6. 微信小程序实现双指缩放图片功能
  7. vs2010安装后找不到运行程序
  8. Fifth-自动旋转和自动调整大小
  9. Nginx+LVS+DNS 负载均衡
  10. DNS负载均衡 例子