1.获取目标进程句柄
参考内存读写获取句柄
HANDLE handle
2.在目标进程内分配内存空间
PVOID FarCall=VirtuakAllocEx(handle,NULL,0xffff,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
0xffff :所分配空间大小
FarCall:分配空间的地址
3.向分配的空间内写入要执行的代码
DWORD bywrite;//用于保存函数的返回信息,一般用不上
//__declspec(naked)是用来告诉编译器函数代码的汇编语言为自己的所写,不需要编译器添加任何汇编代码
//__declspec(naked)是编译器直接拿来用的汇编函数代码,所以一定要记得在开始的时候保存上下文标志位(压栈),在结束的时候要记得恢复上下文(出栈)。并且在结尾要加上ret命令
__declspec(naked) void plant1(DWORD *pxy)
{ __asm
{
mov ebx, [esp+4]
//此时ebx 内存储 pxy 值,这里的 esp +4 暂时这样理解,带参数的远程调用,B进程发起远程调用 A ,A 会 push 参数地址 ,push IP , jmp 调用地址 ,所以 esp +4 为 参数地址存储位置
ret;
}
}
WriteProcessMemory(handle,FarCall,plant1,0xffff,&bywrite);
//远程调用如过有参数同样要给参数分配内存空间,把参数写入
DWORD xy[5];
PVOID CallArg=VirtuakAllocEx(handle,NULL,sizeof(DWORD)*5,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(handle,CallArg,xy,sizeof(xy),&bywrite);
4.远程调用
HANDLE h_remote=CreateRemoteThread(handle,NULL,NULL堆栈未使用所以空,(LPTHREAD_START_ROUTINE)FarCall,CallArg没有参数则为空, NULL, NULL);
//等待远程调用结束,否则在下一步中可能会出现远程调用未结束,就释放了内存,造成调用函数未执行完全
WaitForSingleObject(h_remote,6666最大等待时间);
VirtualFreeEx(handle,FarCall,0xffff,MEM_DECOMMIT);
网友评论