本サービスには一部、Googleの支援により翻訳されたコンテンツが含まれます。Googleは、明示または黙示を問わず、市場性、特定目的への適合性、ならびに非侵害の黙示的保証を含む、翻訳の精度、信頼性、正確性に関連するあらゆる点において保証しません。

Kaspersky Labの本Webサイトは、便宜上、Google Translateを搭載した翻訳ソフトウェアを利用して翻訳されています。正確な翻訳となるよう合理的な努力を払ってはおりますが、自動翻訳の正確性は完全ではなく、翻訳者(人間)による翻訳に代わるものとして意図されているものでもありません。翻訳はKaspersky Labの本Webサイトをご利用の皆様の利便性を図るためのものであり、「翻訳結果をそのまま」ご提供するものです。英語からその他言語への翻訳における精度、信頼性、正確性に関しては、明示または黙示を問わず、いかなる保証もなされません。翻訳ソフトウェアのため、コンテンツの一部(画像、動画、フラッシュ等)は正しく翻訳されない場合があります。

Virus.DOS.Zhengxi

クラス Virus
プラットフォーム DOS
説明

技術的な詳細

これは非常に危険な、多形性およびステルス寄生虫ウイルスのファミリーです。これらのウイルスは、長さが7Kを超え、非常に複雑で、おそらく最も複雑なDOSウイルスです。これらのウイルスは、EXE、OBJおよびLIBファイルに感染し、ZIP、ARJ、およびRARアーカイブにCOMドロッパを追加します。ウイルスには内部テキスト文字列が含まれています:


異常なプログラム終了
ウイルス/ DOS 0.54著作権(c)1995 Zhengxi Ltd
警告!内部使用のみのこのプログラム!

インストール

ウイルスのコードは、感染方法に応じて異なるポイントから制御を受け取りますが、すべての場合において、宛先は多型復号ルーチンです。 EXEファイル(追加)では、EXEファイルが実行のためにメモリにロードされたとき、EXEファイル(挿入)、ローダーコード(EXE感染参照)、感染したOBJ / LIBファイル – CALL命令(OBJ / LIB感染を参照)からCOMドロッパは、JMP命令を初めとするため、JMPは復号ルーチンに制御を移します。

復号化されると、ウィルスのインストールルーチンがその制御を受け取ります。このウイルスはINT 1(One Step Tracing)をフックし、INT 21hをトレースします。トレース中に、ウイルスはINT 21hハンドラ内の特定のコードを検索します(そのコードはDOS 5.xおよびDOS 6.xにあります)。このようなコードが見つかった場合、ウイルスはいくつかの条件をチェックし、場合によってはインストールを終了します。

次の場合、ウイルスはインストールを終了します。

  • MS Windowsがインストールされている
  • ブートドライブはA:またはB:
  • INT 8,13h、28hは同じセグメントを指します(アンチウイルスモニタがインストールされている場合はインストールを終了しますか?)
  • ホストファイルの日(日付とタイムスタンプ)が現在の日と同じか近い場合(ファイルdayとXORされた現在の日の2つの最高ビットがゼロに等しい)
次に、ウイルスTSRコピーのシステムメモリのブロックを割り当て、INT 21hハンドラのアドレスから11バイトを本体に格納し、INT 21hコードをFAR CALL命令(2F FF 1E ?? ??)でパッチしますINT 25hハンドラ(Absolute Disk Read)への制御。その後、ウイルスはINT25hハンドラの最初の5バイトを保存し、そこで5バイトのFAR JMPをウイルスコードに書き込みます。結果は次のようになります。

INT 21hハンドラ:
… …
+ ——- 2E FF 1F ???? FALL CS:Int25に電話する
? C7 06 ???? ;魔法の言葉?
? Int25:???? ???? ???? ???? ; INT 25hの遠いアドレス
? … …

+> INT 25hハンドラー:
+ ——– EA? ???? JMP FAR VirusHandler
? … …

+>ウイルスハンドラ:
2E 8F 06 … POP CS:Caller_IP
… …
その結果、ウイルスにはINT 21hとINT 25hの両方の呼び出しを傍受するハンドラがあります。これらの呼び出しを分離するために、ウイルスは呼び出し元(Caller_IP)のアドレスをチェックします。呼び出しがINT 21hハンドラから実行されると、ウイルスはVirus INT 21hハンドラルーチンに制御を渡し、別の場合はVirus INT 25hハンドラが制御を受け取ります。

インストールルーチンは完了しましたが、ウイルスはそのコードを他のメモリブロックに移動できます(INT 21hハンドラの分析を参照)。したがって、ウイルスのTSRコピーはシステムメモリの同じブロックを占有しませんが、UMBのものを含む他のアドレスに移動する可能性があります。

