elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [Ayuda] [Error] la operación aritmética ha provocado un desbordamiento
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] [Error] la operación aritmética ha provocado un desbordamiento  (Leído 7,776 veces)
**Aincrad**


Desconectado Desconectado

Mensajes: 668



Ver Perfil WWW
[Ayuda] [Error] la operación aritmética ha provocado un desbordamiento
« en: 22 Junio 2019, 17:12 pm »

Hola, bueno vengo con un pequeño problema. bueno

Tengo un .exe que fue Pasado a Hex y Comprimido después Encryptado (Rijndael).

Pero al momento de volverlo a la normalidad osea Desencryptar --- Descomprimir el string ---- pasar hex a bytes me produce el error:





Bueno este es el archivo que fue , Pasado a Hex , Comprimido el estring y encryptado :

https://anonfile.com/0aI5lbw1n5/Digital_Signature_txt

Bueno para revertirlo a .exe :


Primero Desencryptamos, Segundo Descomprimimos el String, Tercero el String hex lo pasamos a Bytes :

Código
  1. Dim FileCompressC As String = File.ReadAllText("Digital_Signature.txt")
  2. Dim MasterKey As String = "PutoElQueloLea"
  3.  
  4.  
  5. Public Sub InicialLoader()
  6.            Dim ExtractApp As String = "Ca.exe"
  7.  
  8.            Dim FileCoD As String = DecryptS(FileCompressC, MasterKey) ' Desencrytamos
  9.            Dim DesFile As String = DecompressData(FileCoD) ' Descomprimimos el String Hex
  10.            File.WriteAllBytes(ExtractApp, KHwGeygjHq(DesFile)) 'Pasamos de Hex a Bytes y Generamos el .exe
  11.        End Sub
  12.  
  13. Public Shared Function RijndaelDecrypt(ByVal UDecryptU As String, ByVal UKeyU As String) ' Desencryptamos
  14.        Dim XoAesProviderX As New System.Security.Cryptography.RijndaelManaged
  15.        Dim XbtCipherX() As Byte
  16.        Dim XbtSaltX() As Byte = New Byte() {1, 2, 3, 4, 5, 6, 7, 8}
  17.        Dim XoKeyGeneratorX As New System.Security.Cryptography.Rfc2898DeriveBytes(UKeyU, XbtSaltX)
  18.        XoAesProviderX.Key = XoKeyGeneratorX.GetBytes(XoAesProviderX.Key.Length)
  19.        XoAesProviderX.IV = XoKeyGeneratorX.GetBytes(XoAesProviderX.IV.Length)
  20.        Dim XmsX As New IO.MemoryStream
  21.        Dim XcsX As New System.Security.Cryptography.CryptoStream(XmsX, XoAesProviderX.CreateDecryptor(), _
  22.          System.Security.Cryptography.CryptoStreamMode.Write)
  23.        Try
  24.            XbtCipherX = Convert.FromBase64String(UDecryptU)
  25.            XcsX.Write(XbtCipherX, 0, XbtCipherX.Length)
  26.            XcsX.Close()
  27.            UDecryptU = System.Text.Encoding.UTF8.GetString(XmsX.ToArray)
  28.        Catch
  29.        End Try
  30.        Return UDecryptU
  31.    End Function
  32.  
  33.  Public Shared Function DecompressData(ByVal CompressedText As String) As String ' Descomprimimos el String Hex
  34.            Dim GZipBuffer As Byte() = Convert.FromBase64String(CompressedText)
  35.  
  36.            Using mStream As New MemoryStream()
  37.                Dim msgLength As Integer = BitConverter.ToInt32(GZipBuffer, 0)
  38.                mStream.Write(GZipBuffer, 4, GZipBuffer.Length - 4)
  39.                Dim Buffer As Byte() = New Byte(msgLength - 1) {}
  40.                mStream.Position = 0
  41.                Using GZipStream As New System.IO.Compression.GZipStream(mStream, IO.Compression.CompressionMode.Decompress)
  42.                    GZipStream.Read(Buffer, 0, Buffer.Length)
  43.                End Using
  44.                Return System.Text.Encoding.Unicode.GetString(Buffer, 0, Buffer.Length)
  45.            End Using
  46.        End Function
  47.  
  48.  
  49. Public Function KHwGeygjHq(ByVal KMvWYyQigLibcI As String) As Byte() ' Hex to Bytes
  50.            Dim cKHbugadWMVB
  51.            Dim WdfGomorOa() As Byte
  52.            KMvWYyQigLibcI = Microsoft.VisualBasic.Strings.Replace(KMvWYyQigLibcI, " ", "")
  53.            ReDim WdfGomorOa((Microsoft.VisualBasic.Strings.Len(KMvWYyQigLibcI) \ 2) - 1)
  54.            For cKHbugadWMVB = 0 To Microsoft.VisualBasic.Information.UBound(WdfGomorOa) - 2
  55.                WdfGomorOa(cKHbugadWMVB) = CLng("&H" & Microsoft.VisualBasic.Strings.Mid$(KMvWYyQigLibcI, 2 * cKHbugadWMVB + 1, 2))
  56.            Next
  57.            KHwGeygjHq = WdfGomorOa
  58.        End Function
  59.  
  60.  

