前俩篇讲到的方法都需要自己每次打开ce,并且尝试不同阳光值,找到对应内存,改变其值,

现在同一次打开游戏,进行俩关:

同一次打开游戏
1-4关的时候,直接存放阳光数量的地址:0x19C8A148
1-5关的时候,直接存放阳光数量的地址:0x19D1CF68

可以发现,只是进入下一关,甚至不要重启游戏,之前直接存放阳光值的地址就发生了改变,因此这次研究游戏基址和偏移量,以后一劳永逸的就可以改变阳光值,无论是进入下一关还是重启游戏,都可以实现阳光的数量的改变

 

首先还是要尝试找到存放阳光值的地址,前面的帖子已经提到,这边很快就能找到这个0x19D1CF68地址存放阳光数量,然后右击是什么改变了他的值,此时没有变化,这个时候去游戏界面收集一下阳光之后,发生了变化,如下图所示

EAX=19D17A08
EBX=00000001
ECX=00000019
EDX=D8C30002
ESI=1A0C64F8
EDI=19D17A08
EBP=0019F9D8
ESP=0019F968
EIP=00430A17

Probable base pointer =19D17A08

00430A0B - and ecx,32
00430A0E - mov eax,[esi+04]
00430A11 - add [eax+00005560],ecx
00430A17 - mov ecx,[eax+00005560]
00430A1D - cmp ecx,00002706

这个时候,发现是:add [eax+00005560],ecx  改变了 eax+00005560 这个内存对应的值,实现阳光改变,也就是偏移量是:5560,eax的值是:19D17A08

 

用ea 找存放 19D17A08 的值的内存,发现有很多:这时候一个个点击ctrl+f5,也就是谁读取了他的值,都是空的,直到有一个出现了类似下面的信息,

EAX=19D17A08
EBX=00000001
ECX=00000C30
EDX=0C612020
ESI=0487A208
EDI=0487A208
EBP=00000001
ESP=0019FC54
EIP=004524FA

Probable base pointer =0487A208

004524F1 - push esi
004524F2 - mov esi,eax
004524F4 - mov eax,[esi+00000768]
004524FA - test eax,eax
004524FC - push edi

 

这个时候就可以直到偏移量是:768,并且是从esi 0487A208来的,

 

再同理用ea找存放:0487A208 的内存

这四个绿色的代表不变的值可能就是基址,因此再一个个ctrl+F5,找出基址为:0x006A9F38

 

其核心实现代码为:

__declspec(dllexport) void changesunnumber()
{
    int *p = (int *)0x006A9F38;//p指向游戏基址
    int *p1 = (int *)((*p) + 0x768);
    int *p2 = (int *)((*p1)+0x5560);
     while (1)
    {
        *p2 = 50000;//阳光数保持在50000
    }
}

这边理解为:

无论怎么启动游戏:0x006A9F38(基址) 永远是存放的new 出的结构体A的地址AddressA(一级基址)

然后 AddressA+ 0x768 这个地址存放的是 另外一个结构体B的地址AddressB(二级基址)

再然后 AddressB+ 0x5560 这个地址存放的是 另外一个结构体(变量)C(实际就是阳关值的地址)的地址AddressC(三级基址)

最后改变 AddressC 地址值即是阳光数量

 

很多比喻成p是基址,   *(p+768+5560) 即是阳光数,这种理解千万不能要,根据上面的代码理解下,比较方便

 

~写代码的小熊猫 o(* ̄▽ ̄*)ブ