
qiling v1.4.11
真のインストゥルメンタブルバイナリエミュレーションフレームワーク
Qilingは高度なバイナリエミュレーションフレームワークであり、以下の機能を備えています:
- マルチプラットフォームのエミュレーション:Windows、macOS、Linux、Android、BSD、UEFI、DOS、MBR。
- マルチアーキテクチャのエミュレーション:8086、X86、X86_64、ARM、ARM64、MIPS、RISC-V、PowerPC。
- 複数のファイル形式をサポート:PE、Mach-O、ELF、COM、MBR。
- Demigod を介した Windows ドライバ (.sys)、Linux カーネルモジュール (.ko)、macOS カーネル (.kext) をサポート。
- 隔離された環境でのコードのエミュレーションとサンドボックス化。
- 完全に設定可能なサンドボックスを提供。
- メモリ、レジスタ、OSレベル、ファイルシステムレベルの詳細なAPIを提供。
- 細粒度のインストルメンテーション:さまざまなレベル(命令/基本ブロック/メモリアクセス/例外/システムコール/I/Oなど)でフック可能。
- 現在の実行状態の保存と復元などの仮想マシンレベルのAPIを提供。
- クロスアーキテクチャおよびクロスプラットフォームのデバッグ機能をサポート。
- リバースデバッグ機能を備えたビルドインデバッガ。
- 実行中のコード(ロード済みライブラリを含む)に対する動的なホットパッチを可能にします。
- Pythonで書かれた真のフレームワークであり、その上にカスタマイズされたセキュリティ分析ツールを簡単に構築できます。
Qilingはさまざまな国際会議にも登場しています。
2022:
2021:
2020:
- Black Hat, Europe
- Black Hat, USA
- Black Hat, USA (Demigod)
- Black Hat, Asia
- Hack In The Box, Lockdown 001
- Hack In The Box, Lockdown 002
- Hack In The Box, Cyberweek
- Nullcon
2019:
QilingはUnicorn Engineを基盤としています。
詳細はウェブサイトをご覧ください。
ライセンス
このプログラムはフリーソフトウェアです。あなたはこれを、Free Software Foundationによって公開されたGNU General Public License(バージョン2、または(あなたの選択により)それ以降のバージョン)の条件の下で再配布または変更することができます。
Qiling と他のエミュレータの比較
多くのオープンソースエミュレータがありますが、Qilingに最も近いプロジェクトはUnicornとQEMUユーザーモードです。このセクションでは、Qilingとそれらの主な違いを説明します。
Qiling vs Unicornエンジン
Unicornの上に構築されていますが、QilingとUnicornはまったく異なるものです。
- Unicornは単なるCPUエミュレータであり、CPU命令のエミュレーションに焦点を当て、エミュレータのメモリを理解できます。それ以上の、動的ライブラリ、システムコール、I/O処理、PE、Mach-O、ELFなどの実行可能形式といった高レベルの概念はUnicornでは認識されません。その結果、Unicornはオペレーティングシステム(OS)のコンテキストなしで生のマシン命令のみをエミュレートできます。
- Qilingはより高レベルのフレームワークとして設計されており、Unicornを利用してCPU命令をエミュレートしつつ、OSを理解できます。つまり、実行可能形式のローダー(現在はPE、Mach-O、ELF)、動的リンカ(共有ライブラリのロードと再配置が可能)、システムコールとI/Oハンドラを備えています。このため、QilingはネイティブOSを必要とせずに実行可能バイナリを実行できます。
Qiling vs QEMUユーザーモード
QEMUユーザーモードは、クロスアーキテクチャで実行可能バイナリ全体をエミュレートするという点で、当エミュレータと似たことを行います。しかし、QilingはQEMUユーザーモードに対していくつかの重要な違いを提供します。
- Qilingは真の分析フレームワークであり、その上に独自の動的分析ツール(Pythonで)を構築できます。一方、QEMUは単なるツールであり、フレームワークではありません。
- Qilingは動的インストルメンテーションを実行でき、実行時にコードをホットパッチすることもできます。QEMUはどちらも実行しません。
- クロスアーキテクチャで動作するだけでなく、Qilingはクロスプラットフォームでもあります。例えば、Windows上でLinux ELFファイルを実行できます。対照的に、QEMUユーザーモードは、エミュレートされたコードからネイティブOSへのシステムコールの転送方法のため、同じOSのバイナリ(例えばLinux上のLinux ELF)のみを実行します。
- QilingはWindows、macOS、Linux、BSDを含むより多くのプラットフォームをサポートしています。QEMUユーザーモードはLinuxとBSDのみを扱えます。
インストール
Qiling Frameworkのインストール方法については、セットアップガイドファイルをご覧ください。
例
以下の例は、Qilingフレームワークを最も簡単な方法で使用してWindows実行可能ファイルをエミュレートする方法を示しています。
from qiling import Qiling
if __name__ == "__main__":
# Qilingインスタンスを初期化し、エミュレートする実行可能ファイルとエミュレートするシステムルートを指定します。
# 現在の作業ディレクトリはQilingホームと見なされることに注意してください
ql = Qiling([r'examples/rootfs/x86_windows/bin/x86_hello.exe'], r'examples/rootfs/x86_windows')
# エミュレーションを開始
ql.run()
- 次の例は、Windowsのcrackmeを動的にパッチして、常に「Congratulation」ダイアログを表示させる方法を示しています。
from qiling import Qiling
def force_call_dialog_func(ql: Qiling):
# 現在のスタックフレームからDialogFuncのアドレスを取得
lpDialogFunc = ql.stack_read(-8)
# DialogFunc用にスタックメモリをセットアップ
ql.stack_push(0)
ql.stack_push(1001) # IDS_APPNAME
ql.stack_push(0x111) # WM_COMMAND
ql.stack_push(0)
# リターンアドレスをプッシュ
ql.stack_push(0x0401018)
# DialogFuncのアドレスからエミュレーションを再開
ql.arch.regs.eip = lpDialogFunc
if __name__ == "__main__":
# Qilingインスタンスを初期化
ql = Qiling([r'rootfs/x86_windows/bin/Easy_CrackMe.exe'], r'rootfs/x86_windows')
# いくつかのコードをNOPで埋める
ql.patch(0x004010B5, b'\x90\x90')
ql.patch(0x004010CD, b'\x90\x90')
ql.patch(0x0040110B, b'\x90\x90')
ql.patch(0x00401112, b'\x90\x90')
# アドレスにコールバックをフック
ql.hook_address(force_call_dialog_func, 0x00401016)
ql.run()
以下のYouTubeビデオは、上記の例がどのように動作するかを示しています。
Ubuntu x64ホスト上でARMルーターファームウェアをエミュレート
Qiling Frameworkは、x86_64 Ubuntuホスト上でARMルーターの/usr/bin/httpdをホットパッチしてエミュレートします。
QilingのIDA Proプラグイン:Miraiの秘密をインストルメントして解読
このビデオは、QilingのIDA ProプラグインがIDA ProをQilingインストルメンテーションエンジンで実行させる方法を示しています。
GDBサーバーとIDA Proのデモ
Qiling FrameworkとIDA Proを使用してシンプルなCTFチャレンジを解く
Qiling FrameworkとIDA Proを使用したシンプルなCTFチャレンジの解法
MBRのエミュレート
Qiling FrameworkはMBRをエミュレートします
Qltool
Qilingは、シェルコードや実行可能バイナリを迅速にエミュレートするためのqltoolという便利なツールも提供しています。
qltoolを使用すると、簡単に実行できます:
シェルコードの場合:
$ ./qltool code --os linux --arch arm --format hex -f examples/shellcodes/linarm32_tcp_reverse_shell.hex
バイナリファイルの場合:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --rootfs examples/rootfs/x8664_linux/
バイナリとGDBデバッガを有効にして:
$ ./qltool run -f examples/rootfs/x8664_linux/bin/x8664_hello --gdb 127.0.0.1:9999 --rootfs examples/rootfs/x8664_linux
コードカバレッジ収集あり(現在はUEFIのみ):
$ ./qltool run -f examples/rootfs/x8664_efi/bin/TcgPlatformSetupPolicy --rootfs examples/rootfs/x8664_efi --coverage-format drcov --coverage-file TcgPlatformSetupPolicy.cov
JSON出力あり(主にWindows):
$ ./qltool run -f examples/rootfs/x86_windows/bin/x86_hello.exe --rootfs examples/rootfs/x86_windows/ --console False --json
連絡先
最新情報はウェブサイト https://www.qiling.io をご覧ください。
メール [email protected]、Twitter @qiling_io でお問い合わせください。
コア開発者、主要コントリビューターなど
CREDITS.mdを参照してください。