その後、ウイルスは制御をホストプログラムに返します。そのようなリターンの3つの異なるバリエーションがあり、それらは感染方法に依存する。 COMドロッパーの場合、ウイルスはメッセージのみを表示します:


異常なプログラム終了
Terminate関数(INT 21h、AH = 4Ch)でDOSに戻ります。 EXE追加感染の場合、ウイルスは多態性エンジンを使用して元のファイルヘッダを復元します(多型復号化ルーチンを生成し、それを実行して元のヘッダを復元します、下記のEXE感染を参照してください)。 EXE挿入の場合、ファイルに挿入されたウイルスローダーが元のコードを単独で復元するため、ウイルスは単にホストプログラムに戻ります。 OBJ / LIBファイルの場合、ウイルスは単にホストプログラムにも戻ります(下記のOBJ / LIB感染を参照)。

INT 21hハンドラ

このウイルスはINT 21h機能の18個を傍受します:

3Dh、6Ch – ファイルを開く/作成する
3Eh – ファイルを閉じる
3Fh – ファイルの読み込み
42時間 – Lseek
4Bh – ファイルを実行する
41h – ファイルの削除
11h、12h – FindFist / Next FCB
4Eh、4Fh – FindFist /次のASCII
00h、4Ch – 終了
31時間 – 滞在TSR
67h – ハンドル数の設定
48h、49h、4Ah – メモリ管理機能(Allocate、Free、Resize)
Set Handle Count、Execute File、およびメモリ管理機能は、コードをシステムメモリに隠すためにウイルスによって使用されます。このウイルスは、メモリブラウジングユーティリティを使用している間、MCBブロックをメモリマップ上に表示しないように操作します。

Terminate、Stay TSR、FreeMemoryの機能を傍受しながら、ウイルスはコードをシステムメモリの新しいアドレスに移動します。ウイルスは新しいメモリブロック(従来型またはUMBメモリブロック)を割り当て、そこに自身をコピーします。そのため、ウイルスをインストールしても、UMBブロックに影響はありませんが、TSRコピーを配置することはできますが、UMBに移動してそこに隠れる可能性があります。

ウイルスを開くファイルはいくつかの異なる呼び出しを実行します。まず、ウイルスはオープンモードをチェックし、ファイルが書き込み用に開かれている場合、ウイルスはファイルを駆除します。

駆除の前に、ウイルスはファイルがアクセスされていることと、そのファイルにアクセスしているプログラム(呼び出し元)をチェックします。このウィルスは、アクセスしているプログラム(呼び出し元)の名前と名前のリスト(下記参照)を比較し、アクセスしたファイルの名前がそのリストにある場合、そのファイルを駆除しません。ファイル名は次のとおりです。


UUENCODE.EXE、PKLITE.EXE、LZEXE.EXE、NDD.EXE、DIET.EXE、AFD.EXE、SD.EXE、
SPEEDDSK.EXE、DEFRAG.EXE、TLINK.EXE、LINK.EXE
AH = 3D00h機能(Open Read Only)の場合、ウイルスはいくつかの奇妙な動作を行います。呼び出し元のコードをスキャンしてパッチします。これは、いくつかのアンチウイルススキャナのパッチのように見えます。幸いにも、ウイルスにはバグがあり、そのブランチは決して実行されません。

このファイルを開くと、ウィルスはコントロールをステルス・ルーチンに持ち込みます。ウィルスはファイルの長さを元のものに置き換えます。

ファイルから読み込み中、ウイルスはステルスルーチンを呼び出します。感染ファイルのヘッダから読み込む場合、ウイルスは元のヘッダを読み込みバッファに読み込み、復号化してコピーします。

Lseek機能の場合、このウイルスはコントロールを別のウイルスのステルスルーチンに持ち込みます。このウイルスは、元のファイル長を探し出すことを許可していません。

感染ファイルを削除している間、ウイルスはそのファイルを駆除します。

FindFirst / Nextを使用してファイルを検索している間、ウイルスはファイルが感染している場合は元のファイルと置き換えます。

FindFist / Next ASCII呼び出しは、ウイルスが感染ファイルを捕捉するためにもウイルスによって使用されます。このウィルスは、FindFirst関数でアクセスされたファイルの名前と、FindNext関数でアクセスされた約5番目のファイル(確率3/16)のそれぞれを保存します。ウイルスにはファイル名用のバッファが1つしかないため、次の各名前は前の名前を上書きします。

