2008年12月23日

Team Cymru の Malware Hash Registry を使うための Perl スクリプト

ファイルの HASH値を whois (43/tcp) または dns (53/udp) で問い合わせると、それがマルウェアのデータベースに登録されているか否かを答えてくれるサービスを Team Cymru が提供しています。

Team Cymru - Malware Hash Registry
http://www.team-cymru.org/Services/MHR/

そこで、ファイルを指定するだけで HASH値を調べて、このサービスに問い合わせ、結果を表示してくれる Perl スクリプトを作ってみました(ちょっと見難いですが…)。
#!/usr/bin/perl

$#ARGV == 0 || die "$0 needs one argument!\n";

$file = "$ARGV[0]";
-e "$file" || die "$file: no such file!\n";

$sha1 = "openssl sha1";
$qfmt = "dig +short %s.malware.hash.cymru.com TXT";

open(SHA1, "$sha1 \"$file\" |") || die "Can't open \"$sha1\"!\n";
$_ = join "", <SHA1>;
close(SHA1);

( $digest ) = /([0-9a-f]{40})/;
( $digest eq "" ) && die "Can't find SHA1!\n";

$qcmd = sprintf("$qfmt", $digest);
open(QUEUE, "$qcmd |") || die "Can't open \"$qcmd\"!\n";
$_ = join "", <QUEUE>;
close(QUEUE);

( $t, $p ) = /\"([0-9]+) ([0-9]{1,3})\"/;
if ( $t ne "" && $p ne "" ) {
print "$p% (";
print scalar localtime($t);
print ")\n";
exit(1);
} else {
print "no data in database.\n";
}

exit(0);
これは内部から HASH値の取り出しに openssl、dns問い合わせに dig を使っています。大概の Unix系 OS ならばこのまま使えると思いますが、Windows のように標準でこれらのコマンドを有していない場合は次のように書き換えてください。

(1) HASH値の取り出し
(旧) $sha1 = "openssl sha1";
(新) $sha1 = "fciv -sha1";
fciv は Windows 標準ではありませんが、Microsoft が無償で提供しているツールです。

Microsoft サポート オンライン
可用性と ファイル チェックサム整合性検証 ユーティリティの説明
http://support.microsoft.com/kb/841290/ja

fciv.exe を PATH の通った場所にインストールしてください。

(2) dns問い合わせ
(旧) $qfmt = "dig +short %s.malware.hash.cymru.com TXT";
(新) $qfmt = "nslookup -q=txt %s.malware.hash.cymru.com 2>&1";

また dnsではなく whoisを使う場合は次のように書き換えてください。
(旧) $qfmt = "dig +short %s.malware.hash.cymru.com TXT";
(新) $qfmt = "whois -h hash.cymru.com %s";
(旧) ( $t, $p ) = /\"([0-9]+) ([0-9]{1,3})\"/;
(新) ( $t, $p ) = /^$digest ([0-9]+) ([0-9]{1,3})/;

なお、Windows では ActivePerl 5.10.0 での動作を確認しています。

ActivePerl
http://aspn.activestate.com/ASPN/Downloads/ActivePerl/
posted by yamaga at 10:41| Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする

2008年12月21日

mt-daapd のログに吐き出される曲名を UTF-8 に戻すプログラム

mt-daapd (firefly) のログに吐き出される曲名は非ASCII文字が \M-x とか \M^x に変換されてしまうので、それを元 (UTF-8) に戻すフィルタプログラムをちょいちょいと書いてみました。
#include <stdio.h>
#include <stdlib.h>

int main()
{
unsigned int c, c2, c3, c4;

while( (c=getchar()) != EOF) {
if (c == '\\') {
if ((c2=getchar()) == EOF) { break; }
if ((c3=getchar()) == EOF) { break; }
if ((c4=getchar()) == EOF) { break; }
if (c2 == 'M' && c3 == '-') {
printf("%c", c4+128);
} else if (c2 == 'M' && c3 == '^') {
printf("%c", c4+64);
} else if (c2 == '2' && c3 == '4' && c4 == '0') {
printf("%c", ' '+128);
} else {
printf("%c%c%c%c", c, c2, c3, c4);
}
} else {
putchar(c);
}
}

exit(0);
}
このソースをコンパイルして、
cat ログファイル | このプログラム | UTF-8を表示できるページャ
とすれば OK のはず。

でもイマドキの人はこんなプログラム、Perl かなんかで書くんでしょうね (^^;;;
posted by yamaga at 21:00| Comment(0) | TrackBack(0) | プログラミング | このブログの読者になる | 更新情報をチェックする