バイナリデータの解析ってどうすればいいのだろう

1,210 views
Skip to first unread message

jscripter

unread,
Apr 29, 2014, 8:10:25 PM4/29/14
to tsnet_...@googlegroups.com
最近は身の回りがテキストデータばかりになって喜んでいたら、バイナリデータが出てきました。
Data::Hexdumperというライブラリをstrawberry perlにインストールして、次のようなPerlスクリプトを書いて解析してみたが、データ構造がよくわかりません。

^-----
use Data::Hexdumper qw(hexdump);
my $filename = $ARGV[0];
open my $in, '<', $filename or die $!;               # ファイルを開いて
binmode $in;                       # バイナリモードにして
my $buf;
my $size = -s $filename;
read $in, $buf, $size;      # サイズ分読み込んで
print "filesize = $size\n";
close my $in;                          # クローズ
print hexdump(
    data => $buf, # what to dump
    # NB number_format is deprecated
    number_format  => 'C',   # display as unsigned 'shorts'
    start_position => 1,   # start at this offset ...
    end_position   => $size    # ... and end at this offset
);
$-----

hexdumpのパラメータ、number_format、start_position、end_positionをどう設定すべきなのかがよくわからない。

Data::Hexdumper - search.cpan.org

Data::Hexdumperの出力と比較するために、超久しぶりにVectorでバイナリエディタを調べました。Windows8で使えるもの。まだ出たばかりですが、FavBinEditを使ってみました。が、コードに対応する日本語文字が表示されるのが違うだけで日本語としては意味がないし、Data::Hexdumperとの結果が異なるとも思えません。

さて、おそらくファイルシステムとの関わりがあるバイナリで、.indexという拡張子が付いているのですが、こういうバイナリを解析するための常識的な手順・方法というものはあるのでしょうか。

Zazel

unread,
May 2, 2014, 11:19:18 PM5/2/14
to tsnet_...@googlegroups.com
Zazelです。

(2014/04/30 9:10), jscripter wrote:
> さて、おそらくファイルシステムとの関わりがあるバイナリで、.indexという拡張子が付いているのですが、こういうバイナリを解析するための常識的な手順・方法というものはあるのでしょうか。

(a) リバースエンジニアリング
(b) オライリーのBinary Hacksを読む
(c) 知識と経験

正直なところ、どれほど様々なファイル形式を眺めた経験があるかだと
思います。有名な形式ならばUnix方面のfileコマンドが教えてくれるかも。

jscripter

unread,
May 3, 2014, 12:43:58 AM5/3/14
to TSNET
ありがとうございます。これからまずはBinary Hacksを調べてきます。それから、Cygwinのfileコマンドを試します。


2014年5月3日 12:19 Zazel <zaz...@gmail.com>:

--
このメールは Google グループのグループ「TSNET」の登録者に送られています。
このグループから退会し、グループからのメールの配信を停止するには tsnet_member...@googlegroups.com にメールを送信してください。
その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。

davi

unread,
May 3, 2014, 5:48:29 AM5/3/14
to tsnet_...@googlegroups.com
jscripterさん < こん??は でび です

今春から、業務用USBメモリをBit Locker暗号化して一安心です。
昨年まではBit Locker暗号化がリードオンリーでしか扱えない
WindowsXPのサポートが切れていかなったので、面倒でした。

そんなわけで、昨年は、各種のファイル暗号化ソフトや
バイナリデータからのデータフォレッシングについて
結構いろいろ調べました。

On Tue, 29 Apr 2014 17:10:25 -0700 (PDT)
jscripter <jscri...@gmail.com> wrote:

> Windows8で使えるもの。

> おそらくファイルシステムとの関わりがあるバイナリで、.indexという拡張子

リバースエンジニアリング的な発想では、そのバイナリをWindows8の
どのプロセスが握っているのかを調べて、そこから逆算して行く
のではないでしょうか。

ProcessExplorer
http://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspx

ProcessExplorer日本語化パッチ
http://d.hatena.ne.jp/wwwcfe/20100327/processexplorer

たとえば、Windowsインデクシングサービス関係とかの可能性はどうですか?
拡張子のことはよくわかりませんが。

検索エンジンを作る 第16回 テキスト情報の抽出[その3]
http://gihyo.jp/dev/serial/01/make-findspot/0016

IFilter Explorer
http://www.citeknet.com/Products/IFilters/IFilterExplorer/tabid/62/Default.aspx

