[vbs]Cómo leer un archivo en modo binario ?

Iniciado por 0x0309, 13 Agosto 2009, 05:34 AM

0 Miembros y 1 Visitante están viendo este tema.

0x0309

Hola quiero hacer algo, pero no sé nada de vbs, así es que pido un poco de ayuda por favor.

Lo que quiero es leer un archivo binario y reemplazar 3 bytes, y luego escribir en el mismo archivo

estaba haciendo esto:

set unFileSystemObject = CreateObject("Scripting.FileSystemObject")
set archivo = unFileSystemObject.OpenTextFile("c:\f.bin", ForReading)
dim contenidoArchivo = archivo.ReadAll
contenidoArchivo = contenidoArchivo.Replace("")


y quiero reemplazar tres bytes, pero en modo binario, es decir supongamos que tengo los bytes:
1 2 3

y quiero reemplazarlos por:

1 2 0

Necesito que sea en binario porque el byte 0 es el ascii 0, y no es imprimible, por eso digo que debe ser binario.

Edito: ya encontré la solución.

Novlucker

Realmente no recuerdo una manera de tratar archivos en modo binario ... o la que recuerdo salta en los AV, pero claro, da igual si lo haces tu y sabes para que es que lo haces ... cual fue tu solución?  :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

0x0309

En realidad necesitaba este código para modificar un byte del archivo findstr.exe de windows, para poder utilizar un script que utiliza una virgulería de este comando e imprimir líneas de texto con color en cmd.exe. Esto es para que findstr no muestre el carácter :

Bueno, el código útil puede encontrarse aquí:
http://sites.google.com/site/cmdscripts/home/colores.zip?attredirects=0

Aquí está el código, lo que hace es reemplazar un byte:


'I found the information for modify a binary file with vbs in:
' http://www.governmentsecurity.org/forum/index.php?showtopic=18727


'With findstr.exe made %UserProfile%\findstr2.exe
'findstr2.exe is for not view the ':' with the option /a
'This alter the text: "%s:"
'hexadecimal: 25 73 3A
'by
'25 73 00
'Only change the 3A by 00

'This write findstr2.exe
'In findstr.exe not made changes.

Dim path,name,name2,obs,ows,strbin,i,f
Set ows = CreateObject("WScript.Shell")
path = ows.ExpandEnvironmentStrings("%SystemRoot%")
name = path & "\system32\findstr.exe"
path = ows.ExpandEnvironmentStrings("%UserProfile%")
name2 = path & "\findstr2.exe"
Set ofs = CreateObject("Scripting.FileSystemObject")

if ofs.FileExists(name) Then
strbin=RSBinaryToString(ReadBinaryFile(name))
i=InStr(1,strbin,chr(&H25)&chr(&H73)&chr(&H3A),0)
If i <> 0 Then
strbin=Left(strbin,i-1)&chr(&H25)&chr(&H73)&chr(&H00)&Mid(strbin,i+3)
Set f = ofs.OpenTextFile(name2,2,True,0)
f.Write strbin
f.Close
End If
End If

WScript.Quit

Function ReadBinaryFile(FileName)
Const adTypeBinary = 1
Dim BinaryStream : Set BinaryStream = CreateObject("ADODB.Stream")
BinaryStream.Type = adTypeBinary
BinaryStream.Open
BinaryStream.LoadFromFile FileName
ReadBinaryFile = BinaryStream.Read
BinaryStream.Close
End Function

Function RSBinaryToString(xBinary)
Dim Binary
If vartype(xBinary)=8 Then
Binary = MultiByteToBinary(xBinary)
Else Binary = xBinary
End If
Dim RS, LBinary
Const adLongVarChar = 201
Set RS = CreateObject("ADODB.Recordset")
LBinary = LenB(Binary)
If LBinary>0 Then
RS.Fields.Append "mBinary", adLongVarChar, LBinary
RS.Open
RS.AddNew
RS("mBinary").AppendChunk Binary
RS.Update
RSBinaryToString = RS("mBinary")
Else
RSBinaryToString = ""
End If
End Function

Novlucker

Entonces si ... estaba en lo cierto  :P

El método que conocía era ese .. haciendo uso del objeto ADODB.Stream, pero como decía .. el problema de ese objeto es que es detectado por muchos AV, ya que cuando aparecieron "bichos" programados en este lenguaje muchos lo utilizaban en las rutias downloader, aunque claro, un code hecho por uno mismo no debería de preocuparnos verdad?  :P

http://foro.elhacker.net/scripting/htmlvbsbatch_propagacion_a_traves_de_internet_posible-t221250.0.html

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

0x0309

mira parece que lo que detectan los antivirus es el objeto: Microsoft.XMLHTTP
porque envié a virustotal el findstr2.vbs y me arrojó 0/41 amenazas, así es que el objeto ADODB.Stream en mi código no da problemas.

Novlucker

Juaj ... entonces la combinación tal vez ... porque yo tengo códigos con el objeto Microsoft.XMLHTTP y no me da problemas ... quizás la heurística, ya que si a algo que tiene este último objeto le agrego el ADODB.Stream, entonces si  :-\

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein