让游戏不再愁“钱”花--->解决“钱不够花”问题---自编游戏修改器

让游戏不再愁“钱”花--->解决“钱不够花”问题---自编游戏修改器

刚才在整理以往的代码时候,整理到VB,还发现一个小玩具,我都快忘了,初中的时候玩红色警戒尤里的复仇,刚开始玩打最多的国家比较难,特别是机器配置越高,计算机越牛,不得不开加速齿轮来调节,感觉如果有更多的钱,就不需要加速齿轮了,于是萌生了能否搞个自己的修改器的想法。

首先,那个时候我已经知道那些money和数据都在内存中,为什么呢,因为我们使用金山游侠(免费破解版),那个时候有一个教程来讲怎么来定位钱数的内存地址,根据我的观察,钱的地址是动态的,但是,我就是想用自己编写的程序锁定钱数,那也很爽啊,因为那是自己的修改器,而且当时想一定有办法确定某个地址是钱的,例如说,让程序读某个固定的钱数(该钱数非常特别,然后自行按键激发,找到该地址,最后锁定该地址)。

界面比较丑陋(界面不重要么?!~不过对于自己用,够了,简洁明了): 

让游戏不再愁“钱”花--->解决“钱不够花”问题---自编游戏修改器_第1张图片

因为玩红警的朋友,特别是我自己,感觉“钱不够花”,所以,一旦开始写,那么就会反复写内存,钱就产生一种花不完的状态,一花又恢复了,你不知道,那感觉多好,哈哈~~

估计很多程序员,也很希望现实中的银行卡上的钱也是这样,那岂不是很爽。如果编程黑入银行,锁定账户,也是可以实现的,不过那可是犯法的哦~!~~。。但是,即使在游戏中体验这种感觉也很不错呀。

 普及一下法律知识:

根据我初中时候玩黑客时候查阅的法律条文:对于任何进入他人主机(特别是服务器),进行任何形式的修改,都是犯法的,即使是修改后又复原,均视为犯法。

 

这个程序的关键是:

1、定位住尤里复仇的钱的内存地址

2、实现读取和修改内存地址的值

3、使用代码按照秒数锁定内存地址的值

 

使用效果证明:

刚开始:

 钱数为4760

让游戏不再愁“钱”花--->解决“钱不够花”问题---自编游戏修改器_第2张图片

切换出,运行程序开始写:(再次实验使用该工具,同学的机器,我的机器上现在没有该游戏)这个程序制作好久了,钱数显示不正常(没有转化好):

让游戏不再愁“钱”花--->解决“钱不够花”问题---自编游戏修改器_第3张图片

 切换回游戏:钱数已变为100

 让游戏不再愁“钱”花--->解决“钱不够花”问题---自编游戏修改器_第4张图片

开始制造电场:可以看到钱数为98,瞬间截屏为98元,实际上只是下调了2 

让游戏不再愁“钱”花--->解决“钱不够花”问题---自编游戏修改器_第5张图片

制造完毕,钱数仍未100 注意,没有矿场,没有其他任何建筑:

让游戏不再愁“钱”花--->解决“钱不够花”问题---自编游戏修改器_第6张图片

核心代码:

模块声明:

Option Explicit

Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long



全局声明:

Dim LngHand As Long

Dim StrName As String * 255

Dim str As String * 2

Dim lngProcID As Long

Dim phandle As Long

Const PROCESS_ALL_ACCESS = &H10000000

LngHand = FindWindow(vbNullString, "Yuri's Revenge")

GetClassName LngHand, StrName, Len(StrName)

GetWindowThreadProcessId LngHand, lngProcID

phandle = OpenProcess(PROCESS_ALL_ACCESS, False, lngProcID)



读取内存钱数(转换有问题)

ReadProcessMemory phandle, &H568D1B8, str, 2, 0&

Label1.Caption = str

锁定钱数:-----加一个时钟组件

WriteProcessMemory phandle, &H568D1B8, Chr$(100), 2, 10&



最终的关闭:

CloseHandle ProcessHandle

 

 

对于钱数显示,是转化有问题,这里只是回顾我当时做的东西,这东西改进也没有太大意义,只是说明如此做是可以做成修改器的,另外,对于动态地址的游戏,我们可以采用内存基址+内存偏移量 来定位钱地址,可以实现永久的使用锁定效果。

 

你可能感兴趣的:(游戏)