IDAPro
IDA 8.1ハイライト

IDA 8.1 が正式にリリースされ、プライベートLumina サーバーなどの優れた機能が追加されました。

プライベートLuminaサーバー

Luminaの公開データベースは、数年前から公開されており、有用な情報が満載です。 しかし、守秘義務の関係ですべての組織が利用できるわけではありません。 そこで、組織内で機能メタデータを共有するために利用できるプライベートサーバーのオプションを提供することにしました。

IDA Teamsには無償のLuminaライセンスが含まれ、IDA Proユーザーは別途購入することができます。

Luminaサーバーについての詳細はこちらから

新しいアイコンの紹介

IDAのための新しいアイコンセットがデザインされました。使用されているアイコンは、IDA版専用のものとなります。

32ビットバイナリ(IDA32)用のIDAを順次終了へ

世界は64ビットに移行しており(実際、IDAも7.0以降64ビット実行ファイルです)、 32ビットIDAが使われることは少なくなってきています。 実装の都合上、32ビット実行ファイルの逆コンパイルに使用する必要がありましたが、現在この制限を徐々に解除しており、 将来的には32ビットファイルはIDA64で解析・逆コンパイルされるようになります。 最終的には、32ビットIDAは完全に非推奨とし、レガシー.idbファイルを扱うためだけに残しておく予定です。

Golang regabiサポート

最近のGoのバージョンでは、いくつかのアーキテクチャで、オリジナルのスタックベースの呼び出し規則ではなく、 レジスタベースの呼び出し規則 (ABIInternal) が有効になっています。 IDAでは__usercallを使って手動で記述することができましたが、 現在は検出されたGoのバージョンとバイナリのアーキテクチャに基づいて、 標準の__golang規約のためのレジスタを自動的に割り当てるようになっています。

例えば、sliceと2つの整数を取る関数は、8.0では以下のように手動で記述する必要がありました。

__int16 __usercall main_crc16@(_slice_uint8 buffer@<0:rax, 8:rbx, 16:rcx>, __int64 start@, __int64 length@)

8.1では以下のように問題なく動作します。

__int16 __golang main_crc16(_slice_uint8 buffer, __int64 start, __int64 length);

変更点・新機能の一覧

IDA TeamsとLumina

  • Lumina: プライベートLuminaサーバーが利用可能になりました。
  • Lumina: LUMINA_HOSTとLUMINA_PORTの設定パラメータを削除(これらの値は代わりにレジストリに保存/取得されます)。
  • Teams:Vaultサーバーのパスワード保存をPBKDF2ハッシュへ変更。

プロセッサー・モジュール

  • ARM: Android NDK 19 ツールチェーンで生成されるA32スイッチパターンの認識を改良。
  • XTENSA: nop.n命令のデコードを追加。
  • XTENSA: a1レジスタを'sp'と表示するようにしました。

ファイルフォーマット

  • ELF:ARM: R_AARCH64_IRELATIVE リロケーションのサポート追加

FLIRT / TILS / IDS

  • FLIRT: icl 221 (Intel C++ 2022.1) 用の署名を追加。
  • FLIRT: ucrt 22621の署名を追加。
  • FLIRT: VC: vc1431 (Visual Studio 16.11.10) 64bit用の署名を追加。
  • FLIRT: VC: vc1432 (Visual Studio 16.11)用の署名を追加。

標準プラグイン

  • golang: regabi呼び出し規則のサポート追加

カーネル(Kernel)

  • noret.cfg: より多くの __noreturn 関数名を追加。

スクリプトとSDK

  • SDK: アプリケーションのビット数の変更 (例:inf_set_64bit()) で、 基本的な型サイズも調整されるようになりました。
  • SDK: 64ビットモードをサポートするプロセッサーモジュールはPR_USE64を設定しなければならないようになりました。

UI

  • UI:IDAでは、エディション(Pro/Home/Free/Teams)に応じた新しいアイコンが使用されるようになりました。

逆コンパイラ

  • decompiler: x86: スタック引数を持つ __fascall 関数の検出が改善されました。




IDA 8.0ハイライト

