美文网首页
C++远程调用(跨线程代码注入执行)

C++远程调用(跨线程代码注入执行)

作者: blank_white | 来源:发表于2020-06-21 15:38 被阅读0次

    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);
    

    相关文章

      网友评论

          本文标题:C++远程调用(跨线程代码注入执行)

          本文链接:https://www.haomeiwen.com/subject/audbnctx.html