Jump to content
LuisRojas

Proyecto VBA bloqueado y desbloqueado

Recommended Posts

Hola mundo! Espero no revivir un muerto

Estaba leyendo en el grupo y vi un post sobre el proyecto bloqueado, pero el tema ya fue cerrado, por lo que publiqué este nuevo

He logrado generar el proyecto bloqueado manualmente, aquí les dejo dos archivos uno 'Sin proyecto bloqueado' y el otro que con 'el proyecto bloqueado', que lo puedo generar con un lector hexadecimal

https://drive.google.com/drive/folders/1ND0fWbdMRU6AkIwxICimpGhCGLIlHDdV?usp=sharing

Como les comenté he logrado generar el proyecto bloqueado, pero mi duda va más por cómo regresar mi archivo con proyecto bloqueado al archivo original, ciertamente lo hexadecimal me marea un poco

En la siguiente imagen les muestro cómo he generado el proyecto bloqueado: https://drive.google.com/file/d/1ir3YtQN168DC6ivSqjZN5JdtpFhhsyqc/view?usp=sharing

Habrá alguien en el grupo que me pueda explicar sobre la igualdad que debería tener el CMG, GC y DPB para desbloquearlo?, o sino otra forma de desbloquearlo manualmente, ya que programas para realizar este 'desbloqueo' existen, pero quiero aprender a hacerlo manualmente

Espero sus respuestas

Share this post


Link to post
Share on other sites

Hola

Antes de cambiar por esas "F", copia los valores originales en algún lugar, bloquea el archivo tal cual lo has hecho, cuando quieras volver a desbloquearlo, solo reemplaza las "F" que colocaste por los valores originales que guardaste en algún lado y listo, archivo recuperado.

OJO, los "clásicos" programas para desbloquear proyectos VBA no podrán desbloquearlo ya que en realidad lo que se ha hecho es "ocultar" los módulos para que no sean visibles, no están realmente bloqueados con una clave, por eso la forma de recuperarloes  reemplazar los valores por los "originales" no usar un programa de desbloqueo (no funcionaran).

Si un tercero hace lo mismo que tú, tampoco es complicado desbloquear, solo se reemplaza por estos valores:

5557BEFEC6BECABECABECABECA

1113FAFFFBFFFBFF

CDCF26065EC35FC35F3C

En el orden respecto, el primero para CMG, el segundo para DPB y el tercero para GC. ¿Cómo los conseguí? Son valores de un archivo cualquiera que en el encriptado que usa Excel dice:

CMG: No está restringido el acceso al proyecto

DPB: No tiene clave

GC: El proyecto es visible

Eso, listo.

Abraham Valencia

 

Edited by avalencia

Share this post


Link to post
Share on other sites

Gracias @avalencia me ha funcionado bien. aunque este método no funciona con archivos que han sido generados con algunos programas, acabo de encontrar un código bastante interesante tratando de investigar sobre este tema

Continuaré investigando para complementar más la idea

Share this post


Link to post
Share on other sites

Si te refieres a archivos generados con "xlLock" o "Locked" que convierten los archivos de Excel a *.exe, así es, hacen otras cosas pero también son desbloqueables je je je. ¿o te refieres a otras cosas?

Como comentario, no existe protección infalible para Excel, todo es desbloqueable. Ah, bueno, si se usa VSTO, eso sí es otro cantar.

Abraham Valencia

Share this post


Link to post
Share on other sites

No viene con el tema de 'proyecto bloqueado', pero he logrado obtener esto

https://1drv.ms/x/s!AirYPHTXALPMhgtFOqdmo4BEb0Kw

Agreándole un 'bloqueo' daría mayor seguridad

@avalencia no me gusta mencionar código que he visto y no lo tengo ahora, pero en una ocasión una persona con quien me medía en VBA me pasó un archivo que después de desbloquear pude ver código ofuscado VBA (similar al que adjunto) y en una parte decía CMG="", DPB="" GC="", lamentablemente no tengo el archivo

