现在的位置: 首页 > 综合 > 正文

早些年用纯汇编写的一个自用的《征途》外挂(五)– 贴完了

2014年02月03日 ⁄ 综合 ⁄ 共 26417字 ⁄ 字号 评论关闭

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 判断游戏进程是否存在
;        返回值:
;                eax        = TRUE,存在
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IsExistGameProcess        proc        uses edx esi edi ecx 
                local        _exitCde:DWORD
                
                invoke        GetExitCodeProcess, g_ZTProcess, addr _exitCde
                test        eaxeax
                jz        _process_not_exist
                cmp        _exitCde,STILL_ACTIVE 
                jne        _process_not_exist
                
                mov        eaxTRUE
                ret
        _process_not_exist:
                xor        eaxeax
                ret
                
IsExistGameProcess        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 枚举窗口
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
EnumWindowProc        proc        hWnd:DWORD, lParam:DWORD
                local        _buffer[255]:byte
                local        _pid:DWORD
                
                mov        _pid, NULL
                invoke        GetWindowText, hWnd, addr _buffer,255  
                test        eaxeax
                jz        _next_window
;                invoke        IsWindowVisible, hWnd
;                test        eax, eax
;                jz        _next_window
                invoke        GetWindowThreadProcessId, hWnd, addr _pid
                mov        eax, _pid
                cmp        eax, g_ZTCurPID
                jne        _next_window
                
                push        hWnd
                pop        g_ZTCurWnd
                
                mov        eaxFALSE
                ret
        _next_window:
                mov        eaxTRUE
                ret
EnumWindowProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 显示托盘图标信息 timer过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ShowTrayTimerProc        proc        hWnd:DWORD, uMsg:DWORD, idEvent:DWORD, dwTimer:DWORD
                LOCAL        _buf[255]:byte
                pushad        
                invoke        IsDlgButtonChecked, g_MainWnd, IDC_CHECK_CLOSE_TRAYINFO
                cmp        eax, BST_CHECKED
                je        _exit_timer_proc
                invoke        RtlZeroMemory, addr _buf, 255
                invoke        GetWindowLong, g_MainWnd, GWL_STYLE
                and        eax, WS_MINIMIZE
                JNZ        _show_notifyicon
                and        eax, WS_VISIBLE
                JZ        _show_notifyicon
                
                jmp        _exit_timer_proc
        _show_notifyicon:
                mov        g_stNIF.dwInfoFlags, NIIF_INFO
                mov        g_stNIF.uTimeout, 3000
                invoke        lstrcpy, addr g_stNIF.szTip, addr g_SelfName
                ;'%s', 0DH, 0AH, '经验:%ld/%ld', 0DH, 0AH, '生命:%ld/%ld', 0DH, 0AH, '法力:%ld/%ld', 0DH, 0AH,'位置:%s', 0DH,0AH '坐标:(%ld,%ld)',0
                invoke        wsprintf, addr _buf, addr g_ShowTrayInfo, \
                        addr g_SelfName, DWORD ptr g_SelfCurExp, DWORD ptr g_SelfMaxExp, \
                        g_SelfCurLife, g_SelfMaxLife, g_SelfCurMagic, g_SelfMaxMagic, \
                        addr g_SelfMapName, g_SelfPosX, g_SelfPosY, g_ExpSpeed, g_ExpUpdateTimeI, \
                        g_ExpUpdateTimeF, addr g_ObjectName
                
                invoke        lstrcpy, addr g_stNIF.szInfo, addr _buf
                ;invoke        ShowWindow, g_MainWnd, SW_HIDE
                .if        lpShell_NotifyIcon != NULL
                        invoke        lpShell_NotifyIcon, NIM_MODIFY, addr g_stNIF
                .endif        
        _exit_timer_proc:
                popad
                ret
ShowTrayTimerProc        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自动捡起垃圾过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
PickupTimerProc        proc        hWnd:DWORD, uMsg:DWORD, idEvent:DWORD, dwTimer:DWORD
                pushad
                cmp        g_AutoPickupState, TRUE
                jne        _exit_pickup_time_proc
                invoke        GetForegroundWindow
                cmp        eax, g_ZTCurWnd
                jne        _exit_pickup_time_proc
                invoke        PostMessage, g_ZTCurWnd, WM_KEYDOWN, 0C0H, 0
                invoke        Sleep, 100
                invoke        PostMessage, g_ZTCurWnd, WM_KEYUP, 0C0H, 0
        _exit_pickup_time_proc:
                popad
                ret
