Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > .NET
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 3 Semanas
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: May 2013
Posts: 723
Poder: 5
aguml Va por buen camino
No entiendo esta función

Hola amigos, tengo un código que estoy intentando entender pero en visual studio c# no compila. La parte que quiero entender por ahora y donde da los errores es esta:
Código PHP:
public unsafe byte[] Decrypt(byte[] eData)
{
    
byte[] buffer2;
    
byte[] buffer Class41.smethod_0((int) Class37.smethod_0(eData));
    if (((
buffer2 eData) != null) && (((int) Class37.smethod_0(buffer2)) != 0))
    {
        
numRef2 = &(buffer2[Class4.smethod_0(0x114)]);
    }
    
fixed (bytenumRef2 = ((byte*) Class4.smethod_0(0x110)))
    {
        if (((
buffer2 buffer) != null) && (((int) Class37.smethod_0(buffer2)) != 0))
        {
            
numRef = &(buffer2[Class4.smethod_0(0x11c)]);
        }
        
fixed (bytenumRef = ((byte*) Class4.smethod_0(280)))
        {
            
intnumPtr = (int*) numRef2;
            
intnumPtr2 = (int*) numRef;
            
int num Class4.smethod_0(0x120);
            do
            {
                
numPtr += Class4.smethod_0(0x124);
                
int num2 numPtr[0].smethod_2();
                
numPtr += Class4.smethod_0(0x128);
                
int num3 numPtr[0].smethod_2();
                
this.ccfae92404b1d8caf890158f763ac579b(ref num2ref num3);
                
numPtr2 += Class4.smethod_0(300);
                
numPtr2[0] = num2 num2.smethod_2();
                
numPtr2 += Class4.smethod_0(0x130);
                
numPtr2[0] = num3 num3.smethod_2();
                
num += Class4.smethod_0(0x134);
            }
            while (
num < (((int) Class37.smethod_0(eData)) >> Class4.smethod_0(0x138)));
        }
    }
    return 
buffer;

Los errores los da en las líneas con fixed.
¿Alguien puede corregir el código y comentarlo para entender que hace en cada línea?
Responder Con Cita
  #2  
Antiguo Hace 3 Semanas
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: Sep 2004
Ubicación: Medellín - Colombia
Posts: 3.434
Poder: 18
mamcx Va camino a la famamamcx Va camino a la fama
Si estas tratando de hacer encriptacion, .NET ya tiene incluido librerias de calidad para esos casos. No inventes tu propia encriptacion.
__________________
Nuevo Blog.
Ahora en Twitter!.
Responder Con Cita
  #3  
Antiguo Hace 3 Semanas
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: May 2013
Posts: 723
Poder: 5
aguml Va por buen camino
No es eso, el caso es que es un código para desencriptar un archivo en concreto y quiero saber qué encriptacion usa para ello y de paso aprendo c#.
Responder Con Cita
  #4  
Antiguo Hace 3 Semanas
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: Sep 2004
Ubicación: Medellín - Colombia
Posts: 3.434
Poder: 18
mamcx Va camino a la famamamcx Va camino a la fama
Igual no has dicho que error.

Y no tienes el nombre del algoritmo?
__________________
Nuevo Blog.
Ahora en Twitter!.
Responder Con Cita
  #5  
Antiguo Hace 3 Semanas
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: May 2013
Posts: 723
Poder: 5
aguml Va por buen camino
El error no lo puedo ver hasta el martes pero es por el fixed y decía algo como que no se puede modificar una variable dentro del fixed o algo así. Por supuesto no se el nombre del algoritmo pero sé que va encriptando/desencriptando bloques de 8 bytes y que si el bloque a encriptar es:
00 00 00 00 00 00 00 00
Queda como:
0D 88 78 F9 51 E0 19 41
Y si el bloque es:
00 00 00 01 00 00 00 00
Queda como:
72 92 D7 6D 67 D8 3C 93
Aún no analicé más el código porque no entiendo está parte y no quiero correr antes de caminar.
Sé que usa una key o algo así para realizar los cálculos porque si no al ser todos 00 no serían valores diferentes para cada byte pero no sé más.
Responder Con Cita
  #6  
Antiguo Hace 3 Semanas
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: May 2013
Posts: 723
Poder: 5
aguml Va por buen camino
Aqui os pongo todas las funciones que creo que son las que estan involucradas por si podeis echarme un cable:
El botón que desencripta:
Código PHP:
private void button_1_Click(object senderEventArgs e)
{
    
File.WriteAllBytes(this.string_0, new Form1.GClass1(this.byte_0).Decrypt(File.ReadAllBytes(this.string_0)));
    
int num = (int)MessageBox.Show(Class5.c39c0e0f1863ae92a6bb9f1c4d11eea98(80));

La función desencriptadora:
Código PHP:
public unsafe byte[] Decrypt(byte[] eData)
{
    
byte[] numArray Class41.smethod_0((int) Class37.smethod_0(eData));
    
byte[] byte_0_1;
    
// ISSUE: cast to a reference type
    // ISSUE: explicit reference operation
    // ISSUE: explicit reference operation
    
fixed (bytenumPtr1 = &^((byte_0_1 eData) == null || (int) Class37.smethod_0(byte_0_1) == ? (byte&) Class4.smethod_0(272) : @byte_0_1[Class4.smethod_0(276)]))
    {
        
byte[] byte_0_2;
        
// ISSUE: cast to a reference type
        // ISSUE: explicit reference operation
        // ISSUE: explicit reference operation
        
fixed (bytenumPtr2 = &^((byte_0_2 numArray) == null || (int) Class37.smethod_0(byte_0_2) == ? (byte&) Class4.smethod_0(280) : @byte_0_2[Class4.smethod_0(284)]))
        {
            
intnumPtr3 = (int*) numPtr1;
            
intnumPtr4 = (int*) numPtr2;
            
int num1 Class4.smethod_0(288);
            while (
num1 < (int) Class37.smethod_0(eData) >> Class4.smethod_0(312))
            {
                
intnumPtr5 numPtr3;
                
IntPtr num2 = (IntPtrClass4.smethod_0(292);
                
intnumPtr6 = (int*) ((IntPtrnumPtr5 num2);
                
int int_2 GClass0.smethod_2(*numPtr5);
                
intnumPtr7 numPtr6;
                
IntPtr num3 = (IntPtrClass4.smethod_0(296);
                
numPtr3 = (int*) ((IntPtrnumPtr7 num3);
                
int int_3 GClass0.smethod_2(*numPtr7);
                
this.ccfae92404b1d8caf890158f763ac579b(ref int_2ref int_3);
                
intnumPtr8 numPtr4;
                
IntPtr num4 = (IntPtrClass4.smethod_0(300);
                
intnumPtr9 = (int*) ((IntPtrnumPtr8 num4);
                
int num5;
                
int num6 num5 GClass0.smethod_2(int_2);
                *
numPtr8 num5;
                
intnumPtr10 numPtr9;
                
IntPtr num7 = (IntPtrClass4.smethod_0(304);
                
numPtr4 = (int*) ((IntPtrnumPtr10 num7);
                
int num8;
                
int_3 num8 GClass0.smethod_2(int_3);
                *
numPtr10 num8;
                
num1 += Class4.smethod_0(308);
            }
            
// ISSUE: cast to a reference type
            // ISSUE: variable of a reference type
            
bytelocal1 = (byte&) Class4.smethod_0(316);
            
// ISSUE: cast to a reference type
            // ISSUE: variable of a reference type
            
bytelocal2 = (byte&) Class4.smethod_0(320);
            return 
numArray;
        }
    }

Esta función creo que es la que realmente desencripta usando dos valores enteros (supongo que uno será el que está en el archivo y el otro el que se usa para desencriptar):
Código PHP:
private void ccfae92404b1d8caf890158f763ac579b(ref int int_2ref int int_3)
{
     
Class4.smethod_0(376);
     
int num1 Class4.smethod_0(380);
     
int num2;
     do
     {
         
num2 this.int_0[Class4.smethod_0(384) - num1] ^ int_2;
         
int_2 = (this.int_1[Class4.smethod_0(388), (int) (byte) (num2 >> Class4.smethod_0(392))] + this.int_1[Class4.smethod_0(396), (int) (byte) (num2 >> Class4.smethod_0(400))] ^ this.int_1[Class4.smethod_0(404), (int) (byte) (num2 >> Class4.smethod_0(408))]) + this.int_1[Class4.smethod_0(412), (int) (bytenum2] ^ int_3;
         
int_3 num2;
         
num1 += Class4.smethod_0(416);
     }
     while (
num1 Class4.smethod_0(420));
     
int_3 this.int_0[Class4.smethod_0(424)] ^ int_2;
     
int_2 this.int_0[Class4.smethod_0(428)] ^ num2;

La función Class41.smethod_0:
Código PHP:
internal static byte[] smethod_0(int int_0)
{
    return new 
byte[int_0];

la función Class37.smethod_0:
Código PHP:
internal static UIntPtr smethod_0(byte[] byte_0)
{
    return (
UIntPtrbyte_0.Length;

La función Class4.smethod_0:
Código PHP:
internal static int smethod_0(int int_1)
{
    return 
BitConverter.ToInt32(Class4.byte_0int_1);

La parte donde se define Class4.byte_0:
Código PHP:
internal sealed class Class4
{
    
internal static readonly byte[] byte_0;
    
internal readonly int int_0;

    static 
Class4()
    {
        if (
Class4.byte_0 != null)
            return;
        
byte[] bytes Convert.FromBase64String("UmVzaWRlbnQgRXZpbCBSZXZlbGF0aW9ucyAyIERlY3J5cHRlciU=");
        
Class4.byte_0 Class6.smethod_1(97LAssembly.GetExecutingAssembly().GetManifestResourceStream(Encoding.UTF8.GetString(bytes0bytes.Length)));
    }
    ... 
El botón donde se encripta:
Código PHP:
private void button_2_Click(object senderEventArgs e)
{
    
File.WriteAllBytes(this.string_0, new Form1.GClass1(this.byte_0).Encrypt(File.ReadAllBytes(this.string_0)));
    
int num = (int)MessageBox.Show(Class5.c39c0e0f1863ae92a6bb9f1c4d11eea98(95));

Para la funcion encriptadora:
Código PHP:
public unsafe byte[] Encrypt(byte[] uData)
{
    
byte[] numArray Class41.smethod_0((int) Class37.smethod_0(uData));
    
byte[] byte_0_1;
    
// ISSUE: cast to a reference type
    // ISSUE: explicit reference operation
    // ISSUE: explicit reference operation
    
fixed (bytenumPtr1 = &^((byte_0_1 uData) == null || (int) Class37.smethod_0(byte_0_1) == ? (byte&) Class4.smethod_0(220) : @byte_0_1[Class4.smethod_0(224)]))
    {
        
byte[] byte_0_2;
        
// ISSUE: cast to a reference type
        // ISSUE: explicit reference operation
        // ISSUE: explicit reference operation
        
fixed (bytenumPtr2 = &^((byte_0_2 numArray) == null || (int) Class37.smethod_0(byte_0_2) == ? (byte&) Class4.smethod_0(228) : @byte_0_2[Class4.smethod_0(232)]))
        {
            
intnumPtr3 = (int*) numPtr2;
            
intnumPtr4 = (int*) numPtr1;
            
int num1 Class4.smethod_0(236);
            while (
num1 < (int) Class37.smethod_0(uData) >> Class4.smethod_0(260))
            {
                
intnumPtr5 numPtr4;
                
IntPtr num2 = (IntPtrClass4.smethod_0(240);
                
intnumPtr6 = (int*) ((IntPtrnumPtr5 num2);
                
int int_2 GClass0.smethod_2(*numPtr5);
                
intnumPtr7 numPtr6;
                
IntPtr num3 = (IntPtrClass4.smethod_0(244);
                
numPtr4 = (int*) ((IntPtrnumPtr7 num3);
                
int int_3 GClass0.smethod_2(*numPtr7);
                
this.c0c1ef294051644e1e4a229a2e6a0ee04(ref int_2ref int_3);
                
intnumPtr8 numPtr3;
                
IntPtr num4 = (IntPtrClass4.smethod_0(248);
                
intnumPtr9 = (int*) ((IntPtrnumPtr8 num4);
                
int num5;
                
int num6 num5 GClass0.smethod_2(int_2);
                *
numPtr8 num5;
                
intnumPtr10 numPtr9;
                
IntPtr num7 = (IntPtrClass4.smethod_0(252);
                
numPtr3 = (int*) ((IntPtrnumPtr10 num7);
                
int num8;
                
int_3 num8 GClass0.smethod_2(int_3);
                *
numPtr10 num8;
                
num1 += Class4.smethod_0(256);
            }
            
// ISSUE: cast to a reference type
            // ISSUE: variable of a reference type
            
bytelocal1 = (byte&) Class4.smethod_0(264);
            
// ISSUE: cast to a reference type
            // ISSUE: variable of a reference type
            
bytelocal2 = (byte&) Class4.smethod_0(268);
            return 
numArray;
        }
    }

Esta función creo que es la que realmente encripta usando dos valores enteros (supongo que uno será el que está en el archivo y el otro el que se usa para encriptar):
Código PHP:
private void c0c1ef294051644e1e4a229a2e6a0ee04(ref int int_2ref int int_3)
{
    
Class4.smethod_0(324);
    
int index Class4.smethod_0(328);
    
int num;
    do
    {
        
num this.int_0[index] ^ int_2;
        
int_2 = (this.int_1[Class4.smethod_0(332), (int) (byte) (num >> Class4.smethod_0(336))] + this.int_1[Class4.smethod_0(340), (int) (byte) (num >> Class4.smethod_0(344))] ^ this.int_1[Class4.smethod_0(348), (int) (byte) (num >> Class4.smethod_0(352))]) + this.int_1[Class4.smethod_0(356), (int) (bytenum] ^ int_3;
        
int_3 num;
        
index += Class4.smethod_0(360);
    }
    while (
index Class4.smethod_0(364));
    
int_3 this.int_0[Class4.smethod_0(368)] ^ int_2;
    
int_2 this.int_0[Class4.smethod_0(372)] ^ num;

Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Alternativas a esta funcion JuanOrtega Varios 4 14-07-2013 22:25:47
Ayuda con esta Función Ledian_Fdez Varios 11 30-04-2010 19:03:45
Que hace esta función en VB? mqm Varios 1 15-10-2007 21:30:15
¿Es valida utilizar esta función? Nelly Varios 5 18-01-2006 18:44:36
Sintaxis de esta Función cmgenny Varios 5 11-05-2003 07:43:01


La franja horaria es GMT +2. Ahora son las 01:58:03.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi