[Question] Using Base64 to store a file in batch

Discussion forum for all Windows batch related topics.

Moderator: DosItHelp

Post Reply
Message
Author
SirJosh3917
Posts: 35
Joined: 02 May 2016 18:59

[Question] Using Base64 to store a file in batch

#1 Post by SirJosh3917 » 18 Aug 2016 18:53

I've seen some other batch files where they convert a file to base 64, do some magic "echo", and whala, here's your file.
I was wondering how exactly could you recreate this? I program in C# so I can code in that to achieve the goal I desire,
and perhaps on the side, create a utility tool to allow for this type of work to be done.

ShadowThief
Expert
Posts: 909
Joined: 06 Sep 2013 21:28
Location: Virginia, United States

Re: [Question] Using Base64 to store a file in batch

#2 Post by ShadowThief » 18 Aug 2016 19:22

The easiest way is the certutil command with the -encode option.

Code: Select all

Usage:
  CertUtil [Options] -encode InFile OutFile
  Encode file to Base64

Options:
  -f                -- Force overwrite
  -Unicode          -- Write redirected output in Unicode
  -UnicodeText      -- Write output file in Unicode
  -gmt              -- Display times as GMT
  -seconds          -- Display times with seconds and milliseconds
  -v                -- Verbose operation
  -privatekey       -- Display password and private key data
  -pin PIN                  -- Smart Card PIN
  -sid WELL_KNOWN_SID_TYPE  -- Numeric SID
            22 -- Local System
            23 -- Network Service
            24 -- Local Service

CertUtil -?              -- Display a verb list (command list)
CertUtil -encode -?      -- Display help text for the "encode" verb
CertUtil -v -?           -- Display all help text for all verbs


And you can use -decode to convert base64 to a file in the same way.

SirJosh3917
Posts: 35
Joined: 02 May 2016 18:59

Re: [Question] Using Base64 to store a file in batch

#3 Post by SirJosh3917 » 18 Aug 2016 19:31

@ShadowTheif
Thank you for your very helpful reply! This will help me a great amount.

aGerman
Expert
Posts: 3706
Joined: 22 Jan 2010 18:01
Location: Germany

Re: [Question] Using Base64 to store a file in batch

#4 Post by aGerman » 19 Aug 2016 00:01

This is the code that I use for "encode_b64.bat":

Code: Select all

@echo off
for /f %%i in ("certutil.exe") do if not exist "%%~$path:i" (
  echo CertUtil.exe not found.
  pause
  exit /b
)
certutil.exe -f -encode "%~1" "temp.b64~" || (pause&exit /b)