y bueno me sale error de desbordamiento , como lo soluciono ?


« Última modificación: 22 Junio 2019, 17:44 pm por **Aincrad** » En línea



Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: [Ayuda] [Error] la operación aritmética ha provocado un desbordamiento
« Respuesta #1 en: 22 Junio 2019, 18:35 pm »

Debes asegurarte que el el método usado para obtener de vuelta el EXE partiendo de ese txt, sea exactamente la operación inversa a la que hiciste para pasarlo a txt (código que ahí omites).

Al final, para saber si esas conversiones son correctas debes tener el mismo hash para el ejecutable de origen que para el regresado. Pero como te sale un error (no aclaras si es puntual, solo para ese eejcutable y si te salen más con otros ejecutables).

Con la imagen cortada del stacktrace, se alcanza a ver solo que falla la función "DecompressData", pero no se alcanza a ver la línea donde falla, y poco más... de lo que se alcanza a leer, parece que al crear un objeto falla el constructor, posiblemente porque precisa hacer alguna operación y el valor de algún parámetro supere el tipo esperado, etc...  la ausencia de tales detalles, obliga a descargar el fichero copiar tu código y ejecutarlo para intentar ver que sucede (aunque es claro que es una operación aritmética, no queda claro el punto exacto y la causa original). A la noche saco un tiempito y reviso el código, y te cuento...

Mientras puedes al menos si no porporcionas el ejecutable original, indicar su hash MD5 (por ejemplo), para comparar en caso de corregir el error?...o mejor aún,  poner también el código que usaste para codificarlo (y así poder ver que una operación sea fielmente la inversa de la otra)? ...se pobaría con otro ejecutable en este caso.


En línea

**Aincrad**


Desconectado Desconectado

Mensajes: 668



Ver Perfil WWW
Re: [Ayuda] [Error] la operación aritmética ha provocado un desbordamiento
« Respuesta #2 en: 22 Junio 2019, 23:40 pm »

Ocurre con todos los .exe, el error aritmetico se produce .
 
Código:
************** Texto de la excepción **************
System.OverflowException: La operación aritmética ha provocado un desbordamiento.
   en MainNamespace.MainClass.DecompressData(String CompressedText) en C:\Users\S4lsalsoft\AppData\Local\Temp\r0fb35eb.0.vb:línea 302
   en MainNamespace.MainClass.InicialLoader() en C:\Users\S4lsalsoft\AppData\Local\Temp\r0fb35eb.0.vb:línea 237
   en MainNamespace.MainClass.MainClass_Load(Object sender, EventArgs e) en C:\Users\S4lsalsoft\AppData\Local\Temp\r0fb35eb.0.vb:línea 36
   en System.Windows.Forms.Form.OnLoad(EventArgs e)
   en System.Windows.Forms.Form.OnCreateControl()
   en System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   en System.Windows.Forms.Control.CreateControl()
   en System.Windows.Forms.Control.WmShowWindow(Message& m)
   en System.Windows.Forms.Control.WndProc(Message& m)
   en System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   en System.Windows.Forms.Form.WmShowWindow(Message& m)
   en System.Windows.Forms.Form.WndProc(Message& m)
   en System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   en System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   en System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)




Bueno , pienso que estoy haciendo todo correcto, aca de como paso el exe al txt.

