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,就得用另一种方法了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值