• Duda con encriptación RC4

 #479272  por Perfect Hidden
 12 Oct 2015, 01:15
Hola,
Tengo un crypter programado en vb6 que encripta archivos con RC4 y agrega la password (string) como recurso al archivo encriptado final,
Ahora mi Stub es con c++ y al parecer no puedo desencriptar el archivo correctamente, este es mi codigo:

unsigned char* ResourceManager::GetResource(int resourceId, char* resourceString, unsigned long* dwSize) {
HGLOBAL hResData;
HRSRC hResInfo;
unsigned char* pvRes;
HMODULE hModule = GetModuleHandle(NULL);

if (((hResInfo = FindResource(hModule, MAKEINTRESOURCE(resourceId), resourceString)) != NULL) &&
((hResData = LoadResource(hModule, hResInfo)) != NULL) &&
((pvRes = (unsigned char *)LockResource(hResData)) != NULL))
{
*dwSize = SizeofResource(hModule, hResInfo);
return pvRes;
}

*dwSize = 0;
return NULL;
}

LPBYTE RC4(LPBYTE lpBuf, LPBYTE lpKey, DWORD dwBufLen, DWORD dwKeyLen)
{ }

int WinMain(){

// El archivo encriptado tambien se incorpora como recurso y lo obtengo de la misma forma que la KEY
unsigned long sizeKEY;
unsigned char* resourceKEY = ResourceManager::GetResource(133, 242, &sizeKEY);
if (resourceKEY == NULL) return 0;

unsigned char* lpKEY = (unsigned char*)malloc(sizeKEY);
memset(lpKEY,0,sizeKEY);
memcpy (lpKEY, resourceKEY, sizeKEY);

if (Archivo!= NULL)
{
Archivo = RC4(Archivo,lpKEY,sizeArchivo,sizeKEY);;
}

}
Les queria pedir que me ayuden a encontrar mi error en el codigo porfavor! y asi poder publicar mi crypter

PD: Será que mi error esta en que la password se guarda como un string en vb6 y la funcion rc4 en c++ me pide un LPBYTE?
 #479297  por Blau
 12 Oct 2015, 11:57
Las StringTable es diferente a cualquier recurso. Para obtener una string de recursos debes utilizar la API [ Debe registrarse para ver este enlace ]. Yo la uso así:
void GetString(UINT dwStringId, char* szBuffer) {
    char str[1024] = {0};
    LoadString(0, dwStringId, szBuffer, 2048);
    szBuffer[strlen(szBuffer)] = '\00';
}
Ejemplo:
char szBuffer[1024];
GetString(1234, szBuffer);
printf("La string es %s\n", szBuffer);
 #479353  por Perfect Hidden
 13 Oct 2015, 07:06
Blau escribió:Las StringTable es diferente a cualquier recurso. Para obtener una string de recursos debes utilizar la API [ Debe registrarse para ver este enlace ]. Yo la uso así:
void GetString(UINT dwStringId, char* szBuffer) {
    char str[1024] = {0};
    LoadString(0, dwStringId, szBuffer, 2048);
    szBuffer[strlen(szBuffer)] = '\00';
}
Ejemplo:
char szBuffer[1024];
GetString(1234, szBuffer);
printf("La string es %s\n", szBuffer);
Gracias por responder blau,
lo que hace ese código es guardar el recurso dentro de szBuffer no? Eso si, no entiendo donde se le pone el nombre y tipo de recurso para que la función obtenga el string.
Bueno independiente de eso, intenté dejar la clave constante y aun así no funciono... dejo mas codigo por si alguien mas se anima a ayudarme

me explico:
'en vb6 hago esto:
Dim codigo As String
Dim clave As String
clave = "indetectables.net"
codigo = RC4(ReadFile(Text1.Text), clave)
//en c++ esto:
char CLAVE(12);
CLAVE = "indetectables.net";
Archivo = RC4(Archivo,CLAVE,sizeArchivo,12);
//la funcion rc4 en c++
LPBYTE RC4(LPBYTE lpBuf, LPBYTE lpKey, DWORD dwBufLen, DWORD dwKeyLen)
{
INT a, b = 0, s[256];
BYTE swap;
DWORD dwCount;
for(a = 0; a < 256; a++)
{
s[a] = a;
}
for(a = 0; a < 256; a++)
{
b = (b + s[a] + lpKey[a % dwKeyLen]) % 256;
swap = s[a];
s[a] = s;
s = swap;
}
for(dwCount = 0; dwCount < dwBufLen; dwCount++)
{
a = (a + 1) % 256;
b = (b + s[a]) % 256;
swap = s[a];
s[a] = s;
s = swap;
lpBuf[dwCount] ^= s[(s[a] + s) % 256];
}
return lpBuf;
}