Kam1n0 v2.x は、拡張可能なアセンブリ管理・分析プラットフォームです。ユーザーはまず、(大量の)バイナリ集合を異なるリポジトリにインデックス化し、クローン検索や分類などのさまざまな分析サービスを利用できます。アプリケーション の概念を用いて、アセンブリリポジトリのマルチテナントアクセスと管理をサポートします。アプリケーションインスタンスは、独自の排他リポジトリを持ち、専門的な分析サービスを提供します。リバースエンジニアリングタスクの多様性を考慮し、Kam1n0 v2.x サーバーは現在、3種類のクローン検索アプリケーション(Asm-Clone、Sym1n0、Asm2Vec)と、Asm2Vec に基づく 実行可能ファイル分類 を提供しています。新しいアプリケーションタイプは、プラットフォームにさらに追加することができます。
ユーザーは複数のアプリケーションインスタンスを作成できます。アプリケーションインスタンスは特定のユーザーグループ間で共有できます。アプリケーションリポジトリの読み書きアクセスとオンオフ状態は、アプリケーションの所有者が制御できます。Kam1n0 v2.x サーバーは、いくつかの共有リソースプールを使用してアプリケーションを同時に提供できます。
Kam1n0 は、カナダのマギル大学データマイニング・セキュリティ研究所の Benjamin C. M. Fung 教授の指導のもと、Steven H. H. Ding と Miles Q. Li によって開発されました。これは、Hex-Rays Plug-In Contest 2015 で第2位を受賞しました。Kam1n0 が有用だと感じられた場合は、以下の論文を引用してください:
S. H. H. Ding, B. C. M. Fung, and P. Charland. Kam1n0: MapReduce-based Assembly Clone Search for Reverse Engineering. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (SIGKDD), pages 461-470, San Francisco, CA: ACM Press, August 2016.
S. H. H. Ding, B. C. M. Fung, and P. Charland. Asm2Vec: boosting static representation robustness for binary clone search against code obfuscation and compiler optimization. In Proceedings of the 40th IEEE Symposium on Security and Privacy (S&P), 18 pages, San Francisco, CA: IEEE Computer Society, May 2019.
Asm-Clone アプリケーションは、アセンブリ関数の効率的な部分グラフ検索問題(すなわちグラフ同型問題)を解決しようとします(230万関数に対して平均クエリ時間1.3秒未満、平均インデックス時間30ms未満)。対象関数(下図左)が与えられると、リポジトリ内の他の関数の中からクローン部分グラフ(下図右)を識別できます。
差別化ファジングテストと制約解決によるセマンティッククローン検索。効率的でスケーラブルな動的-静的ハイブリッドアプローチ(150万関数に対して平均クエリ時間1秒未満、平均インデックス時間100ms未満)。対象関数(下図左)が与えられると、リポジトリ内の他の関数の中からクローン部分グラフ(下図右)を識別できます。抽象構文グラフの可視化をサポート。
Asm2Vec は表現学習を活用します。アセンブリコードの語彙意味関係を理解します。例えば、xmm* レジスタは addps などのベクトル操作と意味的に関連しています。memcpy は strcpy と類似しています。以下のグラフは、libgmp 内の同じソースコード gmpz_tdiv_r_2exp からコンパイルされた異なるアセンブリ関数を示しています。左から右へ、アセンブリ関数は GCC O0 オプション、GCC O3 オプション、O-LLVM 難読化コントロールフローグラフ平坦化オプション、LLVM 難読化 Bogus Control Flow Graph オプションでコンパイルされています。Asm2Vec はそれらを 静的に クローンとして識別できます。
このアプリケーションでは、ユーザーは機能的な関連性に基づいた一連のソフトウェアクラスを定義し、各クラスに属するバイナリを提供します。その後、システムは自動的に関数をクラスタにグループ化し、その中で関数はクローン関係によって直接的または間接的に接続されます。分類に識別力のあるクラスタが保持され、それらのクラスのシグネチャとして機能します。対象のバイナリが与えられると、システムは各ソフトウェアクラスに属する度合いを示します。
関数類似度計算モデルとして Asm2Vec を使用。
下図は、Kam1n0 v2.x の主要なUIコンポーネントと機能を示しています。マテリアルデザインを採用しています。一般的に、各ユーザーはアプリケーションリスト、実行中ジョブリスト、結果ファイルリストを持ちます。
現在の Kam1n0 のリリースは、コアサーバーと IDA Pro プラグインの2つのインストーラで構成されています。
| インストーラ | 含まれるコンポーネント | 説明 |
|---|---|---|
| Kam1n0-Server.msi | コアエンジン | インデックス化と検索のためのサービスを提供するメインエンジン。 |
| ワークベンチ | リポジトリと実行中のサービスを管理するためのユーザーインターフェース。 | |
| Webユーザーインターフェース | バイナリファイルとアセンブリ関数の検索/インデックス化のためのWebユーザーインターフェース。 | |
| Visual C++ 再頒布可能パッケージ(VS 15 用) | z3 の依存関係。 | |
| Kam1n0-IDA-Plugin.msi | プラグイン | コネクタとユーザーインターフェース。 |
| Cefpython 用 PyPI ホイール | ユーザーインターフェースのレンダリングエンジン。 | |
| PyPI および依存ホイール | Python のパッケージ管理。IDA 6.8 および 6.9 に含まれています。 |
Kam1n0 コアエンジンは純粋に Java で書かれています。次の依存関係が必要です:
リリースページ から Kam1n0-Server.msi ファイルをダウンロードします。指示に従ってサーバーをインストールします。インストールパスを選択するように求められます。サーバーが逆アセンブルを処理する必要がない場合、IDA Pro はオプションです。言い換えれば、クライアント側は Kam1n0 プラグインを IDA Pro 用に使用します。Kam1n0 サーバーと一緒に IDA Pro をインストールすることを強くお勧めします。Kam1n0 サーバーは、.i64 ファイルを開くために使用するデフォルトアプリケーションを探すことで、IDA Pro を自動的に検出します。
Kam1n0 IDA Pro プラグインは、ロジック部分が Python、レンダリング部分が HTML/JavaScript で書かれています。インストールには次の依存関係が必要です:
次に、リリースページ から Kam1n0-IDA-Plugin.msi インストーラをダウンロードします。指示に従ってプラグインとランタイムをインストールします。プラグインは、$IDA_PRO_PATH$/plugins にある IDA Pro プラグインフォルダにインストールする必要があることに注意してください。例えば、Windows では、パスは C:/Program Files (x86)/IDA 6.95/plugins になる場合があります。インストーラはパスを検出して検証します。
Oracle バージョンの Java 11 がインストールされていることを確認してください。(apt の default-jdk ではありません)。
sudo add-apt-repository ppa:webupd8team/java
~webupd8team not found など)、プロキシを使用している場合は、http_proxy および https_proxy 環境変数を設定してエクスポートし、-E オプションを付けて sudo で再試行してください。また、'add-apt repository command not found' エラーが発生した場合は、sudo apt install -y software-properties-common を試してください。sudo apt-get update、および sudo apt-get install oracle-java8-installer
java -version で Java バージョンを確認してください。必要に応じて、JAVA_HOME 環境変数を手動で設定する必要がある場合があります(/etc/environment 内)、JAVA_HOME=/usr/lib/jvm/java-11-oracleKam1n0-Community から Linux 用の最新リリース(Kam1n0-IDA-Plugin.tar.gz および Kam1n0-Server.tar.gz)をダウンロードします。
2つの tarball を展開します(例:tar –xvzf Kam1n0-IDA-Plugin.tar.gz および tar –xvzf Kam1n0-Server.tar.gz)。
Kam1n0-Server.tar.gz ファイルは server ディレクトリを作成します。
server ディレクトリ内に、kam1n0.properties というファイルがあるはずです。ここで kam1n0 のさまざまな設定を行います。これは非常に重要です。
kam1n0.data.path を、kam1n0 関連データを書き込む場所に設定します。server と同じ場所に置くことをお勧めします。kam1n0.ida.home は、IDA のインストール場所を指します。IDA を持っておらず、逆アセンブルに kam1n0 を使用する予定がない場合は、この行(および次の kam1n0.ida.batch)をコメントアウトしてください。kam1n0.properties ファイルの詳細(正確な情報)については、kam1n0.properties.explained ファイルを参照してください。
kam1n0-server-workbench を実行します: java -jar kam1n0-server-workbench.jar。これにより、ウィンドウが表示され、kam1n0 を実際に起動するよう促されます。または、kam1n0-server を実行します: java -jar kam1n0-server.jar --start。これにより、コンソールからウィンドウなしでサーバーが起動します。
接続して使用するには、ブラウザで 127.0.0.1:8571(デフォルトの kam1n0 リッスンポートは 8571 ですが、kam1n0.properties で変更可能)にアクセスします。美しい kam1n0 Web UI が表示されます。そこから、Kam1n0-Community リポジトリのチュートリアルに従って、kam1n0 の使い方を学んでください。
以前のバージョン(<2.0.0)で使用されていたアセンブリコードリポジトリと設定ファイルは、最新バージョンではサポートされなくなりました。古いリポジトリの移行が必要な場合は、お問い合わせください。
最新の安定ブランチをクローンします(--recursive を忘れずに!):```bash
git clone --recursive -b master2.x --single-branch https://github.com/McGill-DMaS/Kam1n0-Community
## プロジェクトのインポート
IntelliJ: ルート /kam1n0/kam1n0/ を maven プロジェクトとしてインポートします。すべてのサブモジュールがそれに応じて読み込まれます。
EclipseEE: クローンした Git リポジトリを Git ビューに追加します。Git リポジトリからすべての maven プロジェクトをインポートします。
エラーに対処するために、クラスパスを変更する必要があるかもしれません。
IDE 内で実行する場合、すべてのリソースパスは動的に変更されます(kam1n0-resources サブモジュールを介して)。
プロジェクトをビルドするには:```
cd /kam1n0/kam1n0
mvn -DskipTests clean package
mvn -DskipTests package
生成されたバイナリは /kam1n0/build-bins/ にあります。
テストコードを実行するには、まず http://chromedriver.chromium.org/ から chromedriver.exe をダウンロードし、その絶対パスを webdriver.chrome.driver という環境変数に追加する必要があります。また、システムにChromeブラウザがインストールされている必要があります。テストコードはブラウザインスタンスを起動してUIインターフェースをテストします。テスト手順全体には約3時間かかります。```
cd /kam1n0/kam1n0
mvn -DskipTests clean package # you can skip this one if you already built the package
mvn -DskipTests package # you can skip this one if you already built the package
mvn -DforkMode=never test
これらのコマンドは、libvexとz3のプリコンパイル済みホイールを使用してJavaのみをコンパイルします。そのまま動作します。
libvexとz3のビルドはプラットフォームに依存します。Angrのlibvexのフォークを使用しています。
より本格的なビルドスクリプトやWindows/Linux用のインストーラは、/kam1n0-builds/ にあります。
* kam1n0: サーバーのソースコード。
* kam1n0-builds: インストーラのソースコードと配布物をビルドするスクリプト。
* kam1n0-clients: クライアントのソースコード。
## バイナリリリース
継続的な開発とデリバリーのためにJenkinサーバーを運用しています。最新の安定リリースはこちらに掲載されます。定期的に、内部の実験ブランチとこのリポジトリを同期します。
## ライセンス
本ソフトウェアは、カナダの[McGill Data Mining and Security Lab](http://dmas.lab.mcgill.ca/)および[Queen's L1NNA Research Laboratory](https://l1nna.com/)において、[Steven H. H. Ding](http://stevending.net/)、[Miles Q. Li](http://milesqli.github.io/)、[Benjamin C. M. Fung](http://dmas.lab.mcgill.ca/fung/)によって開発されました。Apache License Version 2.0の下で配布されています。詳細は[LICENSE.txt](https://github.com/mcgill-dmas/kam1n0-community/blob/master2.x/LICENSE.txt)を参照してください。
Copyright 2014-2021 McGill Universityおよび研究者。全著作権所有。
## 謝辞
-orange.svg?style=for-the-badge)




