大家都知道wpe里面有一个可以直接模拟进程发送数据包的功能, 我现在想实现这个功能.
我已经通过 DuplicateHandle 将目标进程的socket复制到了当前的进程,
选取了一些目标进程进行测试
为什么对这个socket进行一些操作,比如说 send,getpeername的时候,
函数运行始终是成功的, 但是有一些目标进程会崩溃,而有一些则不会. 下面是简单的代码及说明 //前面列举出系统所有句柄,代码从循环这些句柄开始if (pSHinfo->Handles[dwIdx].uIdProcess==目标进程id&&pSHinfo->Handles[dwIdx].Handle==句柄ID)
{
printf("pid : %d", pSHinfo->Handles[dwIdx].uIdProcess); //进程ID
printf(" handle:%d", pSHinfo->Handles[dwIdx].Handle); //句柄
printf(" TYPE:%d", pSHinfo->Handles[dwIdx].ObjectType); //句柄的类型
printf(" access:%x\n", pSHinfo->Handles[dwIdx].pObject); //根据进程ID,打开进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE, pSHinfo->Handles[dwIdx].uIdProcess);
if(hProcess != INVALID_HANDLE_VALUE)
{
HANDLE hObject = NULL;
//这个函数用处很大,大概的作用就是,复制一个个内核对象的句柄
//从目标进程中复制一个句柄出来
if(DuplicateHandle(hProcess, (HANDLE)pSHinfo->Handles[dwIdx].Handle,
GetCurrentProcess(), &hObject, SPECIFIC_RIGHTS_ALL, TRUE, 0) != FALSE)
{
//这里已经成功的将目标进程的Handle复制到了hObject
char Buff[1024];
struct sockaddr_in sa;
int len = sizeof(sa);
getpeername((SOCKET)hObject, (struct sockaddr *)&sa, &len);
sprintf(Buff,"对方IP:%s,端口:%d,SOCKET:%d\n", inet_ntoa(sa.sin_addr),htons(sa.sin_port),hObject);
TRACE0(Buff);
//到此,Buff能正确的反映出hObject的远程信息,
但随之,目标进程崩溃!!!!!请问为什么?????
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
CloseHandle(hObject);
}
CloseHandle(hProcess);
break;
}
解决了还可以再给分
我已经通过 DuplicateHandle 将目标进程的socket复制到了当前的进程,
选取了一些目标进程进行测试
为什么对这个socket进行一些操作,比如说 send,getpeername的时候,
函数运行始终是成功的, 但是有一些目标进程会崩溃,而有一些则不会. 下面是简单的代码及说明 //前面列举出系统所有句柄,代码从循环这些句柄开始if (pSHinfo->Handles[dwIdx].uIdProcess==目标进程id&&pSHinfo->Handles[dwIdx].Handle==句柄ID)
{
printf("pid : %d", pSHinfo->Handles[dwIdx].uIdProcess); //进程ID
printf(" handle:%d", pSHinfo->Handles[dwIdx].Handle); //句柄
printf(" TYPE:%d", pSHinfo->Handles[dwIdx].ObjectType); //句柄的类型
printf(" access:%x\n", pSHinfo->Handles[dwIdx].pObject); //根据进程ID,打开进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE, pSHinfo->Handles[dwIdx].uIdProcess);
if(hProcess != INVALID_HANDLE_VALUE)
{
HANDLE hObject = NULL;
//这个函数用处很大,大概的作用就是,复制一个个内核对象的句柄
//从目标进程中复制一个句柄出来
if(DuplicateHandle(hProcess, (HANDLE)pSHinfo->Handles[dwIdx].Handle,
GetCurrentProcess(), &hObject, SPECIFIC_RIGHTS_ALL, TRUE, 0) != FALSE)
{
//这里已经成功的将目标进程的Handle复制到了hObject
char Buff[1024];
struct sockaddr_in sa;
int len = sizeof(sa);
getpeername((SOCKET)hObject, (struct sockaddr *)&sa, &len);
sprintf(Buff,"对方IP:%s,端口:%d,SOCKET:%d\n", inet_ntoa(sa.sin_addr),htons(sa.sin_port),hObject);
TRACE0(Buff);
//到此,Buff能正确的反映出hObject的远程信息,
但随之,目标进程崩溃!!!!!请问为什么?????
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
CloseHandle(hObject);
}
CloseHandle(hProcess);
break;
}
解决了还可以再给分
我已经实现了wpe的模拟进程发包代码,不过还是要谢谢楼上的朋友的回复!