Comandare casa o l’ufficio con una telefonata


Questo è quello che permette di fare Sip listen il fantastico micro-tool scritto dall’amico c0t0d0s0 per impartire comandi ad un computer remoto eseguendo una semplice telefonata.

Sfrutta il protocollo VoIP (SIP) standard, e permette di fare eseguire qualunque comando al pc sul quale è installato.

Sono sufficenti pochi semplici passi per rendere funzinante il nostro sistema:

  1. Installare le librerie osip.
  2. Installare le librerie libeXosip.
  3. Scaricare e modificare il codice sorgente di sip listen con le proprie credenziali per associrsi al servizio VoIP e inserire il comando che si desidera eseguire al ricevimento della telefonata.

That’s all! … Il software, quando viene eseguita una telefona sul numero associato, chiama il comando precedentemente inserito e passa come primo argomento il numero di telefono del chiamate, vedete voi poi cosa ne volte fare, se fare una verifica di provenienza e poi eseguire qualcosa, o se eseguire direttamente un comando; poi viene inviato un segnale di DECLINED, in pratica, la vostra chiamata viene rifiutata ( e non vi vengono addebitati costi!).

Questo è il codice sorgente di sip listen

/* gcc -o sl sip_listen.c -leXosip2 */

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <eXosip2/eXosip.h>

#define THIS_USER "vostro_numero_eueteliavoip"
#define THIS_PASS "password_associata_al_numero"
#define THIS_URL  "sip:vostro_numero_eueteliavoip@proxy_sip:porta" //da definire se diversa dalla 5060
#define PROXY_URL "sip:proxy_sip" // voip.eutelia.it per eutelia

/*void renew_register(int s){
 eXosip_automatic_refresh ();
}*/

void renew_register(int s){
 eXosip_lock ();
 eXosip_automatic_refresh ();
 eXosip_automatic_action ();
 eXosip_unlock ();
}

void init_timer(int t){
 struct itimerval bi;
 bi.it_interval.tv_sec=t;
 bi.it_interval.tv_usec=0;
 bi.it_value.tv_sec=t;
 bi.it_value.tv_usec=0;
 signal(SIGALRM,renew_register);
 setitimer(ITIMER_REAL,&bi,0);
}

int main(int argc,char **argv){
  int i;
  int id;
  eXosip_event_t *je;
  osip_message_t *reg = NULL;

  i=eXosip_init();
  if(i) return -1;

  i=eXosip_listen_addr (IPPROTO_UDP, NULL, 5060, AF_INET, 0);
  if(i){
    eXosip_quit();
    return -1;
  }

  eXosip_lock ();
  eXosip_set_user_agent ("Sip_listen v1.0");
  eXosip_add_authentication_info (THIS_USER, THIS_USER, THIS_PASS, NULL, NULL);

  printf("%d: Registering... ",(unsigned int)time(NULL));
  id = eXosip_register_build_initial_register (THIS_URL, PROXY_URL, NULL, 3600, &reg);
  if (id < 0) {
      printf("FAILED\n");
      eXosip_unlock ();
      return -1;
    }

  osip_message_set_supported (reg, "100rel");
  osip_message_set_supported(reg, "path");

  i = eXosip_register_send_register (id, reg);
  if(i<0) {
        printf("FAILED\n");
        return -1;
  }
  eXosip_automatic_action ();
  printf("OK\n");
  eXosip_unlock ();

  init_timer(60);

  printf("%d: Waiting events\n",(unsigned int)time(NULL));
  for (;;) {
      je = eXosip_event_get ();
      eXosip_lock();
      eXosip_automatic_action ();
      eXosip_unlock();
      if(je == NULL)
        continue;

      printf("%d: ",(unsigned int)time(NULL));
      switch(je->type){
      case EXOSIP_REGISTRATION_NEW:
      case EXOSIP_REGISTRATION_SUCCESS:
      case EXOSIP_REGISTRATION_FAILURE:
      case EXOSIP_REGISTRATION_REFRESHED:
      case EXOSIP_REGISTRATION_TERMINATED:
        printf("%s (%d)\n",je->textinfo,je->type);
        break;

      case EXOSIP_CALL_INVITE:
      case EXOSIP_CALL_REINVITE:
        printf("Call from %s (%s)\n", je->request->from->url->username, je->request->call_id->host);
//      if(!strcmp(argv[1],je->request->from->url->username)){
          char prog[128];
          printf("%d: Verifing Number\n",(unsigned int)time(NULL));
          snprintf(prog,128,"/bin/echo %s",je->request->from->url->username);
          system(prog);
//      }
        printf("%d: Sending DECLINED\n",(unsigned int)time(NULL));
        eXosip_lock ();
        eXosip_call_send_answer (je->tid, 603, NULL);
        eXosip_unlock ();
        break;

      case EXOSIP_CALL_CLOSED:
      case EXOSIP_CALL_RELEASED:
        printf("%s (%d)\n",je->textinfo,je->type);
        break;

      case 27:
        printf("Server update\n");
        i=eXosip_message_send_answer(je->tid,200,NULL);
        break;

      default:
        printf("%s (%d)\n",je->textinfo,je->type);
      }
      eXosip_event_free(je);
    }
  return 0;
}

Enjoy :) !


Tag: , ,

Lascia un Commento