子进程如何完整复制父进程的数据段?

嵌云阁主 2009-08-24 08:49:50
我想在vs2008下实现类似于fork函数的效果,为此需要在子进程里复制父进程的数据段,已解决权限问题,但不知道如何取得数据段的首地址和数据段大小,请高手指教。
...全文
279 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
嵌云阁主 2009-08-25
  • 打赏
  • 举报
回复
因为linux下面的fork函数创建的子进程的状态和父进程的一样,它们将从当前PC所在的位置分别往下执行,所以我需要复制虚存里面的数据段,从父进程复制到子进程。以此达到目的。
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复
你要获得虚存的数据段?
嵌云阁主 2009-08-24
  • 打赏
  • 举报
回复
谢谢,这段代码的确可以获得dll或者exe文件里面写好的VMA,但是却无法保证这个地址和实际加载到内存里面的地址一定是一致的。
dirdirdir3 2009-08-24
  • 打赏
  • 举报
回复
可通过消息发送首地址和数据段大小
雪影 2009-08-24
  • 打赏
  • 举报
回复
可以通过共享内存啊,管道也行。
技术实现细节google
MoXiaoRab 2009-08-24
  • 打赏
  • 举报
回复

#include <windows.h>
#include <Psapi.h>
#pragma comment(lib, "psapi.lib ")

int main(int argc, char* argv[])
{
PROCESS_INFORMATION ProcInfo = {0};
STARTUPINFO StartInfo = {0};
CreateProcess(NULL, "notepad.exe ", NULL, NULL, FALSE, 0, NULL, NULL, &StartInfo, &ProcInfo);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, NULL, ProcInfo.dwProcessId);
if(hProcess)
{
HMODULE hModule;
DWORD cbNeeded;
MODULEINFO modinfo;
LPVOID lpbuf = NULL;
SIZE_T nRead;
if(EnumProcessModules(hProcess, &hModule, sizeof(HMODULE), &cbNeeded))
{
GetModuleInformation( hProcess, hModule, &modinfo, sizeof(MODULEINFO) );
lpbuf = new BYTE[modinfo.SizeOfImage];
memset(lpbuf, 0, modinfo.SizeOfImage);
ReadProcessMemory(hProcess, modinfo.lpBaseOfDll, lpbuf, modinfo.SizeOfImage, &nRead);
//取得节数目
PIMAGE_FILE_HEADER pfh;
int nSectionCount;

pfh = (PIMAGE_FILE_HEADER) ((LPVOID)((BYTE *)(lpbuf)+((PIMAGE_DOS_HEADER)(lpbuf))-> e_lfanew+sizeof(DWORD)));
nSectionCount = pfh-> NumberOfSections;
int i;
PIMAGE_SECTION_HEADER psh;

psh = (PIMAGE_SECTION_HEADER) ((LPVOID)((BYTE *)(lpbuf)+((PIMAGE_DOS_HEADER)(lpbuf))-> e_lfanew+sizeof(DWORD)+sizeof(IMAGE_FILE_HEADER)+sizeof(IMAGE_OPTIONAL_HEADER)));
// 注意:Pe中节是根据数据的属性来分的,而不管数据之间的逻辑关系
// 所以只根据属性来判断节是否为数据节。这一规则在有节合并的Pe中犹为明显。
// 我这里用名称来判定。
for(i=0; i < nSectionCount; i++)
{
if(0 == lstrcmp( ".data ", (char *)psh-> Name))
{
/*
do something you want;
*/
MessageBox(0, "section .data ", "hello ", 0);
}
psh++;
}
}
if(lpbuf)
delete[] lpbuf;
}

return 0;
}

嵌云阁主 2009-08-24
  • 打赏
  • 举报
回复
多谢回复,复制数据的方法使用WriteProcessMemory已经可以实现。

但是因为需要复制完整的数据段,所以需要知道父进程的数据段的起始地址和大小,而我不知道怎么获取这两个值。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