いつものように、IDAは多くの面で改良されましたが、今回最も重要な機能は、新しいIDA Teamsの導入です。

IDA Teamsがリリース!!

IDA Teamsの詳細はこちらから

新しい製品の最後の仕上げに懸命に取り組んできました。シームレスなコラボレーションを実現する統合ツールです。

最高のリビジョン管理ツールに触発され、IDA TeamsはそのキーコンセプトをIDAのデータベースとワークフローに導入しました。

  • リビジョンコントロール
  • 属性の変更
  • 差分とマージ

iOS 16 dyld 共有キャッシュのサポート

Appleは再び、モバイルオペレーティングシステムのシステムファイルの内部フォーマットを変更し、 パフォーマンスとメモリ使用量を改善しました。そのため、新しい調整をサポートするためにIDAを更新しました。

アウトライン化された関数

最近のiOSバージョンでAppleが使用したもう一つの新しいトリックは、アウトライン化された関数です。 これはコードサイズの最適化で、コンパイラが複数の関数で使われる共通の命令シーケンスを新しい擬似関数に抽出し、 それを複数の場所から「呼び出す」ものです。

この動作は、特にアウトライン化された関数が親関数のレジスタやスタック変数を任意に使用する場合、 逆コンパイルされた疑似コードを醜くする傾向があります。レジスタや親関数のスタック変数を使用する場合は特にそうです。 このような関数には、特別な属性 でマークすることができ、逆コンパイルされたコードはより見栄えが良くなります。

たとえば、このような最適化でコンパイルされたファイルの一部を次に示します。

最初の擬似コードでは、コンパイラが生成した _OUTLINED_FUNCTION_NN フラグメントへの明示的な呼び出しと、 逆コンパイラが呼び出しによって損なわれたと見なすためにオレンジでマークされたいくつかの変数が確認できます (これは通常の関数への呼び出しの場合と同じです)。

これらの擬似関数に 'outline' 属性を付けて擬似コードを更新すると、逆コンパイラがすべてをインライン化し、 オレンジ色の変数はなくなります。

Golang 1.18

新バージョンの言語では、メタデータのレイアウトに変更が導入されました。 新しいIDAのバージョンはメタデータを解析し、関数名をうまく復元することができます。

例えば、ここにIDA 7.7で取り除かれたgolang 1.18のバイナリがあります。

そしてIDA 8.0の同じバイナリはこちら。

ARC逆コンパイラ

ARCプロセッサは、SSDドライブやWi-Fiチップセットなど、多くの組み込み機器に使用されています。 また、数年前まで悪名高いIntel MEに使用されていたコアでもあります。 新しいデコンパイラでは、現在IDAでサポートされているすべてのARC命令セット (従来の32ビットISA、32/16ビットARCompact、新しいARCv2)をサポートしています。 遅延 スロット、条件付き命令、ゼロオーバーヘッドループがサポートされています。

※注: この逆コンパイラは、最初は IDA Teams Ultra バンドルの一部としてのみ利用できます。

もうPython 2は必要ありません

Python 2.7のサポートが終了して2年以上が経過し、そろそろ手放す時期が来ているようです。 IDA 8.0 では、最新の 3.10 を含む Python 3.x のみをサポートします (Windows インストーラには Python 3.10.5 が含まれています)。

Function Finder プラグイン (patfind) によるファームウェア解析の改善

ファームウェアのバイナリは通常、シンボルやその他のメタデータがなく、 IDAがマークされていないロードされたデータからコードを見つけるのに役立ちます。 そのため、ユーザーは手作業でそれを行う必要がありました。 新しいリリースでは、Ghidra で使用されているパターン形式を利用するプラグインを追加しました (マイナーな拡張機能付き)。 このプラグインは、バイナリおよびバイナリに似た形式に対してデフォルトで有効になっており、 IDA がより多くのコードを自動的に検出するのに役立ちます。 また、通常の構造化ファイルに対して手動で呼び出して、参照されていないコードを見つけることもできます。

デフォルト設定での初期自動分析後に発見された関数の数の比較:

FLAIRパターンジェネレータ(makepat)

