Una búsqueda MX simple para su proximo mass mailer, no dejo de notar que la mayoría de los gusanos de correo masivo que surgen de esta "escena" en realidad no realizan una búsqueda DNS para la adquisición de un servidor SMTP. Esto es una tontería. Sus capacidades para la difusión son muy limitadas, haciendo cualquiera de las siguientes: si se asume que se usa outlook y se toma su entrada del Registro del servidor SMTP, añadiendo "smtp". o "mx". a un dominio, tener una lista de pre-compilados de los servidores SMTP, o lo que sea que mucha gente está haciendo ahora ... Ahora entiendo por escrito su propia función para realizar una búsqueda de DNS es tedioso y requiere cientos de líneas de código. Por esta razón, Microsoft escribió una API para usted! en "Dnsapi.dll" vive un procedimiento llamado "DnsLookup_A" y hace exactamente lo que suena: realiza una búsqueda DNS! este ejemplo se ha compilado con dev-c ~ a 300kb.

Código: Seleccionar todo

#include <windows.h> 
#include <windns.h>   
 
     // we need this API 
     
typedef int (WINAPI *DNSQUERYA)(PCSTR, WORD, DWORD, PIP4_ARRAY, PDNS_RECORD *, PVOID *); 
DNSQUERYA    _DnsQueryA; 

      // our procedures 
      
BOOL init_dns(void); 
BOOL MXLookup(char *, char *); 

int    main(void){ 
     if(init_dns() == FALSE){ 
        printf("exiting: could not locate APIs..."); 
        return 0; 
     } 
     
     char szDomain[] = "kefivx.info"; 
     char *szSMTP; 
     szSMTP = (char *) malloc(64);    // malloc some space 
     memset(szSMTP, 0, 64); 
     
     if(MXLookup(szDomain, szSMTP) == TRUE){    // perform lookup 
        printf("prefered SMTP server for '%s' is '%s'", szDomain, szSMTP); 
        return 1; 
     } 
        return 0; 
 } 
 
BOOL   init_dns(void){ 
     HINSTANCE hDNS; 
        
        // find dnsapi in memory 
        
        hDNS = GetModuleHandle("dnsapi"); 
        if(hDNS == 0){ 
                hDNS = LoadLibrary("dnsapi"); 
                if(hDNS == 0) 
                     return FALSE
  } 
        
        // find DnsQuery_A in memory 
        
        _DnsQueryA = (DNSQUERYA) GetProcAddress(hDNS, "DnsQuery_A"); 
        if(_DnsQueryA == 0) 
             return FALSE; 
        return TRUE; 
  } 
  
BOOL     MXLookup(char *szDomain, char *buffer){ 
     int   preference = 9001;   // OVER 9000 
     int   ret = 0; 
     
/* 
*   normally i would type this structure out myself... but i'm lazy and 
*   it's huge: http://msdn.microsoft.com/en-us/library/aa450351.aspx 
*/ 

     DNS_RECORD *pQueryResults; 
     DNS_RECORD *pQueryRec; 
     
     // make query 
     
     ret = _DnsQueryA(szDomain, DNS_TYPE_MX, DNS_QUERY_STANDARD, 0, &pQueryResults, 0); 
     if(ret != ERROR_SUCCESS) 
            return FALSE; 
            
     // sort through results to find lowest preference 
     
     for(pQueryRec = pQueryResults; pQueryRec; pQueryRec = pQueryRec->pNext){ 
         if(pQueryRec->wType != DNS_TYPE_MX) 
            continue; 
         if(pQueryRec->Data.MX.wPreference < preference){ 
            preference = pQueryRec->Data.MX.wPreference; 
            strcpy(buffer, pQueryRec->Data.MX.pNameExchange); 
         } 
      } 
      
      if(!buffer) 
         return FALSE; 
             return TRUE; 
 }
Nota del Autor: Eso es todo. espero que usted se decida a utilizar el 70 líneas en lugar de realizar una de las formas anteriores de mierda para localizar un servidor SMTP. usted puede usar, abusar y editar el código de la forma que estimen conveniente. simplemente no me eches la culpa al terminar en la cárcel.

Autor : Kefi

Espero que les sirva...

Saludos !
Imagen


Solo lo mejor es suficiente...
Responder

Volver a “Fuentes”