>"decode_%~n1_b64.bat" (
  echo(@echo off
  echo(for /f %%%%i in ("certutil.exe"^) do if not exist "%%%%~$path:i" (
  echo(  echo CertUtil.exe not found.
  echo(  pause
  echo(  exit /b
  echo(^)
  echo(^>"temp.b64~" (
  for /f "usebackq delims=" %%i in ("temp.b64~") do echo(echo(%%i
  echo(^)
  echo(certutil.exe -f -decode "temp.b64~" "%~nx1"
  echo(del "temp.b64~"
  echo(pause
)
del "temp.b64~"

Either drag/drop a file onto this "encode_b64.bat" or you pass the file name as argument when you call it. It automatically creates the batch file to decode and restore your passed file.

Regards
aGerman

mphevia
Posts: 1
Joined: 25 May 2015 07:56

Re: [Question] Using Base64 to store a file in batch

#5 Post by mphevia » 19 Aug 2016 03:30

Another way to decode base64 using cscript hybrid.

I also use base64 encoding to store data files in batch scripts. I use certutil to encode data, then paste the resulting encoded data removing the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- lines.

To extract the data, certutil may be used again (it is more simple), but I use this code (more complex, as I am).

This script decode and extract as many data sections as found enclosed between :base64Encoded:section:.


Code: Select all

@echo off

:searchAndDecode
SetLocal EnableDelayedExpansion & set "_FILES_=" & set "fil=" & set "ini="
set "_vbs_file_=%TEMP%\%~n0.vbs"

::search for encoded data
for /F "usebackq tokens=1-3 delims=:" %%1 in (`findstr /B /N ":base64Encoded:" "%~f0"`) do (
    if "%%3" EQU "!fil!" (set "_FILES_=!_FILES_!!fil!:!ini!:%%1,") else (set "fil=%%3" & set "ini=%%1")
)
set "_FILES_=%_FILES_:~0,-1%"

rem create a vbscript to do the decoding
for %%# in (%_FILES_%) do (
  for /F "tokens=1-3 delims=:" %%1 in ("%%#") do (
    (
      echo/set outStream=CreateObject("ADODB.Stream"^) ^: outStream.Type=1 ^: outStream.Open
      echo/set oFS=CreateObject("Scripting.FileSystemObject"^)
      echo/set inStream=oFS.OpenTextFile("%~f0",1,0,0^)
      echo/set oXML=CreateObject("MSXml2.DOMDocument"^)
      echo/set oItem=oXML.createElement("tmp"^)
      echo/oItem.DataType="bin.base64" ^: for i=1 to %%2 step 1 ^: inStream.readline ^: next
      echo/do while i^<%%3 ^: oItem.text=inStream.readline ^: decodedBytes=oItem.NodeTypedValue ^: outStream.Write decodedBytes ^: i=i+1 ^: loop
      echo/outStream.SaveToFile "%TEMP%\%%1",2 ^: inStream.close ^: outStream.close
      echo/set oItem=nothing ^: set oXML=nothing ^: set outStream=nothing ^: set inStream=nothing ^: set oFS=nothing
    )>"%_vbs_file_%"
    Cscript.exe /B /E:vbs "%_vbs_file_%" >NUL
    start notepad "%TEMP%\%%1"
  )
)
del /F /Q "%_vbs_file_%" 2>NUL

EndLocal
exit/B 0



:base64Encoded:loremIpsum.txt:
TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2Np
bmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgDQp1dCBs
YWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBtaW5pbSB2
ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyANCmxhYm9y
aXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlz
IGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUg
DQp2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlh
dHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lk
ZW50LCANCnN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0
IGFuaW0gaWQgZXN0IGxhYm9ydW0uDQoNClNlZCB1dCBwZXJzcGljaWF0aXMgdW5k
ZSBvbW5pcyBpc3RlIG5hdHVzIGVycm9yIHNpdCB2b2x1cHRhdGVtIGFjY3VzYW50
aXVtIGRvbG9yZW1xdWUgbGF1ZGFudGl1bSwgDQp0b3RhbSByZW0gYXBlcmlhbSwg
ZWFxdWUgaXBzYSBxdWFlIGFiIGlsbG8gaW52ZW50b3JlIHZlcml0YXRpcyBldCBx
dWFzaSBhcmNoaXRlY3RvIGJlYXRhZSB2aXRhZSANCmRpY3RhIHN1bnQgZXhwbGlj
YWJvLiBOZW1vIGVuaW0gaXBzYW0gdm9sdXB0YXRlbSBxdWlhIHZvbHVwdGFzIHNp
dCBhc3Blcm5hdHVyIGF1dCBvZGl0IGF1dCBmdWdpdCwgDQpzZWQgcXVpYSBjb25z
ZXF1dW50dXIgbWFnbmkgZG9sb3JlcyBlb3MgcXVpIHJhdGlvbmUgdm9sdXB0YXRl
bSBzZXF1aSBuZXNjaXVudC4gTmVxdWUgcG9ycm8gcXVpc3F1YW0gZXN0LCANCnF1
aSBkb2xvcmVtIGlwc3VtIHF1aWEgZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVy
LCBhZGlwaXNjaSB2ZWxpdCwgc2VkIHF1aWEgbm9uIG51bXF1YW0gZWl1cyBtb2Rp
IA0KdGVtcG9yYSBpbmNpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hbSBh
bGlxdWFtIHF1YWVyYXQgdm9sdXB0YXRlbS4gVXQgZW5pbSBhZCBtaW5pbWEgdmVu
aWFtLCANCnF1aXMgbm9zdHJ1bSBleGVyY2l0YXRpb25lbSB1bGxhbSBjb3Jwb3Jp
cyBzdXNjaXBpdCBsYWJvcmlvc2FtLCBuaXNpIHV0IGFsaXF1aWQgZXggZWEgY29t
bW9kaSBjb25zZXF1YXR1cj8gDQpRdWlzIGF1dGVtIHZlbCBldW0gaXVyZSByZXBy
ZWhlbmRlcml0IHF1aSBpbiBlYSB2b2x1cHRhdGUgdmVsaXQgZXNzZSBxdWFtIG5p
aGlsIG1vbGVzdGlhZSBjb25zZXF1YXR1ciwgDQp2ZWwgaWxsdW0gcXVpIGRvbG9y
ZW0gZXVtIGZ1Z2lhdCBxdW8gdm9sdXB0YXMgbnVsbGEgcGFyaWF0dXI/DQoNCkF0
IHZlcm8gZW9zIGV0IGFjY3VzYW11cyBldCBpdXN0byBvZGlvIGRpZ25pc3NpbW9z
IGR1Y2ltdXMgcXVpIGJsYW5kaXRpaXMgcHJhZXNlbnRpdW0gdm9sdXB0YXR1bSAN
CmRlbGVuaXRpIGF0cXVlIGNvcnJ1cHRpIHF1b3MgZG9sb3JlcyBldCBxdWFzIG1v
bGVzdGlhcyBleGNlcHR1cmkgc2ludCBvY2NhZWNhdGkgY3VwaWRpdGF0ZSBub24g
cHJvdmlkZW50LCANCnNpbWlsaXF1ZSBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lh
IGRlc2VydW50IG1vbGxpdGlhIGFuaW1pLCBpZCBlc3QgbGFib3J1bSBldCBkb2xv
cnVtIGZ1Z2EuIA0KRXQgaGFydW0gcXVpZGVtIHJlcnVtIGZhY2lsaXMgZXN0IGV0
IGV4cGVkaXRhIGRpc3RpbmN0aW8uIE5hbSBsaWJlcm8gdGVtcG9yZSwgY3VtIHNv
bHV0YSBub2JpcyBlc3QgZWxpZ2VuZGkgDQpvcHRpbyBjdW1xdWUgbmloaWwgaW1w
ZWRpdCBxdW8gbWludXMgaWQgcXVvZCBtYXhpbWUgcGxhY2VhdCBmYWNlcmUgcG9z
c2ltdXMsIG9tbmlzIHZvbHVwdGFzIGFzc3VtZW5kYSBlc3QsIA0Kb21uaXMgZG9s
b3IgcmVwZWxsZW5kdXMuIFRlbXBvcmlidXMgYXV0ZW0gcXVpYnVzZGFtIGV0IGF1
dCBvZmZpY2lpcyBkZWJpdGlzIGF1dCByZXJ1bSBuZWNlc3NpdGF0aWJ1cyANCnNh
ZXBlIGV2ZW5pZXQgdXQgZXQgdm9sdXB0YXRlcyByZXB1ZGlhbmRhZSBzaW50IGV0
IG1vbGVzdGlhZSBub24gcmVjdXNhbmRhZS4gDQpJdGFxdWUgZWFydW0gcmVydW0g
aGljIHRlbmV0dXIgYSBzYXBpZW50ZSBkZWxlY3R1cywgdXQgYXV0IHJlaWNpZW5k
aXMgdm9sdXB0YXRpYnVzIG1haW9yZXMgYWxpYXMgY29uc2VxdWF0dXIgDQphdXQg
cGVyZmVyZW5kaXMgZG9sb3JpYnVzIGFzcGVyaW9yZXMgcmVwZWxsYXQu
:base64Encoded:loremIpsum.txt:

Post Reply