質問

私は見たことがわち関連の決定に類似のファイルを、いずれも連動し、特定のドメイン画像、音声、テキストです。の技術を提供いただくことが必要知識の基本となるファイル形式のファイルの比較です。私見ではない方法この要件は、任意のバイナリファイルを比較することが可能となるな理解にどのようなデータが含まれている.と思決定に 類似度の比率が二つのファイルのバイナリデータ.

をもう少し詳しくお仕事もこれは潜在的に適用できる、いろいろなものをいて特定の問題と仕事をしています。また、現在はい、解決ではないと思いることが理想的です。があると思われ多くの最適化の比較方法を格納する。(英国と)気温差もあることができるのは与えてくれる、新しいビジョンを作成中です。い編集についての情報私の現在の方法は後日、たくないバイアスの人々の考えの問題ではないことがおわかり頂けどまっています。

問題のようにする クローン検出のためのビデオゲームの画像.方ないの経験をエミュレーションRomには、敵のデータゲームカートリッジ.ROM"クローン"は、通常、修理技術のデモンストレーションで同じゲームをすることにより翻訳です。例えば、日本語と英語のバージョンの ファイナルファンタジー のNESが唆している。ゲームのシェアのほぼすべての資産(sprites、音楽等の文章を翻訳しました。

現在、複数のグループ作業の維持のリストをクローンの様々なシステムが調査を実施しているのは、同じように、これらはすべて手動。私のような方法が見つけら検同様のROM画像を自動的に客観的にデータに基づく類似われるように同じゲーム".その理由はいくつかありますが検出クローンが一つの大きな動機で使用される 固体の圧縮.これを圧縮すべてのゲームのクローンと同一のアーカイブの圧縮クローンに設定しばしば取り上げを少しだけスペースの個人Rom.

一部の懸念事項を考慮すべきポイントについてその潜在的アプローチ:

  • Romり高いサイズによっては、システム。一部は小さいものの、近代システムが大256MB以上。一部の(すべての?) システムだけの力2としての可能サイズ、130MBゲームのこれらのシステムが256MB romは空です。ご注意このため、一部のクローンが気異なるサイズの場合、ゲーム版絹本著色不動明王二童子像として利用カートリッジまでのサイズです。
  • 現在、数千人の知Romに多くのシステム、システムが新発売。でも、古いシステムが大きROM-ハッキングを生成する変更Romうことも多い。
  • 保存類似度データでの対Romのような単位百万列のデータによります。システム5000Romい25万列の類似度データは、単一の新しいゲームを加えること5000さい。
  • 状態を処理する必要の回収、その場合は中断することができるのでいます。他の方法では、多くの加工が必要となり、その全体をもたらしてくれることでしょう走りを一括ではない安心です。
  • 新Romを加えることが可能で、そのメソッドは前の書面による許諾無く、これではすでに、"完了"を設定。この後もい圏内の類似性のためのすべての既存のRomが新たに追加します(こが生じる可能性もありま前の前処理した完全に終了しました)がある必要があります方法と比較しては前回と趣向を変え、決定する(もしあれば)でクローンです。
  • 高い処理速度を優先的に扱うべきであることと精度(へのポイント)かどうかを知るにつRomは94%96%の類似は、特に重要ですが、たとすれば、当日の処理などの比較的新しいROMすべての以前のもの、あろうな。

とても興味深い問題を作所で見られることを楽しみにして何人です。んのコメントしたい場合は任意、そもそもの私の回答のみに供給します。

役に立ちましたか?

解決

あなたがバイナリデルタあるいは多分(それのサイズのような)バイナリデルタのアプリケーションから派生したインデックスを望むように

これが鳴ります。あなたはその後、あなたはそれが「クローン」だかどうかを決定するために実験的に決定し、いくつかのベースラインにこの指標を比較することができます。

があり圧縮とデルタ作成の間に多くの類似点があるので、私はあなたがはるかにあなたの現在の実装とオフではないと言うと思います。

言われて、データベース内のすべてのバイナリファイルの一対比較は、おそらく非常に高価であること(O(nは 2 )、私は思います)。私は比較のための可能な候補を同定するための単純なハッシュを見つけるためにしようとするだろう。何spdenneとエドゥアルドと概念的に類似した何かが示唆されています。これは、ハッシュリストで接近している項目についての細かい粒度の比較を使用し、その後、一度すべての項目に適用することができ、ハッシュを見つけ、そのリストを並べ替えると、あるます。

一般的なケースのために有益なハッシュを構築することは、数年前からCSでの活発な研究テーマとなっています。 LSHKit のソフトウェアライブラリは、この種のいくつかのアルゴリズムを実装しています。 インターネットアクセス紙のそれはより多くのテキストファイルを比較することを目標とするかもしれないように思えるが、あなたに役に立つかもしれません。より最近の論文<のhref = "http://www.sciencedirect.com/science?_ob=ArticleURL&_udi=B7CW4-4P06CJD-7&_user=1617289&_rdoc=1&_fmt=&_orig=search&_sort=d&view=c&_acct=C000053976&_version=1&_urlVersion=0&_userid=1617289&md5 = にハッシング335d7e5e9bf27f9f42bf6a3cf493e44f」REL = 『noreferrer』>マルチ解像度の類似性は、より強力なアルゴリズムを記載しています。しかし、サブスクリプションなしでアクセスできるように表示されません。あなたはおそらく、あなたが他のリソースを参照するようhref="http://en.wikipedia.org/wiki/Locality_sensitive_hashing" rel="noreferrer">局所性鋭敏型ハッシュは便利をアコースティックの分野からいくつかのアイデア(あるいは実行ファイル)を適用することができるかもしれませんフィンガープリントするます。

あなたはそれはあなたがちょうどあなたのROMのために働くはるかに簡単(かつ迅速)ドメイン固有のハッシュ関数を見つけることができるという可能性があります一般的なケースを放棄して喜んでいる場合。おそらく、標準、または一般的なバイトシーケンスの配置及びそれらの近くに選択ビットの値を含む何か。私は本当にあなたのバイナリ形式についてはあまり知らないが、私は、音、画像やテキストのための地域のようなファイル内のセクションの開始を知らせる事を想像しています。バイナリフォーマットは、頻繁にファイルの先頭近くのセクションのこれらの種類のアドレスを格納します。いくつかは、それの大きさと一緒に知られている場所での最初のセクションのアドレスを格納する連鎖メカニズムを使用しています。これは、あなたは少し調査は、あなたはすでにそれを認識していないのであれば、おそらく、あなたはすべての関連の書式を発見することができますし、建設にあなたの方法にもあなたを置く必要がありますなど、またサイズが含まれている次のセクションに移動することができます便利なハッシュます。

ハッシュ関数はあなたにすべての方法を得ることはありません(または、彼らは、メトリック/距離を定義するために、ある種の入力を必要とする)場合は、ウェブ上で利用可能ないくつかのバイナリ差分アルゴリズムと実装があります。私が最もよく知っている1は、Subversionバージョン管理システムで使用されています。これは、効率的にバイナリファイルのリビジョンを保存するためにXDELTAと呼ばれるバイナリ差分アルゴリズムを使用しています。 XDELTA:ここではそれを実装し、そのリポジトリ内のファイルへの直接リンクです.C に。作るWeb上のツールは、おそらくありますこのよりアクセスし、同様ます。

他のヒント

あなたは、バイナリの相違取得/パッチングシステムである、 bsdiff を見たいかもしれません。理論のたくさんの論文もあります。

剽窃検知のアルゴリズムからいくつかのアイデアを使用します。

私の考えます:

小さな部分を変更すると、

各ROMのための同等の「署名」を作成するためには、それがわずかに変化し、単語頻度グラフのようなものを作るが、代わりに単語の頻度を記録するには、ROMの非常に短いセクションをハッシュ可能性、およびハッシュ値の周波数を記録します。

は、バイト2から出発して同じサイズの部分をハッシュ、単に、一つのセクションをハッシュし、次のセクションでは、最初のセクションの端部から出発して、代わりにスライディングウィンドウを使用し、バイト1から始まるセクションをハッシュしませんその後、あなたのROM内の可変サイズの様々な部分の効果を無効にしますバイト3等から。

は簡単発信8ビットとXORすることによって現在のハッシュを次のウィンドウ位置のハッシュを計算し、着信8ビットをXORすることができるようにあなたは、各8ビット・バイトのXORのような単純なハッシュ関数を使用した場合。別の代替的なハッシュ関数は、単に命令コードワード長を使用することができます。すなわち、機械命令を表すコードの静的パターンを作成するのに十分であり得ます。重要なことは、あなたが同じハッシュ値が得られた命令コードに共通の短い配列になりハッシュ関数をお勧めしますということです。

あなたはおそらく、各の高い周波数を持つ少数のハッシュ値をしたいだろうが、あまりにも遠くに行かないか、あなたのグラフは、それらを比較することが困難となる、あまりにもフラットになります。同様に、ハード再び比較を行う、広すぎ行っていない、またはあなたが非常に小さい周波数がたくさんあります。

ROMごとにこのグラフを保管してください。各ハッシュ値の周波数の差の二乗の和を計算することにより、2つの異なるROMの周波数のグラフを比較します。それがゼロに合計場合、ROMは、同一である可能性が高いです。遠くゼロからは、ROMがあろう以下同様である。

そして、たくさん以上の"カップルの間のきっかけになるかもしれないという追加の私の現在の解することができます。

ニルスPipenbrinckったく同じ方向として現在の私の方法です。以降の主な結果のクローンが大きな貯蓄からのアーカイブのきっかけになるかもしれないとこ試験圧縮せRomとしているのを見ていた保存されます。を使用していLZMAアルゴリズム 7zip ます。

最初のステップは縮毎ROM個別には注意して圧縮されたサイズ、そのアーカイブしてみせRomととなったこの結果、サイズとは異なり個々の圧縮サイズです。場合サイズが同一の和として、個々のサイズは、0%そのような場合、サイズは同じです(最大)は同じです。

現在、この膨大な数の圧縮試みに必要な、カップルの最適化これまでのような姿取り扱いが異なります。

  1. 重比較に基づかなければならない類似の圧縮サイズです。まROMにて圧縮されたサイズの10MB ROMとして使用された東京オリンピックの圧縮サイズの2MBでは不可能であると20%以上似てるなとの比較をすることを実際の結果とすることができます。走りと同じ圧縮アルゴリズムの高い類似のファイルになりがちですが同様のサイズの結果、この発見は多くのクローンもの。

  2. 合わせの上、上下に"境界"の可能性はRom.これら優先した.まRom AとBの95%が類似しており、Romユネスコ-アジア文化センターのみ2%類似しているA-Cは0%と7%となっている。ここは低いためクローンのことは比較できる安全に延期も無視され、いかしていけるのではないかと思い知りになり正確な類似性のです。

私は、データ圧縮から借りたいくつかの技術がここに興味深いことができると思います:

2つのファイル、AとBがあるとします。

各ファイルを個別に圧縮し、一緒に圧縮されたサイズを追加。次に、単一の大きなファイルに2つのファイルを連結し、同様にそれを圧縮します。

サイズの違いは、ファイルがどの程度似ているかをあなたに大まかな見積もりを与えるだろう。

私はあなたが圧縮を行うためにバロウウィーラー変換(BZIP2)を試すことを示唆しています。他のほとんどの圧縮アルゴリズムは、限られた歴史を持っています。 BWTアルゴリズムは、大藤データの非常に大きな塊を上で動作することができます。このアルゴリズムは、同時に両方のファイルを「見る」と任意の類似性は、より高い圧縮率になります。

XDELTAがまともなバイナリ差分を取得するためにかなり便利です: http://xdelta.orgする

を開始できる保存のようなもの ハッシュ樹.までに必要な店舗なセットのハッシュ毎のROMに必要な収納スペースのみに比例したがい以下のサイズのROMを想定し、一定のブロックサイズです。のブロックサイズなのに十分な粒度の精度を確保するため、例えば:のための最小サイズの128MiB、精度の制約は1%、 タイガー-128のハッシュ (何もチェックに使用するファイル転送DirectConnect)は、ブロックサイズの1MiBは細かすことができすべてのハッシュに128 * 128 / 8 =2048バイト!もう10,000Romが必要約20MiBの空間です。さらに、選択でき、安全でより速くよび/または小さなハッシュ.を追加チェック類似の新しいROMが伴うもののようなもの:

  1. 分割のROMイクロブロックとハッシュおすすめします。
  2. 毎ROMのデータベースを比較す(下記参照)そのハッシュの新しいハッシュROM.

の比較機能はチェックのための類似性を認める事でしょう。ですが、それぞれに適したハッシュとして不可分値、すなわちなお邪魔している既存のものを探し出しを論理的に重要な差機能とハッシュ.どのブロックサイズともいうべき新たな分野を切り、ハッシュの衝突に少ない、精度保証によりシンプル等と比較しました。

したがって、この問題は、単純な一つの性能的に:チェックのくらい小さいデータセットのための類似性を認める事でしょう。

二つの思考:

  • 考えを整理のファイルとしてデータフローグラフやっcanonicalizationそのrepresention.からだの命令セット、これを実現可能なも直結束、逆アセンブラや一部のテキスト処となります。
  • による学習可能な識別などの CRM114 と言えるでしょうめいただくことをコンパクトな表現を与えてくれるあるかどうかのバイナリしているものがいっぱいあっている。

ウェイロンフリンが言ったように、あなたはバイナリ差分アルゴリズムが必要な場合があります。 rsyncのアルゴリズムの良いものです。これは、高速かつ信頼性の高いです。またnoreferrer">ユーティリティのマニュアルをrel="nofollow href="http://samba.anu.edu.au/rsync/"

ここでの難しさは、あなたが実行可能コードを扱っていることから、簡単な変更が全体のROM全体に伝播できるということです。すべての値のアドレスとオフセットは、単一の変数の追加またはノーオペレーション命令で変更することができます。それも、ブロックベースのハッシュ無価値を行います。

間に合わせと-ソリューションは、 difflib (またはお好みの言語/ワット相当)、それはあなたのデータの追加や削除を扱うことができるスライド式の比較を取得するので。 (可能な場合)実行可能ファイルおよびデータセクションにROMを分割します。データ部は、直接比較することができ、相似比は、に算出できものの」まだ/アドレスまたはオフセットwの問題を抱えているでしょう。

実行可能セクションは、より興味深いものです。マシンのASM形式をよく読んで、実行可能ファイルを取り、オペコードのシーケンスに分割。オペコードのままにして部品を登録しますが、(それは変数のアドレスをロードする)「ペイロード」/「即時」の部分をマスクオフ。あまりにも相似比計算に結果の情報を渡します。

不幸な部分は、これはまだあなたがトラックのROMの数にはO(n ^ 2)操作であることである、それは(増分)クラスタリングまたは比較の量を低減する周波数ベースの比較順序で緩和することができます必要に応じています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top