Log.i53

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

デバッガ検出技術:SeDebugPrivilege

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

 パッカーはプロセスがCSRSS.EXEプロセスを開くことができるかどうかを識別するために間接的にSeDebugPrivilegeを使用します。CSRSS.EXEを開けるということはプロセスがアクセストークンが有効であるSeDebugPrivilege権限を保持していることを意味しており、したがって、これはプロセスがデバッグされていることを示唆しています。このチェックは、プロセスがSeDebugPrivilege権限を持っている場合に、CSRSS.EXEプロセスのセキュリティディスクリプタだけが唯一SYSTEMにそのプロセスへのアクセスを許容することを利用しています。

r例

 以下にSeDebugPrivilege権限を利用するチェックの例を示します:
f:id:i53:20150609035940p:plain

 この例では、CSRSS.EXEのPIDを取得するためにntdll!CsrGetProcessId()APIを利用していますが、パッカーはプロセス列挙を介して、マニュアルでCSRSS.EXEのPIDを取得する可能性があります。OpenProcess()が成功した場合、そのSeDebugPrivilegeが有効であることを意味しており、それはすなわちプロセスがデバッグされていることを示唆しています。

解決策

 ntdll!NtOpenProcess()のリターンにブレークポイントをセットして、ブレークポイントがヒットした時に、引数のPIDがCSRSS.EXEのものであった場合にEAXの値を0xC0000022(STATUS_ACCESS_DENIED)に設定する方法があります。