一太郎 IFilter (無償提供版)
http://www.justsystems.com/jp/download/ichitaro/ifilter/64.html
http://www.justsystems.com/jp/download/ichitaro/ifilter/index.html

64bit版 Windows 7 で Adobe PDFのサムネイルを表示する
http://tak-shimiz.lolipop.jp/oyajinote/blog/archives/2011/0521_183928.html

Adobe PDF IFilter v6.0
http://www.adobe.com/jp/support/downloads/pdfi_2611.html

PDF iFilter 64 11.0.01
http://www.adobe.com/support/downloads/thankyou.jsp?ftpID=5542&fileID=5550

インデックス関係のファイルだと、サイズ圧縮のために生の値を
ハッシュ数値化したり、それをさらにzipやcabなどの圧縮をかけて
いるかもしれません。
それをフルスクラッチで解析して生データに戻すのは大変だろうと
思います。

ある程度、仕様書が公開されているJPEG画像ですら、バイナリを
なめてEXIF情報部分だけを復元するのはきっと大変ですよね?

Windowsのシステムが持っているサービスやOSのDLLからデータを横流し
してもらったりかすめ取ったりする方法を考えるのが楽ちんでは?

ちなみに「i-FILTER」はペアレンタルコントロールソフトの名前で
「IFilter」とは別のもので、中学や高校では、かなり普及している
みたいです。

でび http://davi.txt-nifty.com/1984/

jscripter

unread,
May 3, 2014, 8:47:38 AM5/3/14
to TSNET
Zazelさん、でびさん、毎度コメントありがとうございます。

Cygwinのfileコマンドで調べると、バイナリのデータファイルであることは間違いなかったです。そして、いろいろ調べていると、たまたまファイル名から何のデータであるかが予想がついたので、当然のことながらデータを生成した元のシステム内で何らかの処理ができるだろうと思い始めました。システムの外でできないわけではないでしょうが、おそらく難しい。システム内でテキストにして出力する。なんてことが僕にできるかどうかはよくわかりませんが、少し考えてみます。

お忙しいところ、お手間を取らせました。ありがとうございました。


2014年5月3日 18:48 davi <davi...@nifty.com>:
--
このメールは Google グループのグループ「TSNET」の登録者に送られています。

jscripter

unread,
May 3, 2014, 8:51:01 AM5/3/14
to TSNET
それから、Binary Hacksは見ましたけど、ちんぷんかんでした^^;) 最初にfileで調べるというのが書いてありましたね。


2014年5月3日 21:47 jscripter <jscri...@gmail.com>:

Zazel

unread,
May 3, 2014, 7:01:49 PM5/3/14
to tsnet_...@googlegroups.com
Zazelです。

(2014/05/03 18:48), davi wrote:
> ある程度、仕様書が公開されているJPEG画像ですら、バイナリを
> なめてEXIF情報部分だけを復元するのはきっと大変ですよね?

http://www.jeita.or.jp/cgi-bin/standard/list.cgi?cateid=1&subcateid=4
にあるExifフォーマット規格を読む限り、サムネイルを含む画像データ以外は
圧縮されてないみたいなので、単なる生データの表示ならばそれほど難しく
ないです。以下は殴り書き。

-----^ readexif.pl ( date:14-05-04 time:07:59:20 ) --< cut here
#!/usr/local/bin/perl
use strict;
use warnings;

my $fh;
open($fh, '<:raw', shift @ARGV) || die;

my $buff;
read($fh, $buff, 2) == 2 || die;
if (unpack('n', $buff) != 0xffd8) {
print "not JPEG file\n";
exit(0);
}

while (1) {
read($fh, $buff, 4) == 4 || die;
my ($marker, $length) = unpack('nn', $buff);
$length -= 2;
if ($marker == 0xffda) {
print "no EXIF\n";
last;
}
elsif ($marker != 0xffe1) {
seek $fh, $length, 1;
next;
}

read($fh, $buff, 6) == 6 || die;
$length -= 6;
if ($buff ne "Exif\0\0") {
seek $fh, $length, 1;
next;
}

print "exist EXIF\n";
read($fh, $buff, $length) == $length || die;
my $count = 0;
foreach my $byte (unpack 'C*', $buff) {
print "\n" if $count != 0 && $count % 16 == 0;
printf "%02X ", $byte;
$count++;
}
print "\n";
last;
}

close $fh;
-----$ readexif.pl ( lines:47 words:140 size:906 ) --< cut here

