Log.i53

Themidaのアンパックを目指すブログ改め使い物になるえんじにゃを目指すブログ

Anti-Debug

The Art of Unpacking 翻訳まとめ

翻訳物 アンパック勉強の入口として以下の記事を翻訳しました! とても勉強になりました。ありがとうございます:) The Art of Unpacking - Black Hat (PDF)# 著者に無許可で翻訳物を公開してしまいました。 # フェアユースの概念に従っていますが何か問題が…

AntiDebug技術:Virtual Machines

仮想マシン利用のコンセプトはシンプルです。 分析者はアンチデバッグ技術や分析妨害技術を回避/解決する方法を最終的には把握することになり、保護された実行ファイルは最終的には復号されメモリ内に展開した状態で実行される必要があるので、静的解析をす…

AntiDebug技術:Multi-Threaded Packers

マルチスレッドで動作するパッカーでは、保護された実行ファイルの復号など、要求された操作を実行するためのそれぞれ別のスレッドが生成されます。このようなパッカーでは、コードのトレースが複雑になることからコード理解の困難性が増加します。 マルチス…

AntiDebug技術:API Redirection

APIリダイレクションは保護された実行ファイルのインポートテーブルの再構築を妨害するための手法です。一般的に、オリジナルのインポートテーブルは破壊され、APIは割り当てメモリ内に位置する実際のAPIに対応するルーチンにリダイレクトされます。 以下にk…

AntiDebug技術:Stolen Bytes

Stolen Bytesは、実行ファイルのコード保護(たいていエントリポイントのいくつかの命令)の基礎で的な手法であり、パッカーは割り当てメモリ上にコードをコピーして実行した後で削除します。これにより、保護プロセスがメモリからダンプされた場合であっても…

AntiDebug技術:TLS Callbacks

パッカーによって使用されるその他のテクニックに、実際のエントリポイントが実行される前にコードを実行する手法があります。これはThread Local Storage(TLS)コールバック関数を使用することで実現できます。パッカーはそのデバッガ検出や復号ルーチンをこ…

AntiDebug技術:Debugger Blocker

Armadilloパッカーによって導入され始めてた機能がDebugger Blockerと呼ばれる機能です。これは保護プロセスへのデバッガのアタッチを妨ぐものです。この保護機構はWindowsによって提供されているデバッギング機能を使用して実装されています。 具体的には、…

AntiDebug技術:Process Injection

パッカーによってはプロセスインジェクションを機能としてもつものが存在します。この機能では、アンパッキングスタブが選択されたホストプロセス(それ自身, explorer.exe, iexplorer.exeなど)を生成して、アンパックされた実行ファイルがそのホストプロセス…

AntiDebug技術:OllyDbg:OutputDebugString() Format String Bug

このデバッガ攻撃テクニックはOllyDbg特有のものです。OllyDbgにはフォーマットストリングバグという脆弱性があることが知られており、これを利用することでOllyDbgをクラッシュさせるかまたは任意のコードを実行させることができます。このバグはkernel32!O…

AntiDebug技術:Unhandled Exception Filter

MSDNドキュメントには、例外が未処理例外フィルタ(kernel32!UnhandledExceptionFilter) に達してかつ、そのアプリケーションがデバッグされていなかった場合、その未処理例外フィルタはkernel32!SetUnhandledExceptionFilter() APIのパラメータとして指定さ…

AntiDebug技術:Disabling Breakpoints

ブレークポイントを強制的に解除することによってデバッガを攻撃する方法があります。ハードウェアブレークポイントを無効化するために、パッカーはCONTEXT構造体を介してデバッグレジスタを編集します。 例 この例では、例外ハンドラに渡されるCONTEXTレコ…

AntiDebug技術:ThreadHideFromDebugger

このテクニックは一般的にスレッドの優先度を設定するために使われるntdll!NtSetInformationThread() APIを利用します。このAPIはデバッガに送信されるデバッグイベントを妨害するためにも使用できるのです。 NtSetInformationThread()に渡されるパラメータ…

AntiDebug技術:Blocking Input

分析者によるデバッガの制御を防止するために、パッカーはメインのアンパッキング処理が実行されている間にuser32!BlockInput() APIを利用してキーボードやマウスの入力をブロックすることができます。ガベージコードやアンチ逆アセンブリ技術でこれを隠蔽さ…

AntiDebug技術:Misdirection and Stopping Execution via Exceptions

コードを直線的にトレースしていくことで、分析者はコードの目的を容易に理解し把握することができます。したがって、パッカーによっては線形でないコードによって分析に時間がかかるように仕向けるいくつかの技術を採用しています。 一般的に使用される技術…

Anti-Analysis技術:Anti-Disassembly

分析者を混乱させるためのその他の方法としては逆アセンブリの難読化があります。アンチ逆アセンブリは静的解析によるバイナリの分析を複雑にする効果的な手法であり、ガベージコードやコード置換と組み合わせることでより効果的になります。 アンチ逆アセン…