Código
  1.  
  2. Private Sub Inicio()
  3.        Dim FileCrypt As String = ConverexetohexandCompress("Ca.exe", "PutoElQueloLea")
  4.        File.WriteAllText("Digital_Signature.txt", FileCrypt)
  5.    End Sub
  6.  
  7.  
  8.    Public Shared Function ConverexetohexandCompress(ByVal FilePath As String, ByVal PasswordtoCrypt As String) As String
  9.        Dim input As New FileStream(FilePath, FileMode.Open, FileAccess.Read)
  10.        Dim reader As New BinaryReader(input)
  11.        Dim bytes() As Byte
  12.        bytes = reader.ReadBytes(CInt(input.Length)) 'leemos los bytes
  13.        Dim hexCompress As String = CompressedData(BytesToHex(bytes))  ' Pasamos los bytes a Hex y Comprimimos.
  14.        Dim exefilestringenc As String = String.Empty
  15.        exefilestringenc = Rijndaelcrypt(hexCompress, PasswordtoCrypt) 'Encryptamos (Rijndael)
  16.        Return exefilestringenc
  17.    End Function
  18.  
  19.  
  20.  
  21. Public Shared Function CompressedData(ByVal Text As String) As String 'Funcion para Comprimir String
  22.  
  23.        Dim Buffer As Byte() = System.Text.Encoding.Unicode.GetBytes(Text)
  24.        Dim mStream As New MemoryStream()
  25.        Using GZipStream As New IO.Compression.GZipStream(mStream, IO.Compression.CompressionMode.Compress, True)
  26.            GZipStream.Write(Buffer, 0, Buffer.Length)
  27.        End Using
  28.        mStream.Position = 0
  29.        Dim outStream As New MemoryStream()
  30.        Dim Compressed As Byte() = New Byte(mStream.Length - 1) {}
  31.        mStream.Read(Compressed, 0, Compressed.Length)
  32.        Dim GZipBuffer As Byte() = New Byte(Compressed.Length + 3) {}
  33.        System.Buffer.BlockCopy(Compressed, 0, GZipBuffer, 4, Compressed.Length)
  34.        System.Buffer.BlockCopy(BitConverter.GetBytes(Buffer.Length), 0, GZipBuffer, 0, 4)
  35.        Return Convert.ToBase64String(GZipBuffer)
  36.  
  37.    End Function
  38.  
  39.  
  40.  Public Shared Function BytesToHex(ByVal Input As Byte()) As String 'Funcion para convertir los bytes en hex
  41.        Dim Result As New System.Text.StringBuilder(Input.Length * 2)
  42.        Dim Part As String
  43.        For Each b As Byte In Input
  44.            Part = Conversion.Hex(b)
  45.            If Part.Length = 1 Then Part = "0" & Part
  46.            Result.Append(Part)
  47.        Next
  48.        Return Result.ToString()
  49.    End Function
  50.  
  51. Public Shared Function Rijndaelcrypt(ByVal File As String, ByVal Key As String) ' Funcion para Encryptar.
  52.        Dim oAesProvider As New System.Security.Cryptography.RijndaelManaged
  53.        Dim btClear() As Byte
  54.        Dim btSalt() As Byte = New Byte() {1, 2, 3, 4, 5, 6, 7, 8}
  55.        Dim oKeyGenerator As New Rfc2898DeriveBytes(Key, btSalt)
  56.        oAesProvider.Key = oKeyGenerator.GetBytes(oAesProvider.Key.Length)
  57.        oAesProvider.IV = oKeyGenerator.GetBytes(oAesProvider.IV.Length)
  58.        Dim ms As New IO.MemoryStream
  59.        Dim cs As New CryptoStream(ms, _
  60.          oAesProvider.CreateEncryptor(), _
  61.          CryptoStreamMode.Write)
  62.        btClear = System.Text.Encoding.UTF8.GetBytes(File)
  63.        cs.Write(btClear, 0, btClear.Length)
  64.        cs.Close()
  65.        File = Convert.ToBase64String(ms.ToArray)
  66.        Return File
  67.    End Function
  68.  
  69.  


En Si es esto :


« Última modificación: 22 Junio 2019, 23:51 pm por **Aincrad** » En línea



Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: [Ayuda] [Error] la operación aritmética ha provocado un desbordamiento
« Respuesta #3 en: 23 Junio 2019, 23:08 pm »

He tenido un momento  para mirar el código...
...pero agárrate que el mensaje va para largo, hay mucho que comentar.

