背景
JSLinux では、ブラウザ上で FreeDOS やその他の OS を動かすことができる。
この FreeDOS を利用し、書いたプログラムの実験をしたくなることがある。
しかし、JSLinux の Upload files 機能は Linux VMs でしか動かないとされており、FreeDOS では使えなそうである。
そこで、ファイルのデータを簡単に持ち込む方法を探した。
目的
テスト用の小規模なプログラムのデータ (数バイト~1KiB程度のバイナリ) を JSLinux 上の FreeDOS に簡単に持ち込む。
方法
今回紹介する方法では、以下のソフトウェアを用いる。
- FreeDOS 内部
- uHex
- Perl
- 外部
持ち込むデータを入力用に変換する
CyberChef を用いて、持ち込むデータをキーボードシミュレータ.NET で uHex に入力する用のデータに変換する。
すなわち、以下の変換を行う。
- データを十六進表現に変換する
- 各バイトの間に
[VK_RIGHT]
を入れる
To Hex, Find / Replace - CyberChef
持ち込むデータと同じサイズのファイルを作成する
次の手順で用いる uHex (バイナリエディタ) では、既存のバイトの値の変更はできるが、筆者は今のところバイトの追加や削除 (ファイルサイズの変更) を行う方法を見つけられていない。
そこで、FreeDOS 上 (C ドライブのルート) で以下のコマンドを実行し、持ち込むデータと同じサイズのファイルを作成する。
devel\perl\bin\perl -e "print 0 x ファイルサイズ;" > 作成するファイル名
日本語キーボードでは、\
は ]
(む) キー、"
は Shift+:
(け) キーで入力できるようである。
ここで用いる他の文字は通常通り入力できるはずである。
x
の前後には必ず空白を入れること。
さもないと、0x
から始まる十六進数として解釈されるなど、失敗の原因になる。
持ち込むデータのファイルサイズは、CyberChef で入力として用いる際に表示される。
たとえば、256 バイトのファイル A.TXT
を作成するには、以下のようにする。
devel\perl\bin\perl -e "print 0 x 256;" > a.txt
-e
オプションを用いることで、コマンドラインで指定した Perl のプログラムを実行する。
実行するプログラムは、文字列を指定した回数繰り返した文字列を求める演算子 x
を用いて、文字 0
をファイルサイズの分だけ繰り返した文字列を生成・出力するものである。
この出力をリダイレクトすることで、ファイルを作成する。
持ち込むデータを流し込む
続いて、FreeDOS (C ドライブのルート) 上で以下のコマンドを実行する。
uhex 作成するファイル名
すると、うまくいけば uHex が起動し、以下のような画面になるはずである。
ここに、キーボードシミュレータ.NET を用いて、持ち込むファイルのデータを流し込む。
入力モードは「キーボードシミュレートモード」にする。
入力欄に先ほど CyberChef で変換したファイルデータをコピペする。
これは、たとえば
74[VK_RIGHT]65[VK_RIGHT]73[VK_RIGHT]74
のような形式になっているはずである。
入力文字の間隔を適切に設定する。筆者の環境で試したところ、100 ミリ秒に設定して 1KiB のデータを欠けることなく流し込むことができた。
「入力開始」ボタンを押し、入力が始まるまでの間に JSLinux に対する入力ができる状態にする。
入力が終わるまで待つ。
入力が完了したら、Alt+S
を押してファイルを保存し、Esc
を押して uHex を終了する。
結論
uHex の「ファイルサイズを増やす方法がわからない」という欠点を、Perl を用いて作りたいサイズのファイルをあらかじめ作っておくことにより補うことで、JSLinux の FreeDOS に小規模なファイルを持ち込みやすくなった。