Anti-Analysis技術:Garbage Code and Code Permutation

ガベージコード(Garbage Code) アンパッキング処理へのガベージコードの挿入は分析者を混乱させるための効果的な手法のうちの1つです。コードの真の目的を隠蔽することに焦点が当てられており、複号処理やデバッガ検出のような耐タンパー技術の上に適用され…

Anti-Analysis技術:Encryption and Compression

暗号化(Encryption)と圧縮(Compression)は耐タンパー技術において最も基本的なものです。これらは分析者が逆アセンブラによって保護された実行ファイルをロードして、何の支障もなしに分析を開始することを防止するための、最初の防御となります。 暗号化 パ…

デバッグ検出技術:Code Checksum Calculation

パッチ検出ではパッカーコードの改変を検出します。コードの改変(パッチ)はアンチデバッグ処理の無効化を示唆しています。また、ソフトウェアブレークポイントがセットされているかどうかを検出する上でも利用することができます。パッチ検出はコードチェッ…

デバッガ検出技術:Hardware Breakpoint Detection

ソフトウェアブレークポイントの他にハードウェアブレークポイントというものがあります。ハードウェアブレークポイントはデバッグレジスタを設定することによってセットできます。デバッグレジスタはDr0からDr7まで用意されており、Dr0からDr3が4以下のブレ…

デバッガ検出技術:Software Breakpoint Detection

ソフトウェアブレークポイントはターゲットアドレスのコードを改編することによって設定するブレークポイントであり、例えば、0xCCのバイト値(INT3 / ブレークポイント割り込み)に置き換えられます。この場合、パッカーは保護コードやAPIコード内の0xCC値…

デバッガ検出技術:Guard Pages

このチェックはOllyDbg特有のものであり、これはOllyDbgのメモリブレークポイント機能に関係しています。 ハードウェア/ソフトウェアブレークポイントを別として、OllyDbgはアクセス/ライトメモリブレークポイントを実装しています。このタイプのブレークポ…

デバッガ検出技術:Device Drivers

システムでカーネルデバッガがアクティブになっているかどうかをチェックする古典的な手法として、カーネルデバッガのデバイスドライバへのアクセスを試みるものがあります。このテクニックはとてもシンプルで、SoftICEのようなカーネルモードデバッガによっ…

デバッガ検出技術:Debugger Process

システムでデバッガが動作しているかをチェックする方法の1つに、プロセスを列挙してデバッガのプロセス名(OLLYDBG.EXE、WinDbg.exeなど)があるかどうかを確認する方法があります。この実装は、Process32First/Next()を使用して各プロセスを参照して、デバ…

デバッガ検出技術:Debugger Window

デバッガウィンドウの存在は、システムでデバッガが動作していることを判別するための標識となります。デバッガは特定のクラス名(OllyDbgであればOLLYDBG, WinDbgであればWinDbgFrameClass)でウィンドウを作成ししているため、これらのデバッガウィンドウの…

デバッガ検出技術:DebugObject:NtQueryObject()

プロセスがデバッグされているかどうかを特定する代わりに、デバッガがシステムで実行されているかどうかのチェックに関与するその他の技術があります。 リバースエンジニアリングのフォーラムで議論されていた1つの興味深い方法が、DebugObject型のカーネル…

デバッガ検出技術:Parent Process

一般的に、プロセスはその親(ダブルクリックで実行するなどが要因)としてexplorer.exeを持っています。explorer.exe以外の親プロセスはを持っている場合、そのアプリケーションは別のアプリケーションによって生成されていることを示唆しているため、それ…

デバッガ検出技術:SeDebugPrivilege

通常、プロセスはそのプロセスへのアクセストークンが無効となっているSeDebugPrivilege権限を保持しています。しかし、OllyDbgやWinDbgなどのデバッガによってロードされている場合には、SeDebugPrivilege権限が有効になっています。これらのデバッガがこの…

デバッガ検出技術:Timing Checks

プロセスがデバッグされている間にデバッグイベントを処理するコードや、分析者が命令をステップ実行することなどによっていくらかのCPUサイクルが費やされます。パッカーは、いくつかの命令の間に費やされた時間を確認することで、通常に比べて費やされた時…

デバッガ検出技術:Debugger Interrupts

このテクニックは、デバッガがINT3(ブレークポイント)およびINT1(シングルステップ)割り込み命令を利用する仕様に基づくものです。一般的にデバッガはこれらの割り込みによって生成された例外を処理するため、デフォルトでは例外ハンドラが呼び出されま…

デバッガ検出技術:DebugPort:CheckRemoteDebuggerPresent() / NtQueryInformationProcess()

CheckRemoteDebuggerPresent Kernel32!CheckRemoteDebuggerPresent()は、デバッガがプロセスに接続されているかどうかを返すAPIです。このAPIは、ntdll!NtQueryInformationProcess()内部で呼び出され、ProcessInformationClassパラメータがProcessDebugPort(…