3

I have remote desktop access via Citrix to a remote server running Windows 2000. The server does not have any kind of internet access. The only way of getting data across is copying text through the remote desktop. For some reason copying files does not work, only text but it works at least up to 10Mb.

Are there any built-in tools (in Windows 2000) that would enable me to encode and decode a binary file to text (Base64, uEncode, hex, anything...)?

  • 2
    No; There are not built-in tools like what you require. You will need to place a third-party tool on the server. – Ramhound Mar 24 '14 at 13:50
  • bastet.com – Ƭᴇcʜιᴇ007 Mar 24 '14 at 13:51
  • When I'm facing issues like that I usually "cheat" and upload the files I need to ""public"" places (ftp, etc) visible to the remote server and download the files from there (also a solution to install a local ftp server and start only when connecting with the remote PC - so it's super secure :) – user221741 Mar 24 '14 at 14:00
  • @techie007 - those solutions do not apply to my case because I have Citrix in the middle - as a result the remote desktop does not see the drives on my computer but rather of some intermediate server that I do not have access to. – Knaģis Mar 24 '14 at 14:11
4

Yes, there is actually.

From cmd.exe,

To encode a file: certutil -encode inputFileName encodedOutputFileName

To decode a file: certutil -decode encodedInputFileName decodedOutputFileName

1

Here's a JScript-based script I've written which can translate a binary file to its hexadecimal representation, and vice-versa. Save the code as HexEncoder.js, or whatever you want as long it has the .js extension.

// 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();
}

Syntax

To encode a binary file:

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

To revert back:

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

Example usage

The following command will encode notepad.exe and save the output to the desktop:

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

Known limitations

  • Encoded files are twice the size of the original ones.
  • The script is best suited for small files, say under 1024 KiB.

    Eventually you could work around these limitations by using the script above to transfer some third party encoder.

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.