寄存器是中央处理器内的组成部分 它们可用来暂存指令、数据和地址。 具有这样功能还有内存 我们这里说的内存都是指虚拟内存。 寄存器和虚拟内存的主要区别在于它的存储和读取速度更快,那么有的同学会说,那我们全用寄存器就好了,但是,寄存器是有限的,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 是人物的血地址, 他一直不变都是代表的血地址, 但是里面的血值是会变的, 基地址在程序中的本质是全局变量。 基地址和偏移可以组合成指向任何内存地址的偏移表达式。 那么在我们以后逆向学习中,往往最终的目的多是找到这个偏移表达式! |