![]() |
|
|
#1 |
|
Recien llegado
![]() Fecha de Ingreso: julio-2011
Amigos 0
Mensajes: 1
Gracias: 0
Agradecido 0 veces en 0 mensajes.
|
Hola amigos, estoy con una aplicacion que usa un algoritmo de desencriptacion a partir del serial que introduces y desencripta codigo ejecutable que si el serial es malo el programa crashea.
El codigo lo he pasado a mano de olly a C++builder y funciona para desencriptar pero claro, sin el serial bueno, no desencripta bien. Mi idea es entonces poder invertir el codigo para que en vez de darme los dos dwords que desencripta, que nosotros le demos todos los datos incluidos esos dos dwords desencriptados correctamente (suponiendo que los consiguiese) y nos devuelva las 3 partes del serial que cumplan con la condicion. El codigo de desencriptado que quiero invertir para este fin es este: Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned long parte1Serial = 0x11111111;
unsigned long parte2Serial = 0x88888888;
unsigned long parte3Serial = 0x33333333;
unsigned long lpVolumeSerialNumber = 0;
unsigned long crc1 = 0x074FF074;
unsigned long crc2 = 0x89E23FAF;
unsigned long serialEncriptado1 = 0;
unsigned long serialEncriptado2 = 0;
unsigned long serialEncriptado3 = 0;
unsigned long valorDesencriptar1 = 0x62E1CFA3;
unsigned long valorDesencriptar2 = 0x5CC688B2;
unsigned long constante1 = 0x9E3779B9;
unsigned long constante2 = 0x2004A000;
unsigned long eax, ecx, edx, ebx, edi;
if (GetVolumeInformation(NULL,NULL,0,&lpVolumeSerialNumber,NULL,NULL,NULL,NULL))
{
LabelVolumen->Caption = AnsiString().IntToHex(lpVolumeSerialNumber,8);
}
else
{
ShowMessage("No se pudo sacar el VolumeSerialNumber. Error: " +AnsiString(GetLastError()));
ExitProcess(0);
}
//Encriptacion del serial nuestro
serialEncriptado1 = parte1Serial;
serialEncriptado2 = parte2Serial;
serialEncriptado3 = parte3Serial;
serialEncriptado1 ^= lpVolumeSerialNumber ^ crc1;
serialEncriptado2 ^= lpVolumeSerialNumber ^ crc1 ^ 0x12345678;
serialEncriptado3 ^= lpVolumeSerialNumber ^ crc2;
//comienza la desencriptacion
ebx = valorDesencriptar1;
ecx = valorDesencriptar2;
edx = constante1;
eax = edx;
eax <<= 5;
//Aqui empieza el for
for(int i = 0x20; i > 0; i--)
{
edi = ebx;
edi <<= 4;
ecx -= edi;
edi = serialEncriptado3;
edi ^= ebx;
ecx -= edi;
edi = ebx;
edi >>= 5;
edi ^= eax;
ecx -= edi;
ecx -= constante2;
edi = ecx;
edi <<= 4;
ebx -= edi;
edi = serialEncriptado1;
edi ^= ecx;
ebx -= edi;
edi = ecx;
edi >>= 5;
edi ^= eax;
ebx -=edi;
ebx -= serialEncriptado2;
eax -= edx;
}
ShowMessage("El primer dword desencriptado queda como EBX="+AnsiString().IntToHex(ebx,8));
ShowMessage("El segundo dword desencriptado queda como ECX="+AnsiString().IntToHex(ecx,8));
}
|
|
|
|
![]() |
| Herramientas | |
| Desplegado | |
|
|

Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| DUELO empate CARLOS_ CUBAN-HACK | cuban-hack | Batch | 87 | 07-may-2012 22:20 |
| Alluda con este codigo cual es el error ? | cristofer007 | Batch | 3 | 03-dic-2011 19:44 |
| Adobe Flash Builder v4.5.1 Premium | schiavi13 | Software | 0 | 26-ago-2011 21:26 |
| (Vb.08)(PREGUNTA)¿ Como podria hacer que este codigo leyese CADA palabra de un texto? | David Novikov | Visual Basic y Net | 8 | 25-jul-2011 05:15 |