欢迎来到C++游戏外挂开发系列教程!
游戏外挂开发是一个既有挑战性又充满乐趣的领域,它让我们有机会深入探索计算机程序设计和系统底层原理。本教程将带领你从零开始,逐步学习如何使用C++编程语言开发游戏外挂,包括各种常见游戏中的作弊功能,如自动射击、透视功能、无敌模式等。通过本系列教程,你将了解到游戏外挂的基本原理、常见开发工具、技术挑战和实际应用技巧,为你打造成一名优秀的游戏外挂开发者提供全面的指导。
那么我来问一下,汇编代码的特征是不会变的,这是我们三个杀毒软件经常做的事情,查特征码。如果你的代码特征和某个病毒的代码耦合,那么杀毒软件就会判断你是病毒,通过这个来判断。这个特征码是不会变的,好了,我们可以得出一个结论,我们可以通过扫描这个特征码来匹配,怎么匹配呢?
想想看,文件上的硬编码,文件是一个PE格式的文件,它的PE格式会加载到内存中,加载程序会加载到内存中。前提是这个程序没有加壳的话,杀软可以直接静态反编译。但有些程序为什么一放到电脑上就被杀了?他们没有加壳,杀软直接拿到了他们的代码。但是有一个问题,有的程序一放到电脑上没事,一打开就被杀了,为什么?因为它们的代码地址会变,但是它们的逻辑不会变。这是因为它们的代码地址会变,但是它们的逻辑不会变,因此通过特征码来匹配是有效的。
内存的一些基础知识,我们来简单介绍一下。内存就像一条线,从0一直乘到2G的用户层空间,也就是虚拟内存空间。每个内存都有一个地址,程序一般从0x4410开始,一直走到0x20x7 f f f f。这是内存的大致结构。每一段内存其实都是一段一段的下标,对应着不同的内存地址。但在实际分配内存时,并不是连续的,可能会有一些空的块,即没有提交的内存。
那些红色的地方是已经被使用的,而白色的地方是未使用的。在读取内存时,我们一般会以4096字节为单位进行读取,因为Windows内存页是4096字节对齐的,这样可以提高运行速度。内存中的执行代码、存放变量等属性会影响我们读取的效率。我们可以先预判程序的代码空间大概在哪里,然后逐一取出内存块来进行处理。
变量的数据通常存储在可读区域,允许读写的数据一般在这个区域内。接下来,我们从200个内存块中过滤掉白色的区域,即不需要的区域。然后,将匹配内存属性的内存块加入到内存地址块中,并保存其起始地址和大小。内存区段的属性不需要改变,因为我们要查找的区段通常是可读可写可执行的。查找完毕后,我们进行一些后续处理,将特征码长度复制到保存区域中,然后开始查找。查找过程中,根据内存块数量开启相应数量的线程,将每个内存块的起始地址和大小传递到读取内存的线程中。
接着,从目标进程中读取内存块的数据,存储到临时缓存中,缓存的大小与内存块大小相同。读取完毕后,我们开始匹配特征码,这个匹配过程可能使用模糊匹配算法。匹配成功后,将查询到的内存地址存储到数组中,以便进一步处理。整个过程基本上按照这个模型进行,特征码的查找算法尽量不要改动,因为改动可能会导致不必要的问题。代码区域是可读可执行的,所以我们要找的就是可读可执行的地方。之前已经写过设置进程的部分,代码会提供给你们,你们可以自行封装。