机甲战魔金币无消耗修改器开发笔记

0x00 前言

最近对windows单机游戏的修改器有一点儿兴趣,就简单看了下,写了个简单的购买道具时不消耗金币的功能练手玩。

总的来说整个流程其实挺简单的,就是定位下内存中修改金币的指令,再置为nop就行了。这里的目标是前一段时间在steam登录的游戏《机甲战魔》,还是挺酷炫的,有一种开高达的感觉。

0x01 cheat engine

查了一下,大部分网上的教程里面,那种不用现成的修改器的,大部分都是用的这个cheat engine的工具,就简单试了一下,还是挺好使的,没啥问题,和之前用八位神器改android单机游戏差不多,就是反复在内存中搜索某个值,定位到之后再设置为自己想要的值就行了。为了达成期望的功能,这里的思路其实也比较简单:

  1. 先找到金币对应的内存位置
  2. 用ce定位一下,修改这个内存地址使用到的汇编代码在什么地方
  3. 把对应指令设置为nop

这个过程遇到的唯一一个问题其实是,我在第二步的时候使用了ce的“find out what writes to this address”的时候,游戏直接崩了。。搁网上搜了一下,也不是啥大问题,改改ce的调试器选项就好了。

思路有了,这里也在ce中操作了一把,实现了这个功能,接下来的就是使用代码实现了。

0x02 代码实现

说代码实现之前,简单介绍下使用到的几个api,

  • VirtualProtectEx 修改内存的读写属性,因为这里需要对相关的指令进行修改,而存储指令的内存空间一般是只读的,所以这里就需要对相关地址的内存读写属性进行修改。
  • WriteProcessMemory 这个就是直接对内存内容进行修改的函数

ce作为一个图形化工具,其实已经帮忙实现了很多功能,目前的功能只用鼠标点点就行了,但是对于代码实现来说,还有一些其他功能要做,步骤大概是这个样子:

  1. 通过进程名称获取到进程pid
  2. 获取到进程的基地址
  3. 获取到修改金币的内存指令的相对偏移
  4. 对相关指令部分的内存读写属性进行修改
  5. 对相关指令的内存进行写操作,把nop指令写进去

整个流程其实挺清晰的,也没啥难度。

0x03 总结

其实没啥好说的这个,因为确实不是啥有难度的东西。。看这个玩意,其实是为了接下来想整的一个大活有关系,诶感觉要难很多,(咕咕咕咕咕咕咕)。