摘要:
- 《反恐精英》(Counter-Strike,简称CS)是由Valve Software公司研发的一款第一人称射击类游戏,属于《半条命》(Half-Life)的其中一个游戏模组衍生而成的游戏.。2003年9月9日,《反恐精英》1.6版本(以下简称“CS1.6”)正式发行。
- 逆向工程(又称逆向技术),是一种产品设计技术再现过程,即对一项目标产品进行逆向分析及研究,其主要目的是在不能轻易获得必要的生产信息的情况下,直接从成品分析,推导出产品的设计原理。
一、前言
1.1项目背景
在电子游戏高速发展的今天,越来越多的人选择在空闲时间来打电子游戏放松一下,那么游戏用户的壮大必然会扩大对游戏研究的群体,越来越多的玩家想通过相关技术来使自己拥有更好的游戏体验,虽然通过bug钻空子是一种不好的行为,但是今天我们就来尝试着使用CE软件对CS1.6进行逆向分析,CS1.6相对简单的界面会让我们更好地完成逆向分析,但对于同类游戏又可以得出相近的方法。故在本次实验中,我选择了射击类游戏CS 1.6。
1.2简介
在游戏CS1.6中,有许多的游戏模式,在爆破模式中,玩家可以通过游戏中的金钱来购买自己喜欢的枪支武器等,那么我们发现在游戏中,最初始状态的金钱数量为16000,而随着购买武器的数量逐渐变多,钱只会越来越少,直至用完,即在同一局游戏中,金钱总额为固定值即16000,我们我便想尝试通过逆向分析,使得游戏中金钱数额始终保持在16000,打消金钱焦虑。
二、思路
2.1实验软件
本次实验逆向使用到的软件为Cheat Engine,使用到的版本号为6.4,Cheat Engine是一款专注于游戏的修改器。它可以用来扫描游戏中的内存,并允许修改它们。它还附带了调试器、反汇编器、汇编器、变速器、作弊器生成、Direct3D操作工具、系统检查工具等。内存扫描是Cheat Engine的最主要功能之一,它可以扫描指定数值的内存地址,通过修改这些数值来达到修改游戏数据的目的,从而达到诸如无限生命、时间或弹药等优势。它还有一些Direct3D操作工具,允许穿墙和放大/缩小FOV的视觉,并且通过一些高级配置,Cheat Engine可以移动鼠标以获得进入屏幕中心的特定纹理,这通常用于创建目标机器人,然而,Cheat Engine的主要用途是单人游戏方面,并不鼓励在多人游戏中使用它。本次实验中,我们打算实现的无限金钱功能,就是通过使用其内存扫描功能,进一步分析修改实现的。
2.2实验思路
所有地址相关的概念,都可以理解为坐标,用来给我们做标记。所以CE的内存扫描可以方便我们去寻找想要的地址,实验思路如下:
- 首先为了调试方便,可以将游戏设置为窗口模式;
- 为方便调试,先对游戏的部分参数进行设置调整,然后新建一个游戏;
- 开始游戏后,打开CE,并在左上角打开cs1.6;
- 通过观察发现游戏主界面右下角金钱数量为16000,打开CE,在数值搜索框中,输入16000进行搜索,便会找出许多16000数值的地址;
- 接下来进行筛选,通过购买一件物品,然后对购买后变化的数值进行再次搜索,便可大幅缩小地址范围;
- 剩下的两个地址中,一个是动态地址,一个是基址,我们需要找出真正的基址,这样才能从根源修改,可以选择其中一个,修改数值为10000,然后返回游戏随意购买一件物品,如果数值从10000开始减,那就说明我们找到了正确的基址,否则,就是用于显示的动态地址;
- 接下来查找扣除金钱关系逻辑,通过监控什么改写了这个地址即可找到,返回游戏购买后,就会看到一条修改记录,双击打开这条记录,提取相关信息;
- AA脚本编写,通过反编译后注入代码,脚本根据模板修改即可,最后在主界面下方开启这个脚本即可实现。
三、实验操作与运行结果
3.1实验操作步骤
- 首先打开CS1.6并进入主界面,然后打开Cheat Engine进入主界面;
- 接下来使用CE左上角的‘选择一个程序打开’打开CS1.6,进入修改界面
将购买时间设置为500mins,以便完成实验
3.已知金钱初始数值为800,故在数值搜索框中搜索800,然后选择首次扫描得到许多数值为800的地址;
4.需要从已知的这些地址中找到与金钱相关的地址块,故可以返回游戏中进行消费,购买一些物品使金钱数减少,接下来再次对减少后的数值进行搜索,注意此时应该点击再次扫描,这样就会从之前的结果中搜索;
回到CE,对改变后的结果进行再次扫描,通过再次扫描后我们发现,地址减少为了两个,那么这两个就是我们需要的金钱地址;
5.我们知到这两个地址中,一个是用于显示的动态地址,一个是真正处理数值变化的基址,具体哪个是需要我们尝试确定,我们可以先尝试修改一个地址的数据,修改后返回游戏再次进行消费,如果数值从修改后的值开始变化,那就是说我们找到了基址,如果任然是从原数值进行变化,那就说明找到的是动态地址;
首先我们修改0529C70C地址后发现,修改完后数值变为10000,但是再次购买后金钱任然从原数值开始抵扣,说明这是动态地址,接下来修改下面的地址,发现找到了基址;
接下来找到是什么改写了这个地址,双击该地址将其添加至描述栏然后右键打开是什么改写了这个地址,如果该地址数值发生变化,便会在这其中找到记录;
回到游戏中购买一个道具然后此处就会产生一条记录,双击打开后解读其中的内容,结合一些汇编知识就会发现,从上到下意思为:将金钱放入ecx中、金钱增加一个值,仍然放在ecx中,增加可以为负可以为正,这里理解就是改变金钱、将改变后的金钱(不管是增加还是减少)放到金钱内存地址中、将改变后的金钱放到eax中。
如图,就是红框中的语句定义了消费行为,故esi+00001CC中存放的数值即为实时金钱值;
回到之前的列表中,选择“显示反汇编”,跳到汇编界面,在工具中选中自动汇编
脚本中就会自动出现模板,将originalcode中的代码中的ecx改为0x3E80。之后选择分配到当前CT表。之所以改ecx,上面已经分析了很多了,ecx是动态的金钱,扣除或增加了之后,再赋值到金钱内存中。这里直接改为0x3E80(十进制16000),就等于,不管加钱还是减钱,都直接变为16000,达到无限金钱的效果。
注入完成后,返回到主界面,就会发现下方的脚本栏中出现了一条新的脚本,选择使用这个脚本后再返回游戏,就会发现金钱数又回到了16000,并且无论购买什么武器,金钱数都不会减小。
- 除修改此金钱数外,若我们想要修改购买的手雷数等,均可使用类似的方法,做到拓展。
- 修改手雷拓展
买一颗手雷,然后数值设为1进行扫描。
将手雷丢出,设为0,进行再次扫描。
再设为1,点击再次扫描。
如此反复,最后剩下四个地址,我们对它们进行逐一试验,以获得设置手雷数的内存地址。
首先对第一个进行修改,将数值设为99,激活。
修改失败,进游戏后手雷数仍为1,并且CE的数值也自动跳转回1。删除该地址,尝试其他地址。
一个一个进行尝试,最后到第三个地址时,设置为99后激活,进游戏仍然为99,并且投掷后手雷数不会变化,找到了真正的手雷数内存地址。
3.2运行结果
(1)金钱修改结果
(2)手雷修改结果
实验总结:
本实验通过CE修改了CS的金钱数与手雷数。通过CE观察金钱数的变化,找到控制金钱数的内存地址,通过不断的再次扫描留下数量较少的内存地址,之后逐一排查,最后将真正的内存地址的值修改后进行激活即可。修改手雷数也是类似的,通过对手雷的买入与投掷,观察其在CE中的变化,最后找到内存地址修改值并激活,即可改变手雷数。最后实验达到了无限金钱与无限手雷的目标。