Como desencyptar y ejecutar en Memorya

Iniciado por PokiPoki, 26 Mayo 2014, 03:10 AM

0 Miembros y 1 Visitante están viendo este tema.

PokiPoki

Muy buenas a todos los componentes del Foro,vengo a pediros informacion de como desencryptar un archivo y poder ejecutarlo en Memorya.

Recien empiezo a usar este leguaje y aun me cuesta entender el uso de algunas funciones,ya que mi ingles es muy basico y me ayudo del
vendito San Google  :( ,bueno este es el codigo que estoy utilizando como Loader.

Código (vbnet) [Seleccionar]
Imports System.IO
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Reflection
Imports System.Threading
Imports System.Windows.Forms
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim TH As New Thread(AddressOf ThreadWork)
TH.Start()
End Sub
Private Sub ThreadWork()
'Dim LoadedBytes As Byte() = My.Resources.Test
Dim LoadedBytes As Byte() = IO.File.ReadAllBytes(Application.StartupPath & "\Test.exe")
Dim ExecutingAssemblyPath As String = String.Empty
ExecutingAssemblyPath = Application.StartupPath
Dim MyAssembly As System.Reflection.Assembly = System.Reflection.Assembly.Load(LoadedBytes)MyAssembly.EntryPoint.Invoke(Nothing, Nothing)
End Sub


y este seria Test.exe,solo pongo la parte del sub main ya que el Form1 y los demas modulos llevan mucho code

Código (vbnet) [Seleccionar]
Imports System.Windows.Forms
Module Module1
Sub Main()
Application.Run(New Form1)
End Sub
End Module


Tanto si tengo Test.exe en el mismo directorio,como si lo agrego como recurso funciona bien,mi problema es cuando lo intento desencyptar,
bueno el caso es que yo encrypto Test.exe,con Base64 por ejemplo y lo guardo con otro nombre,a primera vista parece un archivo roto
digo roto por que no tiene icono ni nada,lo abro con notepad++ y dentro como es logico solo encuentro un string muy largo que
coresponde al encryptado de Test.exe,pues lo que quisiera saber es como desencryptarlo y ejecutarlo en memorya sin tener que escribir
otra vez los byte en el pc osea hacer todo el proceso en memorya.
E leido sobre como utilizar MemoryStream,pero devido a que recien empiezo a entender y comprender este lenguaje aun no e podido
hacerlo funcionar corectamente.

Un saludo compañeros

PD: No es mas sabio el que mas sabe,si no el que menos pregunta  <<<< By PokiPoki

kub0x

Muy buenas PokiPoki,

existen varías formas de codificar y decodificar base64, en tu caso si quisieras codificar el archivo utilizarías un array de bytes ( Byte() ). Si quisieras decodificar el archivo entonces extraerías la cadena base64 del ejecutable y la decodificarías con la siguiente función:

Código (VB.NET) [Seleccionar]
Public Function FromBase64(ByVal base64 As String) As Byte()
        If base64 Is Nothing Then Throw New ArgumentNullException("base64")
        Return Convert.FromBase64String(base64)
    End Function


El code fue extraido de : http://www.nonhostile.com/page-vb-net-base64-encoding-decoding.asp, pues ando bastante vago :D

Este code simplemente convertiría el string base64 extraído del ejecutable codificado en un Array de bytes ( Byte() ) el cual podrías cargar en el proceso deseado mediante Assembly.Load.

Si tu propósito fuera codear un Crypter entonces necesitarías decodificar un bloque de datos ( Byte() ) que represente el programa en b64.

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate


PokiPoki

#2
Hola kub0x,no se si no lo hago bien,pero no me funciona,asi e dejado el code
la funcion que tu me as dejado ya la estaba utilizando 'Convert.FromBase64String' esto hace la funcion si no me equivoco :huh:

Código (vbnet) [Seleccionar]
Private Sub ThreadWork()

       'Dim LoadedBytes As Byte() = My.Resources.Encrypt
       Dim LoadedBytes As String = Application.StartupPath & "\Encrypt.exe"
       Dim MyApp As Byte() = Convert.FromBase64String(Base64_To_String(LoadedBytes))
       Dim ExecutingAssemblyPath As String = String.Empty
       ExecutingAssemblyPath = Application.StartupPath
       Dim MyAssembly As System.Reflection.Assembly = System.Reflection.Assembly.Load(MyApp)
       MyAssembly.EntryPoint.Invoke(Nothing, Nothing)

   End Sub
   
   Private Function Base64_To_String(ByVal str As String) As String
       Return System.Text.Encoding.Default.GetString(Convert.FromBase64String(str))
   End Function
 


y con esto encrypto Test.exe para pasarlo a Encrypt.exe,esto si lo e sacado de un crypter...pero mi intencion no es hacer un crypter
si no,poder desencryptar Encrypt.exe y ejecutar esos byte en el Assembly.Load,ya que esa funcion crea un proceso en memorya si no
me equivoco

Código (vbnet) [Seleccionar]
Imports System
Imports System.Text
Imports System.Windows.Forms

Public Class Form1

   Dim FileNameOriginal As String = Application.StartupPath & "\Test.exe"
   Dim FileNameEncrypt As String = Application.StartupPath & "\Encrypt.exe"
   
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim FileOk, NameOk As String
       FileOpen(1, Application.StartupPath & "\Test.exe", OpenMode.Binary, OpenAccess.Read)
       FileOk = Space(LOF(1))
       FileGet(1, FileOk)
       FileClose(1)

       FileOpen(1, NameOk & "Encrypt.exe", OpenMode.Binary, OpenAccess.ReadWrite)
       FilePut(1, String_To_Base64(FileOk))
       FileClose(1)
End Sub

Private Function String_To_Base64(ByVal str As String) As String
       Return Convert.ToBase64String(System.Text.Encoding.Default.GetBytes(str))
   End Function  
End Class


no se que lechugas hago mal,no lo se,igual tendria que añadir algo mas?
si como lo e planteado no esta bien agradeceria que me organizaces un poco el code

Un saludo para el Foro

kub0x

Citando tu código:

Cita de: PokiPoki en 27 Mayo 2014, 18:19 PM
Código (vbnet) [Seleccionar]
Private Sub ThreadWork()

        'Dim LoadedBytes As Byte() = My.Resources.Encrypt
        Dim LoadedBytes As String = Application.StartupPath & "\Encrypt.exe"
        Dim MyApp As Byte() = Convert.FromBase64String(Base64_To_String(LoadedBytes)) 'TERRIBLE FALLO
        'más y más código...
        '....
    End Sub
   
    Private Function Base64_To_String(ByVal str As String) As String
        Return System.Text.Encoding.Default.GetString(Convert.FromBase64String(str))
    End Function
 


En tu ejecutable codificado tendrás el string en base64 que representa el conjunto de instrucciones o código de ese ejecutable. Lo que tienes que hacer es abrir dicho ejecutable, extraer la cadena en b64 y decodificarla en un array de bytes ( Byte() ) de esa forma podrías hacer Assembly.Load para cargar el ensamblado dinámicamente.

En tu código simplemente formas un string con la ruta del archivo codificado y mandas dicho string a ser decodificado en b64, a ver si nos fijamos un poquito más la siguiente vez ;)

Saludos!
Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate