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\0"
END

2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "\r\n"
    "\0"
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、

 

posted @ 2016-05-04 17:22  JavaSkill  阅读(250)  评论(0编辑  收藏  举报