7.31 游戏辅助相关知识(技术贴) 影子资源网

发布时间:2019-7-31 22:50

124 10 0

zifenghuang

用户头衔:影子VIP会员

关注 私信
辅助都在更新,需要更新基质,CF和谐了离线写法~
趁着这个时间,给大家普及点冷知识!希望大家多少看点,小编码字不易~
全C++演示,要有点基础的人才能看懂
cdc61564548740.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交流群:779251955 影子交流

B Color Smilies
影子资源网-分享最全面的热门免费辅助资源网论坛!X

优质资源赠送

福利!即日起开通本站VIP会员五折优惠!五折优惠! 限时活动!...

 

GMT+8, 2020-1-22 20:11

Powered by Discuz! X3.4© 2001-2017 Comsenz Inc.

网站内容仅供用于学习和交流,请遵循相关法律法规

QQ在线咨询|小黑屋|影子资源网 ( 京ICP备14052096号-3 )