Pyclas on Security

pyclas@xmpp.cm (OTR)

マルウェアの仮想化ソフトウェアの検出方法

f:id:pyclas:20150820204339j:plain
マルウェアを収集するハニーポットマルウェアをの解析ツールを動作させるために必須になりつつある、VMwareマルウェアが認証できるようになりつつあるし、今回はそこら辺を少し掘り下げてみたいと思っています...
 
VMwareバックドアI/Oポート
Vmwareにはゲストとホストのマウスポインタの移動、ファイルのドラッグアンドドロップ等を実現するためにバックドアI/Oポートと呼ばれる仕組みが備わっていてマルウェアはそれらが存在するか否かで、どうも仮想化かどうかみたいのを見分けているみたいです。Vmwareバックドアポートを利用するには

・EAXレジスタにVMXhre ,
・ECXレジスタにコマンド番号
・EBX レジスタにコマンド引数
・DX レジスタのポート番号を’VX’
 
に設定しIN 命令(in eax, dx)を実行する
当該プログラムが VMware上で動作している場合,IN 命令の呼び出し後にEBXレジスタに’VMXh’ が設定されてEAXレジスタとECXレジスタにバージョン番号が格納される物理PC上の場合はIN命令で例外が発生しIsInsideVMWare 関数はfalse を返す

VMware-vmc.exeでのVMXhチェック

cmp large dword ptr ds:0D018h, ’VMXh’
jz loc_7CF2FF

EBX レジスタが’VMXh’であるかどうかで自身がVMware 上で動作しているかどうかを判断しているこれらの検出方法をマルウェアが使っている場合はvmxファイルを編集することで無効化することができる

IN 命令での例外発生までは再現されないため、IN 命令による例外発生を再現する必要があるのでVMwareプロセスに修正を加える。



バックドア I/O ポートの検出

bool IsInsideVMWare()
{
  bool rc = true;
   __try
  {
   __asm
  {
    push edx
    push ecx
    push ebx
    mov eax, ’VMXh’
    mov ebx, 0 
    mov ecx, 10 
    mov edx, ’VX’ 
    in eax, dx 
    
    
    cmp ebx, ’VMXh’ 
    setz [rc] 
    pop ebx
    pop ecx
    pop edx
 }
 }
  __except(EXCEPTION_EXECUTE_HANDLER)
 {
  rc = false;
 }
  return rc;
 }

Vmwarevmware-vmx.exeで動作しての機械語命令列があり、IN 命令によりバックドア I/O ポートに対して通信があった際にEAXレジスタに’VMXh’が設定しているかをチェックし、のjz命令をNOP命令(0x90)に変更することで,IN 命令による例外発生を再現することが可能になる。