Qakbot APIHash(2022/6の検体)

はじめに

この記事の内容は2022年6月の検体で確認したQbotについての記事です。

API Hashについて

API Hashとはマルウェアの解析を妨害する手法の一つである。呼び出すWindows APIをハッシュ化しておき、実行時に動的に解決をすることで、そのマルウェアがどういう機能を持っているかがわかりにくくなる。

Qakbotは通信の機能をもっているが、Qakbotの読み込んでいるImport関数やライブラリを見ても、通信に関連するものが見当たらない。通信に限らずAPIを隠すことで解析をしづらくしている。

Qakbotの読み込むライブラリ

Qakbotの読み込むAPI

QakbotのAPI解決の流れ

QakbotのAPI Hashを解決しているコードは次のようになっている。

API解決の関数

この部分では次のような処理を行って、APIのアドレスを取得している(実際に渡されるハッシュ値は複数渡されることもあり、最終的にはAPIのアドレスを格納したヒープ領域のポインタが返ってくる)

API解決処理の概要

QakbotのAPI Hashで使われている関数

Qakbot内では、APIの名前をもとに次のような計算を行っている。

Qakbotのハッシュ値計算①

Qakbotのハッシュ値計算②

①の図中で呼び出しているm_calc_hashが②の処理である。②の関数で計算した値と0x218fe95bをxorした値が、最初に渡したハッシュ値と一致していれば、APIのアドレスを解決し、ヒープ領域に格納するという処理を行っている。

なお、②で行っている計算はCRC32の処理を少しアレンジしているもののため、ハッシュ値 = CRC32(APIの名前) ^ 0x218fe95bという計算となっている。

次の図は、API解決をする際に渡されるデータの一部である。

図中の上から4Byteの0x1e4e54d6LoadLibraryAハッシュ値である。実際に計算をすると、先に示した計算方法とハッシュ値が一致することがわかる。

Pythonでのハッシュ値計算確認

検体のハッシュ値

  • 2022/6の検体:117a60cb0cde4199a78f99d4f6eb5f50