CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx

上传人:b****3 文档编号:17619109 上传时间:2022-12-07 格式:DOCX 页数:12 大小:733.03KB
下载 相关 举报
CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx_第1页
第1页 / 共12页
CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx_第2页
第2页 / 共12页
CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx_第3页
第3页 / 共12页
CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx_第4页
第4页 / 共12页
CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx

《CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx》由会员分享,可在线阅读,更多相关《CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

CE运用之以休闲游戏植物大战僵尸为例制作无限阳光修改器文档格式.docx

确定,如以下图:

2、在数值框中输入当前阳光数50,点击首次扫描;

切换到游戏中种一棵向日葵,使阳光数变成0;

再切换回CE,在数值框中输入0,点击再次扫描;

将会搜索到一个结果,如以下图所示:

3、双击此地址添加到下方的地址列表中,在列表中双击“数值”下面对应的内容可以修改此内存值;

我们将值改成1000试试看,如以下图:

再看看游戏中的值,修改成功了,如以下图:

如上图所示,内存地址“0CD29FB8”就是存放阳光的地址,我们可以随意的修改此内存中的数值,比金山游侠还要好用。

但是此地址是动态的,下次运行游戏时它存放的肯定就不是阳光了,我们要继续查找不会变的静态地址,看下一步。

4、在此地址上点右键->

查找写入该地址的代码,会看到一个对话框“以下代码更改选择的地址”,里面是空白的;

切换回游戏,随便种一棵植物(目的是让阳光变少,好找出哪些代码修改了此内存〕;

再回到CE,会看到刚刚的空白对话框中已经有内容了,双击或点“更多信息”出现以下图内容:

注意看红色汇编代码:

mov是传送指令,把esi的值传送到EDI+5560,ESI的值是16进制的320,等于10进制的800,恰好就是阳光值,而EDI指向的地址0CD24A58偏移加5560刚好等于0CD9FB8,此地址保存着当前阳光值,很显然这就是改变内存的赋值代码了,红色代码上面那行,很显然就是减法运算。

记住EDI的值“0CD24A58“,下一步

5、将上面的搜索框前的16进制勾选上—>

将EDI的值填进去—>

首次扫描,如以下图所示:

搜索出一堆地址,刚开始时我也是毫无头绪,搜索了几次都发现有这个值“010D84E0”,以为这个就是基址了,其实不是的,但这个值是怎么来的呢?

我们继续下一步。

6、将上一步搜索出的值添加到地址列表—>

右键—>

查找所有访问此地址的代码,稍等一下就出一大堆代码出来了,如以下图:

双击第一个mov指令查看更多信息,如以下图:

原来ESI的值是EDI+768得来的,EDI的值是010D7D78,我们继续搜索010D7D78,如以下图:

大功告成,查找到了绿色内存地址,绿色内存地址说明该地址在游戏中是静态的,它就是我们要找的基址了。

7、下面我们试着把这些内存地址连接起来,内存地址006a9ec0〔值为010D7D78〕+偏移768=010D84E0,地址010D84E0〔值为0CD24A58)+偏移5560=0CD9FB8〔此地址就是我们第二步搜索出来的阳光地址〕。

好了,我们用CE测试一下是否正确,如以下图,手动填加地址进行测试:

结果完全正确,最终地址指向的内存值为800,继续下一步。

8、有了内存基址,现在我们就可以写程序了,相对于找基址,写代码就简单得多。

核心代码如下:

主要代码

HWNDhWnd=:

:

FindWindow(NULL,"

植物大战僵尸中文版"

);

//查找窗口句柄

if(hWnd==0)return;

HANDLEhProc;

DWORDproID;

GetWindowThreadProcessId(hWnd,&

proID);

//取得进程ID

hProc=OpenProcess(PROCESS_ALL_ACCESS,false,proID);

//打开进程

if(hProc==NULL)

{

//m_sunny=(int)hWnd;

//UpdateData(false);

//MessageBox("

cannotopenprocess!

"

return;

}

DWORDads_ps=0x006a9ec0;

//读取内存地址

DWORDvalue;

ReadProcessMemory(hProc,(void*)ads_ps,&

value,4,NULL);

ads_ps=value+0x768;

ads_ps=value+0x5560;

UpdateData();

value=m_sunny;

//阳光值

WriteProcessMemory(hProc,(void*)ads_ps,&

//写内存

CloseHandle(hProc);

 

的VC和汇编都是刚学的,以上读取指针的代码我自己看了都觉得怪怪的,呵呵。

将就用着先吧。

最终做出来的程序运行界面如以下图所示:

后记:

刚开始我只做了修改及锁定,但后面觉得这样太麻烦,干脆就做了“安放植物不减阳光,反而获得阳光的功能”,个人感觉这个功能更有意思,这个功能实现起来更简单,还记得第4步的sub减法指令吗?

只要将sub改成add就行了,呵呵。

当然写到我们的程序中是要用16进制的,这个16进制的获得也在CE中获得,如以下图:

仔细看了,subesi,ebx对应的16进制代码为2bf3,我改成addesi,ebx后代码为01de,大家可以自己改改看了。

不过在我们的程序要修改其它程序的代码是要有权限才行的,直接拿上面的代码来用是行不通的,我在上面代码基础上加了个函数vrtualProtectEx,代码如下:

代码

DWORDads_ps=0x0041ba74;

//程序内存地址

WORDvalue;

value=0xde01;

VirtualProtectEx(hProc,(void*)ads_ps,2,PAGE_READWRITE,&

oldFlag);

value,2,NULL);

VirtualProtectEx(hProc,(void*)ads_ps,2,oldFlag,&

好了,一个简单的游戏修改器制作完成,我用同样的方法也做了红色警戒2的修改器〔点击查看〕,期间碰到一个问题,就是无法用SPY获取游戏的窗口句柄,因为红警是全屏运行了,后来我瞎猜了一个“RedAlert2”,竞然成功了,呵呵。

还请哪位高手指点一二,如何获取全屏程序的句柄,或者进程ID。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1