ファイルを閉じると、ウイルスはファイルをチェックし、バッファに格納されている名前でファイルを感染させます。ウィルスはクローズされたファイルにも感染しますが、ウィルスのランダムジェネレータの結果により確率1/4で実行されます。

感染

ウイルスに感染する前に、ウイルスはいくつかの条件をチェックします。
  • 現在の日の数字をファイルのファイルの日付とタイムスタンプと比較することによってファイルを「作成する」だけではありません(インストール時と同じ)
  • ファイルはローカルで、A:またはB:ドライブではありません
  • ファイル名は*。?V? (* .OVL?)
  • 空きディスク領域が十分です(INT 21h、AH = 36hのチェック)
これらのすべての条件の場合、ウイルスはファイルヘッダーを読み取り、EXE、OBJ、LIBおよびスタンプをアーカイブするかどうかをチェックします。

EXEファイルへの感染

このウイルスは、自己解凍ファイルにアーカイブを追加、挿入、感染させる3つの方法でEXEに感染します。

まず、ウイルスはファイル構造をチェックし、自己解凍型のEXEファイル(例えばZIP2EXEで作成されたもの)の場合、以下の方法で添付ファイル(ZIP、ARJ、RAR)を感染させます。アーカイブの内容に追加します。

その後、ウイルスはファイルの長さをチェックし、長さが400h(1024)バイト未満のファイルには感染しません。ロード可能モジュールの長さ(ファイルの長さではなく、ファイルの長さではない)が32Kより大きい場合、ウイルスはローダーをファイルの中央に挿入します。別の場合には、ウイルスはメソッドを追加することによってファイルに感染します。

メソッドを追加してファイルを感染させている間、ウイルスはファイルヘッダーを読み取り、そのファイルを暗号化してファイルの最後に保存します。その後、ウイルスはその多型ジェネレータを実行し、暗号化されたウイルス本体と多形ループをファイルの最後に保存します。感染を完了するために、ウイルスはファイル長を9Dhで割った値に、残りの25時間(すでに感染ファイルを検出するためにはウイルスIDスタンプ)を与え、EXEヘッダーフィールド(レジスタとモジュール長)を変更します。

注:ウイルスは、ポリモーフィック暗号化ループを使用してホストファイルの元のヘッダーを暗号化します。そのループは、ウイルス本体を暗号化する際に使用されるルーチンとは異なります。つまり、元のEXEヘッダーを暗号化している間、および本体を暗号化している間に、ウイルスは多形エンジンを2回呼び出します。

感染EXEファイルを実行している間、解読ループは元のウイルス本体を復元しますが、オリジナルのファイルヘッダは復元しません。ホストプログラムに戻るには、ウィルスはホストデータを復号化する必要がありますが、エンジンはランダムに選択された暗号化機能を持つランダムループを生成します。この問題を解決するために、ウイルスはホストデータを暗号化しながらランダムジェネレータの初期値を格納し、そのデータを解読しながら同じ値を持つ多形ジェネレータを実行します。その結果、ジェネレータはホストデータを暗号化している間に使用されたのと同じコードを持ち、そのルーチンを実行することでそのデータを復号化します。

EXEファイルへの感染(挿入)

ファイルの長さが32Kを超えると、ウイルスはEXEメインモジュールの先頭(EXEヘッダーの直後)にシークし、6Kのコードを読み取り、そこでC / Pascalルーチンを探します。通常、C / PascalルーチンはBPレジスタを保存するのと同じ "ヘッダー"から開始し、スタックポインタSPをBPに移動します。

ウイルスはその "ヘッダー"のコードをスキャンし、このコードが見つかった場合、ウイルスはRETまたはCALL FAR命令の次の54hバイトのコードをスキャンして、次のサブルーチンまたは再配置されたアドレスの重複を防ぎます。そのようなコード(RETまたはCALL FAR)が見つかった場合、ウイルスは感染ルーチンから抜け出します。

その後、ウイルスはそのルーチンの54hバイトを読み込み、ウイルスローダーのコードで上書きし、主なウイルス本体を多態性エンジンで暗号化し、ファイルの終わりに保存します。その後、ウイルスはサブルーチンの元のコードとローダーの第2部分を単純なSUB関数で暗号化し、ファイルの最後に保存します。次に、ウイルスの感染方法を「追加」するのと同じ方法で、ファイルの最後にランダムなデータを書き込みます。


