Welcome to The Passion Of Code Laboratory!!!Статьи

"Win32-вирусы"
1. Найти адрес загрузки kernel.dll

Автор:_follower / TPOC

Первое что мне хотелось бы сделать – это предупредить Вас о том что эта статья является моей первой статьей. Первой в жизни статьей. Более того, тема, которую я тут пытаюсь затронуть, это первая выбранная мной тема и она не из легких. Для работы я взял исходник вируса FLY 0.1 с сайта http://www.y0da.cjb.net/ немного его подчистил для своих нужд, и для ясности изложения. Поэтому заранее прошу Вашего прощения за возможные ошибки, и в надежде на снисхождение начну.

Изложение данного материала мне видится разумным в виде логично связанной последовательности небольших по объему статей включающих формулировку и полное решение(как у великого Iczelion'а). Задача: Найти адрес загрузки kernel.dll.

При запуске программы программный загрузчик, кроме всего прочего, проверяет таблицу импортов и считывает список необходимых программе файлов dll .Некоторые из dll автоматически подгр ужаются в область каждого нового процесса. Далее наступает момент когда PE- загрузчик ищит эти dll –ки и подгружает их в память выделенную запускаемой программе. После зазрузки dll загрузчик вносит адреса необходимых библиотек в таблицу импорта файла программы. Но кто это все будет делать в случае с нашим вирусом? Ответ - все это должен сделать вирус сам. Он (наш вирус) должен сам найти адрес загрузки kernel.dll , чтобы потом пользоваться предоставляемыми им функциями. Вот этим вопросом мы и займемся.

.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
MIN_KERNEL_SEARCH_BASE EQU 070000000h

.CONST

szError DB "Ошибка",0
szGetBaseErr DB "Ошибка в получении адреса kernel.dll",0
szCap DB ":) ",0

.DATA

szFormat DB "Адреса kernel.dll: 0x%08lX",13,10,0
cBuff DB 120 DUP (0)
_ExitProcess DD 0

.code

main:

;int 3
PUSH [ESP]
CALL GetKernelBase
OR EAX, EAX
JZ GetBaseErr
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL
CALL ExitProcess

GetBaseErr:

MOV EAX, OFFSET szGetBaseErr
JMP ShowErr
ShowErr:

INVOKE MessageBox,0,EAX,OFFSET szError,MB_ICONINFORMATION OR MB_SYSTEMMODAL
RET

; -----------------------------------------------------------------------------
GetKernelBase PROC USES EDI ESI, dwTopStack : DWORD
MOV EDI, dwTopStack
AND EDI, 0FFFF0000h
.WHILE TRUE

.IF WORD PTR [EDI] == IMAGE_DOS_SIGNATURE
MOV ESI, EDI
ADD ESI, [ESI+03Ch]

.IF DWORD PTR [ESI] == IMAGE_NT_SIGNATURE

.BREAK

.ENDIF

.ENDIF

ExceptCont:

SUB EDI, 010000h
.IF EDI < MIN_KERNEL_SEARCH_BASE

MOV EDI, 0BFF70000h
.BREAK

.ENDIF

.ENDW
XCHG EAX, EDI
RET

GetKernelBase ENDP

end main

 


Разберем по пунктам.


1)

PUSH [ESP]
CALL GetKernelBase

При загрузке PE –файла загрузчик выполняет функцию CreateProcess(). После отработки этой функции самой последней выполнится команда RET- вернуться в точку вызова функции . Но стек не чистится и в нем остается адрес где-то в середине kernel32.dll. Проверим этот факт. Установим точку останова в начале основной процедуры и запустим файлик под OllyDbg.

...
.code
main:
int 3
PUSH [ESP]
...


OllyDbg

Так вот мы этот оставшийся адрес и используем на входе процедуры поиска адреса загрузки kernel32.dll. Помещаем его в вершину стека и передаем в GetKernelBase().
 

2)

MOV EDI, dwTopStack
AND EDI, 0FFFF0000h

Очистим EDI от младшего слова , т.е. теперь EDI= 77E80000. Для чего это надо? Дело в том что все dll подгружаются в память по адресам кратным 10000h, поэтому мы и чистим чтобы начать с начала и продолжить поиск с шагом в 10000h.

3)

.WHILE TRUE
.IF WORD PTR [EDI] == IMAGE_DOS_SIGNATURE
MOV ESI, EDI
ADD ESI, [ESI+03Ch]
.IF DWORD PTR [ESI] == IMAGE_NT_SIGNATURE

 

Начинает бесконечный цикл поиска в памяти значения IMAGE_DOS_SIGNATURE. Чтобы узнать чему равно это значение откройте файл \masm32\include\windows.inc и проведите поиск значения константы IMAGE_DOS_SIGNATURE, потом IMAGE_NT_SIGNATURE .У меня это выглядит так:

IMAGE_DOS_SIGNATURE = 5A4Dh
IMAGE_NT_SIGNATURE = 00004550h

Что это за величина 03Ch. Согласно [1.2] по смещению 03Ch от начала PE-файла находится сигнатура Win32 – файла ‘PE’. Вот мы его и поищим.

4)

...
SUB EDI, 010000h

.IF EDI < MIN_KERNEL_SEARCH_BASE
MOV EDI, 0BFF70000h
.BREAK
.ENDIF

.ENDW
XCHG EAX, EDI
...

В каждом проходе уменьшает адрес на 010000h. Если адрес получился ниже граничной величины MIN_KERNEL_SEARCH_BASE EQU 070000000h прекращаем поиск считаем что мы попали в среду Win9x где адрес фиксирован и равен 0BFF70000h. Передадим найденный адрес в EAX и выходим .
 

Исходник

Перечень используемой литературы:
[1.1] – Уроки Iczelion'а ( http://www.wasm.ru )
[1.2] – Описание формата файлов РЕ от Hard Wisdom

Перечень используемого программного обеспечения:
[2.1] – ASM Editor for Windows Version 2.2a ( www.avt.newmail.ru )
[2.2] – OllyDbg 1.09d by Oleh Yuschuk ( http://www.wasm.ru )
 

[C] _follower / TPOC

Наши новости

Новые события из жизни нашей лаборатории

Статьи

Статьи и переводы лаборатории TPOC

Программы

Программы лаборатории TPOC

Релизы

Здесь мы сообщаем Вам, какие творения скоро появятся

Ссылки

Ссылки на сайты, где можно найти больше информации

Наша лаборатория

История нашей лаборатории и ее члены

Дата последнего обновления: 4 августа 2005 года
У вас есть предложения по нашему сайту?
Напишите сюда
Любимые сайты вирмейкеров:
(WASM)   (RSDN)