zoukankan      html  css  js  c++  java
  • ZC_RemoteThread

    1、Z_WinMain.cpp

    #include <windows.h>
    #include "resource.h"
    
    #include "Z_RemoteFunc.h"
    
    
    /*
    分配的地址指针 = VirtualAllocEx(进程句柄,开始地址[NULL],大小[0x3000], MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    VirtualFreeEx
    
    WriteProcessMemory
    CreateRemoteThread
    WaitForSingleObject  // 等待远程线程返回
    GetExitCodeThread
    */
    void RemoteProcess()
    {
        char *pcErrMsgCaption = "EatRed";
        char *pcWndCaption = "YB_OnlineClient";
        
        HWND hGame = ::FindWindow(NULL, pcWndCaption);
        if (hGame == NULL)
        {
            ::MessageBox(_hDlg, "FindWindow return 0", pcErrMsgCaption, 0);
            return;
        }
        DWORD dwProcessId = 0;
        DWORD dwThreadId = ::GetWindowThreadProcessId(hGame, &dwProcessId);
        HANDLE hProcessGame = ::OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId);
        if (hProcessGame == NULL)
        {
            char bufErr[128] = {0};
            sprintf(bufErr, "OpenProcess return 0 --> dwProcessId : 0x%08X, GetLastError() : %d", dwProcessId, GetLastError());
            ::MessageBox(_hDlg, bufErr, pcErrMsgCaption, 0);
            return;
        }
        
        DWORD dwVirtualMemorySizeInByte = 1024 * 3;
        void* pVirtualAddr = VirtualAllocEx(
            hProcessGame,
            NULL,    // 不关心在远程线程的哪里分配内存(也可以指定在远程线程的某处开始分配内存)
            dwVirtualMemorySizeInByte,    // 申请分配的内存的大小
            MEM_COMMIT | MEM_RESERVE,    // 内存属性
            PAGE_EXECUTE_READWRITE);    // 内存页属性
        if (pVirtualAddr == NULL)
        {
            char bufErr[128] = {0};
            sprintf(bufErr, "VirtualAllocEx return NULL --> GetLastError() : %d", GetLastError());
            ::MessageBox(_hDlg, bufErr, pcErrMsgCaption, 0);
            return;
        }
        
        DWORD dwWritten = 0;
        // ZC: 这里他直接写入了 0x3000个字符大小的内存
        // ZC:    (他没有计算 函数UseGoods 占了多少字节,而是使用了肯定大于 函数UseGoods 所占字节数的值)
        // ZC: 记得在 Win32汇编书里面 有大概计算 函数占用多少字节的方法(貌似使用 后面函数的地址 减去 该函数的地址 得到 该函数占用的字节数)
        BOOL bRtn = WriteProcessMemory(hProcessGame, pVirtualAddr, UseGoods, dwVirtualMemorySizeInByte, &dwWritten);
        if (! bRtn)
        {
            char bufErr[128] = {0};
            sprintf(bufErr, "WriteProcessMemory return 0 --> GetLastError() : %d", GetLastError());
            ::MessageBox(_hDlg, bufErr, pcErrMsgCaption, 0);
            return;
        }
        
        dwThreadId = 0;
        CreateRemoteThread(hProcessGame, NULL, 0, (LPTHREAD_START_ROUTINE)pVirtualAddr, 0, 0, &dwThreadId);
    }
    
    void RemoteFunc_Call(HWND _hDlg)
    {
        char *pcErrMsgCaption = "EatRed";
        char *pcWndCaption = "YB_OnlineClient";
        
        HWND hGame = ::FindWindow(NULL, pcWndCaption);
        if (hGame == NULL)
        {
            ::MessageBox(_hDlg, "FindWindow return 0", pcErrMsgCaption, 0);
            return;
        }
        DWORD dwProcessId = 0;
        DWORD dwThreadId = ::GetWindowThreadProcessId(hGame, &dwProcessId);
        HANDLE hProcessGame = ::OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId);
        if (hProcessGame == NULL)
        {
            char bufErr[128] = {0};
            sprintf(bufErr, "OpenProcess return 0 --> dwProcessId : 0x%08X, GetLastError() : %d", dwProcessId, GetLastError());
            ::MessageBox(_hDlg, bufErr, pcErrMsgCaption, 0);
            return;
        }
        
        DWORD dwVirtualMemorySizeInByte = 1024 * 3;
        void* pVirtualAddr = VirtualAllocEx(
            hProcessGame,
            NULL,    // 不关心在远程线程的哪里分配内存(也可以指定在远程线程的某处开始分配内存)
            dwVirtualMemorySizeInByte,    // 申请分配的内存的大小
            MEM_COMMIT | MEM_RESERVE,    // 内存属性
            PAGE_EXECUTE_READWRITE);    // 内存页属性
        if (pVirtualAddr == NULL)
        {
            char bufErr[128] = {0};
            sprintf(bufErr, "VirtualAllocEx return NULL --> GetLastError() : %d", GetLastError());
            ::MessageBox(_hDlg, bufErr, pcErrMsgCaption, 0);
            return;
        }
    
        DWORD dwWritten = 0;
        // ZC: 这里他直接写入了 0x3000个字符大小的内存
        // ZC:    (他没有计算 函数UseGoods 占了多少字节,而是使用了肯定大于 函数UseGoods 所占字节数的值)
        // ZC: 记得在 Win32汇编书里面 有大概计算 函数占用多少字节的方法(貌似使用 后面函数的地址 减去 该函数的地址 得到 该函数占用的字节数)
        BOOL bRtn = WriteProcessMemory(hProcessGame, pVirtualAddr, UseGoods, dwVirtualMemorySizeInByte, &dwWritten);
        if (! bRtn)
        {
            char bufErr[128] = {0};
            sprintf(bufErr, "WriteProcessMemory return 0 --> GetLastError() : %d", GetLastError());
            ::MessageBox(_hDlg, bufErr, pcErrMsgCaption, 0);
            return;
        }
    
        dwThreadId = 0;
        CreateRemoteThread(hProcessGame, NULL, 0, (LPTHREAD_START_ROUTINE)pVirtualAddr, 0, 0, &dwThreadId);
    
    
    }
    
    
    
    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    
    HINSTANCE g_hInstance = 0;
    
    BOOL CALLBACK ProcDialog(
            HWND _hWnd, // 窗口句柄
            UINT _uMsg, // 消息ID(identifier)
            WPARAM _wParam,
            LPARAM _lParam)
    {
        if (WM_CLOSE == _uMsg)
        {
            EndDialog(_hWnd,NULL);
        }
        else if (WM_INITDIALOG == _uMsg)
        {
            //HICON hIcon = LoadIcon(g_hInstance, ICO_MAIN);
            //SendMessage(_hWnd, WM_SETICON, ICON_BIG, hIcon);
        }
        else if (WM_COMMAND == _uMsg)
        {
            WORD wLow = LOWORD(_wParam);
            if (IDOK == wLow)
            {
                EndDialog(_hWnd, NULL);
            }
        }
        else
        {
            return false;
        }
        return true;
    }
    
    int WINAPI WinMain(
            HINSTANCE _hInstance,        // 当前 hInstance句柄
            HINSTANCE _hPrevInstance,    // 之前的 hInstance句柄
            LPSTR _lpCmdLine,            // 命令行
            int _nCmdShow)                // 显示状态
    {
        g_hInstance = _hInstance;
    
        DialogBoxParam(_hInstance, (char*)IDD_DIALOG_MAIN, NULL, ProcDialog, NULL);
        ExitProcess(NULL);
        return 0;
    }

    2、Z_RemoteFunc.h

    #ifndef __Z_REMOTE_FUNC_H_20160504__
    #define __Z_REMOTE_FUNC_H_20160504__
    
    void RemoteFunc_begin();
    
    
    void RemoteFunc_end();
    
    #endif // __Z_REMOTE_FUNC_H_20160504__

    3、Z_RemoteFunc.cpp

    void RemoteFunc_begin(){}
    
    
    void RemoteFunc_end(){}

    4、Z_DialogMain.rc

    //Microsoft Developer Studio generated resource script.
    //
    #include "resource.h"
    
    #define APSTUDIO_READONLY_SYMBOLS
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 2 resource.
    //
    #include "afxres.h"
    
    /////////////////////////////////////////////////////////////////////////////
    #undef APSTUDIO_READONLY_SYMBOLS
    
    /////////////////////////////////////////////////////////////////////////////
    // Chinese (中国) resources
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
    #ifdef _WIN32
    LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
    #pragma code_page(936)
    #endif //_WIN32
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // Dialog
    //
    
    IDD_DIALOG_MAIN DIALOG DISCARDABLE  100, 100, 300, 150
    STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | 
        WS_CAPTION | WS_SYSMENU
    CAPTION "主对话框"
    FONT 10, "System"
    BEGIN
        DEFPUSHBUTTON   "确定",IDOK,243,6,50,14
    END
    
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // DESIGNINFO
    //
    
    #ifdef APSTUDIO_INVOKED
    GUIDELINES DESIGNINFO DISCARDABLE 
    BEGIN
        IDD_DIALOG_MAIN, DIALOG
        BEGIN
            LEFTMARGIN, 7
            RIGHTMARGIN, 293
            TOPMARGIN, 6
            BOTTOMMARGIN, 143
        END
    END
    #endif    // APSTUDIO_INVOKED
    
    
    #ifdef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // TEXTINCLUDE
    //
    
    1 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "resource.h"
    END
    
    2 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "#include ""afxres.h""
    "
        ""
    END
    
    3 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "
    "
        ""
    END
    
    #endif    // APSTUDIO_INVOKED
    
    #endif    // Chinese (中国) resources
    /////////////////////////////////////////////////////////////////////////////
    
    
    
    #ifndef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 3 resource.
    //
    
    
    /////////////////////////////////////////////////////////////////////////////
    #endif    // not APSTUDIO_INVOKED

    5、resource.h

    //{{NO_DEPENDENCIES}}
    // Microsoft Developer Studio generated include file.
    // Used by DialogMain.rc
    //
    #define IDD_DIALOG_MAIN                 101
    
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        102
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1000
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif

      ZC: 文件尾部 敲几个回车

    6、

  • 相关阅读:
    XTREE随笔
    多重共线性
    常用特征选取算法
    最短路径算法的实现(dijskstra):Python
    数据科学的完整学习路径—Python版(转载)
    windows下64位python的安装及机器学习相关包的安装(实用)
    拓扑排序 详解 + 并查集 详解 + 最小生成树(MST)详解 【普利姆算法 + 优先队列优化 & 克鲁斯卡尔算法】
    最短路算法 :Bellman-ford算法 & Dijkstra算法 & floyd算法 & SPFA算法 详解
    在linux下部署项目所用到的基本linux命令
    素数筛 模板
  • 原文地址:https://www.cnblogs.com/javaskill/p/5459165.html
Copyright © 2011-2022 走看看