« PerlでONSへ変換しよう  基本編 ~はじめに~ | メイン | PerlでONS -かにしの編 その1 ~テキスト整形~ »

2007年06月14日

●PerlでONS -かにしの編 その0 ~見まねデコード~

基本編と分けてみました。
どう考えても参考にならない気がするし…最初は吉里吉里とかにすべきだったなぁ

ということで改めてかにしの編その0?

『遥かに仰ぎ、麗しの(体験版)(製品版)』(PULL TOP様)を使わせていただきます。
最終的にはWill系列がある程度動けばいいなぁ…とは思いますが、まあいつものごとく。
さて、アーカイブは色々ばらせますが、シナリオファイルは暗号化されていました。
Perlで日本語(shift-jis)を読める様にしても、そもそも日本語じゃないという罠。
幸い、某所でメッセージローダが見つかったのでこちら様のソースを眺めてみると
シナリオファイルは1byteごとに

tf=(tf%4)*0x40 + tf/4;//暗号解除

とされているようです。なので

@file = ("AL_0101.wsc","AL_0102.wsc");#とりあえず2ファイルだけ
foreach $file(@file){
	open (IN, "$file");
	open (OUT, ">$file\_out.txt");
	binmode IN;
	binmode OUT;
	@line = <IN>;
	my $char1 ="";
	foreach $line(@line){#
		my $bin = unpack("H*",$line);
		my $cha = length($bin)/2;
		for ($i = 0; $i < $cha; $i++){
			my $two = hex(substr($bin,$i*2,2));
			$two2 = ( $two % 4 ) * 64 + int($two / 4) ;#前出の式
			$two3 = sprintf("%x",$two2);
			if ( length($two3) == 1 ){
				$two3 = "0$two3";
			}
				$char1 .= "\%"."$two3";
		}
	}
	$char1 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;
	print OUT $char1;
	close(IN);
	close(OUT);
}

こんな感じにすると一応日本語の文章が出てきました。
解析の解が分かっているので当たり前と言えば当たり前なのですが、結構嬉しい。
ちなみに間違いなくPerlのスクリプトはもっと上手い書き方があるでしょう。

続く?

謝辞 メッセージローダ作者 nota様

10/11)
読み直してみると、謝辞が謝辞になっていませんでした…。
改めて、(勝手に)ソースの転用をさせて頂きましたメッセーローダ作者nota様に感謝致します。
かにしのに限らず、私の活動はほぼ全て他の方のデータ解析・抽出の成果に成り立っているので
全方向に足を向けて眠れません。ありがとうございます。

トラックバックURL

このエントリーのトラックバックURL:
http://hitotsumori.com/x/cgi-bin/mt/mt-tb.cgi/24

コメントする