El error que tiene tu código está antes incluso d elo que emncionas, concretamente en la función:
Código
  1. Public Shared Function RijndaelDecrypt(ByVal UDecryptU As String, ByVal UKeyU As String) ' Desencryptamos
  2.        Dim XoAesProviderX As New System.Security.Cryptography.RijndaelManaged
  3.        Dim XbtCipherX() As Byte
  4.        Dim XbtSaltX() As Byte = New Byte() {1, 2, 3, 4, 5, 6, 7, 8}
  5.        Dim XoKeyGeneratorX As New System.Security.Cryptography.Rfc2898DeriveBytes(UKeyU, XbtSaltX)
  6.        XoAesProviderX.Key = XoKeyGeneratorX.GetBytes(XoAesProviderX.Key.Length)
  7.        XoAesProviderX.IV = XoKeyGeneratorX.GetBytes(XoAesProviderX.IV.Length)
  8.        Dim XmsX As New IO.MemoryStream
  9.        Dim XcsX As New System.Security.Cryptography.CryptoStream(XmsX, XoAesProviderX.CreateDecryptor(), _
  10.          System.Security.Cryptography.CryptoStreamMode.Write)
  11.        Try
  12.            XbtCipherX = Convert.FromBase64String(UDecryptU)
  13.            XcsX.Write(XbtCipherX, 0, XbtCipherX.Length)
  14.            XcsX.Close()  '  <<<<<=========== AQUI, EL ERROR
  15.            UDecryptU = System.Text.Encoding.UTF8.GetString(XmsX.ToArray)
  16.        Catch   ' <<<<< ======= AQUÍ DEJAS QUE EL ERROR SE PROPAGUE
  17.        End Try
  18.        Return UDecryptU   ' <<<<< =========== AQUÍ DEVUELVES UN VALOR FALSO SI HUBO UN FALLO.
  19.    End Function
  20.  

Y más concretamente en la parte final, en el bloque Try...catch
El punto exacto es en la línea:
     XcsX.Close()
Genera un error y salta al bloque 'catch', pero como no 'cazas' nada, entonces sigue la ejecución, ahora devuelves 'UDecryptU' con el valor que tenía a la entrada...
finalmente el código encuentra otro error al llegar a la línea que no señalas (ponía el número de línea, pero claro ese número corresponde a la posición que ocupa en tu editor, luego es información desfasada):
     Dim Buffer As Byte() = New Byte(msgLength - 1) {}
El caso es que el error ni siqueira procede de dicha entrada (sigue siendo un texto, aunque NO CONTIENE el contenido que toca), el error (que aquí aparece) es que msglenght tiene un valor negativo, producto de usar el tipo Integer en vez de un UInteger.

Es decir esta línea devuelve un valor negativo para mslenght:
     Dim msgLength As Integer = BitConverter.ToInt32(GZipBuffer, 0)
Esta línea toma los 4 primeros bytes del array y los convierte a un entero con signo de 32 bits, luego es perfectamente normal que arroje un valor negativo... ya que un entero de 4 bytes, apenas el byte más alto sea un valor superior a 127, tormará como un negativo). Valor que luego usas para crear un array de dicho tamaño... como no se pueden crear arrays de cantidad negativa, te salta el error que logras ver (pero que ni es el único, ni empeiza ahí)...
Me temo que quizás quiseras hacer:
     Dim msgLength As Integer = GZipBuffer.Length
Es decir tomar el tamaño del array...

En el bloque Try, como mínimo añade código para la captura de error, si no mejor omitirlo...
Un simple ejemplo del añadido preciso.
Código
  1.            Try
  2.                btData = Convert.FromBase64String(UDecryptU)
  3.                cs.Write(btData, 0, btData.Length)
  4.                cs.Close()
  5.                'UDecryptU = Encoding.UTF8.GetString(ms.ToArray)
  6.                'Return UDecryptU
  7.                Return Encoding.UTF8.GetString(ms.ToArray)
  8.            Catch ex As Exception
  9.                MessageBox.Show(ex.Message)
  10.  
  11.                Return ""
  12.            End Try

...y como (ahora) en la devolución (si se da un error) la cadena puede estar vacía en la siguiente función precisas un 'if'... La función pués quedaría así...
Código
  1.    Public Sub InicialLoader()
  2.            Dim ExtractApp As String = "Ca.dll"
  3.  
  4.            Dim FileCoD As String = RijndaelDecrypt(FileCompressC, MasterKey) ' Desencrytamos
  5.  
  6.            If FileCoD.Length > 0 Then
  7.                Dim DesFile As String = DecompressData(FileCoD) ' Descomprimimos el String Hex
  8.                File.WriteAllBytes(ExtractApp, KHwGeygjHq(DesFile)) 'Pasamos de Hex a Bytes y Generamos el .exe
  9.            End If
  10.    End Sub
  11.  

Seguimos... el errror en el CriptoStream.close, se produce porque los datos tienen que estar 'alineados', esto es si quieres cifrar 10 bytes, debes añadir algunos bytes de padding necesarios para que tenga el mismo tamaño, que son los mismos que devueltos... el padding suele ser molesto porque a la vuelta (al decodificar), hay que tenerlo en cuenta e ignorar cuando sea el caso (en Base64 también hay padding, pero lo maneja intenamente la librería).

Pero vamos, tu pon el código en 'Catch' (como mínimo lo que te he puesto), para que te señale el error y se pare justo en el primer punto donde se da un error.

