讓游戲不再愁“錢”花--->解決“錢不夠花”問題---自編游戲修改器
剛才在整理以往的代碼時候,整理到VB,還發現一個小玩具,我都快忘了,初中的時候玩紅色警戒尤里的復仇,剛開始玩打最多的國家比較難,特別是機器配置越高,計算機越牛,不得不開加速齒輪來調節,感覺如果有更多的錢,就不需要加速齒輪了,於是萌生了能否搞個自己的修改器的想法。
首先,那個時候我已經知道那些money和數據都在內存中,為什么呢,因為我們使用金山游俠(免費破解版),那個時候有一個教程來講怎么來定位錢數的內存地址,根據我的觀察,錢的地址是動態的,但是,我就是想用自己編寫的程序鎖定錢數,那也很爽啊,因為那是自己的修改器,而且當時想一定有辦法確定某個地址是錢的,例如說,讓程序讀某個固定的錢數(該錢數非常特別,然后自行按鍵激發,找到該地址,最后鎖定該地址)。
界面比較丑陋(界面不重要么?!~不過對於自己用,夠了,簡潔明了):
因為玩紅警的朋友,特別是我自己,感覺“錢不夠花”,所以,一旦開始寫,那么就會反復寫內存,錢就產生一種花不完的狀態,一花又恢復了,你不知道,那感覺多好,哈哈~~
估計很多程序員,也很希望現實中的銀行卡上的錢也是這樣,那豈不是很爽。如果編程黑入銀行,鎖定賬戶,也是可以實現的,不過那可是犯法的哦~!~~。。但是,即使在游戲中體驗這種感覺也很不錯呀。
普及一下法律知識:
根據我初中時候玩黑客時候查閱的法律條文:對於任何進入他人主機(特別是服務器),進行任何形式的修改,都是犯法的,即使是修改后又復原,均視為犯法。
這個程序的關鍵是:
1、定位住尤里復仇的錢的內存地址
2、實現讀取和修改內存地址的值
3、使用代碼按照秒數鎖定內存地址的值
使用效果證明:
剛開始:
錢數為4760
切換出,運行程序開始寫:(再次實驗使用該工具,同學的機器,我的機器上現在沒有該游戲)這個程序制作好久了,錢數顯示不正常(沒有轉化好):
切換回游戲:錢數已變為100
開始制造電場:可以看到錢數為98,瞬間截屏為98元,實際上只是下調了2
制造完畢,錢數仍未100: 注意,沒有礦場,沒有其他任何建築:
核心代碼:
模塊聲明:
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
對於錢數顯示,是轉化有問題,這里只是回顧我當時做的東西,這東西改進也沒有太大意義,只是說明如此做是可以做成修改器的,另外,對於動態地址的游戲,我們可以采用內存基址+內存偏移量 來定位錢地址,可以實現永久的使用鎖定效果。