末世辅助网- 热爱游戏、网络、技术网友的聚集地。

我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国

我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 我爱你中国 

游戏辅助相关知识(基质)

发布时间:2019-7-31 12:03 当前分类: 源码

辅助都在更新,需要更新基质,CF和谐了离线写法~

趁着这个时间,给大家普及点冷知识!希望大家多少看点,小编码字不易~

全C++演示,要有点基础的人才能看懂

0.jpg

 

------------------------------------------------------------------------------------------------------------

 

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语言的指针的理解

QQ游戏小号
我爱你中国

评论列表:

马000化000腾 2019-07-31 14:09
666
吾爱PJ 2019-07-31 13:02
不错
学到东西应该懂得感恩作者 无脑喷子永封IP段+删账号所有评论 不喜欢请右上角 X   百度已收录
关闭
我爱你中国
关闭广告