Codifica o arquivo binário como texto no Windows 2000+ usando ferramentas internas

3

Eu tenho acesso a área de trabalho remota via Citrix a um servidor remoto que executa o Windows 2000. O servidor não tem nenhum tipo de acesso à Internet. A única maneira de obter dados é copiar texto através da área de trabalho remota. Por alguma razão, copiar arquivos não funciona, apenas texto, mas funciona pelo menos até 10MB.

Existe alguma ferramenta interna (no Windows 2000) que me permita codificar e decodificar um arquivo binário para o texto (Base64, uEncode, hex, anything ...)?

    
por Knaģis 24.03.2014 / 14:43

2 respostas

3

Sim, há realmente .

Do cmd.exe,

Para codificar um arquivo: certutil -encode inputFileName encodedOutputFileName

Para decodificar um arquivo: certutil -decode encodedInputFileName decodedOutputFileName

    
por 08.04.2015 / 18:48
1

Aqui está escrito um script baseado em JScript que pode traduzir um arquivo binário para sua representação hexadecimal e vice-versa. Salve o código como HexEncoder.js , ou o que você quiser, desde que ele tenha a extensão .js .

// Original script written by paulkienitz, 20110301
// http://www.codeproject.com/Messages/3718403/a-shorter-and-quicker-way-modified.aspx

// Check the parameters count
if (WScript.Arguments.length < 3)
{
    WScript.Quit(2);
}

// Ensure the action parameter is long enough
if (WScript.Arguments(0).length < 2)
{
    WScript.Quit(3);
}

// Detect invalid characters
var action = WScript.Arguments(0).toUpperCase().charCodeAt(1);

switch (action)
{
    // 'D' or 'E'
    case 0x44:
    case 0x45:
        break;

    default:
        WScript.Quit(3);
        break;       
}

var fso = new ActiveXObject("Scripting.FileSystemObject");
var source = WScript.Arguments(1).replace("\", "\\");

// Check whether the source file actually exists
if (!fso.FileExists(source))
{
    WScript.Quit(4);
}

var dest = WScript.Arguments(2).replace("\", "\\");

// When we read a binary stream as ISO 8859-1 (Latin 1), we should get a
// string where each charCodeAt value matches the byte from the stream.
// Unfortunately Windows won't give you Latin 1 -- when you ask for it,
// you get code page 1252, which has extra characters stuck in for byte
// values from 128 to 159. These two strings allow us to translate between
// the bogus Windows characters and the original byte values.
var bogusWindows1252Chars =
    "\u20AC\u201A\u0192\u201E\u2026\u2020\u2021" +
    "\u02C6\u2030\u0160\u2039\u0152\u017D" +
    "\u2018\u2019\u201C\u201D\u2022\u2013\u2014" +
    "\u02DC\u2122\u0161\u203A\u0153\u017E\u0178";

// No translation is necessary for characters 0x81, 0x8D, 0x8F, 0x90, or 0x9D
var correctLatin1Chars =
    "\u0080\u0082\u0083\u0084\u0085\u0086\u0087" +
    "\u0088\u0089\u008A\u008B\u008C\u008E" +
    "\u0091\u0092\u0093\u0094\u0095\u0096\u0097" +
    "\u0098\u0099\u009A\u009B\u009C\u009E\u009F";

if (action == 0x44) // D
{
    decode(source, dest);
}
else if (action = 0x45) // E
{
    encode(source, dest);
}

// This turns a string read as codepage 1252 into a boxed string with a
// byteAt method.
function binaryString(str)
{
    // Always return an object with a .length
    var r = str ? new String(str) : new String();

    r.byteAt = function(index)
    {
        var value = this.charCodeAt(index);

        // Translate character back to originating Windows-1252 byte value
        if (value > 0xff)
        {
            var p = bogusWindows1252Chars.indexOf(this.charAt(index));
            value = correctLatin1Chars.charCodeAt(p);
        }

        // Convert the value to hexadecimal
        var hex = value.toString(16);

        return (hex.length == 2) ? hex : "0" + hex;
    };

    return r;
}

// Does reverse translation from bytes back to Windows-1252 characters.
function fromByte(hex)
{
    var c = String.fromCharCode(parseInt(hex, 16));
    var p = correctLatin1Chars.indexOf(c);
    return (p == -1) ? c : bogusWindows1252Chars.charAt(p);
}

function encode(source, dest)
{
    var stream = new ActiveXObject("ADODB.Stream");
    stream.Type = 2 // adTypeText
    stream.Charset = "iso-8859-1"; // actually Windows codepage 1252
    stream.Open();
    stream.LoadFromFile(source);

    var chunkSize = 4096;
    encodedFile = fso.OpenTextFile(dest, 2, true); // 2 = ForWriting

    while (!stream.EOS)
    {
        var s = binaryString(stream.ReadText(chunkSize));
        var tempArray = new Array();

        for (var i = 0; i < s.length; i++)
        {
            tempArray[i] = s.byteAt(i);
        }

    var hexString = tempArray.join("");

        if (hexString.length > 0)
        {
            encodedFile.Write(hexString);
        }
    }

    encodedFile.Close();
    stream.Close();    
}

function decode(source, dest)
{
    var chunkSize = 8192;
    var encodedFile = fso.OpenTextFile(source, 1); // 1 = ForReading
    var decodedFile = fso.OpenTextFile(dest, 2, true); // 2 = ForWriting

    while (!encodedFile.AtEndOfStream)
    {
        var hexString = encodedFile.Read(chunkSize);
        var tempArray = new Array();

        for (var i = 0; i < hexString.length; i += 2)
        {
            tempArray[i >> 1] = fromByte(hexString.substring(i, i + 2));
        }

        var s = tempArray.join("");

        if (s.length > 0)
        {
            decodedFile.Write(s);
        }
    }

    decodedFile.Close();
    encodedFile.Close();
}

Sintaxe

Para codificar um arquivo binário:

cscript /nologo /e:jscript HexEncoder.js /e "binary file" "output file"

Para reverter:

cscript /nologo /e:jscript HexEncoder.js /d "encoded file" "binary file"

Exemplo de uso

O comando a seguir codificará notepad.exe e salvará a saída na área de trabalho:

cscript /nologo /e:jscript HexEncoder.js /e "%windir%\notepad.exe" "%userprofile%\Desktop\notepad.exe-hex.txt"

Limitações conhecidas

  • Os arquivos codificados têm o dobro do tamanho dos originais.
  • O script é mais adequado para arquivos pequenos, digamos, abaixo de 1024 KiB.

    Por fim, você pode contornar essas limitações usando o script acima para transferir algum codificador de terceiros.

por 27.03.2014 / 18:23