请教如何找到创建自己进程的原进程,并实现DLL与此进程的通信 detour 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 DetourCreateProcessWithDll()应该可以传递命令行参数吧,你可以讲你EXEA的PID或者其它参数以命令行参数的方式传递给EXEB即可。 因为EXEB不是我写的,我只是附加我的DLL上去,所以没有办法 用.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. 请问上述文字哪里包含非法词组了?包含了哪个非法词组?? (删除.后) DLLA是我写的,EXEA也是我写的,但是EXEB不是我写的你说的DetourCreateProcessWithDll()传递参数也是传给EXEB的,DLLA又没法获得这个参数啊 EXEA把自己的句柄写文件DLLA读文件 最直接的命令行参数法你认为不行,因为进程b不是你写的四法可选:1、dll中枚举所有进程,CreateToolhelp32Snapshot,找到自己的进程,然后找到父进程id,这个应该就是你要的进程a的pid了2、进程a创建进程b后将自己的pid作为值进程b的pid作为键写入注册表指定位置,dll中直接查找即可3、环境变量法,进程a设定环境变量比如ABC为自身资料(pid或其他你想要的),由于环境变量的继承性,dll可以或得这个环境变量4、命令行参数法,一定程度上是可行的。虽然b不是你写的,但是只要保证你传入的参数不会干扰b的运行即可。这样在dll中依然可以GetCommandLine获取当前进程的命令行进行分解。 感谢各位的支持,我通过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();} 矢量编辑软件,使用什么SDK比较好? 高分急请教!如何编程实现vc读取excel文件中的查找功能???? 寻三个API接口,发现.NET没有提供,所以想直接用Win32。。。。。。 如何使窗口已开始就以最大化运行? 关于资源调用访问问题,急,在线等待! 如何不规则分割“视”? 窗体钩子钩不到IE8的窗体呢? wma格式是什么媒体类型?辅助说明subtype怎么设??? mfc 模态对话框 消失问题 在vc中怎样画复杂的报表?help!!! 使用CURL类库的问题 一个基于字符界面的聊天程序。问题很诡异。
你说的DetourCreateProcessWithDll()传递参数也是传给EXEB的,DLLA又没法获得这个参数啊
DLLA读文件
此代码给功能是找到自己进程的父进程,如果父进程被关闭了,那么也关闭自己
#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();
}