#define BURRER_SIZE 0x100
char szFilename[]="111.exe";
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
::CreateProcess(NULL, szFilename, NULL, NULL, FALSE, 
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
::CloseHandle(pi.hThread);
HANDLE myhand=pi.hProcess;
char szbuffer[BUFFER_SIZE];
DWORD addr=0x0012ff7c;
::ReadProcessMemory(myhand,(LPVOID)addr,szbuffer,BUFFER_SIZE,NULL);
printf("%s\n",szbuffer)
::CloseHandle(myhand);addr(0x0012ff7c)为111.exe的内存地址,保存着字符串变量char* sz="游戏";为什么上面的代码不能从地址addr中读出
字符串呢?
知道一个进程的某个地址保存着一个汉字字符串,怎样把这个字符串从这个地址读出来?

解决方案 »

  1.   

    0x0012ff7c 一般是函数栈的地址, 该函数没被正在调用就不会有内容
      

  2.   

    首先,这一句STARTUPINFO si = { sizeof(si) }; 应该改成STARTUPINFO si = { sizeof(STARTUPINFO) }; 吧,你那样用不知道行不行
    其次,::CloseHandle(pi.hThread); 你把一个进程的主线程关了,据我所知进程也就随之关闭了吧,因为没有线程的进程是没有意义的,所以后面你引用子进程的句柄我不知道可不可行.
    再次,你确定char* sz="游戏";这一句在子进程中是把变量分配在0x0012ff7c这个地址?你如何保证?
    最后,那个字符串只有几个字节,你却读了BURRER_SIZE这么多字节,会不会读到不允许读的地方?
      

  3.   

    首先.哪个sizeof都一样.
    其次.CloseHandle只是减少句柄的引用计数,注意,是减少句柄的引用计数.并不关闭线程或进程.
    再次.的确,位置没办法保证.
    最后,读取越界也没什么关系.你处理自己关决计的长度就OK了.解决:
    单独调试,看每一个API的执行结果.别只问.
    只有8分????太小气了吧???
      

  4.   

    子进程也是自已写的,就是定义一个char*类型变量,而变量的地址就是0x0012ff7c.为什么会从这个地址读不出变量值"游戏"呢?
      

  5.   

    问题应该出在 0x0012ff7c 地址上,如2楼说的,这个是栈上,栈是要被不停重复使用的,当调用某个函数时候,会临时使用栈,当这个函数返回,又有其他函数运行,这个栈地址上的数据又会被改写。所以你可以在::CreateProcess之后,用调试器挂接上去看看他当时的 0x0012ff7c 地址里到底是什么。