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, );
return;
}
DWORD dwProcessId = ;
DWORD dwThreadId = ::GetWindowThreadProcessId(hGame, &dwProcessId);
HANDLE hProcessGame = ::OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId);
if (hProcessGame == NULL)
{
char bufErr[] = {};
sprintf(bufErr, "OpenProcess return 0 --> dwProcessId : 0x%08X, GetLastError() : %d", dwProcessId, GetLastError());
::MessageBox(_hDlg, bufErr, pcErrMsgCaption, );
return;
} DWORD dwVirtualMemorySizeInByte = * ;
void* pVirtualAddr = VirtualAllocEx(
hProcessGame,
NULL, // 不关心在远程线程的哪里分配内存(也可以指定在远程线程的某处开始分配内存)
dwVirtualMemorySizeInByte, // 申请分配的内存的大小
MEM_COMMIT | MEM_RESERVE, // 内存属性
PAGE_EXECUTE_READWRITE); // 内存页属性
if (pVirtualAddr == NULL)
{
char bufErr[] = {};
sprintf(bufErr, "VirtualAllocEx return NULL --> GetLastError() : %d", GetLastError());
::MessageBox(_hDlg, bufErr, pcErrMsgCaption, );
return;
} DWORD dwWritten = ;
// ZC: 这里他直接写入了 0x3000个字符大小的内存
// ZC: (他没有计算 函数UseGoods 占了多少字节,而是使用了肯定大于 函数UseGoods 所占字节数的值)
// ZC: 记得在 Win32汇编书里面 有大概计算 函数占用多少字节的方法(貌似使用 后面函数的地址 减去 该函数的地址 得到 该函数占用的字节数)
BOOL bRtn = WriteProcessMemory(hProcessGame, pVirtualAddr, UseGoods, dwVirtualMemorySizeInByte, &dwWritten);
if (! bRtn)
{
char bufErr[] = {};
sprintf(bufErr, "WriteProcessMemory return 0 --> GetLastError() : %d", GetLastError());
::MessageBox(_hDlg, bufErr, pcErrMsgCaption, );
return;
} dwThreadId = ;
CreateRemoteThread(hProcessGame, NULL, , (LPTHREAD_START_ROUTINE)pVirtualAddr, , , &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, );
return;
}
DWORD dwProcessId = ;
DWORD dwThreadId = ::GetWindowThreadProcessId(hGame, &dwProcessId);
HANDLE hProcessGame = ::OpenProcess(PROCESS_ALL_ACCESS, false, dwProcessId);
if (hProcessGame == NULL)
{
char bufErr[] = {};
sprintf(bufErr, "OpenProcess return 0 --> dwProcessId : 0x%08X, GetLastError() : %d", dwProcessId, GetLastError());
::MessageBox(_hDlg, bufErr, pcErrMsgCaption, );
return;
} DWORD dwVirtualMemorySizeInByte = * ;
void* pVirtualAddr = VirtualAllocEx(
hProcessGame,
NULL, // 不关心在远程线程的哪里分配内存(也可以指定在远程线程的某处开始分配内存)
dwVirtualMemorySizeInByte, // 申请分配的内存的大小
MEM_COMMIT | MEM_RESERVE, // 内存属性
PAGE_EXECUTE_READWRITE); // 内存页属性
if (pVirtualAddr == NULL)
{
char bufErr[] = {};
sprintf(bufErr, "VirtualAllocEx return NULL --> GetLastError() : %d", GetLastError());
::MessageBox(_hDlg, bufErr, pcErrMsgCaption, );
return;
} DWORD dwWritten = ;
// ZC: 这里他直接写入了 0x3000个字符大小的内存
// ZC: (他没有计算 函数UseGoods 占了多少字节,而是使用了肯定大于 函数UseGoods 所占字节数的值)
// ZC: 记得在 Win32汇编书里面 有大概计算 函数占用多少字节的方法(貌似使用 后面函数的地址 减去 该函数的地址 得到 该函数占用的字节数)
BOOL bRtn = WriteProcessMemory(hProcessGame, pVirtualAddr, UseGoods, dwVirtualMemorySizeInByte, &dwWritten);
if (! bRtn)
{
char bufErr[] = {};
sprintf(bufErr, "WriteProcessMemory return 0 --> GetLastError() : %d", GetLastError());
::MessageBox(_hDlg, bufErr, pcErrMsgCaption, );
return;
} dwThreadId = ;
CreateRemoteThread(hProcessGame, NULL, , (LPTHREAD_START_ROUTINE)pVirtualAddr, , , &dwThreadId); } // *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
// *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** HINSTANCE g_hInstance = ; 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 ;
}
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 , , ,
STYLE DS_MODALFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP |
WS_CAPTION | WS_SYSMENU
CAPTION "主对话框"
FONT , "System"
BEGIN
DEFPUSHBUTTON "确定",IDOK,,,,
END /////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
// #ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_DIALOG_MAIN, DIALOG
BEGIN
LEFTMARGIN,
RIGHTMARGIN,
TOPMARGIN,
BOTTOMMARGIN,
END
END
#endif // APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
// TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END TEXTINCLUDE DISCARDABLE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END 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、
ZC_RemoteThread的更多相关文章
随机推荐
- Thrift初试
Restful 基于 Http 进行通讯. 开放.标准.简单.兼容性升级容易: 性能略低.在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC,RPC采用二进制传输.TCP 通讯,所以通常性能 ...
- Intellij IDEA Ultimate Edition 14.1 破解
key:IDEA value:61156-YRN2M-5MNCN-NZ8D2-7B4EW-U12L4 (2) key:huangwei value:97493-G3A41-0SO24-W57LI-Y2 ...
- 对opencv.hpp头文件的认识
OpenCV学习笔记(二):对opencv.hpp头文件的认识 - 安东的技术博客 - CSDN博客 https://blog.csdn.net/xidiancoder/article/details ...
- 2.Access the mongo Shell Help-官方文档摘录
总结: 1.使用help可以查看帮助信息db.help() help等 2.查看对应的实现方法.比如 test@gzxkvm52$ db.updateUser function (name, upd ...
- flannel相关资料链接
1.DockOne技术分享(十八):一篇文章带你了解Flannel http://dockone.io/article/618 2.理解Kubernetes网络之flannel网络http://ton ...
- 多服务器之间Session共享
原理:多个服务器间想共享session,就相当于共享取多台主机上的一个变量,所以共享的思路就是让大家都能读取变量,实现的方法可以通过将session保存到专门的一个服务器上,所有服务器都去请求数据,也 ...
- pandas(三)汇总和计算描述统计
pandas对象有一些常用的数学和统计的方法,大部分都属于约简或汇总统计. SUM方法 DataFrame对象的sum方法,返回一个含有列小计的Series >>> df = Dat ...
- vue之 node.js 的简单介绍
一.什么是 node.js? 它是可以运行在JavaScript的服务平台 二.安装 1.node.js的特性 - 非阻塞IO模型 - 时间驱动 2.运用场景 - 高并发低业务 - 实时场景 - 聊天 ...
- Java基础知识陷阱(一)
本文发表于本人博客. 事隔好多年了,重新拿起来Java这门语言,看似熟悉其实还很陌生,想想应该梳理下顺便提高下自己.这次先来看看Java里面的String这个对象. 经典的先看下面一段代码,请问最终创 ...
- HDU - 2819 Swap (二分图匹配-匈牙利算法)
题意:一个N*N的01矩阵,行与行.列与列之间可以互换.要求变换出一个对角线元素全为1的矩阵,给出互换的行号或列号. 分析:首先一个矩阵若能构成对角线元素全为1,那么矩阵的秩为N,秩小于N的情况无解. ...