我通过使用CreateToolhelp32SnapShot得到进程快照,通过成员th32ParentProcessID获取父进程ID,当时是对QQ.EXE这个进程做为例子,找出了它的父进程是EXPLORER.EXE,但是当我想通过API挂接时发现,EXPLORER.EXE有引入Kernel32.dll的相关函数,但是就是没有找到EXPLORER.EXE对CreateProcessA、CreateProcessW以及OpenProcess这些函数的引入(我是通过PE分析的方法来查找比对的),那么QQ.EXE这个进程是EXPLORER.EXE创建的,是通过什么方法创建的,难道不是用CreateProcess这个函数么?如果不是,又是通过什么函数来创建的呢?希望高手指点一下

解决方案 »

  1.   

    WinExec  
      ShellExecute  
      CreateProcess
    都可以创建进程
      

  2.   

    当然是用CreateProcess了,不用这个怎么产生新进程啊,PE分析的方法本身就是有局限性的,如果程序实现时是用LoadLibrary来调用DLL中的函数的PE文件的导入表中根本就没有相关的信息
      

  3.   


    ShellExecute 和 CreateProcess 一点关系都没有。他们都和CreateProcessInternalW有关系倒是真的
      

  4.   

    系统的进程树知识建议你了解下,默认你创建的桌面进程都是挂在Explorer.exe下面作为子进程,但实际上并不是由Explorer.exe创建的。系统会用一个Native API挂接父子,名字我不记得了,PsXXXX貌似。
      

  5.   

    这就是为什么你强制结束了Explorer.exe,你其他进程不动,然后又重新启动Explorer.exe,你又看到它成为了所有桌面进程的“父进程”的原因。如果那些进程是Explorer.exe创建出来的,你会看到一个奇怪的现象,那就是你之前创建的进程成了“散兵游勇”,而之后创建的进程才是Explorer.exe的子进程。这种现象是不可能出现的,你就证实了我7#的话了,和CreateProcess一点关系也没有
      

  6.   


    奇怪?我调试了一下,XP上调用次序大致是这样的: 
    ShellExecuteW -> ShellExecuteExW -> CreateProcessW ->CreateProcessInternalW -> NtCreateProcessEx
      

  7.   

    奇怪?我调试了一下,XP上调用次序大致是这样的: 
    ShellExecuteW -> ShellExecuteExW -> CreateProcessW ->CreateProcessInternalW -> NtCreateProcessEx
    ============
    和我试验的结果一样
      

  8.   

    :)这种问题,不试还真不知道。我前面说调ShellExecute其实也不对,explorer里双击执行是直接调了ShellExecuteEx。