FLAIRツールキットは、IDA Proのすべてのユーザーが利用でき、静的ライブラリからFLIRTシグネチャを作成することができます。 しかし、そのようなライブラリは常にあるわけではなく、最終的にリンクされたバイナリしかない場合もあります。 makepatプラグインは、任意のIDAデータベースの関数に対する.patファイルの作成をサポートします。 Lumina用に追加された機能を使って、パターン内の可変バイトをマークします。 .patはsigmakeで署名ファイルとしてコンパイルされ、他のファイルに適用されます。

変更点・新機能の全リスト

プロセッサーモジュール

  • 68K:範囲チェックにcmpaを使用するスイッチのサポート
  • ARM: T疑似レジスタを介したARM/Thumbモードの手動設定の扱いを改善
  • AVR: ATmega640用のコンフィグを追加
  • PC:機能認識を改善

デバッガ

  • PIN: PIN 3.22-98547をサポート

ファイル形式

  • COFF: /bigobj オプションでコンパイルされたARM64とARMv7 のオブジェクトファイルをサポート
  • DWARF: libdwarfをバージョン20220625(aka 0.4.1)にアップグレード
  • MACHO: iOS16+ のdyldcachesにおけるブランチマッピングのシンボル化を改善
  • MACHO: iOS16のdyldキャッシュのサポート
  • MACHO: dyld 共有キャッシュをロードする際、「シングルモジュール」オプションをデフォルトの選択肢に

FLIRT / TILS / IDS:

  • FLIRT: GO: golangのシグネチャのカバレッジを拡大
  • FLIRT: MFC: vc1431のシグネチャを追加(Visual Studio 16.11.10)
  • FLIRT: VC: vc1431 32bit用のシグネチャを追加(Visual Studio 16.11.10)
  • idaclang: cmdlineツールに「--idaclang-parse-static」オプションを追加
  • idaclang: 「--idaclang-extra-c-mangling」オプションを導入し、C++, C, Objective-C などの言語が混在する入力に対してタイプライブラリをビルド可能に
  • idaclang: 現在ロードされているファイルに対応するデフォルトのターゲット設定を事前設定

標準プラグイン

  • DSCU: iOS16からのグローバルオフセットテーブルのロード(およびシンボル化)のサポート
  • dyldcaches
  • golang: go1.18 のサポート (関数名、型)
  • OBJC: objc_alloc_init() を使用して Objective-C オブジェクトを初期化する関数の逆コンパイルを改善
  • OBJC: idbに存在しないメソッドに対する人工的なインポートを作成することにより、 Objective-Cバイナリの逆コンパイルを改善
  • patfind: マークされていないバイナリのコードパターンを検出する新しいプラグイン

スクリプティングとSDK

  • IDAPython: Python 2サポートを削除
  • SDK: 空白をトリミングする新しいメソッドqstring::rtrim()を追加
  • 標準アクション (挿入、削除、編集、更新) をカスタマイズするためのセレクターにget_stdact_descs()を追加
  • シェルと同じルール (例: ** と [az] のような範囲) に従って、パターンに対してパス全体を照合できる wildcard_path_match()を追加
  • SDK: has_external_refs()のコメントを改善
  • SDK: ハッシュ化されたSTLコンテナでqstringの使用法をサポート

  • UI: [Debugger] > [Process options...] ダイアログのコマンドライン引数が 1024 文字に制限されなくなりました

逆コンパイラ

  • オプション HO_PROP_VOLATILE_LDX を追加して、揮発性メモリ アクセスをチェックせずにロード命令を伝達
  • アウトライン化された関数のサポートを追加
  • arm: 接尾辞 _from_thumb、_from_arm、_veneer を持つサンク関数を認識
  • 戻り値のばらつき(=複数のレジスタ/スタック位置の使用)の取り扱いを改善
  • 新しい逆コンパイラ HEXARC (ARCプロセッサ・ファミリ用)
  • pc: 制御レジスタ操作組込関数 (例: __writecr0) が 32 ビットモードで 32 ビット値で動作
  • 文字要素の型としてWCHAR, wchar16_t, wchar32_tをサポート