PickupTimerProc        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DialogProc        proc        uses ebx edi esi hWnd:DWORD, wMsg:DWORD, wParam:DWORD, lParam:DWORD
                local        _stPS:PAINTSTRUCT
                local        _stPT:POINT
                local        _curExp:DWORD, _maxExp:DWORD

                mov        eax,wMsg
        ; 窗体刷新
        ;********************************************************************
                .if        eax == WM_PAINT
                        invoke        BeginPaint, hWnd, addr _stPS
                        
                        invoke        CreateBarGround, IDC_STATIC_LIFE_BAR
                        invoke        DrawBar, g_SelfCurLife, g_SelfMaxLife, IDC_STATIC_LIFE_BAR, BMP_LIFE
                        
                        invoke        CreateBarGround, IDC_STATIC_MAGIC_BAR
                        invoke        DrawBar, g_SelfCurMagic, g_SelfMaxMagic, IDC_STATIC_MAGIC_BAR, BMP_MAGIC
                        
                        mov        eaxDWORD ptr g_SelfCurExp
                        mov        _curExp, eax
                        mov        eaxDWORD ptr g_SelfMaxExp
                        mov        _maxExp, eax
                        
                        invoke        CreateBarGround, IDC_STATIC_EXP_BAR
                        invoke        DrawBar, _curExp, _maxExp, IDC_STATIC_EXP_BAR, BMP_EXP
                                
                        invoke        EndPaint, hWnd, addr _stPS
        ; 按钮菜单等相关操作
        ;********************************************************************
                .elseif        eax == WM_COMMAND
                        mov        eax, wParam
                ; 启动按钮
                ;********************************************************************
                        .if        ax == IDC_BUTTON_APPLY
                                .if        g_HelpStop
                                ; 创建信息获取线程
                                ;********************************************************************
                                        invoke        InitEventQueue, offset g_EvtQueue
                                        mov        g_SkillAssoilState, 00000000H
                                        mov        g_HelpStop, FALSE
                                        invoke        CreateThread, NULL, 0, addr ShowInfoThreadProc, NULL, NULL, NULL
                                        .if        eax
                                                invoke        CloseHandle, eax
                                                invoke        GetDlgItem, g_MainWnd, IDC_BUTTON_APPLY
                                                invoke        SetWindowText, eax, _T('停止(&S)')
                                                invoke        GetDlgItem, g_MainWnd, IDC_BUTTON_SEARCH
                                                invoke        EnableWindow, eaxFALSE
                                                invoke        CreateThread, NULL, 0, addr HelpThreadProc, NULL, NULL, NULL
                                                .if        eax
                                                        invoke        CloseHandle, eax
                                                .endif
                                                invoke        CreateThread, NULL, 0, addr EventThreadProc, NULL, NULL, NULL
                                                .if        eax
                                                        invoke        CloseHandle, eax
                                                .endif
                                                invoke        SetTimer, g_MainWnd, IDI_PICKUP_TIME, 3000, addr PickupTimerProc
                                        .else
                                                invoke        GetDlgItem, g_MainWnd, IDC_BUTTON_APPLY
                                                invoke        EnableWindow, eaxFALSE
                                        .endif
                                .else
                                        mov        g_HelpStop, TRUE
                                        invoke        GetDlgItem, g_MainWnd, IDC_BUTTON_APPLY
                                        invoke        SetWindowText, eax, _T('启动(&P)')
                                        invoke        GetDlgItem, g_MainWnd, IDC_BUTTON_SEARCH
                                        invoke        EnableWindow, eaxTRUE
                                .endif
                ; 退出按钮
                ;********************************************************************
                        .elseif        ax == IDC_BUTTON_EXIT
                                jmp        _close_main
                ; 隐藏游戏复选框
                ;********************************************************************
                        .elseif ax == IDC_CHECK_HIDE_GAME_WINDOW
                        _show_or_hide_game:
                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_HIDE_GAME_WINDOW
                                .if        eax == BST_CHECKED
                                        invoke        IsWindowVisible, g_ZTCurWnd
                                        .if        eax
                                                invoke        ShowWindow, g_ZTCurWnd, SW_HIDE
                                                invoke        CheckMenuRadioItem, g_PopupMenu, ID_POPUP_ITEM_SHOW_GAME,\
                                                        ID_POPUP_ITEM_HIDE_GAME, ID_POPUP_ITEM_HIDE_GAME, MF_BYCOMMAND
                                        .endif
                                .elseif        eax == BST_UNCHECKED
                                        invoke        IsWindowVisible, g_ZTCurWnd
                                        .if        !eax
                                                invoke        ShowWindow, g_ZTCurWnd, SW_SHOW
                                                invoke        CheckMenuRadioItem, g_PopupMenu, ID_POPUP_ITEM_SHOW_GAME,\
                                                        ID_POPUP_ITEM_HIDE_GAME, ID_POPUP_ITEM_SHOW_GAME, MF_BYCOMMAND
                                        .endif
                                .endif
                ; 仙挂机辅助复选框
                ;********************************************************************
                        .elseif ax == IDC_CHECK_XIAN_HELPER
                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_XIAN_HELPER
                                .if        eax == BST_UNCHECKED
                                        mov        g_SSAssoiled, FALSE
                                        mov        g_ZSAssoiled, FALSE
                                        mov        g_SS_sTime, 0
                                        mov        g_ZS_sTime, 0
                                .endif
                ; 本窗体最前复选框
                ;********************************************************************
                        .elseif        ax == IDC_CHECK_SELF_SETTOP
                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_SELF_SETTOP
                                .if        eax == BST_CHECKED
                                        invoke        SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, \
                                                SWP_NOMOVE or SWP_NOSIZE
                                .elseif        eax == BST_UNCHECKED
                                        invoke        SetWindowPos, hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, \
                                                SWP_NOMOVE or SWP_NOSIZE
                                .endif
                ; 自动释放技能复选框
                ;********************************************************************
                        .elseif        ax == IDC_CHECK_AUTO_SKILL_1
                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_AUTO_SKILL_1
                                .if        eax == BST_UNCHECKED
                                        mov        g_Skill_Interval_1, 0
                                        mov        g_Skill_Assoil_1, FALSE
                                        invoke        SendDlgItemMessage, g_MainWnd, IDC_STATIC_AUTO_SKILL_TIME_1, \
                                                WM_SETTEXT, 0, _T("0")
                                .endif
                        .elseif        ax == IDC_CHECK_AUTO_SKILL_2
                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_AUTO_SKILL_2
                                .if        eax == BST_UNCHECKED
                                        mov        g_Skill_Interval_2, 0
                                        mov        g_Skill_Assoil_2, FALSE
                                        invoke        SendDlgItemMessage, g_MainWnd, IDC_STATIC_AUTO_SKILL_TIME_2, \
                                                WM_SETTEXT, 0, _T("0")
                                .endif
                        .elseif        ax == IDC_CHECK_AUTO_SKILL_3
                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_AUTO_SKILL_3
                                .if        eax == BST_UNCHECKED
                                        mov        g_Skill_Interval_3, 0
                                        mov        g_Skill_Assoil_3, FALSE
                                        invoke        SendDlgItemMessage, g_MainWnd, IDC_STATIC_AUTO_SKILL_TIME_3, \
                                                WM_SETTEXT, 0, _T("0")
                                .endif
                        .elseif        ax == IDC_CHECK_AUTO_SKILL_4
                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_AUTO_SKILL_4
                                .if        eax == BST_UNCHECKED
                                        mov        g_Skill_Interval_4, 0
                                        mov        g_Skill_Assoil_4, FALSE
                                        invoke        SendDlgItemMessage, g_MainWnd, IDC_STATIC_AUTO_SKILL_TIME_4, \
                                                WM_SETTEXT, 0, _T("0")
                                .endif
