一、计算机原理
中央处理器(CPU,Central Processing Unit)是一台计算机的运算核心(Core)和控制核心( Control Unit)。 它的功能主要是解释计算机指令以及处理计算机软件中的数据。 说白了就是负责计算 CPU由三部分组成: 1、控制器:是整个CPU的指挥控制中心,由指令寄存器IR(Instruction Register)、指令译码器ID(Instruction Decoder)和操作控制器OC(Operation Controller)等组成 2、运算器:可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。 3、存储器:包括寄存器、缓存等,是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时间短
内存负责在硬盘和CPU之间中转数据,所有的程序运行时都必须通过加载到内存来进行
硬盘负责存储数据
数据的调用方向是: 硬盘->内存->CPU缓存->CPU控制器->CPU寄存器->CPU计算器
存储器的种类很多,按用途可以分为主存储器和辅助存储器,主存储器又称内存,是CPU能直接寻址的存储空间,它的特点是存取速率快。内存一般采用半导体存储单元,包括随机
存储器(RAM)、只读存储器(ROM)和高级缓存(Cache)。 随机存储器(RAM)可以随机读写数据,但是电源关闭时存储的数据就会丢失; 比如内存条 只读存储器(ROM):(Read Only Memory)只能读取,不能更改,即使机器断电,数据也不会丢失; 比如Bios 高级缓存(Cache):它是介于CPU与内存之间,常用有一级缓存(L1)、二级缓存(L2)、三级缓存(L3)。它的读写速度比内存还快,当CPU在内存中读取或写入数据时,数据会被保存在高级缓冲存储器中,当下次访问该数据时,CPU直接读取高级缓冲存储器,而不是更慢的内存。辅助存储器又称外存储器(简称外存),就是那些磁盘、硬盘、光盘等 一、内存辅助原理1、虚拟内存前面我们说过,游戏文件是保存在硬盘中,游戏启动时,游戏进程必须通过加载到内存中才能运行。32位程序启动时,操作系统会自动分配一个4G的虚拟内存地址给进程,内存地址从00000000到FFFFFFFF。虚拟内存不是真正的内存,它通过映射的方法使可用虚拟地址达到4GB,每个应用程序可以获得2GB的虚拟地址,剩下的2GB留给操作系统自用。一个进程用到的虚拟地址是由内存区域表来管理的,实际用不了4G,而用到的内存区域,会通过页表映射到物理内存。所以每个进程都可以使用同样的虚拟内存地址而不冲突,因为它们的物理地址实际上是不同的。这里的4G,是指有4G个内存“虚拟地址”——再直白一点,就是每个进程可以获得4G个门牌号,而不是4G个真实的内存空间。房子少,门牌却多,这些门牌最终要挂在哪里呢?答曰:一部分挂到真实的物理地址上去,一部分可能被挂到“虚拟内存(硬盘空间)”上,还有很大一部分,哪儿也不挂,整个儿就是操作系统给进程开的白条。windows是一个分时的多任务操作系统,CPU时间被分成一个个时间片后分配给不同的程序,在一个时间片里,与这个程序的执行无关的内容不会被映射到线性地址中,因此,每个程序都有自己的4GB寻址空间,互不干扰。需要明白几点:1>应用程序不会直接访问物理地址;2>虚拟内存管理器通过虚拟地址的访问请求来控制所有物理地址访问;3>每个应用程序都有独立的4GB寻址空间,不同应用程序的地址空间是彼此隔离的;4>DLL程序没有“私有”空间,它们总是被映射到其他应用程序的地址空间中,作为其他应用程序的一部分运行。 64位系统(64位程序)提供了16TB的有效寻址空间,其中一半可用于用户模式的应用程序。游戏要进行各种计算必须通过 CPU,而CPU要获取数据必须通过内存,所以只要当前游戏用到的各种数据都必然会存在于内存中,这就是为什么通过内存我们可以找到我们想要的游戏数据,实现我们想实现的内存辅助功能。 2、游戏数据:对于单机游戏而言,游戏中绝大部分的参数(比如血、蓝、能量亦或是金币)都存储在计
算机的内存中,一些类似剧情进度的则加密后写入本地的自定义配置文件中;对于网游,虽然服务器保存了大量的重要的参数,但由于客户端不可避免的需要进行大量的计算和资源的加载,本地内存中必定存有部分的临时变量,通过判断这些变量的变化规律和函数的破密寻到利于自身的参数,比如伤害值一类,继而寻找该变量的内存地址,根据指针偏移分析获得内存基址,再提升权限利用Windows API把自定义数值写入该内存块,就完成了修改某项数值的操作,一般来说,只要破解了一项数值,利用规律继而破解其他数值就更加容易了。3、游戏功能CALL通过逆向分析获得游戏功能CALL,调用功能CALL驱动游戏实现各种动作。通过分析游戏明文封包CALL,可以快速定位游戏功能CALL有游戏数据+各种游戏功能CALL,通过编程语言调用游戏数据和功能CALL写逻辑流程,即可让游戏自动执行指定的游戏任务、副本等功能,从而开发出具有强大功能的游戏辅助。也可以引入其他脚本语言(比如lua)来写逻辑流程。 一、游戏数据类型、进制、编码等知识的了解1、数据类型字节型 Byte双字节 Word整数型(4字节) DoubleWord (DWord) 长整数型(8字节) long 文本型(字符串)小数型(浮点型)(4字节)float 双精度小数型(8字节) Doublefloat字节数组数组逻辑型(字节型) True False坐标:浮点型最多,有些是整数型人物的血值、等级:整数型人物名字、怪物名字:字符串某种状态,比如怪物是否死亡,人物是否骑马:逻辑型 2、进制二进制 八进制 十进制 十六进制8bit=1Byte 一个字节等于8个位1 高电平 0低电平 80GB 80GByte1byte 1kByte
1024B =1kB1kb*1024=1MB1MB*1024=1GB80*1024*1024*1024Byte80000000000Byte 二进制:0 1 0 1 10 11 100 101 110 111 1000 1000:1111101000=0*2^0+0*2^1+0*2^2+1*2^3+0*2^4+1*2^51111101000=3E8 1BYTE=8bit1KB=1024个字节1MB=1024个KB1GB=1024个MB1TB=1024个GB二进制 Binary八进制 Octal number system十进制 Decimal system十六进制 Hex 1Mb 1MB 80GB 80000000000个字节 13DEH10010000B1035D 10000000 8011111010 FA十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 1C=C*16^0+1*16^1=12+16=28十进制: 0 1 2 3 4 5 6 7 8 9 10八进制: 0 1 2 3 4 5 6 7 10二进制: 0 1 10 2CEB06H=001011001110101100000110 2943750 [size=10.5000pt]1、编码ASCII American Standard Code for Information Interchange(美国信息交换标准代码) ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。其中:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。ASCII扩展 一个英文字母占一个字节,一个中文汉字占两个字节00000000 -111111110000000000000000-1111111111111111GB2132 国标码对于我们汉字来说,需要使用两个字节来表示。小于127的依然表示原来的字符(也就是该字节最高位为0),当计算机遇到两个大于127的字节时候(也就是两个字节的最高位都是1),就一次性读取两个字节,将它解码成一个汉字。这就是GB2312编码,它大概能够表示7000多个简体汉字。不包括一些繁体字,但是对于日常使用已经足够。它所收录的汉字已经覆盖99.75%的使用频率,在中国大陆和新加坡广泛使用。编码方式:GB2312对所收汉字进行了“分区”处理,每区含有94个汉字或者符号,这种表示方法也叫做“区位码”。 它是用双字节表示的,前面的字节为第一字节,又称“高字节”,后面的为第二字节,“低字节”。 高位字节,把 01-87 区的区号加上 0xA0 (相当于数字 160);低位字节把 01-94 区的区号加上 0xA0(相当于数字160)。 举个简单的小例子:第一个汉字— —“啊”,它的区号为 16,位号 01,则区位码是 1601。则高字节位:16+0xA0=0xB0;低字节位:01+0xA0=0xA1,所以“啊”的汉字处理编码为0xB0A1 GBK编码(GB2132编码的扩展) 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物。 BIG5编码 大五码 由台湾五家软件公司创立是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。 ISO8859-1:拉丁码表 欧洲码表Unicode UTF-32 UTF-16 UTF-8UTF8编码 一个英文占一个字节,一个中文汉字(含繁体字)占三个字节UTF-8: ( 最多用三个字节来表示一个字符。) UTF8 是 unicode 其中的一个使用方式。UTF 的意思是: unicode translation format,即把 unicode 转作某种格式的意思。 UTF-8 使用可变长度字节来存储unicode 字符,如 ASCII 字母还是采用一个字符来存储,希腊字母等采用2 个字符来存储,而常用的汉字要使
用 3字节,辅助平面字符则使用 4 字节。Ø UTF-16:使用一个或两个未分配的16 位代码单元的序列对 unicode 代码点进行编码,即 2个字节表示一个字符。Ø UTF-32:将每一个 unicode代码点表示为相同值的 32 位整数。 ANSI(American National Standards Institute),中文:美国国家标准学会ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f 范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。新建一个空的文本文件,用记事本打开(必须是Windows自带的记事本),只输入“联通”二字保存关闭(输入“1联通”也是联通显示的也是乱码),再重新打开时将是乱码。当txt文档中一切字符都在 C0≤AA(第一个字节)≤DF 80≤BB(第二个字节)≤BF 这个范围时,notepad都无法确认文档的格式,自动依照GB-2312来解码。 而"联通"就是C1 AA CD A8,刚好在上面的范围内,所以不能正常显现。记事本默认是以ANSI编码保存文本文档的,而正是这种编码存在的bug招致了上述怪现象。假如保存时选择Unicode、Unicode (Big Endian)、UTF-8编码,就正常了。此外,假如以ANSI编码保存含有某些特别符号的文本文档,再次打开后符号也会变成英文问号。 从 ASCII, GB2312, GBK 到 GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一的处理。区分中文编码的方法是高字节的最高位不为0。
|