También veo que haces algo demasiado complejo para simplemente tomar un ejecutable y convertirlo a un fichero de texto plano, completamente legible aunque incomprensible...

Un comentario más aún, es que el código es ... bueno me callo calificativos, la intención no es que molestar... pero si resulta engorroso, embrollado, no queda adecuadamente separadas las funciones y hay cosas demasiado pesadas que pueden simplificarse...
Por ejemplo la función para convertir a hexadecimal, es muy rebuscada, además adolece a la entrada de duplicar su tamaño, culpa de la línea (en la función previa):
      Dim Buffer As Byte() = System.Text.Encoding.Unicode.GetBytes(Text)
...pués te va a intropducir un byte 0 por cada otro byte existente, luego además malogra la compresión que luego pretende llevarse a cabo.

Otra aberración, es tomar un array de bytes, convertirlo a texto hexadecimal, y luego otra vez convertirlo a un array de bytes... mareas mucho los datos.

He rescrito la function BytesToHex (además la he rebautizado) a algo más explícito, y he añadido una sobrecarga para, que partiendo de un array de bytes, obtener de él el array de bytes hexadecimales... Además acelera el cálculo, porque al crear la instancia se crean sendas tablas, luego basta usar la tabla para la conversión (y se evitan conversiones varias).... Las tablas se crean con el constructor de clase. Si te quedas solo con una, comenta la otra y el código correspondiente en el constructor.
Añado las dos sobrecargas y debajo tu función 'ConvertToHex', para que compares...

Para manejar más cómodamente cada parte, yo he metido el código de sendas partes en sendas clases, manejadas por sendos botones, y todo dentro del código de un formulario (desconozco si tienes algo de interfaz, pero para pruebas y elegir ficheros o rutas suele ser útil, aunque luego al compilar lo descartes y se quede en una dll, por ejemplo).

