Frange escribió:psn_hypervisor escribió:Encriptar o desencriptar FIRMANDO?
Lo primero es que encriptar o desencriptar nada tiene que ver con el proceso de firmado, y segundo, no dice nada del lv0
Un saludo
lo del lv0 lo comentan en la fuente, busca
¿Que busque que? Lo primero, nada de ordenes a mi.
Lo segundo, antes de postear lee bien los comentarios de la gente de esa noticia:
Te pongo uno:
"Whenever I see this guy's name I think at CFW FOLDER Checker (whatever)... and I always end up with a stupid grin over my face
I might even think at a great application to post for this contest myself... It will be called "Useless Crap of Magic PS3" - UCMPS3
Now, I respect everyone's work, I know that making free applications for someone is hard, and the biggest reward we get as developers is the people's gratitude!
YES, I respect your work, but making a program that adds 1+1 endlessly, and posting it over the net won't get anyone's attention!
OH, and if you ever wonder why I bash this guy this much: You can do what this program does with one line of code! ONE LINE!
I'm a little rusty, more than 7 yrs break from programming but I'm sure that encryption routines are embedded in every major programming language"
Entiendo que quieras informar de algo que sale deprisa y corriendo y ser el primero que informa de ello...si...
Es solo mi opinion, quitando el offtopic, y por una vez voy a poner un codigo largo, si, es la funcion que este programa usa para encriptar, crea una key RC4, deriva y saca una publica (en estructura BLOB), hace un hash, etc.
- Código: Seleccionar todo
int __cdecl sub_4115F0(LPCSTR lpFileName, const CHAR *a2, LPCSTR pbData)
{
void *v3; // eax@2
int v4; // edx@3
int v5; // eax@3
int v6; // eax@6
int v7; // eax@9
int v8; // eax@14
int v9; // eax@19
int v10; // eax@21
BYTE *v11; // eax@23
int v12; // eax@24
int v13; // eax@30
int v14; // eax@33
int v15; // eax@36
int v16; // eax@38
int v17; // eax@42
DWORD v18; // eax@41
int v19; // eax@45
int v20; // eax@48
int v21; // eax@53
int v22; // eax@57
int v23; // eax@59
int v24; // eax@70
int v25; // eax@74
int v26; // eax@77
int v28; // ST18_4@78
int v29; // ecx@78
char v30; // [sp+Ch] [bp-168h]@1
unsigned __int8 v31; // [sp+D3h] [bp-A1h]@50
DWORD NumberOfBytesWritten; // [sp+DCh] [bp-98h]@35
DWORD dwBufLen; // [sp+E8h] [bp-8Ch]@49
DWORD nNumberOfBytesToRead; // [sp+F4h] [bp-80h]@49
void *Memory; // [sp+100h] [bp-74h]@1
DWORD Size; // [sp+10Ch] [bp-68h]@22
BYTE *lpBuffer; // [sp+118h] [bp-5Ch]@1
HCRYPTHASH hHash; // [sp+124h] [bp-50h]@1
HCRYPTKEY hExpKey; // [sp+130h] [bp-44h]@1
HCRYPTKEY hKey; // [sp+13Ch] [bp-38h]@1
HCRYPTPROV hProv; // [sp+148h] [bp-2Ch]@1
HANDLE hFile; // [sp+154h] [bp-20h]@1
HANDLE hObject; // [sp+160h] [bp-14h]@1
char v44; // [sp+16Fh] [bp-5h]@1
int v45; // [sp+174h] [bp+0h]@78
memset(&v30, -858993460, 0x168u);
v44 = 0;
hObject = (HANDLE)-1;
hFile = (HANDLE)-1;
hProv = 0;
hKey = 0;
hExpKey = 0;
hHash = 0;
lpBuffer = 0;
Memory = 0;
CreateFileA(lpFileName, 1u, 1u, 0, 3u, 0x80u, 0);
hObject = (HANDLE)((int (*)(void))sub_41117C)();
if ( hObject == (HANDLE)-1 )
{
GetLastError();
v5 = ((int (*)(void))sub_41117C)();
sub_41119F("Error opening plaintext file!\n", v5);
goto LABEL_62;
}
printf("The plaintext file, %s, is open. \n", lpFileName);
((void (*)(void))sub_41117C)();
CreateFileA(a2, 2u, 1u, 0, 4u, 0x80u, 0);
v3 = (void *)((int (*)(void))sub_41117C)();
hFile = v3;
if ( v3 == (void *)-1 )
{
GetLastError();
v6 = ((int (*)(void))sub_41117C)();
sub_41119F("Error opening ecrypted file!\n", v6);
goto LABEL_62;
}
printf("The encryption file, %s, is open. \n", a2);
((void (*)(void))sub_41117C)();
CryptAcquireContextA(&hProv, 0, "Microsoft Enhanced Cryptographic Provider v1.0", 1u, 0);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v7 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during Crypto!\n", v7);
goto LABEL_62;
}
printf("A crypto has been acquired. \n");
((void (*)(void))sub_41117C)();
if ( pbData && *pbData )
{
CryptCreateHash(hProv, 0x8003u, 0, 0, &hHash);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v17 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptCreateHash!\n", v17);
goto LABEL_62;
}
printf("A hash object has been created. \n");
((void (*)(void))sub_41117C)();
lstrlenA(pbData);
v18 = ((int (*)(void))sub_41117C)();
CryptHashData(hHash, (const BYTE *)pbData, v18, 0);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v19 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptHashData. \n", v19);
goto LABEL_62;
}
printf("The key has been added to the hash. \n");
((void (*)(void))sub_41117C)();
CryptDeriveKey(hProv, 0x6801u, hHash, 0x800000u, &hKey);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v20 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptDeriveKey!\n", v20);
goto LABEL_62;
}
printf("An encryption key is derived from the password hash. \n");
((void (*)(void))sub_41117C)();
}
else
{
CryptGenKey(hProv, 0x6801u, 0x800001u, &hKey);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v8 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptGenKey. \n", v8);
goto LABEL_62;
}
printf("A key has been created. \n");
((void (*)(void))sub_41117C)();
CryptGetUserKey(hProv, 1u, &hExpKey);
if ( ((int (*)(void))sub_41117C)() )
{
printf("The user public key has been retrieved. \n");
((void (*)(void))sub_41117C)();
}
else
{
GetLastError();
if ( ((int (*)(void))sub_41117C)() != -2146893811 )
{
GetLastError();
v10 = ((int (*)(void))sub_41117C)();
sub_41119F("User public key is not available and may not exist.\n", v10);
goto LABEL_62;
}
CryptGenKey(hProv, 1u, 1u, &hExpKey);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v9 = ((int (*)(void))sub_41117C)();
sub_41119F("Could not create a user public key.\n", v9);
goto LABEL_62;
}
}
CryptExportKey(hKey, hExpKey, 1u, 0, 0, &Size);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v12 = ((int (*)(void))sub_41117C)();
sub_41119F("Error BLOB length! \n", v12);
goto LABEL_62;
}
printf("The key BLOB is %d bytes long. \n", Size);
((void (*)(void))sub_41117C)();
malloc(Size);
v11 = (BYTE *)((int (*)(void))sub_41117C)();
lpBuffer = v11;
if ( !v11 )
{
sub_41119F("Out of memory. \n", -2147024882);
goto LABEL_62;
}
printf("Memory is allocated for the key BLOB. \n");
((void (*)(void))sub_41117C)();
CryptExportKey(hKey, hExpKey, 1u, 0, lpBuffer, &Size);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v13 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptExportKey!\n", v13);
goto LABEL_62;
}
printf("The key has been exported. \n");
((void (*)(void))sub_41117C)();
if ( hExpKey )
{
CryptDestroyKey(hExpKey);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v14 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptDestroyKey.\n", v14);
goto LABEL_62;
}
hExpKey = 0;
}
WriteFile(hFile, &Size, 4u, &NumberOfBytesWritten, 0);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v15 = ((int (*)(void))sub_41117C)();
sub_41119F("Error writing header.\n", v15);
goto LABEL_62;
}
printf("A file header has been written. \n");
((void (*)(void))sub_41117C)();
WriteFile(hFile, lpBuffer, Size, &NumberOfBytesWritten, 0);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v16 = ((int (*)(void))sub_41117C)();
sub_41119F("Error writing header.\n", v16);
goto LABEL_62;
}
printf("The key BLOB has been written to the file. \n");
((void (*)(void))sub_41117C)();
free(lpBuffer);
((void (*)(void))sub_41117C)();
}
nNumberOfBytesToRead = 1000;
dwBufLen = 1008;
malloc(0x3F0u);
Memory = (void *)((int (*)(void))sub_41117C)();
if ( Memory )
{
printf("Memory has been allocated for the buffer. \n");
((void (*)(void))sub_41117C)();
v31 = 0;
do
{
ReadFile(hObject, Memory, nNumberOfBytesToRead, &NumberOfBytesWritten, 0);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v21 = ((int (*)(void))sub_41117C)();
sub_41119F("Error reading plaintext!!!\n", v21);
goto LABEL_62;
}
if ( NumberOfBytesWritten < nNumberOfBytesToRead )
v31 = 1;
CryptEncrypt(hKey, 0, v31, 0, (BYTE *)Memory, &NumberOfBytesWritten, dwBufLen);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v22 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptEncrypt. \n", v22);
goto LABEL_62;
}
WriteFile(hFile, Memory, NumberOfBytesWritten, &NumberOfBytesWritten, 0);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v23 = ((int (*)(void))sub_41117C)();
sub_41119F("Error writing ciphertext.\n", v23);
goto LABEL_62;
}
}
while ( !v31 );
v44 = 1;
}
else
{
sub_41119F("Out of memory. \n", -2147024882);
}
LABEL_62:
if ( hObject )
{
CloseHandle(hObject);
((void (*)(void))sub_41117C)();
}
if ( hFile )
{
CloseHandle(hFile);
((void (*)(void))sub_41117C)();
}
if ( Memory )
{
free(Memory);
((void (*)(void))sub_41117C)();
}
if ( hHash )
{
CryptDestroyHash(hHash);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v24 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptDestroyHash.\n", v24);
}
hHash = 0;
}
if ( hKey )
{
CryptDestroyKey(hKey);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v25 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptDestroyKey!\n", v25);
}
}
if ( hProv )
{
CryptReleaseContext(hProv, 0);
if ( !((int (*)(void))sub_41117C)() )
{
GetLastError();
v26 = ((int (*)(void))sub_41117C)();
sub_41119F("Error during CryptReleaseContext!\n", v26);
}
}
v28 = v4;
sub_41109B(&v45, &dword_411F28);
return sub_41117C(v29, v28);
}
Si se sabe programar para Windows, se sabe que API se estan usando muy rapido.
No tengo nada mas que decir del tema.
Un saludo