Zazel

unread,
May 3, 2014, 7:07:46 PM5/3/14
to tsnet_...@googlegroups.com
Zazelです。

(2014/05/03 21:51), jscripter wrote:
> それから、Binary Hacksは見ましたけど、ちんぷんかんでした^^;)

実行ファイルやOSを解析するノウハウ本なので。(^_^)

jscripter

unread,
May 3, 2014, 8:00:40 PM5/3/14
to TSNET
教えていただいたIFilterというものがあるのは初めて知りました。

IFilter - Wikipedia, the free encyclopedia

Webにある文書などのバイナリをサーチエンジンがテキスト部分を抽出してインデックス化するためのものですね。

Webで自社製品のデータをサーチできるようにするために、自社の製品のIFilterアドインを提供する必要があるということなんでしょう。

今回の場合はWebに公開されることはないデータなので、IFilterが提供されていないと思われます。

しかしながら、WebではIFilterは重要な要素ですね。

-----^
> Windows8で使えるもの。

> おそらくファイルシステムとの関わりがあるバイナリで、.indexという拡張子

リバースエンジニアリング的な発想では、そのバイナリをWindows8の
どのプロセスが握っているのかを調べて、そこから逆算して行く
のではないでしょうか。

ProcessExplorer
http://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspx

ProcessExplorer日本語化パッチ
http://d.hatena.ne.jp/wwwcfe/20100327/processexplorer

たとえば、Windowsインデクシングサービス関係とかの可能性はどうですか?
拡張子のことはよくわかりませんが。

検索エンジンを作る 第16回 テキスト情報の抽出[その3]
http://gihyo.jp/dev/serial/01/make-findspot/0016

IFilter Explorer
http://www.citeknet.com/Products/IFilters/IFilterExplorer/tabid/62/Default.aspx
-------$


2014年5月3日 18:48 davi <davi...@nifty.com>:
jscripterさん  <  こん??は でび です
--
このメールは Google グループのグループ「TSNET」の登録者に送られています。

davi

unread,
May 4, 2014, 8:03:07 AM5/4/14
to tsnet_...@googlegroups.com
Zazelさん < こん??は でび です

On Sun, 04 May 2014 08:01:49 +0900
Zazel <zaz...@gmail.com> wrote:

> 圧縮されてないみたいなので、単なる生データの表示ならばそれほど難しく
> ないです。以下は殴り書き。

添付ファイルは適当な画像を作ってネットから拾ってきた画像から
EXIFだけを借用して流し込んでみたものです。
GPS座標は東京スカイツリーにしてみました。

bash-3.2$ perl -f readexif.pl female.jpg > exif.txt

でバイナリダンプのような結果を得られました。

たぶん、この生データをさらにデコード?というか、バイナリ化?
すれば文字列を得られるわけですね。
復元する文字コードやエンディアンがどっちなのかとか、
分岐処理が面倒くさそうだけど。

ただ、生のfemale.jpgをバイナリエディタで見たときに2D54の
位置から始まっているRDF情報(なのかな? FF E1 12 48~)を
捕捉できないようです。

どこを直せばうまくゆきますか?

