crackme #09 のkeygen

eagle0wlさんのcrackme #09のkeygen(キージェネレーター)を書いた。
初めてまともにアセンブラを使ったが理解が曖昧なので結構苦労した。
eagle0wlさんのkeygen template #03を使わせて貰った。
チュートリアルはいつか書く。

ソースコードの必要な部分だけ示す。

.data
	_00403183		db	18 dup(?)
	_004031E8		db	"S1AC4QM5EGOU8IKZRG6WXPD7NT9BV2HJ", 0
	CRK9			db	"CRK9-", 0

WndProc			proc	hWin	:DWORD,
						uMsg	:DWORD,
						wParam	:DWORD,
						lParam	:DWORD
	.if uMsg == WM_COMMAND
		.if wParam == IDC_GENERATE
			invoke	GetDlgItemTextA, hWin, IDC_USERNAME, offset szNameBuf, 100h
			.if	eax != 0
				invoke	GenerateKey, offset szNameBuf, offset szSerialBuf
			.else
				invoke	lstrcpy, offset szSerialBuf, offset szNameError
			.endif
			invoke	SetDlgItemTextA, hWin, IDC_SERIAL, offset szSerialBuf

GenerateKey		proc	lpNameBuf	:DWORD,
						lpSerialBuf	:DWORD
	xor eax, eax
	mov esi, lpNameBuf
	
	@@:
	cmp byte ptr [esi],0
	je @f
	movsx ecx,byte ptr [esi]
	xor ecx,3DCB7C5Bh
	add ecx,6FD76EF5h
	rol ecx,7
	add eax,ecx
	inc esi
	jmp @b
	@@:
	
	mov esi, offset _00403183
	add esi, 16
	push eax
	mov ecx, 8
	
	@@:
	mov ebx,eax
	and ebx,0Fh
	movsx edx,byte ptr [ebx+_004031E8]
	mov byte ptr [esi],dl
	dec esi;inc esi
	shr eax,4
	dec ecx
	je @f
	jmp @b
	@@:
	
	mov byte ptr [esi],2Dh
	pop eax
	rol eax,0Dh
	xor eax,3DCB7C5Bh
	rol eax,7
	mov ecx,8
	
	@@:
	mov ebx,eax
	and ebx,0Fh
	add ebx,10h
	movsx edx,byte ptr [ebx+_004031E8]
	dec esi ; inc esi
	mov byte ptr [esi],dl
	shr eax,4
	dec ecx
	je @f
	jmp @b
	@@:
	
	invoke	lstrcpy, lpSerialBuf, addr CRK9
	invoke	lstrcat, lpSerialBuf, addr _00403183
	
	ret
	
	
GenerateKey		endp