辅助都在更新,需要更新基质,CF和谐了离线写法~
趁着这个时间,给大家普及点冷知识!希望大家多少看点,小编码字不易~
全C++演示,要有点基础的人才能看懂

------------------------------------------------------------------------------------------------------------
1. 什么是基址?
这个概念是最常被提起的,也是最重要的。所谓基址,就是程序中某些变量的地址,这些地址是恒定不变的(在游戏被更新之前)。为什么是基址不会改变呢?可以运行下面这个简单的实例,
# include < stdio.h > int a = 123 ; int main () { printf ( " %X " , &a); }
多次运行之后你会发现,输出的值都是不变的,因为a的地址是不变的(即使将int a = 123
写到函数体内,输出的值也是恒定的)。
-
int a = 123
写在main外部:a是存储在静态存储区的(.data段),在程序编译阶段已经就确定了存储的位置(即段内偏移量是不会变的,除非程序改动后重新编译) -
int a = 123
写在main里面,a的地址不变的原因:a存储在栈区,栈指针esp在编译阶段已经可以确定是如何移动的(esp初始位置也是确定的),因此a的地址不变(这里只考虑单线程程序,多线程由于有独立栈空间,输出的结果会有变化)
游戏里面的基址通常是一个指针,通过基址+偏移量的方法,定位出关键数据的位置,举个例子
# include < stdio.h > struct people { char * name; int age; int power; //攻击力 // ... }; people *instance; //人物指针 int main () { instance = (people*) malloc ( sizeof (people)); // ...后面对任务进行初始化等 }
由于基址是不变的,所以instance这个变量的地址其实在编译阶段就已经确定了,假设我们通过某种方法获取到instance的地址0x12345678。我们可以通过*(int*)(0x12345678)
获取到people实际的存储地址,如果我们想要修改人物的攻击力,可以通过*(int*)(*(int*)(0x12345678) + 8) = 12345678
这里8为人物攻击力的偏移量,得到该地址后取指针就可以得到人物攻击力的真实存储地址了。
游戏中的结构体一般都比较复杂,有多级偏移,一般就是[[[[基址]+偏移1]+偏移2]+偏移3] ...
这种模式([]为去变量的地址)
如果想了解更多,可以去看虚拟地址,操作系统的分段和分页机制,加深对C语言的指针的理解
评论列表: