#GEDZAC Mitosis eZine Issue 4
#MITOSIS ARTICLE#
#Interprete String de un ejecutable
#Autor: MOWPaX[GEDZAC]
<mowpax[at]gedzac[dot]com>

Este articulo se me ocurrió en una de mis tantas tardes en las que intento mantener nuestro ejecutable mas “seguro” evitando ciertos programitas indeseables. Quiero aclarar que todos mis articulos son cortos =P, pero siempre soy breve con mis explicaciones, espero que sepan entender. Consiste en leer strings de los ejecutables que se van a ejecutar y comparándolas con estándares fijados por nosotros.
Con esto me refiero a que:
[*] Se hace una petición para ejecutar un programa
[*] Manipulo dicha petición y la pongo en pausa por unos instantes
[*] Reviso las strings del ejecutable
[*] Las comparo
[*] Tomo la decisión correcta (aceptar petición, o no aceptar)
[*] Creo que esto ya empezó a aburrir asi que pasemos a la parte teorico-practica.

Tal vez esta forma no sea eficiente, y existan otras mejores, pero creo que lo que importa es que pude encontrar un método generado por un razonamiento mio que cumpla con la finalidad deseada. Primero tendremos que manipular la ejecución de programas, esto es conocido por la mayoría de las personas asi que no expando el tema:

"HKEY_CLASSES_ROOT\exefile\shell\open\command\", "miexe.exe" & " " & Chr(34) & "%1" & Chr(34) & " %*"
Bueno con esa clave, hacemos que al intentar ejecutar un programa, antes se ejecute el miexe.exe, ahora bien, obviamente el miexe.exe será programa por nosotros.

Lo que hará este archivo será leer la línea de comandos para obtener la ruta y nombre del programa que intenta ejecutarse, una vez obtenida dicha línea, abrirá el archivo en modo binario y lo transformará los bytes en hexadecimal que almacenara en un buffer. Antes de esto, (o después) tendrá que pasar a hexadecimal las strings que querramos buscar:


Linea = “nod32”
For i = 1 To Len(Linea) - 1
LineaHexa = LineaHexa + Hex$(Asc(Mid(Linea, i, 1))) + "00"
Next
LineaHexa = LineaHexa + Hex$(Asc(Mid(Linea, i, 1)))


Lo que hace ese code es, pasar la string “nod32” a hexadecimal.
Ahora paso a mostrar el código para leer un archivo en modo binario, completar la transformación a hexa, y comparando el código con la string (en hexa):


Open Lineadecomandos For Binary As #1
While Not EOF(1)
Get #1, , A$
B$ = Asc(A$)
If B >= 90 Then B = B - 32
B$ = Hex$(B)
If Len(H) >= Len(LineaHexa) Then
H = Mid(H, 3, Len(LineaHexa) - 2)
End If
If Len(B$) = 1 Then B$ = "0" + B$
H = H + B$ Wend
Close

Sub Buscar()
If (InStr(H, LineaHexa) <> 0) Or (InStr(H, LineaHexa1) <> 0) Or (InStr(H, LineaHexa2) <> 0) Then
MsgBox "Contiene la string buscada"
Kill Lineadecomandos ‘aquí pondremos la acción que quieras.
End If
End Sub


Creo que el code es muy entendible y no requiere una explicacion mas que un simple analisis. Puede observarse que una linea convierte los caracteres en minusculas de modo que la string "nod32" sea igual a "NoD32"
Paso a comentar algunas dificultades, piensen que si una persona intenta abrir un archivo ejecutable que pesa unos 5mb, nuestro programa tendrá que leerlo y transformarlo todo y compararlo, obviamente llevara mucho tiempo y consumirá memoria :S. Esto lo pude mejorar un poco, antes había diseñado un code en el que el tiempo de espera era mayor, pero pude reducirlo, aunque no mucho.
Para “solucionar” el problema, pensé en que nuestro programa solo podría analizar archivos con un determinado peso.

If FileLen(LineadeComandos) > 1024000 Then
MsgBox "Archivo muy grande"
Call Ejecutarprograma
End If


Con este code, estaremos dispuestos a analizar solo los archivos que tengan un peso inferior a 1 mega.
Bueno, espero que puedan encontrar un método que agilize el análisis de los ejecutables y que les sea de mucha ayuda. En vez de tomar el control de los ejecutables pueden optar por hacer busquedas de los archivos ejecutables del disco entero y ahi comenzar a leer su contenido, pero dejo a criterio de ustedes la forma de implementar el interprete.
Me pareció una buena idea la de escribir un articulo sobre este tema, ya que interpretar las string de un ejecutable es algo que no había visto antes (no soy de mirar mucho xD).
Conclusion, con esto podrán evitar y eliminar a los programas que tengan dentro de su código string que pongan en juego la existencia de nuestro ejecutable.

(C) Mitosis 4 - GEDZAC LABS