大道之行,天下为公。这篇文章主要讲述远程call调用相关的知识,希望能为你提供帮助。
typedef struct ParamData//参数结构
long Param1;
long Param2;
DWORD Param3;
DWORD Param4;
ParamData,*Paramp;
//**************************************************************************************
//函数名:InfusionFunc
//功能:封装远程注入的函数
//参数 1:进程ID
//参数 2:被注入函数指针< 函数名>
//参数 3:参数
//参数 4:参数长度
//**************************************************************************************
void InfusionFunc(DWORD dwProcId,LPVOID mFunc, LPVOID Param, DWORD ParamSize)
HANDLE hProcess; //远程句柄
LPVOID mFuncAddr; //申请函数内存地址
LPVOID ParamAddr; //申请参数内存地址
HANDLE hThread; //线程句柄
DWORD NumberOfByte; //辅助返回值
CString str;
//打开被注入的进程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
//申请内存
mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
ParamAddr = VirtualAllocEx(hProcess,NULL,ParamSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//写内存
WriteProcessMemory(hProcess,mFuncAddr,mFunc,128, & NumberOfByte);
WriteProcessMemory(hProcess,ParamAddr,Param,ParamSize, & NumberOfByte);
//创建远程线程
hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr,
ParamAddr,0,& NumberOfByte);
WaitForSingleObject(hThread, INFINITE); //等待线程结束
//释放申请有内存
VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE);
VirtualFreeEx(hProcess,ParamAddr,ParamSize,MEM_RELEASE);
//释放远程句柄
CloseHandle(hThread);
CloseHandle(hProcess);
//**************************************************************************************
//函数名:CallAddhp
//功能:调用加血Call
//**************************************************************************************
voidCallAddhp ()
DWORD dwAddr = 0x00452E98;
_asm
pushad
mov eax,dword ptr DS:[0x456D68]
mov edx,0x00453028
call dwAddr
popad
//**************************************************************************************
//函数名:CallAddhp
//功能:调用加法计算Call
//**************************************************************************************
void CallAdd(LPVOID lParam)
ParamData * lp;
lp=(ParamData *)lParam;
long lp1=(long)lp-> Param1;
long lp2=(long)lp-> Param2;
DWORD dwAddr = 0x45992C;
_asm
pushad
pushad
push lp2
push lp1
mov eax,dword ptr DS:[0x461CF8]
push eax
call dwAddr
popad
下面是调用实例
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//一例:调用无参Call
void CInfusionFunDlg::OnButton4()
// TODO: Add your control notification handler code here
DWORD ProcessId=NULL;
HWND hWnd = ::FindWindow(NULL,"游戏找CALL练习实例one"); //窗口标题取句柄
GetWindowThreadProcessId(hWnd,& ProcessId);
if(ProcessId==NULL)
::AfxMessageBox("未找到进程");
else
InfusionFunc(ProcessId,CallAddhp,NULL,NULL);
//二例:调用有参Call
void CInfusionFunDlg::OnButtonAdd()
// TODO: Add your control notification handler code here
DWORD ProcessId=NULL;
HWND hWnd = ::FindWindow(NULL,"F8 CALL 01"); //窗口标题取句柄
GetWindowThreadProcessId(hWnd,& ProcessId);
ParamData CallParam;
CallParam.Param1 = atoi(m_edit1_text);
CallParam.Param2 = atoi(m_edit2_text);
if(ProcessId==NULL)
::AfxMessageBox("未找到进程");
else
InfusionFunc(ProcessId,CallAdd,& CallParam,sizeof(CallParam));
【远程call调用】
推荐阅读
- Scala 基础 (运算符和流程控制)
- 一次诡异的磁盘空间占用问题排查
- Java中的类和对象
- C++ 遍历进程内存块
- 通过注册表强制解锁文件占用
- C++ 反调试(基于 SEH 的 SetUnhandledExceptionFilter)
- 源文件与模块生成时的文件不同。是否希望调试器使用它()
- C++ HOOK 指定进程的指定 API(MessageBoxA 为例)(最简单)
- Windows 10 系统进入测试模式命令