首页
社区
课程
招聘
[讨论]能否借用已有的socket发送数据?
发表于: 2022-11-16 21:53 8119

[讨论]能否借用已有的socket发送数据?

2022-11-16 21:53
8119

有这么一个情形:有一对Client/Server程序,Server端是第三方的,无代码。Client端是自己写的,与Server端按规定的协议通讯。假设Server端的侦听端口是100。C、S分两机部署。
C端若通过socket连接成功S端,C端可以按规定的协议向S端发数据,S端也会返回数据,C端按协议来解析。
现在有这么一个想法:能否在S端再跑一个自己写的程序S2,借用S端的socket向C端发些别的数据?目的是利用现成的socket而不是再新建socket。而且S2也只是单向发数据给C,不接收。
感觉貌似行得通,但不知怎么下手。请有兴趣的大侠指点一二?


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 5467
活跃值: (1435)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
思路可以这样:
1、先向C端进行远程线程注入;
2、这个线程再HOOK C端的数据发送函数;
3、这个线程还可以与S2进行通讯;
4、S2可以将要发送的数据发送给线程,然后线程中可以把数据发送到S端。。
2022-11-16 22:20
0
雪    币: 3710
活跃值: (2669)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
3
"借用S端的socket向C端发“,这个可以通过hook拿到S端已有的socket,然后就可以自己控制发送数据了。
2022-11-16 23:46
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
WSADuplicateSocket ?
2022-11-17 12:53
0
雪    币: 2917
活跃值: (2640)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
浙江螃蟹 思路可以这样: 1、先向C端进行远程线程注入; 2、这个线程再HOOK C端的数据发送函数; 3、这个线程还可以与S2进行通讯; 4、S2可以将要发送的数据发送给线程,然后线程中可以把数据发送 ...
谢谢!看来需要通过hook socket来达到目的。我先了解一下这块。
2022-11-17 14:25
0
雪    币: 2917
活跃值: (2640)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
yegu "借用S端的socket向C端发“,这个可以通过hook拿到S端已有的socket,然后就可以自己控制发送数据了。
多谢,hook socket这个思路,看来可行。请问能否找到这方面的例子?另外有个疑问,Hooker程序S2,与S1共享同一个socket,两者都接收数据的话,估计会坏事;但S2要发送数据的话,应该与S1的发送错开吧?同时发,怕是数据会搞乱了
2022-11-17 14:34
0
雪    币: 2917
活跃值: (2640)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
zz77 WSADuplicateSocket ?
忘了还有这个函数~~~多谢提醒!
2022-11-17 14:35
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
WSADuplicateSocket
DuplicateHandle
应该都可以
2022-11-18 01:13
0
雪    币: 1312
活跃值: (1113)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9

主要是找到初始化那段特征码,下面是以前某第三方UDP服务端中注入自己DLL的代码片段:

#define SOCKET_INF			"\x8D\x4D\x08\x8D\x55\xEC\x51\x52\x6A\x00\x8D\x8D\x40\xF0\xFF\xFF\x68\xAA\x0F\x00\x00\x51\x50"
#define SOCKET_INF_BYTES	sizeof(SOCKET_INF)-1

SOCKET	m_GameSocket=0;
void	*psocket_filter = NULL;
char*	m_szPacket[128] = {0x00};

__declspec(naked)void socket_filter()
{
	__asm
	{
		mov m_GameSocket,eax
		jmp psocket_filter
	}
}

// 发送消息
void SendMsg()
{
	if(m_GameSocket)
	{
		sockaddr_in remoteAddr;
		remoteAddr.sin_family = AF_INET;
		remoteAddr.sin_addr.S_un.S_addr = pinet_addr("127.0.0.1");
		remoteAddr.sin_port = phtons(9999);
		sendto(m_GameSocket, (char*)&m_szPacket, sizeof(m_szPacket), 0, (sockaddr*)&remoteAddr, sizeof(remoteAddr));
	}
}

// 开始安装勾子
void StartHook()
{
	void	*pAddress = NULL;
	pAddress = (void*)GetModuleHandleA("xxxx.dll");
	psocket_filter = FIND_MEMORY(pAddress,SOCKET_INF);
	if(psocket_filter)
	{
		DetourTransactionBegin();
		DetourAttach((void**)&psocket_filter,socket_filter);
		DetourTransactionCommit();
	}
	else
	{
		printf("could not found the master socket pointer.");
	}
}
2022-11-21 17:50
0
游客
登录 | 注册 方可回帖
返回
//