感染していない
———— ——–
+ ————– + + ————– +
?exeヘッダー? ?exeヘッダー?
+ ————–? + ————–?
メインのEXEコード?メインのEXEコード?
?————–? ?————–?
?C / Pascal subr? – +?ウイルスローダ?パート1、52hバイト、暗号化されていない
?————–? ? ?————–?
? ? ?メインのEXEコード?
? ? ? ?(続き)?
+ ————– +? + ————–?
?ウイルス?多形ループで暗号化
? ?————–?
?ウイルスローダー?パート2、SUBコマンドで暗号化
? ?————–? 70hバイト
+ – >?保存されたコード?パッチされたサブルーチンのオリジナルコード、
?————–? 52hバイト、SUBで暗号化
?ランダムなデータですか?ファイル長/ 9Dh、残りは25h
+ ————– +
実行されると、ローダーはPSPフィールドを使用してホストファイル名を探し、ファイルを開き、ファイルの終わりまでシークしてから、ドロッパーの第2部分を読み取り、復号化して実行します。その部分はパッチされたサブルーチンを復元し、システムメモリ(従来型またはUMB)を割り当て、主なウイルス本体を読み取り、制御を解読多型ループに渡します。そのループはウイルス本体を解読し、その制御をインストールルーチンに渡します。

それは感染の非常に狡猾な方法です。ウイルスのコードはファイルに隠されており、ファイルヘッダーからウイルスコードに直接入力することはありません。ウイルスローダーに置き換えられたサブルーチンは、「めったに実行されない」ものです。たとえば、エラーメッセージを表示するサブルーチンです。そのため、ウイルスはそのようなファイルで長時間スリープした後、いくつかの限られた条件下で飛び出して感染する可能性があります。

感染アーカイブズ

アーカイブの場合、ウイルスは感染したCOMドロッパーのイメージをメモリに作成し、それをアーカイブに追加します。そのCOMドロッパーは常にランダムデータ、暗号化されたウイルスコード、解読多型ループが続くJMP命令で始まります。 JMP命令は制御を解読ループに持ち込む。

ドロッパーの名前は無作為に選択され、.COM拡張子で終了します。たとえば、次のようになります。


HAIF.COM、UCM.COM、DOO.COM、VLG.COMなど。
アーカイブフィールドを処理している間、ウィルスは外部ユーティリティを使用せず、必要なすべてのフィールドを自動的に埋め込みます。ウイルスはドロッパーをパックするのではなく、「保存済み」メソッドを使用します。ウイルスは「そのまま」アーカイブに保管されます。ウイルスに感染すると、アーカイブの内容がチェックされ、2回感染することはありません。

OBJファイルとLIBファイルの感染

OBJ / LIBモジュールに感染すると、ウイルスはファイルのフィールドをチェックし、多形ループで暗号化されたウイルスコードを含む新しいオブジェクトレコードを作成し、そこに挿入します。

オブジェクトファイルをスキャンしている間、ウィルスはC / Pascalサブルーチン "ヘッダ"のためにそのファイルのコードをチェックし、EXEファイルに挿入する間にチェックし、そのコードが見つかった場合にのみファイルを感染させます。しかし、OBJまたはLIBモジュールの場合、ウイルスはローダーのコードをそこに落とさず、CALL命令(E8xxxx)でC / Pascalヘッダーを上書きします。

実行ファイルにリンクされ、CALLはその制御をウイルスの多形暗号解読ループに持ち込みます。そのループはウイルスコードを解読し、その制御をウイルスインストールルーチンに渡します。

同様にEXEファイル(挿入)では、CALLがコントロールを受信しないことがあり、ウイルスが長時間スリープする可能性があります。しかし、状況によっては、ウイルスが飛び出してシステムに感染する可能性があります。

INT 25hハンドラ

このハンドラはINT 25hレベルでステルスルーチンを実現します。ディレクトリのエントリにアクセスしている間、ウイルスはファイルの長さを元のものに置き換え、感染ファイルのヘッダを読み取ってウイルスが復元し、元の形にします。

もちろん、ウイルスはINT 25hレベルで100%ステルスを実現しません。ステルスルーチンをバイパスする方法があります。しかし、一部のアンチウィルスプログラムがINT 21h DOS関数でファイルの内容を読み取った後、ディレクトリ構造を読み取り、INT 25hの絶対呼び出しで内容を記録すると、ウイルスは表示されません。

トリガルーチン

ZIPファイルを処理しているときにウイルスが "stored"メソッドでパックされたレコードを見つけたら、ZIPファイルの日付とタイムスタンプをチェックします。そのファイルの最終修正年が1996年以上であれば、ウイルスはC:〜Z:までのすべてのディスクのすべてのディレクトリのすべてのファイルを検索し、ファイルとサブディレクトリツリー全体を削除します。


オリジナルへのリンク