Почти каждый, кто изучает язык ассемблера, рано или поздно пишет вирус, некоторые люди пишут вирус, когда заканчивают изучать какой-нибудь язык программирования... Прежде чем читать то, что я буду писать ниже и понимать хоть что-нибудь, вы должны: а) знать основные команды ассемблера б) уметь пользоватся АПИ-функциями в) взять где-нибудь (можно и у меня) TASM32 (можно и другой, но каждый компилятор имеет свои особенности). г) отладчик (если собираетесь собственноручно создать зверька, то без отладки довольно трудно найти ошибки) д) прогу, которая прикреплена (на неё вопит касперский, но это не вирус!!!! ) е) иметь здоровую голову (если вы хотите испортить все компы на Земле, то ваше место в больнице, а не здесь) ё) ПОМНИТЬ, ЧТО ЭТОТ МАТЕРИАЛ ПРЕДСТАВЛЕН ТОЛЬКО В ЦЕЛЯХ ОБУЧЕНИЯ, И ЗА ПОСЛЕДСТВИЯ Я НИКАКОЙ ОТВЕТСТВЕННОСТИ НЕ НЕСУ Вроде всё.
Теперь план обучения: 1) формат заголовка файла РЕ 2) разбор основных полей заголовка РЕ 3) методика заражения 4) дельта-смещение. 5) поиск АПИ 6) разбор используемых АПИ 7) пишем код 8) Reserved
7.1 Пишем код Для разминки напишем прогу, которая определяет адрес Кернела на той системе, где она запущена.
includelib import32.libextrn ExitProcess: nearextrn MessageBoxA: near;функции для работы проги
.386.modelflat.data; надпись в заголовке сообщения
szTitle db'kernel base search prog', 0
; начало сообщения
szMessage db'ADDR OF KERNEL BASE ON YOUR COMPUTER IS: ';тут будет лежать символьное представление адреса кернела
k_addr_str dd 0, 0
; после адреса переходим на новую строку и печатаем ещё строку
db 0ah, 0dh,'by FreeMan (c). Kiev 2004', 0
.codestart:
call delta
delta:
; так как это немного переделанный кусок вируса, поиск дельты остался
sub dwordptr [esp], offset delta
R_SEH:
xor edx, edx
mov eax, fs:[edx]
dec edx
search32:
cmp [eax], edxje check32
mov eax, [eax]
jmp search32
check32:
mov eax, [eax+4]
xor ax, ax
searchMZ:
cmp wordptr [eax], 5A4Dh
je IsPe
sub eax, 10000h
jmp searchMZ
IsPe:
mov edx, [eax+3ch]
cmp [eax+edx], 4550h
jne Exit
; этот кусок я объяснил
write:
mov ecx, 8 ; начинаем переводить адрес в символы
; пихаем в esi адрес места, куда будем пихать символы
mov esi, offset k_addr_str
add esi, 7 ; с конца это делать удобней
loops:
mov ebx, eax; сохраняем eax, мы будем его использовать
and al, 0fh ; обнуляем старший байт
cmp al, 0ah; сравниваем с 10
jl mensh
add al, 7h ; если больше, то имеем дело с символом
mensh:
add al, 30h
pechat:
mov byteptr [esi], al; суём al и строку (это уже печатный символ)
dec esi; указатель на следующую позицию
mov eax, ebx; достаём сохранённый еах
shr eax, 4 ; убираем полбайта, которые обработали
loop loops ; повторяем
xor eax, eax; обнулить еах для последующего использования в функции
push 30h
push offset szTitle
push offset szMessage
push eaxcall MessageBoxA
; вызов функции вывода сообщения
Exit:
push 0
call ExitProcess
; выход из проги
endstart
Можете компилировать и юзать. для компиляции: Tasm32.exe /m3 /ml /zi iasdf.asm , , ; Tlink32.exe /Tpe /aa /v iasdf, iasdf, ,import32.lib iasdf - имя проги юзать: запускать файл, в нашем случае iasdf.ехе. Если заметите ошибки в коде (или материале) - пишите, стучите, звоните... Просто писал перевод в символы без проверки (нет компилятора), используя не самый лучший алгоритм (просто он простой для понимания:))
Поюзав эту прогу на нескольких компах с разными операционками вы увидите, что база кернела вполне зафиксированное значение для каждой операционки.