全3140文字
PR

 マルウエアの多くは、容易に検知や解析をされないようにするため、動作時に使用する文字列や自身のプログラムコードなどを「難読化」している。

 そこで今回は、マルウエアによる難読化の仕組みと解読方法を、具体例を挙げて解説しよう。

解析や検知の回避を狙う

 ここでの難読化とは、特定のルール(計算式)で文字を変換してデータを読みにくくすることである。一般的な暗号化とは異なり、変換には秘密情報(暗号鍵)を用いない。難読化を「暗号化」と呼ぶ場合もあるが、本記事では難読化とする。

 マルウエアのプログラムコードが読めれば、その処理の流れや接続先のURLなどを比較的容易に把握できる。テキストエディターやバイナリエディターでマルウエアのEXEファイルを開いただけで、接続先であるC2サーバーのURLなどが文字列として発見できる場合もある。こうした特徴がすぐに分かれば、アンチウイルスソフトのベンダーはパターンファイルやシグネチャーを作りやすくなり検知が容易になる。

 こうした事態を避けるため、マルウエアを開発する攻撃者はデータを平文で扱わず、あの手この手で難読化を施す。難読化されていると、マルウエアを含むプログラムやメモリーの内容をざっと見ただけではどのような処理をしているか解析しづらく、挙動をつかみにくい(図1)。また、パターンファイルやシグネチャーで検知することが難しくなる。そのため最近のマルウエア解析では、まずは難読化の解読から始めることが多い。

図1●コードを「難読化」して解析を困難に
図1●コードを「難読化」して解析を困難に
マルウエアの多くは、プログラムコードに含まれる文字などを特定のルールで置き換える。このことを「難読化」という。難読化により解析を困難にする。
[画像のクリックで拡大表示]

 今回例として取り上げるのは、2020年の半ばころに出現したランサムウエアの「Conti」である。

 Contiは、世界中で大きな被害をもたらしているランサムウエアの1つである。その作者は、様々な難読化を施して、解析や検知を妨害している。ここでは、そのうちの1つを取り上げて具体的に説明していく。

 Contiは、すべての文字列をメモリー上で難読化しており、使用するタイミングで1文字ずつ復元する。図2は、メモリー上に難読化された状態で配置されている文字列をツールで読み出した例である。「lovjk□l□□lol」という文字列になっており、このままではどういう意味なのかが全く分からない。

図2●ランサムウエアによって難読化された文字列の例
図2●ランサムウエアによって難読化された文字列の例
難読化されたランサムウエア「Conti」のプログラムコードの一部。1文字1文字が異なる文字に置き換えられているので、そのままでは何が書かれているのか分からない。
[画像のクリックで拡大表示]