;                ; 关闭托盘信息显示复选框
;                ;********************************************************************
;                        .elseif        ax == IDC_CHECK_CLOSE_TRAYINFO
;                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_CLOSE_TRAYINFO
;                                .if        eax == BST_CHECKED
;                                        .if        g_Timer
;                                                invoke        KillTimer, g_MainWnd, IDI_SHOWTRAYINFO_TIME
;                                                mov        g_Timer, 0
;                                        .endif
;                                .endif
                ; 显示主窗体弹出菜单项
                ;********************************************************************
                        .elseif        ax == ID_POPUP_ITEM_SHOW_MAIN
                                invoke        SendMessage, hWnd, WM_SIZE, SIZE_RESTORED, 0
                ; 显示游戏窗体弹出菜单项
                ;********************************************************************
                        .elseif ax == ID_POPUP_ITEM_SHOW_GAME
                                invoke        SendDlgItemMessage, hWnd, IDC_CHECK_HIDE_GAME_WINDOW, \
                                        BM_SETCHECK, BST_UNCHECKED, 0
                                jmp        _show_or_hide_game
                ; 隐藏游戏窗体弹出菜单项
                ;********************************************************************
                        .elseif ax == ID_POPUP_ITEM_HIDE_GAME
                                invoke        SendDlgItemMessage, hWnd, IDC_CHECK_HIDE_GAME_WINDOW, \
                                        BM_SETCHECK, BST_CHECKED, 0
                                jmp        _show_or_hide_game
                ; 自动捡取垃圾弹出菜单项
                ;********************************************************************
                        .elseif ax == ID_POPUP_ITEM_AUTO_PICKUP
                                invoke        GetMenuState, g_PopupMenu, ID_POPUP_ITEM_AUTO_PICKUP, \
                                        MF_BYCOMMAND
                                .if        eax == MF_UNCHECKED
                                        mov        g_AutoPickupState, TRUE
                                        mov        eax, MF_CHECKED
                                .else
                                        mov        g_AutoPickupState, FALSE
                                        mov        eax, MF_UNCHECKED
                                .endif
                                invoke        CheckMenuItem, g_PopupMenu, ID_POPUP_ITEM_AUTO_PICKUP, eax
                ; 退出本工具弹出菜单项
                ;********************************************************************
                        .elseif ax == ID_POPUP_ITEM_EXIT_APP
                                jmp        _close_main
                        .endif
        ; 托盘图标
        ;********************************************************************
                .elseif        eax == WM_SHELLNOTIFY
                        .if        lParam == WM_LBUTTONDBLCLK
                                invoke        SendMessage, hWnd, WM_SIZE, SIZE_RESTORED, 0
                        .elseif lParam == WM_RBUTTONDOWN
                                invoke GetCursorPos,addr _stPT
                                invoke TrackPopupMenu, g_PopupMenu, TPM_RIGHTALIGN, _stPT.x, _stPT.y, NULL, hWnd, NULL
                        .endif
        ; 窗体形态发生改变
        ;********************************************************************
                .elseif        eax == WM_SIZE
                        .if        wParam == SIZE_MINIMIZED
                                invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_SYS_NOTIFY
                                .if        eax == BST_CHECKED
                                        mov        g_stNIF.dwInfoFlags, NIIF_WARNING
                                        mov        g_stNIF.uTimeout, 0BB8H
                                        invoke        lstrcpy, addr g_stNIF.szTip, addr g_SelfName
                                        ;invoke        lstrcpy, addr g_stNIF.szInfo, _T('我现在在这里了!')
                                        invoke        ShowWindow, hWnd, SW_HIDE
                                        .if        lpShell_NotifyIcon != NULL
                                                invoke        lpShell_NotifyIcon, NIM_ADD, addr g_stNIF
                                        .endif        
                                        
