win32asm写的红警98修改器
from http://zerray.com/
?
前段時間寫的,感覺比較完善了。能鎖定金錢,電量和用電量,并能增加建造速度。并可以工作在win98和winxp兩種平臺上。
.386
.model flat, stdcall
option casemap: none
include /masm32/include/windows.inc
include /masm32/include/kernel32.inc
include /masm32/include/user32.inc
include /masm32/include/shell32.inc
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/user32.lib
includelib /masm32/lib/shell32.lib
WinMain proto :DWORD, :DWORD, :DWORD, :DWORD
KeyProc proto :DWORD, :DWORD, :DWORD
GetOsVersion proto
WM_SHELLNOTIFY equ WM_USER + 5
IDI_TRAY equ 0
RaIcon equ 10000
TimerID equ 1
ButtonID1 equ 1
ButtonID2 equ 2
ButtonID3 equ 3
ButtonID4 equ 4
HotKeyID1 equ 0ABC1h
HotKeyID2 equ 0ABC2h
HotKeyID3 equ 0ABC3h
HotKeyID4 equ 0ABC4h
.const
??? AppMutex db 'racheatmutex', 0
??? AlreadyRun db 'RA cheater is already running!', 0
??? AppName db 'RA cheater', 0
??? ClassName db 'racheaterclass', 0
??? TargetTitle db 'Red Alert', 0
??? ButtonClass db 'Button', 0
??? Button1 db 'lock money(Alt+1)', 0
??? Button2 db 'lock used power(Alt+2)', 0
??? Button3 db 'lock power(Alt+3)', 0
??? Button4 db 'speed up(Alt+4)', 0
??? Value1 dd 30000
??? Value2 dd 0
??? Value3 dd 500
??? Value4 dd 0F0h
.data
??? flag1 db 0
??? flag2 db 0
??? flag3 db 0
??? pid dd 0
??? hd dd 0
.data?
??? inst HINSTANCE ?
??? cmd LPSTR ?
??? note NOTIFYICONDATA <?>
??? ico dd ?
??? OsVer dd ?
??? hHook dd ?
??? Addr1 dd ?
??? Addr2 dd ?
??? Addr3 dd ?
??? Addr4 dd ?
??? hwnd HWND ?
.code
start:
??? invoke CreateMutex, NULL, FALSE, addr AppMutex
??? invoke GetLastError
??? .IF eax == ERROR_ALREADY_EXISTS
??????? invoke MessageBox, NULL, addr AlreadyRun, addr AppName, MB_OK or MB_ICONWARNING
??????? invoke ExitProcess, 0
??? .ENDIF
??? invoke GetOsVersion ; 判斷系統類型
??? mov OsVer, eax
??? .IF OsVer == VER_PLATFORM_WIN32_NT ; 根據系統類型賦不同的地址,也許在你的機器上和我的不一樣,FPE搜一下就知道了。
??????? mov Addr1, 0A431D17h
??????? mov Addr2, 0A431D67h
??????? mov Addr3, 0A431D63h
??????? mov Addr4, 0A431D53h
??? .ELSE
??????? mov Addr1, 01C31D17h
??????? mov Addr2, 01C31D67h
??????? mov Addr3, 01C31D63h
??????? mov Addr4, 0A431D53h
??? .ENDIF
??? invoke GetModuleHandle, NULL
??? mov inst, eax
??? invoke GetCommandLine
??? mov cmd, eax
??? invoke WinMain, inst, NULL, cmd, SW_MINIMIZE
??? invoke ExitProcess, eax
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
??? LOCAL wc:WNDCLASSEX
??? LOCAL msg:MSG
??? mov wc.cbSize, SIZEOF WNDCLASSEX
??? mov wc.style, CS_HREDRAW or CS_VREDRAW
??? mov wc.lpfnWndProc, OFFSET WndProc
??? mov wc.cbClsExtra, NULL
??? mov wc.cbWndExtra, NULL
??? push hInst
??? pop wc.hInstance
??? mov wc.hbrBackground, COLOR_WINDOW
??? mov wc.lpszMenuName, NULL
??? mov wc.lpszClassName, OFFSET ClassName
??? invoke LoadIcon, hInst, RaIcon
??? mov wc.hIcon, eax
??? mov wc.hIconSm, eax
??? mov ico, eax
??? invoke LoadCursor, NULL, IDC_ARROW
??? mov wc.hCursor, eax
??? invoke RegisterClassEx, addr wc
??? invoke CreateWindowEx, NULL,/
?????????? addr ClassName,/
?????????? addr AppName,/
?????????? WS_OVERLAPPEDWINDOW and not WS_MAXIMIZEBOX and not WS_SIZEBOX,/
?????????? CW_USEDEFAULT,/
?????????? CW_USEDEFAULT,/
?????????? 200,/
?????????? 225,/
?????????? NULL,/
?????????? NULL,/
?????????? hInst,/
?????????? NULL
??? mov hwnd, eax
??? invoke ShowWindow, hwnd, CmdShow
??? invoke UpdateWindow, hwnd
??? .WHILE TRUE
??????? invoke GetMessage, addr msg, NULL, 0, 0
??????? .BREAK .IF (!eax)
??????? invoke TranslateMessage, addr msg
??????? invoke DispatchMessage, addr msg
??? .ENDW
??? mov eax, msg.wParam
??? ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
??? .IF uMsg == WM_CREATE
??????? invoke SetTimer, hWnd, TimerID, 500, NULL
??????? .IF OsVer == VER_PLATFORM_WIN32_NT
??????????? invoke RegisterHotKey, hWnd, HotKeyID1, MOD_ALT, VK_1
??????????? invoke RegisterHotKey, hWnd, HotKeyID2, MOD_ALT, VK_2
??????????? invoke RegisterHotKey, hWnd, HotKeyID3, MOD_ALT, VK_3
??????????? invoke RegisterHotKey, hWnd, HotKeyID4, MOD_ALT, VK_4
??????? .ELSE ; 由于win98下注冊的快捷鍵進游戲后就失效了,只好用鉤子實現快捷鍵。
??????????? invoke SetWindowsHookEx, WH_JOURNALRECORD, addr KeyProc, inst, NULL
??????????? mov hHook, eax
??????? .ENDIF
??????? invoke CreateWindowEx, NULL, addr ButtonClass, addr Button1,/
?????????????? BS_PUSHBUTTON or WS_VISIBLE or WS_CHILD, 0, 0, 195, 50,/
?????????????? hWnd, ButtonID1, inst, NULL
??????? invoke CreateWindowEx, NULL, addr ButtonClass, addr Button2,/
?????????????? BS_PUSHBUTTON or WS_VISIBLE or WS_CHILD, 0, 50, 195, 50,/
?????????????? hWnd, ButtonID2, inst, NULL
??????? invoke CreateWindowEx, NULL, addr ButtonClass, addr Button3,/
?????????????? BS_PUSHBUTTON or WS_VISIBLE or WS_CHILD, 0, 100, 195, 50,/
?????????????? hWnd, ButtonID3, inst, NULL
??????? invoke CreateWindowEx, NULL, addr ButtonClass, addr Button4,/
?????????????? BS_PUSHBUTTON or WS_VISIBLE or WS_CHILD, 0, 150, 195, 50,/
?????????????? hWnd, ButtonID4, inst, NULL
??? .ELSEIF uMsg == WM_SIZE
??????? .IF wParam == SIZE_MINIMIZED
??????????? mov note.cbSize, SIZEOF NOTIFYICONDATA
??????????? push hWnd
??????????? pop note.hwnd
??????????? mov note.uID, IDI_TRAY
??????????? mov note.uFlags, NIF_ICON or NIF_MESSAGE or NIF_TIP
??????????? mov note.uCallbackMessage, WM_SHELLNOTIFY
??????????? push ico
??????????? pop note.hIcon
??????????? invoke lstrcpy, addr note.szTip, addr AppName
??????????? invoke ShowWindow, hWnd, SW_HIDE
??????????? invoke Shell_NotifyIcon, NIM_ADD, addr note
??????? .ENDIF
??? .ELSEIF uMsg == WM_SHELLNOTIFY
??????? .IF wParam == IDI_TRAY
??????????? .IF lParam == WM_LBUTTONDOWN
??????????????? invoke Shell_NotifyIcon, NIM_DELETE, addr note
??????????????? invoke ShowWindow, hWnd, SW_RESTORE
??????????????? invoke SetForegroundWindow, hWnd
??????????? .ENDIF
??????? .ENDIF
??? .ELSEIF uMsg == WM_TIMER
??????? .IF hd == 0
??????????? invoke FindWindow, 0, addr TargetTitle
??????????? .IF eax != 0
??????????????? invoke GetWindowThreadProcessId, eax, addr pid
??????????????? invoke OpenProcess, PROCESS_ALL_ACCESS, FALSE, pid
??????????????? mov hd, eax
??????????? .ENDIF
??????? .ENDIF
??????? .IF flag1 == 1
??????????? invoke WriteProcessMemory, hd, Addr1, addr Value1, SIZEOF Value1, NULL
??????????? .IF eax == 0
??????????????? mov hd, 0
??????????? .ENDIF
??????? .ENDIF
??????? .IF flag2 == 1
??????????? invoke WriteProcessMemory, hd, Addr2, addr Value2, SIZEOF Value2, NULL
??????????? .IF !eax
??????????????? mov hd, 0
??????????? .ENDIF
??????? .ENDIF
??????? .IF flag3 == 1
??????????? invoke WriteProcessMemory, hd, Addr3, addr Value3, SIZEOF Value3, NULL
??????????? .IF !eax
??????????????? mov hd, 0
??????????? .ENDIF
??????? .ENDIF
??? .ELSEIF uMsg == WM_COMMAND
??????? mov eax, wParam
??????? .IF ax == ButtonID1
??????????? xor flag1, 1
??????? .ELSEIF ax == ButtonID2
??????????? xor flag2, 1
??????? .ELSEIF ax == ButtonID3
??????????? xor flag3, 1
??????? .ELSEIF ax == ButtonID4
??????????? .IF hd
??????????????? mov edx, Addr4
??????????????? invoke WriteProcessMemory, hd, edx, addr Value4, SIZEOF Value4, NULL
??????????????? add edx, 4
??????????????? invoke WriteProcessMemory, hd, edx, addr Value4, SIZEOF Value4, NULL
??????????????? add edx, 4
??????????????? invoke WriteProcessMemory, hd, edx, addr Value4, SIZEOF Value4, NULL
??????????????? add edx, 4
??????????????? invoke WriteProcessMemory, hd, edx, addr Value4, SIZEOF Value4, NULL
??????????? .ENDIF
??????? .ENDIF
??? .ELSEIF uMsg == WM_HOTKEY
??????? .IF wParam == HotKeyID1
??????????? xor flag1, 1
??????? .ELSEIF wParam == HotKeyID2
??????????? xor flag2, 1
??????? .ELSEIF wParam == HotKeyID3
??????????? xor flag3, 1
??????? .ELSEIF
??????????? .IF hd
??????????????? mov edx, Addr4
??????????????? invoke WriteProcessMemory, hd, edx, addr Value4, SIZEOF Value4, NULL
??????????????? add edx, 4
??????????????? invoke WriteProcessMemory, hd, edx, addr Value4, SIZEOF Value4, NULL
??????????????? add edx, 4
??????????????? invoke WriteProcessMemory, hd, edx, addr Value4, SIZEOF Value4, NULL
??????????????? add edx, 4
??????????????? invoke WriteProcessMemory, hd, edx, addr Value4, SIZEOF Value4, NULL
??????????? .ENDIF
??????? .ENDIF
??? .ELSEIF uMsg == WM_SYSKEYDOWN
??????? .IF lParam == VK_1
??????????? xor flag1, 1
??????? .ELSEIF lParam == VK_2
??????????? xor flag2, 1
??????? .ELSEIF lParam == VK_3
??????????? xor flag3, 1
??????? .ENDIF
??? .ELSEIF uMsg == WM_DESTROY
??????? .IF OsVer == VER_PLATFORM_WIN32_NT
??????????? invoke UnregisterHotKey, hWnd, HotKeyID1
??????????? invoke UnregisterHotKey, hWnd, HotKeyID2
??????????? invoke UnregisterHotKey, hWnd, HotKeyID3
??????? .ELSE
??????????? invoke UnhookWindowsHookEx, hHook
??????? .ENDIF
??????? invoke PostQuitMessage, NULL
??? .ELSE
??????? invoke DefWindowProc, hWnd, uMsg, wParam, lParam
??????? ret
??? .ENDIF
??? xor eax, eax
??? ret
WndProc endp
KeyProc proc nCode: DWORD, wParam: WPARAM, lParam: LPARAM
??? .IF nCode == HC_ACTION
??????? mov edx, lParam
??????? assume edx: PTR EVENTMSG
??????? .IF [edx].message == WM_SYSKEYDOWN
??????????? mov eax, [edx].paramL
??????????? .IF al == VK_1
??????????????? invoke PostMessage, hwnd, WM_SYSKEYDOWN, NULL, VK_1
??????????? .ELSEIF al == VK_2
??????????????? invoke PostMessage, hwnd, WM_SYSKEYDOWN, NULL, VK_2
??????????? .ELSEIF al == VK_3
??????????????? invoke PostMessage, hwnd, WM_SYSKEYDOWN, NULL, VK_3
??????????? .ENDIF
??????? .ENDIF
??? .ENDIF
??? invoke CallNextHookEx, hHook, nCode, wParam, lParam
??? ret
KeyProc endp
GetOsVersion proc
??? LOCAL ovi:OSVERSIONINFO
??? mov ovi.dwOSVersionInfoSize, SIZEOF OSVERSIONINFO
??? invoke GetVersionEx, addr ovi
??? mov eax, ovi.dwPlatformId
??? ret
GetOsVersion endp
end start
由于紅警98中金錢等信息的地址在每次載入時都是固定的,所以這個程序可以得逞,要是換紅警2,就得用另一種方法了。
總結
以上是生活随笔為你收集整理的win32asm写的红警98修改器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: panabit安装和默认密码
- 下一篇: 解决——》feign文件下载时报错fei