Ruby
解析
strings

EXEファイルから日本語文字列を抽出する例

はじめに

  • macOS 上で行いたい
  • OS 附属の strings は日本語に対応していない
  • istrings や jstrings といった派生ツールがあるようだけど導入が大変そう(brew で見つからない)
  • スクリプト言語だと融通が効く

ということで Ruby を使います。

コード

require "pathname"
require "kconv"
require "natto"

mecab = Natto::MeCab.new("-F%f[0]")
bin = Pathname("binary.exe").read.toutf8.scrub
bin.scan(/[\p{Han}\p{Hiragana}]{2,}/) do |e|
  parts = mecab.enum_parse(e).to_a[0..-2]
  if parts.size == e.size
    next
  end
  puts e
end

要点

  1. kconv の toutf8 を使ったのはエラーになりにくいため
  2. scrub で不正なコードを除去する(簡単に書けるの便利)
  3. 漢字 または ひらがな が含まれる2文字以上の言葉が対象
  4. 意味不明な漢字の羅列は MeCab に通したとき1文字ずつに分断される傾向があるので、分断された数と文字数が等しい場合は意味不明な文字列と見なしてスキップする
  5. ここでは行なってないですが parts 配列の要素にある feature メソッドは "名詞" などの種類を返すので、それをうまく利用してフィルタしてもいい

実行結果

閙酣
鑵酣
鐫酣閧
(snip)
韶貲
鞨貲
靨貲頸
が間違っています
を選択して下さい
まだまだこれからですね
困ったなあ
負けたか
こんなはずじゃ
本当は負けず嫌いなんですよっ
の書き込みに失敗しました

それでも意味不明な漢字の羅列が大量に出てきてしまいますが、あらかじめわかっている言葉で検索すると日本語の塊にたどりつきやすいです。