一个dos程序,需要在windows XP下运行,由一个vc写的win32程序加载作为子进程,然后win32程序要改写dos程序的内存,请问:
如果已经知道要改写的进程的内存地址,如何进行改写?因为dos的地址是段:偏移量的形式,与win32程序的虚拟地址不同,请教如何解决?
谢谢!

解决方案 »

  1.   

    谢谢2位,但与我的问题似乎不太对应。我想要的方法是:
    假定我要改写子进程0x1200:0058这个地址,我的win32程序如何定位子进程这个地址?
    另外,在改写之前,我肯定要将子进程挂起,如果我用下述代码来创建一个进程:
        CreateProcess(Pchar(sDir + 'a.exe'),         //lpApplicationName
            'DialogServer.exe',                                 //lpCommandLine
            NIL,                                                //lpProcessAttributes
            NIL,                                                //lpThreadAttributes
            false,                                              //bInheritHandles
            Create_Suspended + NORMAL_PRIORITY_CLASS,           //dwCreateFlags
            NIL,                                                //lpEnvironment
            Pchar(sDir),                                        //lpCurrentDirectory
            siInfo,                                             //lpStartupInfo
            piInfo);                                            //lpProcessInformation;其中参数Create_Suspended表示进程创建时先挂起,但我发现这个16位dos程序不起作用,也就是16位程序不会停在入口处,这样,改写就不起作用了。
    像这样的情况应该如何解决?
      

  2.   

    说明一下,上述代码是用delphi写的,用VC也类似
      

  3.   

    直接WriteProcessMemoray(0x00401258)不可以么?
      

  4.   

    不知道。
    个人认为XP里面的win16子系统是个虚拟系统,也就是说是通过虚拟机制来运行dos程序的,那么楼主就是要对虚拟系统里面的程序进行修改,就像通过native code修改java application运行时状态,不是没有可能,但肯定非常麻烦。