WhITECat安全团队
游戏破解(一)|一键hook无限技能MP
0x00背景介绍
首先介绍这款国外开发的游戏,PwnAdventure 3,这是一款专为黑客而开发的,易受攻击的第一人称MMORPG游戏,其目的旨在提升游戏开发人员的安全编码能力。本系列文章均由逆向小组成员咸湿小和尚通过逆向破解带领玩家在此游戏中飞天遁地,无所不能,有兴趣的小伙伴可以持续跟进~
相关下载链接:http://www.pwnadventure.com
0x01关键词
游戏逆向修改、MP锁定之dll文件修改与hook
0x02开始正文
游戏开始前,可以看到HEALTH是血量,即常说的HP,而MANA是我们说的MP,因为进入时候没有技能,技能栏为空,而需要获取到技能才可以看到MP的变化。
在路口往前后左转,直走后找到相关秘籍,获得第一个技能:“火遁”,火遁需要MP的消耗才能成功放出来,因此,在释放“火遁”的时候,对应的MP也会减少,因此,需要定位到MP的数据修改位置
在“火遁”释放之前,可以确定的是MP数值满为100,释放一个“火遁”后,发现MP在释放后瞬间减少,然后缓慢回升,这时候可以想到,搜索数据100,然后释放以后直接不断搜索改变的数据,对应缓慢回升的数据定位,最后选择锁定后,可以找到MP相关的地址数据。
1)MP满格时候,搜索100的数据
一共搜索出7827个数据
2)喷射一定量的火遁,不断点击变化数据
3)找到三个数据,并双击后取下来
4)通过锁定数值一一查看定位到MP数据是哪一块
4)经过锁定,得到的MP数据块是
<CheatTable>
<CheatEntries>
<CheatEntry>
<ID>1</ID>
<Description>"No description"</Description>
<LastState Value="100" Activated="1" RealAddress="2DBAE30C"/>
<VariableType>4 Bytes</VariableType>
<Address>2DBAE30C</Address>
</CheatEntry>
</CheatEntries>
</CheatTable>
5)追踪相关数据
因此,只需要写死eax为满格就好了。
已知相关的位置汇编代码是:
7A8E25C3 - 7C E6 - jl GameLogic.RandomFloat+318BB
7A8E25C5 - 2B C2 - sub eax,edx
7A8E25C7 - 89 86 BC000000 - mov [esi+000000BC],eax <<
7A8E25CD - 8B 11 - mov edx,[ecx]
7A8E25CF - 50 - push eax
在地址7A8E25C7处将数据写在地址esi+000000BC处,然后该值是由eax赋予的,因此,可以hookeax的数据,但是这时候我们可以在动态调试进行写死。
这时候需要直接进入动态调试进行分析
下好断点后再次使用“火遁”,发现断点成功,接下来查看eax的数据是60,
追踪数据,找到相关位置,发现数据是6400 00 00 ,而64正是十进制的100,就是满格MP
这时候可以知道,eax就是写入到该位置的,所以直接把eax改为固定值即可,这时候直接改为其他数值,然后保存为GameLogic.dll。
替换游戏根目录下的GameLohic.dll然后重新进入游戏获得“火遁”后,释放一次查看一下MP值已经是被锁定得了。
6)接下来就是hook了,可以直接写一个简单的修改器,其中设置两个按钮:
恢复体力的时候,可以直接调到地址2DBAE30C,将其数值直接改为100,使用WriteProcessMemory指令,可以写出修改器,这样就省下分析的过程了,关键代码如下:
HWND game_wnd = ::FindWindowA(NULL, "PwnAdventure3 (32-bit, PCD3D_SM5)");
BYTE game_data[1];
LPCVOID pbase = (LPCVOID)0x2DBAE30C;
LPVOID a = (LPVOID)0x2DBAE30C;
RtlZeroMemory(game_data, 1);
if (game_wnd)
{
DWORD game_pid;
::GetWindowThreadProcessId(game_wnd, &game_pid);
HANDLE game_handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, game_pid);
if (NULL != game_handle)
{
DWORD bread;
ReadProcessMemory(game_handle, pbase, game_data, 1, &bread);
if (game_data[0] != 100) {
DWORD ii=100;
WriteProcessMemory(game_handle, a, &ii, 1, &bread);
}
CloseHandle(game_handle);
}
}
为了展示效果,我把100改为200如下:
打完收工~期待后续的飞天遁地……
往期经典推荐:
HVV前奏|最新版AWVS&Nessus破解及批量脚本分享
渗透实战(一)|BSides Vancouver 2018 (Workshop)
移动安全(一)|Android设备root及神器Xposed框架安装
>>关于我们:
WhITECat安全团队是起源实验室合作安全团队,主要致力于交流分享团队成员技术研究成果、即时发布最新的漏洞新闻资讯、各大厂商内推通道以及各种安全相关延伸。团队成员目前由起源实验室核心成员、一线安全厂商攻防实验室、某研究院、漏洞盒子TOP10白帽子等人员组成。团队内有不定期的技术交流,(不可描述)工具分享等活动,致力于实现“开放分享”的hack精神。
欢迎各位大佬关注^_^
关注我们
开放共享
扫描上方二维码添加关注
一起分享安全狮的日常
本文始发于微信公众号(WhITECat安全团队):游戏破解(一)|一键hook无限技能MP
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论