elsif ($marker != 0xffe1) {

の所はデータを捨てず、拾う指定をしているように読み取ったのですが、
それが勘違い?

フリーソフトのGUIなEXIF情報閲覧ソフトをいくつか試してみましたが
このRDF情報のような部分を表示(や抽出や編集)できるソフトが
なかなか見当たりません。

この部分はAdobeが独自に埋め込んでいるメタデータなのでしょうが、
Photoshopからこの部分を編集できるメニューも見当たらないし、
いったい何だろうな、と。

>http://www.jeita.or.jp/cgi-bin/standard/list.cgi?cateid=1&subcateid=4
>にあるExifフォーマット規格を読む限り、

規格書は完全に解読しきれませんでしたが、付加情報開始の宣言が
FFらしいという所までは、どうにか理解。

でび http://davi.txt-nifty.com/1984/
female.jpg

davi

unread,
May 4, 2014, 8:22:53 AM5/4/14
to tsnet_...@googlegroups.com
jscripterさん < こん??は でび です

On Sun, 4 May 2014 09:00:40 +0900
jscripter <jscri...@gmail.com> wrote:

> Webで自社製品のデータをサーチできるようにするために、
>自社の製品のIFilterアドインを提供する必要があるということなんでしょう。

本来は、イントラのドキュメントフォルダ内の文書を全文検索する
Namazuのようなものとして開発されたみたいですが、現在では
Windows デスクトップ サーチから発展させて、Windows標準の
ファイルやフォルダーの検索でローカルのドキュメントを全文検索
する標準機能としても活用されているようです。
Windows8でもたぶんそうでしょう。

Googleデスクトップを意識して実装したんだろうと思います。

でび http://davi.txt-nifty.com/1984/

jscripter

unread,
May 4, 2014, 8:54:42 AM5/4/14
to tsnet_...@googlegroups.com
でびさん

なるほど、デスクトップでも同じですね。WikipediaにはWindowsのsearch engineにデスクトップのものも含めて列挙されていました。

2014年5月4日日曜日 21時22分53秒 UTC+9 davi:

jscripter

unread,
May 4, 2014, 9:24:27 AM5/4/14
to tsnet_...@googlegroups.com
jscripterです。

Image::ExifToolのライブラリをインストールして試してみました。

----^
use Image::ExifTool qw(:Public);

my $filename = $ARGV[0];

# ---- Simple procedural usage ----

# Get hash of meta information tag names/values from an image
my $info = ImageInfo($filename);

foreach (sort keys %$info) {
    print "$_ => $$info{$_}\n";
}
-----$

次のようなwarningが出ますね。ご参考まで。出力が長いので前後をカットしています。

-----^
-----
ThumbnailLength => 5286
ThumbnailOffset => 1510
UserComment =>
Warning => [minor] Possibly incorrect maker notes offsets (fix by -113?)
Warning (1) => Invalid CanonCameraSettings data
Warning (10) => [minor] Bad format (12592) for MakerNotes entry 32
Warning (11) => Bad MakerNotes offset for tag 0x0003
Warning (12) => Bad MakerNotes offset for CanonPanorama
Warning (13) => [Minor] Too many warnings -- MakerNotes parsing aborted
Warning (2) => Bad MakerNotes offset for tag 0x0003
Warning (3) => [minor] Bad format (73) for MakerNotes entry 3
Warning (4) => [minor] Bad format (487) for MakerNotes entry 25
Warning (5) => [minor] Bad format (12848) for MakerNotes entry 26
Warning (6) => [minor] Bad format (6144) for MakerNotes entry 27
Warning (7) => [minor] Bad format (256) for MakerNotes entry 28
Warning (8) => [minor] Bad format (11572) for MakerNotes entry 30
Warning (9) => [minor] Bad format (21321) for MakerNotes entry 31
WhiteBalance => Auto
XMPToolkit => XMP toolkit 2.8.2-33, framework 1.5
XResolution => 72
XResolution (1) => 96
....
----$

2014年5月4日日曜日 21時03分07秒 UTC+9 davi:

Zazel

unread,
May 4, 2014, 7:40:38 PM5/4/14
to tsnet_...@googlegroups.com
Zazelです。

(2014/05/04 21:03), davi wrote:
> ただ、生のfemale.jpgをバイナリエディタで見たときに2D54の
> 位置から始まっているRDF情報(なのかな? FF E1 12 48~)を
> 捕捉できないようです。

私が手抜きしたからです。(^_^;)

Exif情報などが入っているAPP1というマーカーは複数あってもいいのですが、
最初の一つしか表示しないようにしてるのでそうなります。whileブロックの
最後にあるlastを削除すれば画像イメージが始まる所まで読んでくれます。

ただし0x2d54からのAPP1はExif情報ではないので、それを判別している部分の
変更もお忘れなく。

%%%%

ちなみにFirefoxのFxIFというアドオンでExifをみるとこんな感じ。

カメラメーカー: Canon
カメラモデル: Canon EOS 5D Mark III
レンズ: EF24-70mm f/4L IS USM
撮影日時: 2014-05-04 15:15:15 (タイムゾーン情報なし)
焦点距離: 32mm
絞り値: f/9.0
露出時間: 0.0080 秒 (1/125)
ISO 感度: 100
露出補正値: +0.67 EV
測光方式: マトリックス
露出: 絞り優先 (セミオート)
ホワイトバランス: オート
フラッシュ使用: いいえ (強制)
画像方向: 標準
色空間: sRGB
GPS 位置: 35° 42′ 36.20″ N, 139° 48′ 38.50″ E
GPS 高度: 5.788696m
コメント:

Reply all
Reply to author
Forward
0 new messages