*-----------------------------------------------------------------------
前几日,几个朋友在局域网中玩红警对战,常因游戏中无钱而使战斗长时间不能结束,
有人就想到用游侠修改金钱来作弊,无奈在网络对战中用游侠修改游戏是要暂停游戏的,一
人停下大家都停了,作弊就被人发现了。能不能整它个一键锁定,神不知鬼不觉,不被人发
现?于是我就编写了这个“傻瓜式RA2游戏修改器”。为什么没有去破解游戏或做补钉呢?那
样的话别人玩这个机子的RA2游戏也能享受作弊待遇了,且钱数不变易被人发现作弊了:)
用法:
①把本程序拷到RA2游戏目录中,运行本程序,游戏程序被启动了
②开始一场战斗,切记,等游戏界面显示的钱数“不变”时,按下数字键盘上的星号键
第一遍搜索开始了,也许要好几秒时间,这段时间内你可以点兵派将,但不可使钱数增减。
③当你听到提示音且鼠标被置于屏幕左上角时,第一遍搜完了。现在赶紧让你的钱数变
化,比如建一座电站,最好是钱数再次“不变“时,可以按下数字键盘上的星号键进行第二
遍搜索了,这次是极极极的快,鼠标没有被置于左上角,说明找到正确地址并已自动锁定钱
数了。什么?钱数在变化没有锁定?非也!五秒之内你用钱了自然要减少挣钱了自然要增加
不然旁观者看到钱数不变就知道你作弊了:),这是不同于游侠的地方,要的就是这个效果。
当一场战斗终了,要开始下一场战斗时,你只要按一下“-”键,然后重复上述步骤即
可。为什么要重新搜索?因为每一盘游戏的金钱数地址都不同。
本程序在WinXP/SP2、ra2之1.006英文版(有中国超牛机器人的那个)运行通过且稳定
无误。如果是其他版本,只要用十六进制编辑工具搜索数值“008373cch”,改为你想要的
地址值即可,共有两处要改。这个地址值是怎么得来的?最简单的方法是用游侠了。有游侠
为啥还要用我这个破玩意儿?因为游侠的界面和暂停会让别人发现你作弊的。用游侠搜索到
的地址一般有三个,有两个地址值相差4,取较小的那个即可,最大的也是最另类的那个每
盘游戏都会变,它才是正直的金钱数保存地址,本程序就是要找到这个变化的地址并锁定数
值。
对于那些弹出游侠界面或暂停后就死掉的游戏,用类似的方法就可以修改了吧?!如果
数值地址不是象ra2这样有多个,可在游戏中记下几个数值,然后写入一文件中,搜索时从文
件中读取数值即可。也可用键盘钩子记录按键,进行无界面动态输入。
*-------------------------------------------------------------------------------
,
:
windows.inc
kernel32.inc
user32.inc
psapi.inc
kernel32.lib
user32.lib
psapi.lib
ADD_DATA1 008373cch
ADD_DATA3_START 01000000h
ADD_DATA3_END 0f600000h
MEMSIZE 10000h
_GetProcessHandle
*在调试时用这段代码取得游戏进程的句柄为好
info:PROCESSENTRY32
:
CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
,
info.dwSize,sizeof PROCESSENTRY32
Process32First,, info
,@F
lstrcmpi, info.szExeFile,
!
CloseHandle,
OpenProcess,PROCESS_ALL_ACCESS,,info.th32ProcessID
EXIT
Process32Next,, info
!
CloseHandle,
,
EXIT:
@@:
,0
*通常情况下也可以用下面的方法取得游戏进程的句柄,但要注意……
ProcessId
GetForegroundWindow
,ProcessId
GetWindowThreadProcessId,,
OpenProcess,PROCESS_ALL_ACCESS,,ProcessId
_GetProcessHandle
_GetDataAddr hProcess:,num:,hmem:
N,ListMemSize,pListMem,ReadSize
mbi:MEMORY_BASIC_INFORMATION
EmptyWorkingSet,hProcess
SetProcessWorkingSetSize,hProcess,-1,-1
GlobalLock,hmem
pListMem,
GlobalSize,hmem
ListMemSize,
ReadProcessMemory,hProcess,ADD_DATA1, N,sizeof N,NULL
,N
GlobalAlloc,GMEM_FIXED,MEMSIZE
,
,ADD_DATA3_START
@@: VirtualQueryEx,hProcess,, mbi,sizeof MEMORY_BASIC_INFORMATION
mbi.State == MEM_COMMIT && mbi.Protect == PAGE_READWRITE
ReadSize,MEMSIZE
mbi.RegionSizeListMemSize
,1000h
GlobalReAlloc,hmem,,GMEM_MOVEABLE
GlobalLock,
pListMem,
GlobalSize,hmem
ListMemSize,
,pListMem
,mbi.BaseAddress
,
[-4h],
,4h
>=N
,ReadSize
mbi.BaseAddress,
mbi.RegionSize,
mbi.RegionSize<=0h
,mbi.BaseAddress
,mbi.RegionSize
>=ADD_DATA3_END
GlobalFree,
_GetDataAddr
_FindAddrInList hProcess:,num:,hmem:
Data,N
DD1,DD2
ReadProcessMemory,hProcess,ADD_DATA1, DD1,sizeof DD1,NULL
GlobalLock,hmem
,
,
N,
,[+*4h]
ReadProcessMemory,hProcess,, DD2,sizeof DD2,NULL
,DD1
==DD2
[+*4h]
,N
[+*4h]
N
,num
>=[]
,N
[],
,2h
GlobalReAlloc,hmem,,GMEM_MOVEABLE
_FindAddrInList
_WriteProcessData hProcess:,hmem:
DATA,IsRun
,2000
DATA,
GlobalLock,hmem
,[]
>=5h
,
WriteProcessMemory,hProcess,, DATA,sizeof DATA,NULL
Sleep,1000
GetExitCodeProcess,hProcess, IsRun
GetAsyncKeyState,VK_SUBTRACT
|| IsRun!=STILL_ACTIVE
_WriteProcessData
_StartGame
StartInfo:STARTUPINFO
PI:PROCESS_INFORMATION
RtlZeroMemory, StartInfo,sizeof STARTUPINFO
StartInfo.cb,sizeof STARTUPINFO
,GAME_NAME
,
CreateProcess,,,,,,,,, StartInfo, PI
Sleep,10000
TerminateProcess,PI.hProcess,0h
CloseHandle,PI.hProcess
GAME_NAME:
,0
_StartGame
start:
MAIN
msg:MSG
num,hmem,hProcess,MutexName
_StartGame
,
MutexName,
CreateMutex,NULL,, MutexName
GetLastError
!=ERROR_ALREADY_EXISTS
RegisterHotKey,NULL,VK_MULTIPLY,0h,VK_MULTIPLY
RegisterHotKey,NULL,VK_SUBTRACT,0h,VK_SUBTRACT
RegisterHotKey,NULL,'X',MOD_CONTROL MOD_ALT,'X'
GlobalAlloc,GMEM_MOVEABLE,1000h
hmem,
,
num,
hProcess,
1
GetMessage, msg,NULL,NULL,NULL
msg.message==WM_HOTKEY
msg.wParam=='X'
msg.wParam==VK_SUBTRACT
num,0h
num==0h
hProcess
CloseHandle,hProcess
_GetProcessHandle
hProcess,
,num
_GetDataAddr,,,hmem
num>1h
_FindAddrInList,hProcess, num,hmem
num==1h
_WriteProcessData,hProcess,hmem
==0
MessageBeep,MB_OK
SetCursorPos,9h,9h
GetCurrentProcess
EmptyWorkingSet,
UnregisterHotKey,NULL,VK_MULTIPLY
UnregisterHotKey,NULL,VK_SUBTRACT
UnregisterHotKey,NULL,'X'
CloseHandle,hProcess
GlobalUnlock,hmem
GlobalFree,hmem
ExitProcess,NULL
MAIN
start