问题补充说明:红警2修改腻了,想修改红警98的rules 文件,但是不知道各种单位的对应名称,请问有知道的么?悬赏追加50
前段时间写的,感觉比较完善了。能锁定金钱,电量和用电量,并能增加建造速度。并可以工作在win98和winxp两种平台上。
.38来自6
.modelflat,stdcall
optioncasemap:none
include\masm32\include\***.inc
include\masm32\include\***.inc
360问答include\masm核游32\include\*认卷福压职**.inc
inc鱼穿千指地封呀预配刻lude\masm32\i市念准率是逐吧啊倒喜nclude\***必德统者映断.inc
includelib\masm32\l派ib\kernel32.lib
includelib\masm32\lib\user32.lib
includelib\masm省弱何文念赵八冷目使十32\lib\shell32.lib
WinMainproto:DWORD,:DWORD,:DWORD,:DWORD
KeyP呼饭rocproto:DWORD,:DWORD,:D住养令WORD
GetOsVersionproto
WM_SHELLNOTIFYequWM_USER+5
IDI_TRAYequ0
RaIconequ10000
TimerIDequ1
ButtonID1equ1
ButtonID2e却息想顶优qu2
ButtonID减3equ3
ButtonID4equ4
关轻出罪棉封 HotKeyID1equ0ABC1h
HotKeyID2equ群飞们响菜完但许帝0ABC2h
HotKeyI随直某混记断D3equ0ABC3h
HotKeyID4equ0ABC4h
.const
AppMutexdb'racheatmutex',0
AlreadyRundb'RAcheaterisalreadyrunning!',0
AppNamedb'RAcheater',0
ClassN路三amedb'racheaterclass',0
TargetTitledb'RedAlert',0
ButtonC教谁义皇及由lassdb'Button',0
Button1db'lo史皮判为甲特星ckmoney(Alt+1)',0
Button2db'locku心考风裂蒸sedpower(Alt+2)',0
Button3db'lockpower(Alt+3)',0
Button4db'speedup(Alt+4)',0
Value1dd30000
Value2dd0
Value3dd500
Value4dd0F0h
.data
flag1db0
flag2db0
flag3db0
piddd0
hddd0
.data?
instHINSTANCE?
cmdLPSTR?
noteNOTIFYICONDATA>
icodd?
OsVerdd?
hHookdd?
Addr1dd?
Addr2dd?
Addr3dd?
Addr4dd?
hwndHWND?
.code
start:
invokeCreateMutex,NULL,FALSE,addrAppMutex
invokeGetLastError
.IFeax==ERROR_ALREADY_EXISTS
invokeMessageBox,NULL,addrAlreadyRun,addrAppName,MB_OKorMB_ICONWARNING
invokeExitProcess,0
.ENDIF
invokeGetOsVersion;判断系统类型
movOsVer,eax
.IFOsVer==VER_PLATFORM_WIN32_NT;根据系统类型赋不同的地址,也许在你的机器上和我的不一样,FPE搜一下就知道了。
movAddr1,0A431D17h
movAddr2,0A431D67h
movAddr3,0A431D63h
movAddr4,0A431D53h
.ELSE
movAddr1,01C31D17h
movAddr2,01C31D67h
movAddr3,01C31D63h
movAddr4,0A431D53h
.ENDIF
invokeGetModuleHandle,NULL
movinst,eax
invokeGetCommandLine
movcmd,eax
invokeWinMain,inst,NULL,cmd,SW_MINIMIZE
invokeExitProcess,eax
WinMainprochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
movwc.cbSize,SIZEOFWNDCLASSEX
mov***.style,CS_HREDRAWorCS_VREDRAW
movwc.lpfnWndProc,OFFSETWndProc
movwc.cbClsExtra,NULL
movwc.cbWndExtra,NULL
pushhInst
popwc.hInstance
movwc.hbrBackground,COLOR_WINDOW
movwc.lpszMenuName,NULL
movwc.lpszClassName,OFFSETClassName
invokeLoadIcon,hInst,RaIcon
movwc.hIcon,eax
movwc.hIconSm,eax
movico,eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor,eax
invokeRegisterClassEx,addrwc
invokeCreateWindowEx,NULL,\
addrClassName,\
addrAppName,\
WS_OVERLAPPEDWINDOWandnotWS_MAXIMIZEBOXandnotWS_SIZEBOX,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
200,\
225,\
NULL,\
NULL,\
hInst,\
NULL
movhwnd,eax
invokeShowWindow,hwnd,CmdShow
invokeUpdateWindow,hwnd
.WHILETRUE
invokeGetMessage,addrmsg,NULL,0,0
.BREAK.IF(!eax)
invokeTranslateMessage,addrmsg
invokeDispatchMessage,addrmsg
.ENDW
moveax,msg.wParam
ret
WinMainendp
WndProcprochWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IFuMsg==WM_CREATE
invokeSetTimer,hWnd,TimerID,500,NULL
.IFOsVer==VER_PLATFORM_WIN32_NT
invokeRegisterHotKey,hWnd,HotKeyID1,MOD_ALT,VK_1
invokeRegisterHotKey,hWnd,HotKeyID2,MOD_ALT,VK_2
invokeRegisterHotKey,hWnd,HotKeyID3,MOD_ALT,VK_3
invokeRegisterHotKey,hWnd,HotKeyID4,MOD_ALT,VK_4
.ELSE;由于win98下注册的快捷键进游戏后就失效了,只好用钩子实现快捷键。
invokeSetWindowsHookEx,WH_JOURNALRECORD,addrKeyProc,inst,NULL
movhHook,eax
.ENDIF
invokeCreateWindowEx,NULL,addrButtonClass,addrButton1,\
BS_PUSHBUTTONorWS_VISIBLEorWS_CHILD,0,0,195,50,\
hWnd,ButtonID1,inst,NULL
invokeCreateWindowEx,NULL,addrButtonClass,addrButton2,\
BS_PUSHBUTTONorWS_VISIBLEorWS_CHILD,0,50,195,50,\
hWnd,ButtonID2,inst,NULL
invokeCreateWindowEx,NULL,addrButtonClass,addrButton3,\
BS_PUSHBUTTONorWS_VISIBLEorWS_CHILD,0,100,195,50,\
hWnd,ButtonID3,inst,NULL
invokeCreateWindowEx,NULL,addrButtonClass,addrButton4,\
BS_PUSHBUTTONorWS_VISIBLEorWS_CHILD,0,150,195,50,\
hWnd,ButtonID4,inst,NULL
.ELSEIFuMsg==WM_SIZE
.IFwParam==SIZE_MINIMIZED
movnote.cbSize,SIZEOFNOTIFYICONDATA
pushhWnd
popnote.hwnd
movnote.uID,IDI_TRAY
movnote.uFlags,NIF_ICONorNIF_MESSAGEorNIF_TIP
movnote.uCallbackMessage,WM_SHELLNOTIFY
pushico
popnote.hIcon
invokelstrcpy,addrnote.szTip,addrAppName
invokeShowWindow,hWnd,SW_HIDE
invokeShell_NotifyIcon,NIM_ADD,addrnote
.ENDIF
.ELSEIFuMsg==WM_SHELLNOTIFY
.IFwParam==IDI_TRAY
.IFlParam==WM_LBUTTONDOWN
invokeShell_NotifyIcon,NIM_DELETE,addrnote
invokeShowWindow,hWnd,SW_RESTORE
invokeSetForegroundWindow,hWnd
.ENDIF
.ENDIF
.ELSEIFuMsg==WM_TIMER
.IFhd==0
invokeFindWindow,0,addrTargetTitle
.IFeax!=0
invokeGetWindowThreadProcessId,eax,addrpid
invokeOpenProcess,PROCESS_ALL_ACCESS,FALSE,pid
movhd,eax
.ENDIF
.ENDIF
.IFflag1==1
invokeWriteProcessMemory,hd,Addr1,addrValue1,SIZEOFValue1,NULL
.IFeax==0
movhd,0
.ENDIF
.ENDIF
.IFflag2==1
invokeWriteProcessMemory,hd,Addr2,addrValue2,SIZEOFValue2,NULL
.IF!eax
movhd,0
.ENDIF
.ENDIF
.IFflag3==1
invokeWriteProcessMemory,hd,Addr3,addrValue3,SIZEOFValue3,NULL
.IF!eax
movhd,0
.ENDIF
.ENDIF
.ELSEIFuMsg==WM_COMMAND
moveax,wParam
.IFax==ButtonID1
xorflag1,1
.ELSEIFax==ButtonID2
xorflag2,1
.ELSEIFax==ButtonID3
xorflag3,1
.ELSEIFax==ButtonID4
.IFhd
movedx,Addr4
invokeWriteProcessMemory,hd,edx,addrValue4,SIZEOFValue4,NULL
addedx,4
invokeWriteProcessMemory,hd,edx,addrValue4,SIZEOFValue4,NULL
addedx,4
invokeWriteProcessMemory,hd,edx,addrValue4,SIZEOFValue4,NULL
addedx,4
invokeWriteProcessMemory,hd,edx,addrValue4,SIZEOFValue4,NULL
.ENDIF
.ENDIF
.ELSEIFuMsg==WM_HOTKEY
.IFwParam==HotKeyID1
xorflag1,1
.ELSEIFwParam==HotKeyID2
xorflag2,1
.ELSEIFwParam==HotKeyID3
xorflag3,1
.ELSEIF
.IFhd
movedx,Addr4
invokeWriteProcessMemory,hd,edx,addrValue4,SIZEOFValue4,NULL
addedx,4
invokeWriteProcessMemory,hd,edx,addrValue4,SIZEOFValue4,NULL
addedx,4
invokeWriteProcessMemory,hd,edx,addrValue4,SIZEOFValue4,NULL
addedx,4
invokeWriteProcessMemory,hd,edx,addrValue4,SIZEOFValue4,NULL
.ENDIF
.ENDIF
.ELSEIFuMsg==WM_SYSKEYDOWN
.IFlParam==VK_1
xorflag1,1
.ELSEIFlParam==VK_2
xorflag2,1
.ELSEIFlParam==VK_3
xorflag3,1
.ENDIF
.ELSEIFuMsg==WM_DESTROY
.IFOsVer==VER_PLATFORM_WIN32_NT
invokeUnregisterHotKey,hWnd,HotKeyID1
invokeUnregisterHotKey,hWnd,HotKeyID2
invokeUnregisterHotKey,hWnd,HotKeyID3
.ELSE
invokeUnhookWindowsHookEx,hHook
.ENDIF
invokePostQuitMessage,NULL
.ELSE
invokeDefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xoreax,eax
ret
WndProcendp
KeyProcprocnCode:DWORD,wParam:WPARAM,lParam:LPARAM
.IFnCode==HC_ACTION
movedx,lParam
assumeedx:PTREVENTMSG
.IF[edx].message==WM_SYSKEYDOWN
moveax,[edx].paramL
.IFal==VK_1
invokePostMessage,hwnd,WM_SYSKEYDOWN,NULL,VK_1
.ELSEIFal==VK_2
invokePostMessage,hwnd,WM_SYSKEYDOWN,NULL,VK_2
.ELSEIFal==VK_3
invokePostMessage,hwnd,WM_SYSKEYDOWN,NULL,VK_3
.ENDIF
.ENDIF
.ENDIF
invokeCallNextHookEx,hHook,nCode,wParam,lParam
ret
KeyProcendp
GetOsVersionproc
LOCALovi:OSVERSIONINFO
movovi.dwOSVersionInfoSize,SIZEOFOSVERSIONINFO
invokeGetVersionEx,addrovi
moveax,ovi.dwPlatformId
ret
GetOsVersionendp
endstart
由于红警98中金钱等信息的地址在每次载入时都是固定的,所以这个程序可以得逞,要是换红警2,就得用另一种方法了。