怎么向远程进行注入常量字符串
如何向远程进行注入常量字符串
我自定义如上的线程,使用WriteProcessMemory(hTargetProcess, pRemoteThread, &threadProc, 4096, 0)将上述线程threadProc拷贝到宿主进程中,并使用CreateRemoteThread在宿主进程中创建以上线程运行能够成功,但是在上述的 线程中再添加 printf("threadProc GetProcAddress:%0p\n", MyFun); 时,则发现运行时出现失败,提示访问非法内存空间。
我想这应该是WriteProcessMemory仅仅将线程threadProc对应的代码区复制到宿主中,而线程中涉及的常量字符串 threadProc GetProcAddress:%0p 没有复制,因此宿主进程中访问了本程序自己的常量字符串执行内存,从而出错。如果我的理解正确,那应该如何将相应的常量字符串也复制到宿主中呢?
------解决方案--------------------
不但字符串没有拷贝过去,printf函数的地址也不对。
如果仅仅是字符串的问题,可以用字符数组来解决。
------解决方案--------------------
代码注入,函数里不能直接调用函数,要用函数指针方式,这个涉及到两个PE文件(进程)IAT的不同
如果用函数指针,因为系统级(内核,system32里)的DLL,在每个进程的基址是一样的,所以能保证其导出的API函数地址是一样的,但用户级DLL(运行时库,自己编写的DLL),加载基址是不确定的
这种方法,基本上要写asm汇编代码的,然后还要修正用户级DLL导出函数地址
研究用可以学习一下这种方法,
但实际使用多数是注入DLL的方法,这种方法可以直接调用API(包括运行时库),各种DLL导出函数
另外,和写入threadProc一样,用VirtualAllocEx、WriteProcessMemory写入常量字符串
//线程函数定义
DWORD __stdcall threadProc(LPVOID lParam)
{
//只要使用api必须拦截 !!!!!!!!
RemoteParam* pRP = (RemoteParam*)lParam;
typedef int (*DllFun)(void); // 函数指针,注意要和原函数的原型一制
DllFun MyFun = (DllFun)pRP->dwMessageBox;
//就是这句有错!!!!!!!!!
// printf("threadProc GetProcAddress:%0p\n", MyFun);
// printf("szMsg:%s\n", pRP->szMsg);
(DllFun)MyFun();
return 0;
}
我自定义如上的线程,使用WriteProcessMemory(hTargetProcess, pRemoteThread, &threadProc, 4096, 0)将上述线程threadProc拷贝到宿主进程中,并使用CreateRemoteThread在宿主进程中创建以上线程运行能够成功,但是在上述的 线程中再添加 printf("threadProc GetProcAddress:%0p\n", MyFun); 时,则发现运行时出现失败,提示访问非法内存空间。
我想这应该是WriteProcessMemory仅仅将线程threadProc对应的代码区复制到宿主中,而线程中涉及的常量字符串 threadProc GetProcAddress:%0p 没有复制,因此宿主进程中访问了本程序自己的常量字符串执行内存,从而出错。如果我的理解正确,那应该如何将相应的常量字符串也复制到宿主中呢?
API DLL 宿主 注入 远程
------解决方案--------------------
不但字符串没有拷贝过去,printf函数的地址也不对。
如果仅仅是字符串的问题,可以用字符数组来解决。
char msg[] = "szMsg:%s\n";
printf(msg, pRP->szMsg);
------解决方案--------------------
代码注入,函数里不能直接调用函数,要用函数指针方式,这个涉及到两个PE文件(进程)IAT的不同
如果用函数指针,因为系统级(内核,system32里)的DLL,在每个进程的基址是一样的,所以能保证其导出的API函数地址是一样的,但用户级DLL(运行时库,自己编写的DLL),加载基址是不确定的
这种方法,基本上要写asm汇编代码的,然后还要修正用户级DLL导出函数地址
研究用可以学习一下这种方法,
但实际使用多数是注入DLL的方法,这种方法可以直接调用API(包括运行时库),各种DLL导出函数
另外,和写入threadProc一样,用VirtualAllocEx、WriteProcessMemory写入常量字符串