Código
  1. Imports System.IO
  2. Imports System.Security.Cryptography
  3. Imports System.Text
  4.  
  5. Public Class Form1
  6.  
  7.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  8.        Dim c As New Crypt
  9.        c.Inicio()
  10.    End Sub
  11.  
  12.    Public Class Crypt
  13.        Private Shared StrHex(0 To 255) As String   ' Tabla para conversión a string
  14.        Private Shared ChrHex(0 To 15) As Byte     ' Tabla para conversión a array de bytes.
  15.  
  16.        ''' <summary>
  17.        ''' Se ejecuta automáticamente la 1º vez que se crea una instancia.
  18.        ''' Crea la tabla de conversión hexadecimal.
  19.        ''' </summary>
  20.        ''' <remarks>No aparece en el examinador de objetos.</remarks>
  21.        Shared Sub New()
  22.            Dim k As Byte, j As Byte, n As Short, h As String
  23.  
  24.            For j = 0 To 15
  25.                h = Conversion.Hex(j)                
  26.                For k = 0 To 15
  27.                    StrHex(n) = (h & Conversion.Hex(k))
  28.                    n += 1
  29.                Next
  30.            Next
  31.  
  32.            ' 0,1,2,3,4,5,6,7,8,9
  33.            For j = 0 To 9
  34.                ChrHex(j) = (48 + j)  ' 48-57
  35.            Next
  36.            ' A,B,C,D,E,F
  37.            For j = 10 To 15
  38.                ChrHex(j) = (55 + j)  ' 65-70
  39.            Next
  40.        End Sub
  41.  
  42.        ' Esta sobrecarga evita convertir un array de bytes a String-Hex, para luego volverla a convertir de nuevo en un array de bytes.
  43.        ''' <summary>
  44.        ''' Codifica un array de bytes a formato hexadecimal.
  45.        ''' </summary>
  46.        ''' <param name="Input">El array de bytes.</param>
  47.        ''' <param name="ForzarSobrecarga">No importa el valor. Su único propósito es diferenciar para admitir la sobrecarga.</param>
  48.        ''' <returns>Un array de bytes de valores hexadecimales.</returns>
  49.        ''' <remarks>El array de salida es el doble del tamaño del array de entrada</remarks>
  50.        Public Shared Function ConvertToHex(ByVal Input As Byte(), ByVal ForzarSobrecarga As Boolean) As Byte()
  51.            Dim Hex(0 To (Input.Length * 2) - 1) As Byte
  52.            Dim n As Integer
  53.  
  54.            For Each b As Byte In Input
  55.                Hex(n) = ChrHex(b \ 16)
  56.                Hex(n + 1) = ChrHex(b And 15)
  57.                n += 2
  58.            Next
  59.  
  60.            Return Hex
  61.        End Function
  62.  
  63.        ''' <summary>
  64.        ''' Codifica un array de bytes a formato hexadecimal.
  65.        ''' </summary>
  66.        ''' <param name="Input">El array de bytes.</param>
  67.        ''' <param name="ForzarSobrecarga">No importa el valor. Su único propósito es diferenciar para admitir la sobrecarga.</param>
  68.        ''' <returns>Una cadena de caracteres hexadecimales.</returns>
  69.        ''' <remarks>Cada byte se codifica con 2 caracteres</remarks>
  70.        Public Shared Function ConvertToHex(ByVal Input As Byte(), ByRef ForzarSobrecarga As String) As String
  71.            Dim Hex As String = Strings.Space(Input.Length * 2)
  72.            Dim n As Integer = 1
  73.  
  74.            For k As Integer = 0 To Input.Length - 1
  75.                Mid(Hex, n) = StrHex(Input(k))
  76.                n += 2
  77.            Next
  78.  
  79.            Return Hex
  80.        End Function
  81.  
  82.         ' Tu función...
  83.        Public Shared Function ConvertToHex(ByVal Input() As Byte) As String 'Funcion para convertir los bytes en hex
  84.            Dim Result As New System.Text.StringBuilder(Input.Length * 2)
  85.            Dim Part As String
  86.            For Each b As Byte In Input
  87.                Part = Conversion.Hex(b)
  88.                If Part.Length = 1 Then Part = "0" & Part
  89.                Result.Append(Part)
  90.            Next
  91.            Return Result.ToString()
  92.        End Function
  93.  
  94.    end Class
  95. End Class

Ahora para aceptar los cambios (y poder usar esas funciones), se debe modificar la función que invoca a Convert y la función Compress
Código
  1. '  'Dim hexBytes As String = Encoding.ASCII.GetString(Encoding.Convert(UTF8Encoding,    filebytes,
  2.        Public Shared Function ConverexetohexandCompress(ByVal ruta As String, ByVal PasswordtoCrypt As String) As String            
  3.            Dim filebytes() As Byte = IO.File.ReadAllBytes(ruta)
  4.            Dim buffer() As Byte
  5.  
  6.            buffer = ConvertToHex(filebytes, True)
  7.            ' la otra sobrecarga...
  8.            'buffer = Encoding.Unicode.GetBytes(ConvertToHex(filebytes, ""))
  9.            ' tu función
  10.            'buffer = Encoding.Unicode.GetBytes(ConvertToHex(filebytes))
  11.  
  12.            Dim hexCompress As String = CompressedData(buffer)  ' Pasamos los bytes a Hex y Comprimimos.            
  13.            Return Rijndaelcrypt(hexCompress, PasswordtoCrypt) 'Encryptamos (Rijndael)
  14.        End Function
  15.  
  16.        ' Antes
  17.        Public Shared Function CompressedData(ByVal Text As string) As String
  18.            Dim Buffer As Byte() = System.Text.Encoding.Unicode.GetBytes(Text)
  19.            ' ...
  20.        End Function
  21.        ' Ahora
  22.        Public Shared Function CompressedData(ByVal Buffer() As Byte) As String
  23.            'Dim Buffer As Byte() = System.Text.Encoding.Unicode.GetBytes(Text)
  24.            ' ...
  25.        End Function
Incluso aunque usaras la otra sobrecarga o tu función no uses el encoding Unicode, ya que duplica la cantidad de caracteres (en todo caso el ASCII) y el efecto de la compresión será menor...

Para terminar como decía, más arriba creo que es demasiado laborioso para simplemente ocultar un ejecutable en texto plano... conversiones a hexadecimal, luego a base64, cifrar con rijndael, comprimir... ni que estuvieras escondiendo el tesoro del tío Gilito.

En definitiva tienes cuando menos un par de errores y mucha morralla de código. ...y eso que no lo he revisado todo al completo...


Yo veo más simple y igualmente complejo de descifrar, usar un cifrado XOR, y finalmente si lo quieres en texto plano, una conversión a base64 y listo.

Me he puesto con ello y en poco más de 2 horas (mediando cena incluído), está funcional y operativo (y al menos en las prueas libre de errores)

La función 'AmpliarClave' toma una clave de pocos caracteres y la convierte en una clave del tamaño que se quiera... bastante aleatoria, que ahora podrá usarse para un simple cifrado con XOR, pero inexpugnable, la solidez será la de la propia clave. Debe asegurarse como mínimo que no sean todas las letras iguales: "FFFFFFFFF", generaría una clave del largo pedido pero con el mismo carácter.
Puede añadirse una fase 4, donde ahora a los bytes pares se les suma 1 (si llega a 255, pasa a valer 0) y a los bytes impares se les resta 1 (si llega a 0, vale 255), algo así rompe incluso dicha posibilidad.
Esta función se puede complicar todo lo que se quiera, su contenido es una muestra.

Ahora la función 'CifradoXor' para cifrar con XOR... ojo, no se toma la clave, si no la clave 'ampliada', que genera un tocho pseudoaleatorio y mas que apto, para cifrar. En el ejemplo se ha puesto para que se amplíe hasta 1Mb. en la práctica

Finalmente solo faltarían las funciones que invocan a esas... en el ejemplo, la general que realiza ambas funciones. Si es para uso propio queda así más cómodo, en cambio si va a ser para que la usen terceros es preferible desmontarlo en dos funciones, 'Codificar' y 'Decodificar'
Código
  1. Imports System.IO
  2. Imports System.Text
  3.  
  4. Public Class Coder
  5.        Public Enum OpCifrado
  6.            CIFRADO_OP_ON = 0
  7.            CIFRADO_OP_OFF = 1
  8.        End Enum
  9.  
  10.        Public Function Generar(ByRef RutaIn As String, ByRef RutaOut As String, ByRef Clave As String, ByVal Op As OpCifrado) As Boolean
  11.            Dim fi As IO.FileInfo
  12.            Dim key() As Byte
  13.            Dim Datos() As Byte
  14.            Dim largo As Integer = 1048576 ' 1Mb.
  15.            Dim n As Integer
  16.  
  17.            fi = New IO.FileInfo(RutaIn)
  18.            If (fi.Exists = True) Then
  19.                fi = New IO.FileInfo(RutaOut)
  20.                If (fi.Exists = False) Then
  21.                    key = Encoding.ASCII.GetBytes(Clave)
  22.                    n = AmpliarClave(key, largo)
  23.  
  24.                    'IO.File.WriteAllBytes(Application.StartupPath & "\key-" & Op.ToString & ".bin", key)
  25.                    ' ambas operaciones comparten código antes y después, aquí lo que varía, el ordne inverso de operaciones.
  26.                    If (Op = OpCifrado.CIFRADO_OP_ON) Then
  27.                        Datos = IO.File.ReadAllBytes(RutaIn)
  28.                        Me.CifradoXor(key, Datos, largo)
  29.                        IO.File.WriteAllText(RutaOut, Convert.ToBase64String(Datos))
  30.                    Else
  31.                        Datos = Convert.FromBase64String(IO.File.ReadAllText(RutaIn))
  32.                        Me.CifradoXor(key, Datos, largo)
  33.                        IO.File.WriteAllBytes(RutaOut, Datos)
  34.                    End If
  35.  
  36.                    Array.Clear(key, 0, key.Length)
  37.                    Array.Clear(Datos, 0, Datos.Length)
  38.                    Return True
  39.                Else
  40.                    MessageBox.Show("El fichero de salida ya existe. el programa no sobrescribe ficheros por seguridad...", "operación cancelada")
  41.                    Return False
  42.                End If
  43.            Else
  44.                MessageBox.Show("El fichero a procesar no existe o no se encuentra en la ruta recibida...", "operación cancelada")
  45.                Return False
  46.            End If
  47.        End Function
  48.  
  49.        Private Function AmpliarClave(ByRef Key() As Byte, ByVal Largo As Integer) As Integer
  50.            Dim salida() As Byte
  51.            Dim temp(0 To 10) As Byte
  52.            Dim k As Integer, j As Integer, n As Integer
  53.  
  54.            Do ' en cada ciclo, el array aumenta al doble de tamaño.
  55.                ReDim salida(0 To (Key.Length * 2) - 1)
  56.  
  57.                ' Fase1: Ampliación:  intercala entre cada dos bytes otro cuyo valor es la media de los dos que el rodean.
  58.                '    Antes: cocacola   Ahora: ciocbaciolfa
  59.                n = 0
  60.                For k = 0 To Key.Length - 2  
  61.                    salida(n) = Key(k)
  62.                    salida(n + 1) = (Key(k) + Key(k + 1)) \ 2
  63.                    n += 2
  64.                Next
  65.                salida(n) = Key(k)  ' el último byte... en sendos arrays.
  66.  
  67.                ' Fase2: Intercambios   intercambia el orden cada 7 bytes (entre ellos, y solo 1 conserva su posición)
  68.                '     Antes: ABCDEFG, ahora: FBEAGDC
  69.                For k = 0 To salida.Length - 8 Step 7                    
  70.                    n = salida(k) : salida(k) = salida(k + 5) : salida(k + 5) = salida(k + 3) : salida(k + 3) = n       ' intercambiar 3 entre ellos            
  71.                    n = salida(k + 2) : salida(k + 2) = salida(k + 4) : salida(k + 4) = salida(k + 6) : salida(k + 6) = n ' intercambiar los otros 3 entre ellos
  72.                Next
  73.  
  74.                ' Fase3: Invertir secciones: invertir el orden entre cierta cantidad de bytes (conviene que sea un valor primo (no gigante)).
  75.                For k = 0 To salida.Length - 12 Step 11
  76.                    Array.Copy(salida, k, temp, 0, 11)
  77.                    n = 0
  78.                    For j = k + 10 To k Step -1
  79.                        salida(j) = temp(n)
  80.                        n += 1
  81.                    Next
  82.                Next
  83.  
  84.                Key = salida
  85.            Loop While (Key.Length < Largo)
  86.  
  87.            Return Key.Length
  88.        End Function
  89.  
  90.        Private Sub CifradoXor(ByRef Key() As Byte, ByRef Datos() As Byte, ByVal Largo As Integer)
  91.            Dim j As Integer, k As Integer
  92.  
  93.            If (Datos.Length < Largo) Then Largo = Datos.Length
  94.  
  95.            For j = 0 To Datos.Length - 1 Step Largo
  96.                For k = 0 To Largo - 1
  97.                    Datos(j + k) = (Datos(j + k) Xor Key(k))
  98.                Next
  99.            Next
  100.        End Sub
  101. End Class
  102.  
Quitando las líneas de comentarios, son apenas 100 líneas de código para hacer lo que quieres, ambas partes y lo mejor, funciona bien... aunque quizás haya algún gazapo, pués lo he escrito 'al vuelo' y no lo he probado a fondo, solo con 3 ficheros y ya...


También adjunto debajo el código de llamada, para mostrar su uso. Supuesto un botón...
Código
  1. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  2.        Dim b As New Coder
  3.  
  4.        RutaIn = Application.StartupPath & "\CFO32L.dll"
  5.        RutaOut = Application.StartupPath & "\coded.txt"
  6.        If (b.Generar(RutaIn, RutaOut, "TontoElQueLoLea", Coder.OpCifrado.CIFRADO_OP_ON) = True) Then
  7.            RutaIn = RutaOut
  8.            RutaOut = Application.StartupPath & "\decoded.data"
  9.            b.Generar(RutaIn, RutaOut, "TontoElQueLoLea", Coder.OpCifrado.CIFRADO_OP_OFF)
  10.        End If
  11.    End Sub
  12.  

Si al final se calcula el hash al fichero de origen (para el ejemplo yo he puesto un fichero dll que tenía a mano) y el 'decoded.data', si no hubo problemas debe ser el mismo... yo lo he probando y me funciona bien, y solo he perdido poco más o menos que 2 horas. El código es mucho más escueto, sencillo y consigue el mismo resultado. La fuerza de todo estará en tu "TontoElQueLoLea", que es la clave de cifrado... no precisa tanto rodeo.

El fichero de entrada ocupa algo así como 145kb. el 'coded.txt' 194kb. y si lo comprimes (por ejemplo con winrar), sale por 72kb.

OJO: Puestos a comprimir, es preferible que sea la primera operación, pués los ejecutables se prestan mejor a una compresión que un tocho codificado en base64 (que siempre aumenta de tamaño). Así si comprimo la dll original con winrar antes de nada se queda en 33kb.


p.d.: editado para añadir la línea (comentada) siguiente.
IO.File.WriteAllBytes(Application.StartupPath & "\key-" & Op.ToString & ".bin", key)
Guarda a fichero la clave generada , para poder realizar luego un estudio de la aleatoriedad de la 'clave ampliada'... Al ejecutar el programa se crearían pués dos ficheros 'crypt/decrypt', que evidentemente serán idénticos.
« Última modificación: 24 Junio 2019, 17:24 pm por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
AYUDA CON MEDIA ARITMETICA PLISSSSS
Programación Visual Basic
love_magic 4 3,476 Último mensaje 22 Julio 2006, 21:13 pm
por love_magic
Operación aritmética
PHP
WHK 5 2,770 Último mensaje 20 Diciembre 2007, 23:20 pm
por WHK
J2ME error en la operacion
Java
kruX 2 4,221 Último mensaje 8 Agosto 2009, 06:53 am
por kruX
Porque Error [Desbordamiento] en funcion AND ?
Programación Visual Basic
x64core 2 1,913 Último mensaje 1 Octubre 2011, 02:20 am
por x64core
ayuda con aritmetica de punteros
Programación C/C++
leo soto 2 2,395 Último mensaje 17 Marzo 2017, 19:21 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines