【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法
 
前言:此文章主要用于提供方法与思路,fps游戏基本都能如此找偏移,文章里找的偏移比较少,主要用来演示寻找思路,文章的后记中会附一个大佬的github项目,项目会定期更新CS:GO游戏中常用的偏移值,写程序的时候使用大佬项目里的内容即可。本章需要CE基础,达到会改植物大战僵尸的阳光就可以了,全称采用CE搜基址,没有使用汇编分析。
 
环境:Steam里的CS:GO 和 Cheat Engine7.4,配置好这两个我们就正式开始了
 

寻找地址前的准备

进入游戏,选择人机练习赛,进入游戏,在游戏内使用`键打开控制台,在游戏控制台内输入如下指令

sv_cheats 1
mp_roundtime_defuse 60
bot_stop 1
mp_restartgame 1

指令完成后休闲模式变成60分钟一局,机器人暂停,以方便基址的查找,不然找一会儿游戏重新开始了,又要重找

使用CheatEngine附加到CS:GO进程

1.找自己的角度

角度:是人物面朝的方向,有上下角度和左右角度(摇头,点头),在游戏开始时,上下角度和左右角度都为0,角度是单浮点类型,头抬到最上方时,上下角度=-89,低到最低的时候上下角度=89,左右角度和上下角度的数值是连在一起的

找角度的方法:用(角度是单浮点类型,头抬到最上方时,上下角度=-89,低到最低的时候上下角度=89)这个特征寻找:

头抬到最高处,CE搜索单浮点精确数值-89

头抬到最低处,CE搜索单浮点精确数值89

头往上抬一点,则搜索减少的数值,往下低一点,则搜索增加的数值

几次过滤后得到七百多条数据,将这些数据都拖到下面,进行筛选

筛选方法:

一次选中一半的数值,按Enter键批量修改数值,随便修改一个 -89~89的数值

如果人物的视角发生了改变,则说明其中有正确的数值

将没选中的另一半删除掉

再对剩下的数值进行上述操作,几次后能找到一个正确的数值(或者几个),修改数值,视角变化,则确定是上下角度

选择浏览相关内存区域,寻找左右角度,一般上下角度和左右角度是连在一起的

将数据显示模式改为浮点型

可以在上下坐标(29.40)右侧,发现数据(-130.82),修改右侧数据,人物画面左右移动,则确认是左右角度

由此得到:上下角度的偏移值=FBF64DA0 、 左右角度偏移值= 上下角度偏移值+4

进入下一步,通过偏移值寻找基址

寻找基址一般有两种方法,一种是通过CE扫地址,来追基址,一种是读汇编,不断找上层call,这边就采用第一种来举例:

下一个访问断点

可以看到视角来源于ESI+4D90

上下角度 = [ESI+4D90]   ESI=FC690010

CE中搜索 FC690010(ESI) ,看哪块内存保存了ESI的值,直接搜出来一个基址,直接拿来用就行了

得到 ESI=[engine.dll+58CFDC],结合上下角度 = [ESI+4D90],得到:

上下角度 = [[engine.dll+58CFDC]+00004D90]

左右角度 = [[engine.dll+58CFDC]+00004D90]+4

得到人物角度的基址

2.找自己的坐标

坐标:游戏中人物的坐标是三维的,其数据类型为浮点型,其中Z轴的值是最好确认增加和减少的,所以采取的方法是先寻找Z轴的值,在Z轴旁边的就是X,Y轴的值

找坐标的方法:几次搜索后可以得到Z轴的值,得到Z轴的地址后,X,Y轴的地址就在Z轴地址旁边

在游戏中找一个箱子,CE先搜索未知的初始值(单浮点)

跳到箱子上后CE再次搜索增加的数值

从箱子上跳下来后CE搜索减少的数值

不移动人物,进行开枪,开镜,换弹,丢枪操作后CE搜索未变动的数值,在平地上左右移动后搜索未变动的数值

来回反复几次,最后过滤到四百多条,基本过滤不动了,将所有的结果添加到下面,再次筛选

筛选方法:

对半修改,选择一半,改为一个随便的值,看人物的是否上下移动

如果上下移动,则说明其中有正确的值,将另外一半的地址删除

重复,直到出现一个或多个值

注:游戏改崩了很正常,不要在意,重新来过

选择浏览相关内存区域,可以看到Z轴的数据前有两个数据,通过修改,人物前后左右移动,确定是X轴的值和Y轴的值

得到:

z坐标 = 7808B764

x坐标 = z坐标的地址 - 8

y坐标 = z坐标的地址 - 4

进入下一步,通过偏移值寻找基址(至于为什么没有图,原因是忘记截了,又懒得再搞一遍了)

先下访问断点,得到 Z轴的坐标 = [EDI + 000001E4]   EDI = 7808B580

在ce里四字节,十六进制 搜索7808B580(EDI),得到两个基址,里面储存了7808B580,随便拿一个用,可以得到 EDI=[server.dll+AC6258]

综上所述:

Z轴 = [[server.dll+AC6258]+1E4]

x轴 = [[server.dll+AC6258]+1E4-8]

y轴 = [[server.dll+AC6258]+1E4-4]

得到人物坐标的基址

3.找敌人的的坐标

坐标:敌人的坐标也是三维的,前文已经找到自己的坐标,可以通过自己与敌人的相对位置来找,即,自己站的比敌人低则搜索值大于***(自己的坐标)

找坐标的方法:

先在游戏控制台输入

mp_limitteams 0
bot_kick
bot_add_ct

把其他机器人都踢掉,只留一个ct,方便查找

先搜索单浮点,未知的初始值

自己站的比敌人高则搜索值小于***(自己坐标),此时站得比CT高,自己的z轴是56,搜索值小于56

自己站的比敌人高则搜索值小于***(自己坐标),此时站得比CT低,自己的z轴是-102,搜索值大于-102

此时和CT同一高度,则搜索值等于0.27

期间可以通过bot_stop 1 指令使机器人停止活动,以方便查找

经过几次重复可以找到几百个值,选取修改,如果修改后人物浮空,则说明正确的值在其中,则删除另外一半的值,反复几次,得到一个正确的偏移值

选择浏览相关内存区域,显示类型改成单浮点,可以看到敌人的X轴和Y轴

通过偏移值寻找基址

选择敌人x,y,z轴中的一个,使用上面使用的方法(下访问断点,搜上一层偏移)可以得到

人物的坐标 = [[client.dll+0x4DDD91C]+138]

此时需要补充一个知识点,在游戏开发的过程中,同样类型的事物会被写成类,而在游戏中实例化对象,像CS:GO此类fps游戏中,人物对象一般都包括人物的血量,人物的护甲,人物开镜状态,人物蹲起状态,人物的位置,人物的骨骼矩阵,人物视角矩阵,而此偏移138,则有可能是人物的位置,通过CE,可以分析这个结构,判断其他偏移

选择查看内存,分析数据结构

在框中输入client.dll+0x4DDD91C,选择 结构->定义新结构,得到如下视图,可以发现,每个指向C_CSPlayer对象的指针之间都差0x10

点开一个结构,可以在A8处看见人物的Z轴坐标

在100处看见人物的血量

则可以得到

人物的血量 = [[client.dll+0x4DDD91C]+100

人物的Z轴坐标 = [[client.dll+0x4DDD91C]+A8

其他的数据也都可以通过这个指针来分析,故总结一些就是通过人物的坐标( [[client.dll+0x4DDD91C]+0x138]) 找到 人物对象([client.dll+0x4DDD91C]) ,通过人物对象找到血量([client.dll+0x4DDD91C]+0x100)

4.找自己的视角矩阵

注:只写方法,没有截图

视角矩阵:这是个3D游戏,但屏幕是二维的,所以需要一种方法把3D的坐标转换为屏幕上的2D坐标,这个是通过视角矩阵和人物坐标实现的

矩阵的特征:

4x4

array[0][0]不开镜的时候小于1

自己的矩阵下面一行会跟着一行几乎一样的数据

视角转变会变化,开镜会变化

抬头(最上面)看的时候,array[3][3]和array[3][4]都是1.00

低头(最下面)看的时候,array[3][3]和array[3][4]都是-1.00

方法:

先搜未知的初始值,转个头、开个镜、转个身 都搜变动的数值,不动视角切枪,换弹,搜未变动的数值,几次下来就剩下几个数值了

挨个点击浏览相关内存,动视角,看哪一块内存是4*4的动,再不动,单独看开镜,是否变动,结合上面的1.00和-1.00直到找到觉得正确的值

可以在内存里看到矩阵

至此,找偏移的部分就结束了。

后记:

  写这篇文章的原因:当时感兴趣想学一下的时候网上没有能参考的文章,现在我把方法和思路分享出来,未来如果有想学习的人,可以多一篇参考文章

  后面的代码部分会用到这篇文章找到一些基址

  大佬的github:https://github.com/frk1/hazedumper

【C++】从零开始的CS:GO逆向分析1——寻找偏移与基址的方法的更多相关文章

  1. 【C++】从零开始的CS:GO逆向分析2——配置GLFW+IMGUI环境并创建透明窗口

    [C++]从零开始的CS:GO逆向分析2--配置GLFW+IMGUI环境并创建透明窗口   使用的环境:Visual Studio 2017,创建一个控制台程序作为工程文件 1.配置glfw 在git ...

  2. 【C++】从零开始的CS:GO逆向分析3——写出一个透视

    [C++]从零开始的CS:GO逆向分析3--写出一个透视 本篇内容包括: 1. 透视实现的方法介绍 2. 通过进程名获取进程id和进程句柄 3. 通过进程id获取进程中的模块信息(模块大小,模块地址, ...

  3. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  4. RE-1 逆向分析基础

    逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: ...

  5. 技术分享:逆向分析ATM分离器

    文章内容仅供技术交流,请勿模仿操作! 背景(作者) 每一次外出时, Elizabeth和我总是格外的小心,同时把我们身上的钱藏在特殊的皮带上面,这样还不够,我们还采取了“狡兔三窟”的方式来藏身上带的银 ...

  6. C++反汇编与逆向分析技术揭秘

    C++反汇编-继承和多重继承   学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 一.单类继承 在父类中声明为私有的成员,子类对象无法直接访问,但是在子类对象的 ...

  7. TI(德州仪器) TMS320C674x逆向分析之一

    一.声明 作者并不懂嵌入式开发,整个逆向流程都是根据自身逆向经验,一步一步摸索出来,有什么错误请批评指正,或者有更好的方法请不吝赐教.个人写作水平有限,文中会尽量把过程写清楚,有问题或是写的不清楚的地 ...

  8. 一文了解安卓APP逆向分析与保护机制

    "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物 ...

  9. Android逆向分析(2) APK的打包与安装背后的故事

    前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之 ...

随机推荐

  1. 阻塞赋值-非阻塞赋值(LUT,FDC,BUF...)

    一.看RTL级综合网络 1.1 FDC FDPE FDRE FDSE均是XILINX FPGA片上资源中四种不同的触发器,具体功能可直接百度 1.2 LUT是实现组合逻辑功能的一张真值表,根据输入值直 ...

  2. 第十六天python3 文件IO(二)

    BytesIO操作 io模块中的类 from io import BytesIO 内存中,开辟的一个二进制模式的buffer,可以像文件对象一样操作它: 当close方法被调用的时候,这个buffer ...

  3. Stream流中的常用方法foeEach和Stream流中的常用方法filter

    延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似Stri ...

  4. react 吸顶实现

    今天获取到一个需求,其实就是吸顶的需求,页面下滑,某一块dom隐藏时发生吸顶现象.这种特效其实老生常谈了,但是在这次做的时候,突发奇想,能否将其做成一个 hook ,从而实现出传递ref即可使得 do ...

  5. python 部分内置函数详解

    简介 eval与exec eval和exec都是python内置的可以执行python代码的函数,但它们之间有所区别. eval(expression[, globals[, locals]]) ex ...

  6. ASP.NET Core 6框架揭秘实例演示[29]:搭建文件服务器

    通过HTTP请求获取的Web资源很多都来源于存储在服务器磁盘上的静态文件.对于ASP.NET应用来说,如果将静态文件存储到约定的目录下,绝大部分文件类型都是可以通过Web的形式对外发布的." ...

  7. linux学习随笔3之linux安全

    1.history显示时间,用户和命令 vim /etc/profile export HISTTIMEFORMAT=" %F %T `who -u am i 2>/dev/null| ...

  8. BZOJ3572/Luogu3233 [Hnoi2014]世界树 (虚树) (Unfinished)

    我太弱了,这叼题先搁着把,来日方长,自有切时... ...或许吧 #include <iostream> #include <cstdio> #include <cstr ...

  9. 基于 .NET 6 的轻量级 Webapi 框架 FastEndpoints

    大家好,我是等天黑. FastEndpoints 是一个基于 .NET 6 开发的开源 webapi 框架,它可以很好地替代 .NET Minimal APIs 和 MVC ,专门为开发效率而生,带来 ...

  10. 超实用在线工具!能将文字加密为Emoji表情

    试想一下,如果你需要将一段比较敏感的内容发送给你的好友. 但如果这段内容不小心外泄,被别人看到了,可能会带来很多麻烦. 那么,有什么方法能够让传输的文本内容不那么容易被"看破"呢? ...