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)
-----------------------------------------------------------------------------------------
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
Adjunto los proyectos completos a modo de ejemplo para el que quiera ponerlo en práctica (no compilados).
¡Un saludo!