A simple MX lookup for your next mass mailer
Publicado: 19 Dic 2011, 23:43
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.
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 !
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;
}
Autor : Kefi
Espero que les sirva...
Saludos !