
;=======================================================================;
;                                                                       ;
; Название   : DicMaker+                                                ;
;                                                                       ;
; Платформа  : win32 (консоль)                                          ;
;                                                                       ;
; Компилятор : MASM32, v7                                               ;
;                                                                       ;
; Автор      : 1) Serrgio[HI-TECH] - медитировал                        ;
;              2) Аркадий Белоусов[HI-TECH] - бил палкой по голове и    ;
;              объяснял сущность дZена                                  ;
;              3) DOS'овкий прототип был взят из книги "Техника и       ;
;              философия хакерских атак" Криса Касперски.               ;
;                                                                       ;
; Описание   : Продвинутый генератор паролей, который можно             ;
;              использовать, например, для реверсирования "необратимых" ;
;              функций методом перебора. Примечание для дZенствующих:   ;
;              к S_alphabet при желании можно относиться как к "вектору ;
;              упорядоченных цифр" некой извращенной системы счисления  ;
;              с основанием szAlphabet.                                 ;
;                                                                       ;
;=======================================================================;

.386

.model flat,stdcall
option casemap :none

include C:\Program Files\masm32\include\kernel32.inc
include C:\Program Files\masm32\include\windows.inc

includelib kernel32.lib

.data ;-|глобальные переменные и константы|------------------------------

S_consoleTitle	db 'DicMaker+',0		; заголовок окна
S_alphabet	db 'aAbBcCdDeEfFgGhHiIjJkKlLmM'
		db 'nNoOpPqQrRsStTuUvVwWxXyYzZ'	; "алфавит"
szAlphabet	= $-S_alphabet			; число символов алфавита
szBuffer	= 20				; размер буферов
S_password	db szBuffer dup(?)		; буфер результата
S_key		db szBuffer dup(?)		; буфер ключа
szKey		= $-S_key			; размер буфера ключа

.code ;==================================================================

main	proc	uses ebx esi ebp edi

;---------- локальные переменные

	local	houtput  :dword		; хэндл вывода
	local	nwritten :dword		; "напечатано символов"

;---------- подготовительные операции

	invoke	SetConsoleTitle,addr S_consoleTitle ; задать заголовок окна
	invoke	GetStdHandle,STD_OUTPUT_HANDLE	; получить хэндл вывода
	mov	[houtput],eax			; ...и сохранить его

;---------- рабочая часть

	mov	esi,offset S_key	; указатель на ключ
	mov	edi,offset S_password	; указатель на пароль
	mov	ecx,esi			; старший разряд ключа

@@keylenloop:
	cmp	ecx,offset S_key+szKey	; вылезли за пределы буфера?
	jae	@@break			; да - закончить генерацию
	mov	byte ptr [esi],0	; нет - инициализировать новый
					;  старший разряд ключа
@@passwordloop:
	movzx	ebx,byte ptr [esi]	; значение разряда ключа
	mov	al,S_alphabet[ebx]	; ...в символ "алфавита"
	mov	[edi],al		; ...установить разряд пароля

;-|A|--------------------------------------------------------------------
; в этом примере пароль печатается, но никто не мешает вставить между
; А и Б вычисление хэш-функции пароля и сравнения его с реверсируемым.

	push	ecx
	mov	edi,offset S_password		; указатель на пароль
	sub	ecx,offset S_key-3		; длина пароля+два байта CRLF
	mov	word ptr [edi+ecx-2],0A0Dh	; CRLF после пароля
	invoke	WriteConsole,houtput,edi,ecx,addr nwritten,NULL
	pop	ecx

;-|Б|--------------------------------------------------------------------

	mov	esi,offset S_key	; указатель на ключ
	;mov	edi,offset S_password	; указатель на пароль
@@carryloop:
	inc	byte ptr [esi]		; увеличить разряд ключа
	cmp	byte ptr [esi],szAlphabet ; максимальное значение разряда?
	jb	@@passwordloop		; НЕТ - следующий ключ готов

	mov	byte ptr [esi],0	; ДА - обнулить разряд ключа
	mov	al,S_alphabet[0]
	mov	[edi],al		; ...и соответствующий разряд пароля
	inc	esi			; следующий разряд ключа
	inc	edi			; следующий разряд пароля
	cmp	esi,ecx			; вылезли за пределы текущей длины?
					;  (исчерпаны все значения ключа?)
	jbe	@@carryloop		; нет - увеличить следующий разряд

	inc	ecx			; да - добавить новый разряд в ключ
	jmp	@@keylenloop
@@break:

;---------- на прощание

	invoke	ExitProcess,0		; ВЫХОД ;)

main	endp

;========================================================================

end main
