LoginSignup
3
1

More than 5 years have passed since last update.

Elixirのソースコードにバイナリを埋めこむ方法とそのバイナリ表現の生成方法

Posted at

Elixir ソースコードの中にバイナリを埋め込みたいとする.Elixir ソースコードはテキストファイルである.テキストファイルの中にどのようにバイナリを埋め込むとよいだろうか.

Elixir では(もちろん Erlang でも)バイナリを表現する方法が用意されている.Binaries, strings, and char listsにあるとおり<<0, 255, 127>> のように記述する.

それでは,バイナリをこのような 0..255 の表現で取得するにはどうしたらよいか.hexdump というコマンドでバイナリを様々なフォーマットで出力できる.

今回は

  1. ls のバイナリを hexdump で Elixir 内で扱えるバイナリ文字列へと変換する
  2. Elixir 内で扱えるバイナリ文字列を Elixir で読み込む
  3. Elixir 内で扱えるバイナリ文字列を Elixir からバイナリとして書き出す
  4. 書き出したバイナリを実行して,ls と同じ動作をすること

を確かめた.

/var/tmp/elixir_binary% hexdump -ve '/1 "%u,"' /bin/ls | sed -e 's/,*\r*$//' | awk '{print "<<"$0">>"}' > elixir_binary.txt
/var/tmp/elixir_binary% head -c 100 elixir_binary.txt
<<207,250,237,254,7,0,0,1,3,0,0,128,2,0,0,0,18,0,0,0,8,7,0,0,133,0,32,0,0,0,0,0,25,0,0,0,72,0,0,0,95%                                                           /var/tmp/elixir_binary% iex
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Interactive Elixir (1.4.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> {result, _bindings} = Code.eval_file("elixir_binary.txt")
{<<207, 250, 237, 254, 7, 0, 0, 1, 3, 0, 0, 128, 2, 0, 0, 0, 18, 0, 0, 0, 8, 7,    0, 0, 133, 0, 32, 0, 0, 0, 0, 0, 25, 0, 0, 0, 72, 0, 0, 0, 95, 95, 80, 65,
   71, 69, 90, 69, 82, ...>>, []}
iex(2)> File.write!("myls", result)
:ok
iex(3)>
User switch command
 --> q
/var/tmp/elixir_binary% chmod 755 myls
/var/tmp/elixir_binary% ./myls -l
total 296
-rw-r--r--  1 niku  wheel  108227  5  4 20:53 elixir_binary.txt
-rwxr-xr-x  1 niku  wheel   38512  5  4 20:55 myls
/var/tmp/elixir_binary% diff /bin/ls myls
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1