;                                        invoke        SetTimer,hWnd, IDI_SHOWTRAYINFO_TIME, 10000, addr ShowTrayTimerProc
;                                        mov        g_Timer, eax
                                .endif
                        .elseif        wParam == SIZE_RESTORED
                                invoke        ShowWindow, hWnd, SW_RESTORE
                                .if        lpShell_NotifyIcon != NULL
                                        invoke        lpShell_NotifyIcon, NIM_DELETE, addr g_stNIF
                                .endif        
                                .if        g_Timer
;                                        invoke        KillTimer, g_MainWnd, IDI_SHOWTRAYINFO_TIME
;                                        mov        g_Timer, 0
                                .endif        
                        .endif
        ; 辅助工具初始化
        ;********************************************************************
                .elseif        eax == WM_INITDIALOG
                        push        hWnd
                        pop        g_MainWnd
                        
                        mov        g_AutoPickupState, FALSE
                        
                        invoke        CreatePopupMenu
                        mov        g_PopupMenu,eax
                        invoke        AppendMenu, g_PopupMenu, MF_STRING or MF_DEFAULT,ID_POPUP_ITEM_SHOW_MAIN, addr g_PITEM_SM
                        invoke        AppendMenu, g_PopupMenu, MF_SEPARATOR, 0, NULL
                        invoke        AppendMenu, g_PopupMenu, MF_STRING, ID_POPUP_ITEM_SHOW_GAME, addr g_PITEM_SG
                        invoke        AppendMenu, g_PopupMenu, MF_STRING, ID_POPUP_ITEM_HIDE_GAME, addr g_PITEM_HG
                        invoke        AppendMenu, g_PopupMenu, MF_SEPARATOR, 0, NULL
                        invoke        AppendMenu, g_PopupMenu, MF_STRING, ID_POPUP_ITEM_AUTO_PICKUP, addr g_PITEM_AP
                        invoke        AppendMenu, g_PopupMenu, MF_SEPARATOR, 0, NULL
                        invoke        AppendMenu, g_PopupMenu, MF_STRING, ID_POPUP_ITEM_EXIT_APP, addr g_PITEM_EA
                
                ; 提升进程本身权限
                ;********************************************************************
                        invoke        _EnablePrivilege, offset mySE_DEBUG_NAME, TRUE        
                ;托盘
                ;********************************************************************
                        invoke        LoadLibrary, _T('shell32.dll')
                        .if        eax
                                mov        g_lpShellNotifyDll, eax
                                invoke        GetProcAddress, g_lpShellNotifyDll, \
                                        _T('Shell_NotifyIcon')
                                mov        lpShell_NotifyIcon, eax
                        .endif
                        invoke        LoadLibrary, _T('MyGetKeyState.dll')
                        .if        eax
                                mov        g_lpInstallApiHookDll, eax
                                invoke        GetProcAddress, g_lpInstallApiHookDll, \
                                        _T('InstallMyKeyMouseApiHook')
                                mov        lpInstallApiHook, eax
                                invoke        GetProcAddress, g_lpInstallApiHookDll, \
                                        _T('SetKeyData')
                                mov        lpSetKeyData, eax
                        .endif

                        invoke        RtlZeroMemory, addr g_stNIF, sizeof NEWNOTIFYICONDATA
                        mov        g_stNIF.cbSize, sizeof NEWNOTIFYICONDATA
                        push        hWnd
                        pop        g_stNIF.hWnd
                        ;mov        g_stNIF.uID, IDI_TRAY
                        mov        g_stNIF.uFlags, NIF_ICON + NIF_MESSAGE + NIF_TIP + NIF_INFO
                        mov        g_stNIF.uCallbackMessage, WM_SHELLNOTIFY
                        invoke        LoadIcon, g_InstanceHandle, ICO_MAIN
                        mov        g_stNIF.hIcon, eax
                        mov        g_stNIF.dwInfoFlags, NIIF_WARNING
                        invoke        lstrcpy, addr g_stNIF.szInfoTitle, _T('Journey Helper')
                        ;invoke        lpShell_NotifyIcon, NIM_ADD, addr g_stNIF
                        
        
                ; 创建状态栏
                ;********************************************************************
                        call        CreateStatusBar
                        call        ReSize
        
                ; 初始化快捷键列表
                ;********************************************************************
                        call        InitKeyList
        
                ; 窗体是否最前
                ;********************************************************************                        
                        invoke        IsDlgButtonChecked, hWnd, IDC_CHECK_SELF_SETTOP
                        .if        eax == BST_CHECKED
                                invoke        SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, \
                                        SWP_NOMOVE or SWP_NOSIZE
                        .elseif        eax == BST_UNCHECKED
                                invoke        SetWindowPos, hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, \
                                        SWP_NOMOVE or SWP_NOSIZE
                        .endif
        
                ; 设置标题栏图标
                ;********************************************************************
                        invoke        LoadIcon, g_InstanceHandle, ICO_MAIN
                        invoke        SendMessage, hWnd, WM_SETICON, ICON_BIG, eax
        
                ; 搜索进程
                ;********************************************************************
                        invoke        SearchGameProcess, addr g_ZTProcessName, addr g_PidFilter
                        .if        g_ZTCurPID != 0
                                
                        ; 如果找到了进程,则对其进行操作
                        ;********************************************************************
                                invoke        OpenProcess, PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or \
                                        PROCESS_TERMINATE, FALSE, g_ZTCurPID
                                test        eaxeax
                                jz        _error_ret
                                
                                mov        g_ZTProcess, eax
                        ; 从基地址获取相关地址
                        ;********************************************************************
                                call        GetSelfAddr
                                .if        !eax
                                        invoke        GetDlgItem, g_MainWnd, IDC_BUTTON_APPLY
                                        invoke        EnableWindow, eaxFALSE
                                        jz        _error_ret
                                .endif
                                
                                call        GetObjectAddr
                                .if        !eax
                                        invoke

抱歉!评论已关闭.