Sabrás si puedo modificar estos valores desde VBA? quizá con alguna API. Te comento que a la fecha estoy siguiendo a un vietnamita programador en VBA Excel, y coloca mucho código interesante, por ejemplo este:


Option Explicit

Private Const PAGE_EXECUTE_READWRITE = &H40

Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)

Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr

Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr

Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
ByVal lpProcName As String) As LongPtr

Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer

Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As LongPtr
Dim Flag As Boolean

Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
    GetPtr = Value
End Function

Public Sub RecoverBytes()
    If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub

Public Function Hook() As Boolean
    Dim TmpBytes(0 To 5) As Byte
    Dim p As LongPtr
    Dim OriginProtect As LongPtr

    Hook = False

    pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")


    If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then

        MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
        If TmpBytes(0) <> &H68 Then

            MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6

            p = GetPtr(AddressOf MyDialogBoxParam)

            HookBytes(0) = &H68
            MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
            HookBytes(5) = &HC3

            MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
            Flag = True
            Hook = True
        End If
    End If
End Function

Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer

    If pTemplateName = 4070 Then
        MyDialogBoxParam = 1
    Else
        RecoverBytes
        MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                   hWndParent, lpDialogFunc, dwInitParam)
        Hook
    End If
End Function

Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Sub

 

Con el cual se puede liberar la contraseña de un proyecto VBA (64bits) sin necesidad de usar un hexadecimal, ni el típico cambio de DPB a DPx

Share this post


Link to post
Share on other sites
Hace 59 minutos , avalencia dijo:

Si te refieres a archivos generados con "xlLock" o "Locked" que convierten los archivos de Excel a *.exe, así es, hacen otras cosas pero también son desbloqueables je je je. ¿o te refieres a otras cosas?

Como comentario, no existe protección infalible para Excel, todo es desbloqueable. Ah, bueno, si se usa VSTO, eso sí es otro cantar.

Abraham Valencia

Me refería a archivos como este https://1drv.ms/x/s!AirYPHTXALPMhgx7zbHqls2mlvYj

(Que es de descarga gratis desde la web)

Y fue protegido con Unviewable+ 2.7.3, en este caso no puedo desbloquearlo

Share this post


Link to post
Share on other sites
Hace 21 minutos , bigpetroman dijo:

Saludos @LuisRojas, interesante el tema, aqui en el foro está un tema sobre ofuscar el codigo que tratamos algo hace tiempo

 

 

Saludos

Claro esa ofuscación es cambiando los nombres de módulos, procesos, funciones y variables a esta forma i101101l0 

Pero la que he adjuntado es de esta forma


