| Welcome to The Passion Of Code Laboratory!!! | Статьи |
"Win32-вирусы" |
|
.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] ... |

Так вот мы этот оставшийся адрес и
используем на входе процедуры поиска адреса загрузки 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
Здесь мы сообщаем Вам, какие творения скоро появятся
Ссылки на сайты, где можно найти больше информации
История нашей лаборатории и ее члены
| У вас есть предложения по нашему сайту? Напишите сюда | Любимые сайты вирмейкеров: (WASM) (RSDN) |