游戏安全实验室 首页 游戏漏洞 查看内容

【游戏漏洞】逆向基础之寄存器和内存

发布于:2018-2-20 17:13   |    140764次阅读 作者: 外部投稿    |   原作者: 通化程序员

寄存器是中央处理器内的组成部分 它们可用来暂存指令数据地址

具有这样功能还有内存 我们这里说的内存都是指虚拟内存。

寄存器和虚拟内存的主要区别在于它的存储和读取速度更快,那么有的同学会说,那我们全用寄存器就好了,但是,寄存器是有限的,32位寄存器只有eax,ecx,edx,ebx,esp,ebp,esi,edi8个通用寄存器。所以,大量的数据往往是需要存放在内存中的。而当我们对速度有特殊要求时,就要考虑尽量的用寄存器了,例如fastCall函数约定,就是用寄存器来传递参数,这样的主要目的就是提升运行速度。

 

 

这8个通用寄存器除了都可以储存数据的功能之外,各自又有自己稍微独特一点的特性。

eax,往往存放函数的返回值。

ecx,计数器等等

ecx和ebx,在fastcall函数约定时存放参数,当然其他寄存器实际也有可能存放参数。

esp,栈顶指针。

ebp,栈底指针。

 

 

讲完寄存器

那么什么是内存呢?

内存是计算机中重要的部件之一。计算器中所有程序的运行都要在内存中进行。其作用是用于暂时存放cpu中的运算数据。

我们调试游戏时所说的内存,往往是指虚拟内存,软件执行后,会用到很多数据,都是被装载在该程序的进程空间的虚拟内存中。

虚拟内存是在硬盘上的,操作系统为该软件的进程分配4GB的虚拟内存空间,用来存放数据。

 

 

有这样一个问题,为什么是分配4GB虚拟内存空间?32位计算机系统为什么最大内存是4g ?

因为是32位系统,所以地址最小是32位的8个0,即0x00000000,地址最大是8个F,即0xFFFFFFFF。

那么一共有地址的数量是0xFFFFFFFF+1=0x100000000这么多的地址,那么我们算算一共是多少,首先我们先把 0x100000000转换成10进制等于4294967296字节,除以1024等于4194304KB,再除以1024等于4096MB,再除以1024等于4GB。

 

 

什么是偏移?

其实很简单,就是一个内存地址相对于另外一个内存地址的距离,单位字节

内存地址A+偏移=内存地址b。

例如   50000  和  50050 的偏移就是 50。

 

什么是基地址?

我们找一些单机数据时会发现,如果找到了人物的血地址,每次启动游戏这个地址都是不变的。这种往往就是基地址, 基地址是静态的不变的,所谓的静态的是指的,这个地址的含义,而不是里面的值。例如 12345 是人物的血地址, 他一直不变都是代表的血地址, 但是里面的血值是会变的,

基地址在程序中的本质是全局变量。

 

基地址和偏移可以组合成指向任何内存地址的偏移表达式。

那么在我们以后逆向学习中,往往最终的目的多是找到这个偏移表达式!



来源:通化程序员-公众号投稿

*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩0 赞0

收藏

下一篇:【游戏漏洞】逆向基础之发包函数和线程发包

最新评论
B Color Image Link Quote Code Smilies

发表评论

top 问题反馈

返回顶部