首页
社区
课程
招聘
[原创]游戏《东方绯想天》简单修改器以及一个辅助工具的实现
发表于: 2009-8-23 13:04 14301

[原创]游戏《东方绯想天》简单修改器以及一个辅助工具的实现

2009-8-23 13:04
14301

《东方绯想天》是最近一个很流行的格斗游戏,还支持网络对战。一时感兴趣就拿这个游戏搞一下了。游戏中的界面如下:

    由于本来就只是打算研究一下玩玩看的,所以调试的过程中也没做什么详细的笔记,大虾们飘过,新手耶随便看看好了。
一、        简单的修改
由于这个是格斗游戏,所以存放数据的地址很难找,现在可以知道的信息只有:显示面板上显示的连击伤害点数,还有卡片数目。我用CheatEngine将卡片数目的地址找出来后,再用od挂接,下内存访问断点,在一句这样的代码中停了下来mov cx,word ptr:[esi+0x56c]。而往上回溯会发现很多操作都是以esi的指为基址加上偏移来修改的,所以可以判断这个是玩家数据的基址。
但esi的值是0x014XXXXX这样的,这不是在游戏中的常量区段中而是在进程的堆存储区中,并且每次进行游戏都会改变的,所以要往上回溯,寻找保存着临时数据基址的空间。一直往上可以总结出寻址的规律为:
Mov eax,[0x6e6244]
Mov eax,[eax+0x0C]
此时eax中的即为1p的数据基址。
尽管找到了数据基址,但像HP还有灵力等数据仍然未能确定。我比较笨,只好根据连击的伤害点数扣除的血量估计总血量的大概数值,和在上面那个内存断点中断下来的地方找一下相关的代码。于是找到了以下几个数值的偏移:
对方数据基址:+0x170
HP:+0x174
灵力:+0x482
顺带还找到了扣除HP的过程是先找到玩家的数据基址,在从0x170的地方取出敌对玩家的数据基址,再对对方的HP血量进行修改,其中我找到关键的一句代码就是在0x46baf1处的:
sub     word ptr [esi+174], bx
将这句代码nop掉,双方就都不会掉血了。
而到了这里,写一个锁定HP的修改器就再简单不过了:写一个dll注入到游戏中,将这句代码改成一个跳转跳到自己的处理函数中,判断esi是不是1P的数据基址,是的话则跳过不进行处理,否则就执行这句代码。不过我比较懒,就用了另外一个比较笨的方法来实现:开启一条线程,隔一段时间往游戏进程中的内存地址中写入固定的数值,这样就等于是变相锁定HP了,具体代码如下:

DWORD WINAPI WorkThread(LPVOID)
{
	DWORD dataaddr;
	DWORD readbytes;
	WORD hp = 0x7fff;
	while(ischeat)
	{
		ReadProcessMemory(thhandle,(LPVOID)0x6e6244,&dataaddr,4,&readbytes);
		dataaddr+=0x0c;
		ReadProcessMemory(thhandle,(LPVOID)dataaddr,&dataaddr,4,&readbytes);
		dataaddr+=0x174;
		WriteProcessMemory(thhandle,(LPVOID)dataaddr,&hp,2,&readbytes);
		Sleep(1000);

	}
	return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 4399
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
消灭0回复,顺便坐沙发
2009-8-23 16:13
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
正在玩这游戏,按楼主方法也来试试。
2009-8-23 18:12
0
雪    币: 181
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
血的查找可以用  CE里面的 未知数值查找,,然后等掉血了,现用 减小的数值查找,会方便些
2009-10-4 15:06
0
游客
登录 | 注册 方可回帖
返回
//