创建子进程后的问题。高手大大们救命啊~~~
我通过CreateProess创建了一个子进程,而后,我想读取这个子进程中某个内存地址中的数据(这个子进程虚拟内存空间中的一个地址的数据)。这时出现了问题。
看看代码先:
#include <windows.h>
#include <shellapi.h>
#include <iostream.h>
void main(void)
{
PROCESS_INFORMATION pi;
STARTUPINFO startInfo;
// Set up members of STARTUPINFO structure.
startInfo.cb = sizeof(STARTUPINFO);
startInfo.lpReserved = NULL;
startInfo.lpTitle = "hehe";
startInfo.lpDesktop = NULL;
startInfo.dwX = 0;
startInfo.dwY = 0;
startInfo.dwXSize = 0;
startInfo.dwYSize = 0;
startInfo.dwXCountChars = 0;
startInfo.dwYCountChars = 0;
startInfo.dwFlags = STARTF_USESTDHANDLES;
startInfo.wShowWindow = 0; //SW_SHOWDEFAULT;
startInfo.lpReserved2 = NULL;
startInfo.cbReserved2 = 0;
startInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
startInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
cout<<CreateProcess(
"notepad.exe",
NULL,
NULL,
NULL,
false,
NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&startInfo,
&pi)<<endl;
cout<<"PID :"<<pi.dwProcessId<<endl;
HANDLE ph=OpenProcess(PROCESS_VM_READ,false,pi.dwProcessId);
cout<<"ph :"<<ph<<"pi.hp "<<pi.hProcess<<endl;
//这个的 ph(通过openprocess得到的进程句柄)和pi.hprocess(创建进程时得到的进程句柄)竟然不一样?!
DWORD buf = 0;
DWORD lpAddress=0x89074324;
DWORD oldprot, dummy = 0;
cout<<"result :"<<VirtualProtectEx(ph, LPVOID(lpAddress), 256, PAGE_EXECUTE, &oldprot)<<endl;//这里失败了。
ReadProcessMemory(ph, (void*) lpAddress, &buf, 4, NULL );
VirtualProtectEx(ph, (void*) lpAddress, 256, oldprot, &dummy);
cout<<buf<<endl;
CloseHandle(ph);
//一下是错误捕获。显示“参数错误”
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
// Free the buffer.
LocalFree( lpMsgBuf );
}
怎么回事呢?难道由我创建的子进程我不能读取数据吗?
如何才能读取呢?
windows2000下。
问题点数:0、回复次数:16Top
1 楼feng_me(哲哲)回复于 2003-09-01 17:13:21 得分 0
我顶。顶~顶~~~~~~~Top
2 楼zhucde(【風間苍月】★<==>★【虚拟闲人】)回复于 2003-09-01 17:18:59 得分 0
看得头晕,待会儿再来Top
3 楼NowCan(城市浪人)回复于 2003-09-01 17:39:24 得分 0
干吗要VirtualProtectEx,这个函数需要在打开进程时使用PROCESS_VM_OPERATIONTop
4 楼FAICHEN(CC)回复于 2003-09-01 17:45:09 得分 0
//这个的 ph(通过openprocess得到的进程句柄)和pi.hprocess(创建进程时得到的进程句柄)竟然不一样?!
好像有一个是伪句柄Top
5 楼feng_me(哲哲)回复于 2003-09-01 18:02:01 得分 0
To NowCan(能量、激情、雨水、彩虹——雷雨云) :
试了,不行啊。如果不用这个函数,那么我应该如何完成呢?
请问有没有通过进程句柄得到进程ID的函数啊?
我只知道通过windows句柄得到进程ID的函数。Top
6 楼awnucel(西大耻犹未雪,南京恨何时灭&抵制日货)回复于 2003-09-01 19:50:37 得分 0
UPTop
7 楼feng_me(哲哲)回复于 2003-09-02 09:28:40 得分 0
顶啊~等待中~5555Top
8 楼feng_me(哲哲)回复于 2003-09-03 09:31:58 得分 0
顶啊。Top
9 楼feng_me(哲哲)回复于 2003-09-23 12:33:34 得分 0
唉~看来没人可以了。Top
10 楼ruihuahan(飞不起来的笨鸟)回复于 2003-09-23 17:22:04 得分 0
不要直接读内存,用内存映射文件。Top
11 楼binarier(沙子)回复于 2003-09-23 18:57:17 得分 0
我有一点不明白,你为什么把页面保护改为PAGE_EXECUTE?
这是MSDN中对PAGE_EXECUTE的说明:Enables execute access to the committed region of pages. An attempt to read or write to the committed region results in an access violation.
Top
12 楼binarier(沙子)回复于 2003-09-23 19:00:33 得分 0
还有,你的lpAddress=0x89074324是哪来的?这块内存是不是committed的?Top
13 楼binarier(沙子)回复于 2003-09-23 19:00:54 得分 0
还有,你的lpAddress=0x89074324是哪来的?这块内存是不是committed的?Top
14 楼feng_me(哲哲)回复于 2003-09-26 13:54:48 得分 0
这块内存是可读的。使用别的软件可以读取这个地址的数据。
不能直接读内存是什么意思?如何使用内存映射文件?
疑问很多啊,不好意思。Top
15 楼wangbab(bab)回复于 2003-09-26 18:23:59 得分 0
cout<<"result :"<<VirtualProtectEx(ph, LPVOID(lpAddress), 256, PAGE_EXECUTE, &oldprot)<<endl;//这里失败了。
VirtualProtectEx:
The access protection value can be set only on committed pages. If the state of any page in the specified region is not committed, the function fails and returns without modifying the access protection of any pages in the specified region.
因此,楼主应该先VirtualAllocEx申请远进程的地址,
VirtualAllocEx(ph,LPVOID(lpAddress), 256,MEM_COMMIT,PAGE_READWRITE);Top
16 楼boywang(大力水手)回复于 2003-09-26 22:23:03 得分 0
那个地址可能是不能修改页保护属性的,但是用readprocessmemory可以直接读取的。Top
17 楼feng_me(哲哲)回复于 2003-09-28 10:44:26 得分 0
嗯。的确如此。
但是同样的地址,别人的程序可以读取,实在不甘心。
哪位可以给我一个例程?
谢谢。
主要是个例子。Top




