解决方案 »

  1.   

    DetourCreateProcessWithDll()应该可以传递命令行参数吧,你可以讲你EXEA的PID或者其它参数以命令行参数的方式传递给EXEB即可。
      

  2.   

    因为EXEB不是我写的,我只是附加我的DLL上去,所以没有办法
      

  3.   

    用.CreateToolhelp32Snapshot.可.以.获.取.parent process id。不.过.我.喜.欢.另.一.种.方.法. -- EXEA 中.主.动.创.建.共.享.用.的.handles(比.如.event, mutex, process, filemapping等),DuplicateHandle复.制.成. EXEB 中.的.handles, WriteProcessMemory写.入. EXEB 中.特.定.位.置.--比.如. EXEB 的. PE 结.构.的. DosHeader 部.分.,DLLA 可.以.通.过.GetModuleHandle(0)获.取. EXEB 的.基.址. + 特.定.偏.移.量. 获.取.这.些.共.享.handles.直.接.使.用,只.要.记.得.DLL_PROCESS_DETACH.时.CloseHandle.即.可。P.S. 请问上述文字哪里包含非法词组了?包含了哪个非法词组?? (删除.后)
      

  4.   

    DLLA是我写的,EXEA也是我写的,但是EXEB不是我写的
    你说的DetourCreateProcessWithDll()传递参数也是传给EXEB的,DLLA又没法获得这个参数啊
      

  5.   

    EXEA把自己的句柄写文件
    DLLA读文件
      

  6.   

    最直接的命令行参数法你认为不行,因为进程b不是你写的四法可选:1、dll中枚举所有进程,CreateToolhelp32Snapshot,找到自己的进程,然后找到父进程id,这个应该就是你要的进程a的pid了2、进程a创建进程b后将自己的pid作为值进程b的pid作为键写入注册表指定位置,dll中直接查找即可3、环境变量法,进程a设定环境变量比如ABC为自身资料(pid或其他你想要的),由于环境变量的继承性,dll可以或得这个环境变量4、命令行参数法,一定程度上是可行的。虽然b不是你写的,但是只要保证你传入的参数不会干扰b的运行即可。这样在dll中依然可以GetCommandLine获取当前进程的命令行进行分解。
      

  7.   

    感谢各位的支持,我通过5L的启发已经找到办法,下面放出我整理好的代码
    此代码给功能是找到自己进程的父进程,如果父进程被关闭了,那么也关闭自己
     #include <process.h>
    #include <windows.h>
    #include "GetParent.h"
    #include <iostream>
    #define ProcessBasicInformation 0  
     
     typedef struct  
     {  
         DWORD ExitStatus;  
         DWORD PebBaseAddress;  
         DWORD AffinityMask;  
         DWORD BasePriority;  
         ULONG UniqueProcessId;  
         ULONG InheritedFromUniqueProcessId;  
     }   PROCESS_BASIC_INFORMATION;  
     
     
     typedef LONG (__stdcall *PROCNTQSIP)(HANDLE,UINT,PVOID,ULONG,PULONG);
     HANDLE MyParentProcess;//父窗口句柄 #include <Psapi.h> //GetModuleFileNameEx用的
    #pragma comment (lib,"Psapi.lib")
     void GetParent()
     {
     MyParentProcess=NULL;
     DWORD MyParentPid= GetParentProcessID(GetCurrentProcessId());//获得父窗口PID
     MyParentProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE, MyParentPid);//获得父窗口句柄
     if (MyParentProcess)
     {
     char MyName[255]={0};
     GetModuleFileNameEx(MyParentProcess,NULL,MyName,255);//可以获得父进程的EXE路径
    // ::getmodule
     }
     _beginthread( CheckMyParent__InsideTrigger, 0, NULL  );//启动监控线程
     }
    DWORD GetParentProcessID(DWORD dwProcessId)//通过本线程的PID获得父线程PID和句柄
        {
            LONG                        status;
            DWORD                        dwParentPID = (DWORD)-1;
            HANDLE                        hProcess;
            PROCESS_BASIC_INFORMATION    pbi;
     
            PROCNTQSIP NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(  
                GetModuleHandle("ntdll"), "NtQueryInformationProcess"); 
     
            if(NULL == NtQueryInformationProcess)
            {
                return (DWORD)-1;
            }
            // Get process handle
            hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE, dwProcessId);
            if (!hProcess)
            {
                return (DWORD)-1;
            }
     
            // Retrieve information
            status = NtQueryInformationProcess( hProcess,
                ProcessBasicInformation,
                (PVOID)&pbi,
                sizeof(PROCESS_BASIC_INFORMATION),
                NULL
                );
     
            // Copy parent Id on success
            if  (!status)
            {
                dwParentPID = pbi.InheritedFromUniqueProcessId;
            }
     
            CloseHandle (hProcess);
     
            return dwParentPID;
             
     }void CheckMyParent__InsideTrigger(void * lpParam)
    {
    while(1)
    {
    Sleep(1000);//1秒检测一次
    if(MyParentProcess!=NULL)//如果父进程不在就关闭自己
    {
    DWORD ISClose;
    GetExitCodeProcess(MyParentProcess,&ISClose);
     if(ISClose   ==   STILL_ACTIVE) 
     { 
     }
     else 
     { 
     ::ExitProcess(0);
     } 
    }
    }
    _endthread();
    }