win32asm寫的紅警98修改器

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.