NASM Encryption

NASM Encryption

NASM is the Netwide Assembler: portable Intel-syntax assembly used in tutorials, kernels, and plenty of 32-bit Windows glue code. The snippets here follow a small template style so you can drop them into a larger project without fighting FASM-only features.

Raw db/dw messages in your object file are the first thing someone greps when reversing. StringEncrypt gives you NASM that unpacks the string at run time instead of advertising it in the section dump.

String encryption supports both UNICODE and ANSI strings.

Official resources:

NASM Encryption (UNICODE Example)

Plaintext reference: StringEncrypt sample

; encrypted with https://www.stringencrypt.com (v1.5.0) [NASM Assembler (32 bit, template)]

section .data

	; myString = "StringEncrypt sample"
	myString: dw 0xF398, 0x365B, 0xEA5C, 0xE178, 0x8220, 0x7116, 0xFE35, 0xD3D2
                  dw 0x7BCB, 0xED17, 0xEDC8, 0x507E, 0x9044, 0x0498, 0x824E, 0x6AA8
                  dw 0xD938, 0xE537, 0x94C9, 0x8DF3, 0x3A33

section .text

	mov	ecx, myString
	mov	ebx, 21
	and	edx, 0

XYnHe:
	mov	ax, word [ecx + edx]
	add	eax, edx
	push	ebx
	movzx	ebx, ax
	shr	ebx, 8
	xor	ax, bx
	pop	ebx
	push	ebx
	movzx	ebx, ax
	shl	ebx, 9
	and	bx, 0xFFFF
	xor	ax, bx
	pop	ebx
	add	eax, edx
	push	eax
	mov	cl, dl
	rol	word [esp], cl
	pop	eax

	push	ebx
	mov	ebx, 2
vOgjB:
	inc	eax
	sub	eax, 0x5CA4
	dec	ebx
	jne	vOgjB
	pop	ebx


	push	ebx
	mov	ebx, 4
tHEzK:
	inc	eax
	push	ebx
	movzx	ebx, ax
	shl	ebx, 12
	and	bx, 0xFFFF
	xor	ax, bx
	pop	ebx

	push	ebx
	mov	ebx, 2
idRpz:
	push	ebx
	movzx	ebx, ax
	shr	ebx, 13
	xor	ax, bx
	pop	ebx

	push	ebx
	mov	ebx, 3
rWRlh:
	dec	eax
	dec	ebx
	jne	rWRlh
	pop	ebx

	dec	ebx
	jne	idRpz
	pop	ebx

	dec	ebx
	jne	tHEzK
	pop	ebx


	push	ebx
	mov	ebx, 4
zGwSp:
	add	eax, 0x32C7

	push	ebx
	mov	ebx, 3
cHMyg:

	push	ebx
	mov	ebx, 2
SzVOl:
	xor	eax, 0xBE97
	dec	eax
	neg	eax
	dec	ebx
	jne	SzVOl
	pop	ebx

	sub	eax, edx
	dec	ebx
	jne	cHMyg
	pop	ebx

	push	ebx
	movzx	ebx, ax
	shl	ebx, 8
	and	bx, 0xFFFF
	xor	ax, bx
	pop	ebx
	dec	ebx
	jne	zGwSp
	pop	ebx


	push	ebx
	mov	ebx, 2
NRjia:

	push	ebx
	mov	ebx, 4
xZtLB:
	rol	ax, 8
	dec	ebx
	jne	xZtLB
	pop	ebx

	dec	ebx
	jne	NRjia
	pop	ebx

	xor	eax, edx
	push	ebx
	movzx	ebx, ax
	shr	ebx, 15
	xor	ax, bx
	pop	ebx
	push	ebx
	movzx	ebx, ax
	shl	ebx, 8
	and	bx, 0xFFFF
	xor	ax, bx
	pop	ebx
	mov	word [ecx + edx], ax
	inc	edx
	dec	ebx
	jne	XYnHe

NASM Encryption (ANSI Example)

Plaintext reference: StringEncrypt sample

; encrypted with https://www.stringencrypt.com (v1.5.0) [NASM Assembler (32 bit, template)]

section .data

	; myString = "StringEncrypt sample"
	myString: db 0xD0, 0x21, 0xCA, 0x69, 0xF9, 0xB0, 0x7C, 0x4A
                  db 0x59, 0x2D, 0x43, 0xA9, 0x00, 0xEE, 0x80, 0x56
                  db 0x52, 0xF3, 0xD0, 0xD8, 0x04

section .text

	mov	ecx, myString
	mov	edx, 21
	and	eax, 0

rgFpy:
	mov	bl, byte [ecx + eax]

	push	edx
	mov	edx, 4
lqcPt:
	push	ebx
	mov	cl, al
	rol	byte [esp], cl
	pop	ebx
	push	edx
	movzx	edx, bl
	shl	edx, 5
	and	dl, 0xFF
	xor	bl, dl
	pop	edx
	add	ebx, eax
	dec	edx
	jne	lqcPt
	pop	edx

	inc	ebx
	add	ebx, eax

	push	edx
	mov	edx, 2
HYTOU:
	rol	bl, 4

	push	edx
	mov	edx, 4
vZpFz:

	push	edx
	mov	edx, 2
ZXQuL:
	inc	ebx
	dec	edx
	jne	ZXQuL
	pop	edx

	neg	ebx
	xor	ebx, eax
	dec	edx
	jne	vZpFz
	pop	edx


	push	edx
	mov	edx, 4
fjmyV:

	push	edx
	mov	edx, 4
UDzEy:
	inc	ebx
	dec	ebx
	neg	ebx
	dec	edx
	jne	UDzEy
	pop	edx

	dec	edx
	jne	fjmyV
	pop	edx

	dec	edx
	jne	HYTOU
	pop	edx


	push	edx
	mov	edx, 3
WlBzZ:
	rol	bl, 4

	push	edx
	mov	edx, 3
WtMwo:
	push	ebx
	mov	cl, al
	ror	byte [esp], cl
	pop	ebx
	dec	edx
	jne	WtMwo
	pop	edx

	dec	edx
	jne	WlBzZ
	pop	edx


	push	edx
	mov	edx, 3
oEJAP:

	push	edx
	mov	edx, 3
HIrmX:
	neg	ebx
	dec	ebx
	dec	edx
	jne	HIrmX
	pop	edx

	dec	edx
	jne	oEJAP
	pop	edx

	push	edx
	movzx	edx, bl
	shr	edx, 5
	xor	bl, dl
	pop	edx
	xor	ebx, 0x3F
	add	ebx, 0x79
	mov	byte [ecx + eax], bl
	inc	eax
	dec	edx
	jne	rgFpy