标签:
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、
标签:
原文地址:http://www.cnblogs.com/javaskill/p/5459165.html