El objetivo es generar ejecutables de tal forma que se pueda decidir el valor de ciertas variables sin disponer del código fuente.

Supongamos un cierto cypter. Como sabemos, está compuesto de por dos partes: cliente y stub. La mayoría de los crypters permite configurar ciertas opciones, como por ejemplo la contraseña. Estos parámetros se suelen añadir al final del archivo (EOF). A continuación propongo una alternativa a este método de configuración.

La idea básica es utilizar constantes en el stub que modificaremos en el compilado. Suena un poco raro modificar constantes en un binario, pero es justamente de lo que se trata.

El ejemplo más simple que se me ocurre es un programa que muestre un mensaje, y queremos poder modificar el mensaje que aparecerá. Para ello creamos una constante del tipo String. Debemos asegurarnos de que el valor que le demos será único.
Private Const VAR1 As String = "variable#01"    'Unique ID

Sub Main()

    MsgBox VAR1

End Sub
Al compilar el ejecutable, VB6 guarda el valor de las constantes en unicode con el formato BSTR. Por ejemplo, la cadena "variable#01" se almacenaría así:

Código: Seleccionar todo

 -----------------------------------------------------------------------------------------
 |16 00 00 00 | 76 00 61 00 72 00 69 00 61 00 62 00 6c 00 65 00 23 00 30 00 31 00 | 00 00| (Hex)
 |.  .  .  .  | v  .  a  .  r  .  i  .  a  .  b  .  l  .  e  .  #  .  0  .  1  .  | .  . | (Char)
 |Value Length|                               Value                               | Null | (Layout)
 -----------------------------------------------------------------------------------------
Los cuatro primeros bytes (big-endian) determian la longitud de la cadena: &H16 = 22 = 11 unicode chars (la longitud de la cadena). No se tiene en cuenta el null final para la longitud.

Ahora, el cliente lo que deberá hacer es buscar el identificador de cada constante, reemplazar dicho valor por el que quiera el usuario y corregir los cuatro bytes de longitud de la cadena. De eso se encarga la siguiente rutina:
Sub Patch(ByRef str As String, ByRef var As String, ByRef val As String)

    Dim sPad, sLen As String
    Dim iLen1, iLen2, iLen, i As Integer
    
    iLen1 = Len(var)
    iLen2 = Len(val)
    iLen = IIf(iLen1 < iLen2, iLen1, iLen2)                             'iLen = Minimum of iLen1 and iLen2
    
    i = InStr(str, var)                                                 'Look for variable
    If (i > 4) Then
        
        sPad = String$(iLen1, 0)
        Mid$(sPad, 1, iLen) = val                                       'Padding with Zeros
        
        Mid$(str, i - 1, 1) = Chr$((iLen And &HFF000000) / &H1000000)   '|
        Mid$(str, i - 2, 1) = Chr$((iLen And &HFF0000) / &H10000)       '|
        Mid$(str, i - 3, 1) = Chr$((iLen And &HFF00) / &H100)           '|
        Mid$(str, i - 4, 1) = Chr$(iLen And &HFF)                       '|_ String length patch
        
        Mid$(str, i, iLen1) = sPad                                      'String value patch
        
    End If
    
End Sub
Las ventajas de utilizar este método son:
  • No se utiliza EOF
  • Se simplifica el código en el sutb
Y las principal desventaja es que hay que fijar un tamaño máximo: no se puede superar la longitud del identificador.

Adjunto los proyectos completos a modo de ejemplo para el que quiera ponerlo en práctica (no compilados).

¡Un saludo!
No tiene los permisos requeridos para ver los archivos adjuntos a este mensaje.
github.com/Slek-Z
Gracias por el truco. muy bueno.

recuerda que visual basic solo inicializa el tipo de dato a las variables seguidas de as (tipo de dato) (Por si se te olvido.) y para los que se pregunten y vean que no funciona como la mayoría de otras lenguajes.


Dim sPad, sLen As String 'solo sLen es inicializada como cadena
Dim iLen1, iLen2, iLen, i As Integer 'solo sLen es inicializada como cadena


gracias Slek

Saludos
Imagen
Cierto, se me había olvidado. Gracias por recalcarlo, hace mucho que no utilizo VB6 xD

¡Un saludo master!
github.com/Slek-Z
Responder

Volver a “Manuales”