[远程Call]32位远程多参数带返回调用
引子
在Windows上可以使用CreateRemoteThread实现远程Call,但是有不带返回值且只能传递一个参数的限制。
解决思路
将多个参数利用VirtualAllocEx和WriteProcessMemory写入目标程序,再通过此方法注入一段shellcode,通过shellcode完成多参数的调用。
核心shellcode
- push var_1
- ...
- push var_n
- mov eax,function_addr
- /*
- 如果为 cdcel则需要平栈
- add esp,count_param
- */
- call eax
复制代码 实现c++代码
[code]#include #include #include #include using namespace std;LPVOID RemoteNew(HANDLE hProcess, PUCHAR data,size_t size){ auto hMem=VirtualAllocEx(hProcess, NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (hMem == NULL) { return FALSE; } if (WriteProcessMemory(hProcess, hMem, data, size,NULL) == FALSE) { VirtualFreeEx(hProcess, hMem, 0, MEM_RELEASE); return FALSE; } return hMem;}BOOL RemoteCall( HANDLE hProcess, LPVOID remoteFuncAddr, vector param, bool cdcelCall, bool waitRemoteThread ){ if (remoteFuncAddr == NULL) return FALSE; vector shellcode; //push 结构 for (int i = param.size() - 1; i >= 0; i--)//调用栈是个栈 { if (((UINT)param) |