//注意:本程序测试时,用的植物大战僵尸版本为:
植物大战僵尸年度中文版
http://l5.yunpan.cn/lk/36mpcb54vc
本程序下载地址:
因业界一直对外挂持否定的态度,所以作者就不将其发布在互联网上了,
本程序仅供个人学习研究之用,有需要者请联系作者本人
//
上次我写了个植物大战僵尸加阳光的外挂,结果在学习、无聊之余,玩玩游戏,劳逸结合,收获不少!...
先说一下这次找金钱的基址的方法:
刚学外挂时,我自己找过金钱的基址,找了很多次都没找到,奇怪之极!...
一次在网上看到了一个找金钱基址的教程,看了之后,我才恍然大悟,原来我们在游戏中
看到的金钱,最后一个0是没有用的,例如,我们在游戏中看到的金钱数为5550,实际上
我们拥有的金钱数为555,所以我们在用CE搜金钱时,要是我们不把5550后面的0去掉,我们是
搜不到金钱的基址的,知道了原因之后,我们每次搜金钱时,把金钱后面的0给去掉,然后再搜就可以了。
呵呵,经过一番搜索之后,我发现金钱的基址跟我以前搜索出来的阳光的基址是一样的,都是:006A9EC0
只是它们的偏移不同而已...
本程序效果截图如下:
//本程序对其它版本有可能不起作用
http://l5.yunpan.cn/lk/36mpcb54vc
本程序下载地址:
因业界一直对外挂持否定的态度,所以作者就不将其发布在互联网上了,
本程序仅供个人学习研究之用,有需要者请联系作者本人
//
上次我写了个植物大战僵尸加阳光的外挂,结果在学习、无聊之余,玩玩游戏,劳逸结合,收获不少!...
这次我忍不住要写个加钱的外挂,因为我发现在游戏中没钱买装备,
那是相当的无奈呀!呵呵,现实中也一样啦!...
先说一下这次找金钱的基址的方法:
刚学外挂时,我自己找过金钱的基址,找了很多次都没找到,奇怪之极!...
一次在网上看到了一个找金钱基址的教程,看了之后,我才恍然大悟,原来我们在游戏中
看到的金钱,最后一个0是没有用的,例如,我们在游戏中看到的金钱数为5550,实际上
我们拥有的金钱数为555,所以我们在用CE搜金钱时,要是我们不把5550后面的0去掉,我们是
搜不到金钱的基址的,知道了原因之后,我们每次搜金钱时,把金钱后面的0给去掉,然后再搜就可以了。
呵呵,经过一番搜索之后,我发现金钱的基址跟我以前搜索出来的阳光的基址是一样的,都是:006A9EC0
只是它们的偏移不同而已...
本程序效果截图如下:
主要代码如下:
//获取当前金钱总数函数,hGame为游戏进程句柄
int GetCurrentMoney(HANDLE hGame)
{
DWORD dwRead=0;
DWORD dwArr=0;
//读取基址所指向的地址,基址为:0x6A9EC0
BOOL bRead=::ReadProcessMemory(hGame,LPVOID(0x6A9EC0),(LPVOID)&dwArr,(DWORD)4,&dwRead);
//获取一级偏移在内存中的地址
bRead=::ReadProcessMemory(hGame,LPVOID(dwArr+0x82c),(LPVOID)&dwArr,(DWORD)4,&dwRead);
//获取金钱
//金钱在内存单元中的地址为:dwArr+0x28
bRead=::ReadProcessMemory(hGame,LPVOID(dwArr+0x28),(LPVOID)&dwArr,(DWORD)4,&dwRead);
//关闭游戏进程句柄
::CloseHandle(hGame);
hGame=NULL;
//返回获取到的金钱
return (int)dwArr;
}
//增加金钱函数,hGame为游戏进程句柄 void AddMoney(int nAddMoney,HANDLE hGame) { DWORD dwRead=0; DWORD dwArr=0; //读取基址所指向的地址,基址为:0x6A9EC0 BOOL bRead=::ReadProcessMemory(hGame,LPVOID(0x6A9EC0),(LPVOID)&dwArr,(DWORD)4,&dwRead); //获取一级偏移在内存中的地址 bRead=::ReadProcessMemory(hGame,LPVOID(dwArr+0x82c),(LPVOID)&dwArr,(DWORD)4,&dwRead); //增加金钱 //上一步我们读取内存中dwArr+0x82c处的值,得到一个内存地址 //这个内存地址加上偏移0x28,就是金钱在内存中的地址 //要知道内存每个单元都有一个地址,数据存放在内存单元中 bRead=::WriteProcessMemory(hGame, (LPVOID)(dwArr+0x28), (LPVOID)&nAddMoney, (DWORD)sizeof(nAddMoney), &dwRead); //关闭句柄 if(hGame!=NULL) ::CloseHandle(hGame); hGame=NULL; }