ddコマンドまとめ

ddコマンドのまとめです。

各項目の入力データは以下のようにして作成。

takk@deb9:~/tmp$ seq 64 | perl -ne'print chr'>in.bin
takk@deb9:~/tmp$ od -td1 -w8 -An -v in.bin
    1    2    3    4    5    6    7    8
    9   10   11   12   13   14   15   16
   17   18   19   20   21   22   23   24
   25   26   27   28   29   30   31   32
   33   34   35   36   37   38   39   40
   41   42   43   44   45   46   47   48
   49   50   51   52   53   54   55   56
   57   58   59   60   61   62   63   64
takk@deb9:~/tmp$

 

 

バイナリデータの最初から最後までコピー

takk@deb9:~/tmp$ dd < in.bin > out.bin
0+1 レコード入力
0+1 レコード出力
64 bytes copied, 0.000332896 s, 192 kB/s
takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin
    1    2    3    4    5    6    7    8
    9   10   11   12   13   14   15   16
   17   18   19   20   21   22   23   24
   25   26   27   28   29   30   31   32
   33   34   35   36   37   38   39   40
   41   42   43   44   45   46   47   48
   49   50   51   52   53   54   55   56
   57   58   59   60   61   62   63   64
takk@deb9:~/tmp$

最初から最後までなら、cpで済むのでこの使い方自体は意味がないです。ddによるフィルタリングパターンとして挙げています。

 

 

バイナリデータの最初から途中までコピー

takk@deb9:~/tmp$ dd bs=1 count=38 < in.bin > out.bin
38+0 レコード入力
38+0 レコード出力
38 bytes copied, 0.0008758 s, 43.4 kB/s
takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin
    1    2    3    4    5    6    7    8
    9   10   11   12   13   14   15   16
   17   18   19   20   21   22   23   24
   25   26   27   28   29   30   31   32
   33   34   35   36   37   38
takk@deb9:~/tmp$

各種フォーマットのヘッダ部分の抽出とかに使えるでしょうか。

 

 

バイナリデータの途中から最後までコピー

takk@deb9:~/tmp$ dd bs=1 skip=3 < in.bin > out.bin
61+0 レコード入力
61+0 レコード出力
61 bytes copied, 0.00042046 s, 145 kB/s
takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin
    4    5    6    7    8    9   10   11
   12   13   14   15   16   17   18   19
   20   21   22   23   24   25   26   27
   28   29   30   31   32   33   34   35
   36   37   38   39   40   41   42   43
   44   45   46   47   48   49   50   51
   52   53   54   55   56   57   58   59
   60   61   62   63   64
takk@deb9:~/tmp$

使い道はやはり、各種フォーマットのボディ部分の抽出とか、ですかね。

 

 

バイナリデータの途中の一部分をコピー

takk@deb9:~/tmp$ dd bs=1 skip=3 count=6 < in.bin > out.bin
6+0 レコード入力
6+0 レコード出力
6 bytes copied, 0.000562645 s, 10.7 kB/s
takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin
    4    5    6    7    8    9
takk@deb9:~/tmp$

バイナリデータ内のある数値を抜き出ししたいときに有用です。抜き出したバイナリはテキストに変換して使いますので、結局ddはxxd等のコマンドと併用することになると思います。

 

 

バイナリデータの上下1Byte入れ替え

takk@deb9:~/tmp$ dd conv=swab < in.bin > out.bin
0+1 レコード入力
0+1 レコード出力
64 bytes copied, 0.00062047 s, 103 kB/s
takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin
    2    1    4    3    6    5    8    7
   10    9   12   11   14   13   16   15
   18   17   20   19   22   21   24   23
   26   25   28   27   30   29   32   31
   34   33   36   35   38   37   40   39
   42   41   44   43   46   45   48   47
   50   49   52   51   54   53   56   55
   58   57   60   59   62   61   64   63
takk@deb9:~/tmp$ ^C

16bitのデータの上下8bitを入れ替えするとき、つまりエンディアン変換したいときに使いますが、今時、16bitでは足らないでしょう。このオプション単体で使うことはないのかもしれません。

 

 

バイナリデータの生成(ゼロ)

takk@deb9:~/tmp$ dd bs=1 count=64 < /dev/zero > out.bin
64+0 レコード入力
64+0 レコード出力
64 bytes copied, 0.000629518 s, 102 kB/s
takk@deb9:~/tmp$
takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin
    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0
    0    0    0    0    0    0    0    0
takk@deb9:~/tmp$

よく使うパターンだと思います。

 

 

バイナリデータの生成(乱数)

takk@deb9:~/tmp$ dd bs=1 count=64 < /dev/urandom > out.bin
64+0 レコード入力
64+0 レコード出力
64 bytes copied, 0.000635843 s, 101 kB/s
takk@deb9:~/tmp$ od -tu1 -w8 -An -v out.bin
 185  76 144  72 205  90 140 208
 135 216 177 209  33  60  41 152
  66 227 246 122 114  86 207 135
 210  67 130  83 173  63 180 198
  14   7  69 214  89  97 128 157
 146  60  66  12 142 182  55  27
 227 166  42 199 170  93  38   7
 173 242  31  40 225  38 166 162
takk@deb9:~/tmp$

暗号等に使うときに有用でしょうか。

 

 

バイナリデータの一部を、入力ファイルに基づいて書き換え

takk@deb9:~/tmp$ seq 64 | perl -ne 'print chr 8' > out.bin
takk@deb9:~/tmp$ dd bs=1 count=3 skip=26 seek=10 if=in.bin of=out.bin conv=notrunc
3+0 レコード入力
3+0 レコード出力
3 bytes copied, 0.000978647 s, 3.1 kB/s
takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin
    8    8    8    8    8    8    8    8
    8    8   27   28   29    8    8    8
    8    8    8    8    8    8    8    8
    8    8    8    8    8    8    8    8
    8    8    8    8    8    8    8    8
    8    8    8    8    8    8    8    8
    8    8    8    8    8    8    8    8
    8    8    8    8    8    8    8    8
takk@deb9:~/tmp$

テストに使うデータとか、バイナリデータをある数値で初期化したい場合等、たぶん、これが一番使えるかもしれません。

 

 

バイナリデータの一部を、手入力で書き換え

takk@deb9:~/tmp$ seq 64 | perl -ne 'print chr 0x2d' > out.bin
takk@deb9:~/tmp$ dd bs=1 count=3 seek=10 conv=notrunc of=out.bin
abc
3+0 レコード入力
3+0 レコード出力
3 bytes copied, 1.44266 s, 0.0 kB/s
takk@deb9:~/tmp$
takk@deb9:~/tmp$ od -tc -w8 -An -v out.bin
   -   -   -   -   -   -   -   -
   -   -   a   b   c   -   -   -
   -   -   -   -   -   -   -   -
   -   -   -   -   -   -   -   -
   -   -   -   -   -   -   -   -
   -   -   -   -   -   -   -   -
   -   -   -   -   -   -   -   -
   -   -   -   -   -   -   -   -
takk@deb9:~/tmp$

手入力でバイナリデータを書き換えることは、ミスもあるのであまりやらない方がよいのですが、このバイナリ操作がとても面白いです。ASCIIコードと数値を暗記して、いつでもどこでもバイナリ加工でできるようになると、もうddの虜になってしまいます。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA