我想用GetProcAddress获取用CreateProcess创建的进程里的一个函数地址,但是GetProcAddress要求的是进程的HMODULE/HINSTANCE,所以我要取得实例句柄,但是不知道怎么获得

解决方案 »

  1.   

    哦,没仔细看,是CreateProcess的啊。
      

  2.   

    GetModuleHandle只能返回加载到自己进程空间的模块的HMODULE,而CreateProcess并不是将子进程加载进自己的空间,所以GetModuleHandle是不行的,谢谢,呵呵
      

  3.   

    也许使用CreateRemoteThread可以实现,好象可以
      

  4.   

    哦,差点蒙了。
    你这个是CreateProcess的,那么是2个进程了,第一个进程怎么能调用第二个进程空间内的函数呢。如果是LoadLibrary倒是可以的。
      

  5.   

    对的,LOADLIBRARY是可以的,先谢谢你,过几天考试完了在仔细瞧下MSDN,14号就要上砧板了,呵呵
      

  6.   

    对了,如果我用LoadLibrary加载了一个EXE文件,那我可不可以让它运行起来呢?
      

  7.   

    我没试过,我猜测如果你调用了第二个exe的入口点,他就能运行起来。
    像winmain什么的。
      

  8.   

    使用LoadLibraryEx函数通常情况下,加载一个.exe文件,就能够启动一个新进程
      

  9.   

    不过它运行起来是会有问题的,重定位的问题,它原先调用的那些api什么的,地址都不正确了。
      

  10.   

    这几天原本不该学这些的了,政治一大堆都没看的,有个朋友说使用PROCESS_INFO结构里的hProcess,这不对的,有编译错误
      

  11.   

    MSDN里说的很明白了,.EXE是无法运行的,原文如下:
    LoadLibrary can be used to map a DLL module and return a handle that can be used in GetProcAddress to get the address of a DLL function. LoadLibrary can also be used to map other executable modules. For example, the function can specify an .EXE file to get a handle that can be used inFindResource orLoadResource. 看最后这句“Do not use LoadLibrary to "run" a .EXE file.” 
      

  12.   

    如果.exe文件本身包含.reloc section,那么把.exe加载到一个进程内运行是可行的,但是要做很多额外工作。如果不包含.reloc section,那理论上的可能都没有。
    在一个进程内加载多个exe要做的额外工作包括:自己手工映射各个section,解决IAT,解决relocation,解决.tls section(Thread Local Storage);截获一些API做特殊处理,比如进程内经常用GetModuleHandle(NULL)得到.exe的HINSTANCE,你得分清GetModuleHandle从哪个exe被调用,返回不同的handle;最后你还得分清哪些线程由哪个exe创建,等等。
    总之,以你现在的知识,不大可能做出来。