windows-内存地址和偏移

工具

植大战僵尸经典版

下载地址:https://download.csdn.net/download/weixin_43916597/14040707

CE 6.8.1

下载地址:https://download.csdn.net/download/weixin_43916597/14040715

windows下一个程序运行的过程

1.如何存放:可执行程序需要放在硬盘上,而硬盘是一个外设上面有文件系统,exe以文件方式存放在硬盘上。操作系统将程序放在硬盘特定的位置。

  2.如何启动:而应用程序需装入内存上才能被CPU运行,操作系统再把exe从硬盘放到内存里面去,去启动他。

  3.操作系统给程序分配内存

  4.操作系统给用户提供设备分配

  5.会自动分配内存不会被一个程序霸占

  6.程序结束退出系统并释放内存

内存

计算机的组成结构中有一个很重要的部分是存储器。它是用来存储程序和数据的部件。

有了存储器,才有记忆功能,才能保证正常工作。

存储器的种类很多。按其用途可分为主存储器辅助存储器,主存储器又称内存储器(简称内存)。

内存又称主存。它是CPU直接寻址存储空间,由半导体器件制成。特点是存取速率快。

内存是电脑中的主要部件,它是相对于外存而言的。

我们平常使用的程序,如:Windows操作系统打字软件游戏软件等。一般安装硬盘外存上,但仅此是不能使用其功能,必须把它们调入内存中运行,才能真正使用其功能。

我们平时输入一段文字或玩一个游戏,其实是在内存中进行。好比在一个书房,存放书籍的书架和书柜相当于电脑的外存,我们工作的办公桌相当于内存。

通常,我们把要永久保存、大量数据存储外存上,把一些临时或少量的数据和程序放在内存上。当然,内存的好坏会直接影响电脑的运行速度。

内存是暂时存储程序以及数据的地方。当我们使用WPS处理文稿时,当你在键盘上敲入字符时,它被存入内存中。当你选择存盘时,内存中的数据才会被存入硬(磁)盘。

虚拟内存

  因为当一个程序要变成进程运行时都会用到内存,而一个进程会分配4GB的内存,所以这里我们的内存肯定是不够的,于是有了虚拟内存的产生让每个运行的进程看起来是有一个完整的连续的运行4GB空间

https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98/101812?fr=aladdin

内存地址

Windows程序的内存块:0x00000000~0xFFFFFFFF

 

使用CE来分析植物大战僵尸

首先打开植物大战僵尸,然后用CE附加这个主进程来处理

这次直接来处理这个阳光,因为玩过的都知道,阳光是植物大战僵尸的关键,而阳光的值是25 25 的往上走,所以这里我猜是一个int类型的变量来处理,所以在这个数值类型这里选用四字节来处理

 

 

 

 

 

在数值这里输入150进行搜索,因为初始的阳光值是150

 

 

 

 

 

 

 

静态地址和动态地址

这里可以看到CE在内存中查找数值时,有内存地址为黑色和绿色的值

,这里的黑色代表的是内存的动态地址,绿色的代表的是静态地址。动态地址也就是每次加载后会不一样,而静态地址表示程序每次使用的时候都是不变的地址

静态地址就相当于一直保存而动态地址就相当于暂时存放。

  全局变量可以看为静态地址,局部变量可以看为动态地址

  动态地址=静态地址+偏移地址

  其实这里的静态地址也就是一个指针类型,用来存放动态的游戏地址,但是这个静态地址是不变的,相当于这是一个指针变量,这个指针变量的地址不变,但是指向的内容是会改变的

例子:

  基地址0x11111111  偏移地址0x100

第一步:[0x11111111]+0x100=动态地址

    相当于c语言里的的  *a+0x100=动态地址

不同的进程游戏地址肯定会改变,但是改变的是静态地址指向的地址,但是静态地址的内容是不变的。

过滤数据

总的来说就是对一个类型的数据一直进行分析,比如说这些的阳光这个类型的数据,如果我在使用了植物之后阳光就会减少,这个时候再来搜索就是对上面之前这个150的阳光后变成了50的阳光的类型再来搜索一次就会过滤掉很多数据

分析阳光:

 

在初始的150的阳光使用掉100种一个豌豆射手之后变为了50,这个时候再搜索就肯定会减少数据。这个时候我们使用50再来搜索一次数据

 

 

就知道了这个阳光其实是保存在161CF688这个动态地址的下面的数据,可以直接进行修改就可以实现这里的阳光修改了。

 

 

 

通过动态地址找静态地址

要想做游戏辅助,肯定要使用静态地址来处理,因为动态你只是知道方法,别人如果要使用还是很麻烦的。

 

 

在CE中选择你要查找的动态地址,然后选择

 

 

然后可以看到这里其实是有两个调用了它。而且内容都是对偏移地址为00005560的偏移地址,这里我们选择mov指令的地址来查看,因为mov在汇编语言中的直接对寄存器进行赋值

 

 

EAX=00000032 EBX=00000001 ECX=00000000 EDX=074BB968 ESI=16338EA8 EDI=1248B520 EBP=0019FA98 ESP=00199790 EIP=0048982B

指针基址可能是 =16338EA8

0048981D - test al,al 0048981F - jne 00489933 00489825 - mov eax,[esi+00005560] 0048982B - xor ecx,ecx 0048982D - test eax,eax

偏移量

在这里可以看到偏移量是5560,这个如果看不懂的去先去看看汇编语言

这里的指令是

mov eax,[esi+00005560]

而对应的寄存器esi的值是16338EA8,所以CE报告说可能的静态地址是16338EA8

 

然后这里再根据前面提供的esi寄存器的地址来搜素查看

 

 

 

 

 

在这个第二个地址中查看到了对应的MOV esi,xxxx所以这里可以确定第二次的偏移地址是768

EAX=00452650 EBX=0019FD00 ECX=026A9D68 EDX=00667BA0 ESI=16338EA8 EDI=026A9D68 EBP=00000001 ESP=0019FC60 EIP=00452679

指针基址可能是 =026A9D68

0045266A - cmp byte ptr [edi+000004CF],00 00452671 - je 0045269B 00452673 - mov esi,[edi+00000768] 00452679 - test esi,esi 0045267B - je 0045269B

 

同样的这次来搜索对应的edi的值,EDI=026A9D68

 

这次搜索后,可以很直观的看到了绿色的地址

 

 

刚刚有说到,在CE中绿色的就是静态地址,所以这里算是把静态地址找到了

其实学过这个结构体的应该都清楚:这里相当于是

动态地址=静态地址+偏移量

这里只用了两个偏移量就找到了算是很简单了

第一个偏移量是:768h 第二个偏移量是5560h(这里是十六进制)

最后进行找到的静态地址+偏移量来处理

 

 

最后重启查看是否改变,如果改变说明失败,如果没有改变说明找到了对的静态地址+偏移量