Option Explicit
Const BmLGnerFlNWocU = "EDJ(thv-Y8r­U:Iex-29=\OuM[{>"
Const nebEGDXSXxaUBUxwzCloLPUoY = _
"Qr@W<SVJ@g/2j^~9­%GhFtQ[kxOSDao<%+[mChC"
Public jENBaeDwEJWbTSzpzfRnTqsBRutZlku As _
String
Function CqhIMDiALohuSNoCbIFFRxUigWHAFpy(OMZfAMOCV As String) As String
CqhIMDiALohuSNoCbIFFRxUigWHAFpy = SKZbYYHYApXwsyIUzNawpqEiZSrbpAX(OMZfAMOCV)
End Function
Function _
SKZbYYHYApXwsyIUzNawpqEiZSrbpAX(ykyyvxNRYfYQ As _
String) As _
String
Dim iKcdZPqRjUprE As Byte, rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE As Long, OTLAeQNkZvgO As Integer, RCwymCjoWmarswqbGRLeV As Integer, PvlyHBcMRhTsQ As Long, aFKMSsUbFtlmItcDAH As Long, aZBYfonpWJIuUnKpyYzteSZG As Long, ptueAHfGdIqysAQaQn As String, mGAXQjfB As String, FIkiydcBOieKJuPMryMBrEpzOCKA As String, zxVnYNYnElZuZVuRTRgvhtQLnhu As String, aqWUqbjkvXWJYyaJDfbfbOnbMAI As String
FIkiydcBOieKJuPMryMBrEpzOCKA = ""
If ykyyvxNRYfYQ <> "" Then
zxVnYNYnElZuZVuRTRgvhtQLnhu = ykyyvxNRYfYQ
iKcdZPqRjUprE = 29687 - &H734A
RCwymCjoWmarswqbGRLeV = InStr(ykyyvxNRYfYQ, _
Chr(iKcdZPqRjUprE))
If jENBaeDwEJWbTSzpzfRnTqsBRutZlku = "" Then
aqWUqbjkvXWJYyaJDfbfbOnbMAI = """"
For PvlyHBcMRhTsQ = _
&H373E - 14110 To 4922 - &H12BC
If InStr( _
aqWUqbjkvXWJYyaJDfbfbOnbMAI, Chr( _
PvlyHBcMRhTsQ)) = 0 Then jENBaeDwEJWbTSzpzfRnTqsBRutZlku = jENBaeDwEJWbTSzpzfRnTqsBRutZlku & _
Chr(PvlyHBcMRhTsQ)
Next _
PvlyHBcMRhTsQ
End If
aZBYfonpWJIuUnKpyYzteSZG = Len(jENBaeDwEJWbTSzpzfRnTqsBRutZlku)
mGAXQjfB = Left( _
zxVnYNYnElZuZVuRTRgvhtQLnhu, _
RCwymCjoWmarswqbGRLeV - 1)
zxVnYNYnElZuZVuRTRgvhtQLnhu = Right(zxVnYNYnElZuZVuRTRgvhtQLnhu, Len(zxVnYNYnElZuZVuRTRgvhtQLnhu) - _
RCwymCjoWmarswqbGRLeV)
ptueAHfGdIqysAQaQn = ""
For PvlyHBcMRhTsQ = 1 To Len(zxVnYNYnElZuZVuRTRgvhtQLnhu) Step 2
ptueAHfGdIqysAQaQn = _
ptueAHfGdIqysAQaQn & _
Mid( _
zxVnYNYnElZuZVuRTRgvhtQLnhu, PvlyHBcMRhTsQ + 1, 1) & _
Mid(zxVnYNYnElZuZVuRTRgvhtQLnhu, PvlyHBcMRhTsQ, 1)
Next PvlyHBcMRhTsQ
zxVnYNYnElZuZVuRTRgvhtQLnhu = _
ptueAHfGdIqysAQaQn
aFKMSsUbFtlmItcDAH = 0
For _
PvlyHBcMRhTsQ = 1 To _
Len( _
zxVnYNYnElZuZVuRTRgvhtQLnhu)
ptueAHfGdIqysAQaQn = Mid(zxVnYNYnElZuZVuRTRgvhtQLnhu, PvlyHBcMRhTsQ, 1)
rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE = Asc(ptueAHfGdIqysAQaQn)
RCwymCjoWmarswqbGRLeV = InStr( _
jENBaeDwEJWbTSzpzfRnTqsBRutZlku, ptueAHfGdIqysAQaQn)
If RCwymCjoWmarswqbGRLeV = 0 Then
If rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE >= (483 - &H163) Then
rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE = rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE + (&H6ED6 - _
28310)
If rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE > (21678 - _
&H53AF) Then rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE = _
rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE - _
(&H44CE - _
17486)
ptueAHfGdIqysAQaQn = _
Chr(rmUoKGAsfWuGMQDUVNJXIUtNNkRFXQE)
End If
FIkiydcBOieKJuPMryMBrEpzOCKA = FIkiydcBOieKJuPMryMBrEpzOCKA & ptueAHfGdIqysAQaQn
Else
aFKMSsUbFtlmItcDAH = aFKMSsUbFtlmItcDAH + _
1
If _
aFKMSsUbFtlmItcDAH > Len(mGAXQjfB) Then aFKMSsUbFtlmItcDAH = 1
OTLAeQNkZvgO = Asc(Mid(mGAXQjfB, _
aFKMSsUbFtlmItcDAH, 1))
RCwymCjoWmarswqbGRLeV = RCwymCjoWmarswqbGRLeV - _
OTLAeQNkZvgO
While RCwymCjoWmarswqbGRLeV > _
aZBYfonpWJIuUnKpyYzteSZG
RCwymCjoWmarswqbGRLeV = RCwymCjoWmarswqbGRLeV - aZBYfonpWJIuUnKpyYzteSZG
Wend
While RCwymCjoWmarswqbGRLeV < 0
RCwymCjoWmarswqbGRLeV = RCwymCjoWmarswqbGRLeV + _
aZBYfonpWJIuUnKpyYzteSZG
Wend
If RCwymCjoWmarswqbGRLeV = 0 Then RCwymCjoWmarswqbGRLeV = aZBYfonpWJIuUnKpyYzteSZG
FIkiydcBOieKJuPMryMBrEpzOCKA = FIkiydcBOieKJuPMryMBrEpzOCKA & Mid(jENBaeDwEJWbTSzpzfRnTqsBRutZlku, RCwymCjoWmarswqbGRLeV, 1)
End If
Next PvlyHBcMRhTsQ
End If
SKZbYYHYApXwsyIUzNawpqEiZSrbpAX = FIkiydcBOieKJuPMryMBrEpzOCKA
End Function
Sub macro1()
MsgBox CqhIMDiALohuSNoCbIFFRxUigWHAFpy(BmLGnerFlNWocU), vbInformation, "Luis Rojas"
End Sub
Sub macro2()
MsgBox aWmBKfnaMCtHjBNKJtDBMONaoxlugea( _
nebEGDXSXxaUBUxwzCloLPUoY), vbInformation, _
"Luis Rojas"
End Sub
Function aWmBKfnaMCtHjBNKJtDBMONaoxlugea(ghEoRjlqdMhhf As String) As String
aWmBKfnaMCtHjBNKJtDBMONaoxlugea = SKZbYYHYApXwsyIUzNawpqEiZSrbpAX(ghEoRjlqdMhhf)
End Function

Me parece más dificil de entender, al menos para un usuario estándar, el código original fue este:


Sub macro1()
    MsgBox "Soy un cacahuate", vbInformation, "Luis Rojas"
End Sub

Sub macro2()
    MsgBox "Todos somos cacahuates", vbInformation, "Luis Rojas"
End Sub

Ahora agregándo un ROT13 al nombre (Luis Rojas) me parece que se podría mejorar un poco

Share this post


Link to post
Share on other sites
Hace 2 horas, bigpetroman dijo:

Saludos @LuisRojas, interesante el tema, aqui en el foro está un tema sobre ofuscar el codigo que tratamos algo hace tiempo

 

 

Saludos

@bigpetroman estaba leyendo la publicación que mencionaste, te comento que la forma de generar una ofuscación de este tipo OO001ll0O1l es con unviewable+ (https://www.spreadsheet1.com/unviewable-vba-project-app-for-excel.html)

Aquí un ejemplo https://www.spreadsheet1.com/excel-vba-code-obfuscation.html

Share this post


Link to post
Share on other sites

Hola amigos, aunque pude leerlos desde el celular recién me siento en la PC.

Sobre ofuscar, así sea solo el código y/o los nombres de los módulos, siempre habrá una abuelo de Ron de Bruin (te odio @Gerson Pineda) que pueda "desofuscarlo", claro, como bien ya mencionan para el usuario "promedio" no será nada fácil y hasta quizás imposible y así se sepa como hacer, encontrar el algoritmo necesario puede llevar un tiempo que quizá para algunos (me incluyo) no compense el esfuerzo.

Sobre las propiedades CMG, DPB o CG "vacías", entiendo que no tengas algún archivo así pero para saber que hicieron habría que ver el archivo.

Ah, por cierto para modificar todas esas cosas desde VBA, claro que se puede y sin necesidad de funciones de la API, solo hay que reproducir todo desde VBA, o sea, hay que programar mucho (yo lo tengo hecho en VB.Net y C++) reproduciendo lo siguiente:

- Elegir el archivo

- Copiarlo y cambiarle la extensión

- Descomprimirlo

- Abrir el archivo bin con ADO como si fuera texto

- Buscar la cadena de texto necesaria y reemplazarla, guardar el archivo

- Volver a comprimirlo y cambiarle  la extensión y listo

Suena fácil pero hay que pensarlo bien y programarlo pero, de poder, se puede.

Sobre lo que envías de nuestro amigo vietnamita, también se puede con office de 32 bits por si acaso, yo lo he hecho varias veces, es un buen truco ya que  se "engaña" al Excel para que crea que el valor enviado al cuadro de dialogo de la contraseña es el adecuado. En resumen,  cuando uno ingresa una contraseña correcta, para Excel el resultado es un 1, si es incorrecta es un 0, usando funciones de la API de Windoes se simula el 1. Claro, el archivo bloqueado debe estar necesariamente abierto y solo funciona para claves de proyectos VBA, no para otros tipos de bloqueo.

Sobre el archivo bloqueado con Unviewable+, también se puede desbloquear, solo hay que "reconstuir" el archivo bin (reemplazando los nombres de los módulos estándar y los de Clase además de algunos otros cambios en las ´propiedades así como usar unas funciones de la API para mostar el proyecto VBA. Después de eso hay que "desofuscar" el código también. Menudo trabajito si son muchos módulos y/o mucho código. Es la ventaja de usar aplicaciones de terceros, como bien ya habíamos dicho con @Gerson Pineda. Yo ya lo he hecho pero en este caso no lo haré ya que el archivo pertenece a mi amigo Gustavo Sebastiani y además fue "bloqueado" por mi gran amigo Sergio Alejandro Campos. Por respeto a la amistad, no debo tocar dicho archivo.

Por cierto, repito, hasta ahora lo que no he podido desbloquear son archivos *.xlsm con VSTO. Lo único.

Saludos

Abraham Valencia

Edited by avalencia

Share this post


Link to post
Share on other sites

Gracias @avalencia por tu respuesta, voy a buscar el archivo con las modificaciones de CMG, DPB y GC igual a "vacías", me lo enviaron por whatsapp hace tiempo y como cambio de cuentas constantemente, lo he perdido, pero trataré de conseguir uno similar

El proceso que describes para la modificación desde VBA, lo entiendo, pero cuando mencionas a ADO a qué te refieres? Normalmente ADO lo utilizo para conexión a BD, a menos que sea otro ADO

El código del amigo vietnamita lo he usado principalmente para desbloqueo de archivo xlam, y me ha servido mucho, he encontrado código muy interesante

Sobre el archivo protegido con Unviewable+, sólo lo coloqué como ejemplo, ese archivo es de descarga gratuita, y sólo mencioné que con el método que explicaste inicialmente no se podía leer, pero ahora ya entiendo mejor la lógica de cómo 'desbloquearlo' manualmente; para leer cualquier archivo de Gustavo basta con usar a LibreOffice y se tendrá el acceso, eso lo descubrí hace unos años, lamentablemente ya no publica mucho

Más adelante investigaré sobre VSTO, ahora estoy un poco entretenido con otro lenguaje jeje, gracias por el dato

Bastante interesante el tema

Share this post


Link to post
Share on other sites

ADO también sirve para los archivos de texto, finalmente el archivo bin es casi casi eso je je je

Además de LibreOffice, se puede usar también la hoja de cálculo de google para desproteger varias cosas como las hojas

Saludos

Abraham Valencia

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...

Important Information

Privacy Policy

Ayuda Excel - Madrid, Madrid, ES - Valorada por 6254 personas - Aprender Excel - Total: 4.7 / 5