Wordlist encoding: Support added for internal convert from and to user-defined encoding during runtime

Wordlist encoding: Added parameters --encoding-from and --encoding-to to configure wordlist encoding handling
Dictstat: Structure for dictstat file changed as it has to include --encoding-from and --encoding-to parameter now
pull/1224/head
Jens Steube 7 years ago
parent fab4ede364
commit 7cabb848d2

@ -1 +1 @@
Subproject commit bf0f43b76f4556c3d5717f8ba8a01216b27f4af7
Subproject commit 42e7afe066a67107c2236b86c9864a472f8eead8

@ -1,5 +1,12 @@
* changes v3.40 -> 3.5.x:
##
## Features
##
- Wordlist encoding: Support added for internal convert from and to user-defined encoding during runtime
- Wordlist encoding: Added parameters --encoding-from and --encoding-to to configure wordlist encoding handling
##
## Improvements
##
@ -10,6 +17,7 @@
## Technical
##
- Dictstat: Structure for dictstat file changed as it has to include --encoding-from and --encoding-to parameter now
- OpenCL Runtime: Updated AMDGPU-Pro driver version check, do warn if version 17.10 is detected which is known to be broken
- WPA cracking: Reduced --nonce-error-corrections default from 16 to 8 to compensate speed drop caused due to Big-Endian fixes

@ -189,8 +189,8 @@ _hashcat ()
local BUILD_IN_CHARSETS='?l ?u ?d ?a ?b ?s ?h ?H'
local SHORT_OPTS="-m -a -V -v -h -b -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -i -I -s -l"
local LONG_OPTS="--hash-type --attack-mode --version --help --quiet --benchmark --hex-salt --hex-wordlist --hex-charset --force --status --status-timer --machine-readable --loopback --weak-hash-threshold --markov-hcstat --markov-disable --markov-classic --markov-threshold --runtime --session --speed-only --progress-only --restore --restore-file-path --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-check-timer --outfile-check-dir --separator --show --left --username --remove --remove-timer --potfile-disable --potfile-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --opencl-info --opencl-devices --opencl-platforms --opencl-device-types --opencl-vector-width --workload-profile --kernel-accel --kernel-loops --nvidia-spin-damp --gpu-temp-disable --gpu-temp-abort --gpu-temp-retain --powertune-enable --skip --limit --keyspace --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --truecrypt-keyfiles --stdout --keep-guessing --hccapx-message-pair --nonce-error-corrections"
local OPTIONS="-m -a -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -s -l --hash-type --attack-mode --status-timer --weak-hash-threshold --markov-hcstat --markov-threshold --runtime --session --timer --outfile --outfile-format --outfile-check-timer --outfile-check-dir --separator --remove-timer --potfile-path --restore-file-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --opencl-devices --opencl-platforms --opencl-device-types --opencl-vector-width --workload-profile --kernel-accel --kernel-loops --nvidia-spin-damp --gpu-temp-abort --gpu-temp-retain -disable --skip --limit --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment-min --increment-max --scrypt-tmto --truecrypt-keyfiles --hccapx-message-pair --nonce-error-corrections"
local LONG_OPTS="--hash-type --attack-mode --version --help --quiet --benchmark --hex-salt --hex-wordlist --hex-charset --force --status --status-timer --machine-readable --loopback --weak-hash-threshold --markov-hcstat --markov-disable --markov-classic --markov-threshold --runtime --session --speed-only --progress-only --restore --restore-file-path --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-check-timer --outfile-check-dir --separator --show --left --username --remove --remove-timer --potfile-disable --potfile-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --opencl-info --opencl-devices --opencl-platforms --opencl-device-types --opencl-vector-width --workload-profile --kernel-accel --kernel-loops --nvidia-spin-damp --gpu-temp-disable --gpu-temp-abort --gpu-temp-retain --powertune-enable --skip --limit --keyspace --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --truecrypt-keyfiles --stdout --keep-guessing --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to"
local OPTIONS="-m -a -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -s -l --hash-type --attack-mode --status-timer --weak-hash-threshold --markov-hcstat --markov-threshold --runtime --session --timer --outfile --outfile-format --outfile-check-timer --outfile-check-dir --separator --remove-timer --potfile-path --restore-file-path --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --opencl-devices --opencl-platforms --opencl-device-types --opencl-vector-width --workload-profile --kernel-accel --kernel-loops --nvidia-spin-damp --gpu-temp-abort --gpu-temp-retain -disable --skip --limit --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment-min --increment-max --scrypt-tmto --truecrypt-keyfiles --hccapx-message-pair --nonce-error-corrections --encoding-from --encoding-to"
COMPREPLY=()
local cur="${COMP_WORDS[COMP_CWORD]}"
@ -363,7 +363,7 @@ _hashcat ()
--status-timer|--markov-threshold|--runtime|--session|--separator|--segment-size|--rule-left|--rule-right| \
--nvidia-spin-damp|--gpu-temp-abort|--gpu-temp-retain|--generate-rules|--generate-rules-func-min|--generate-rules-func-max| \
--increment-min|--increment-max|--remove-timer|--bitmap-min|--bitmap-max|--skip|--limit|--generate-rules-seed| \
--weak-hash-threshold|--outfile-check-timer|--outfile-check-dir|--induction-dir|--scrypt-tmto)
--weak-hash-threshold|--outfile-check-timer|--outfile-check-dir|--induction-dir|--scrypt-tmto|--encoding-from|--encoding-to)
return 0
;;

@ -16,6 +16,7 @@
#include <sys/stat.h>
#include <sys/time.h>
#include <unistd.h>
#include <iconv.h>
#if defined (_WIN)
#include <windows.h>
@ -573,80 +574,82 @@ typedef enum user_options_map
IDX_CUSTOM_CHARSET_4 = '4',
IDX_DEBUG_FILE = 0xff04,
IDX_DEBUG_MODE = 0xff05,
IDX_FORCE = 0xff06,
IDX_GPU_TEMP_ABORT = 0xff07,
IDX_GPU_TEMP_DISABLE = 0xff08,
IDX_GPU_TEMP_RETAIN = 0xff09,
IDX_ENCODING_FROM = 0xff06,
IDX_ENCODING_TO = 0xff07,
IDX_FORCE = 0xff08,
IDX_GPU_TEMP_ABORT = 0xff09,
IDX_GPU_TEMP_DISABLE = 0xff0a,
IDX_GPU_TEMP_RETAIN = 0xff0b,
IDX_HASH_MODE = 'm',
IDX_HCCAPX_MESSAGE_PAIR = 0xff0a,
IDX_HCCAPX_MESSAGE_PAIR = 0xff0c,
IDX_HELP = 'h',
IDX_HEX_CHARSET = 0xff0b,
IDX_HEX_SALT = 0xff0c,
IDX_HEX_WORDLIST = 0xff0d,
IDX_HEX_CHARSET = 0xff0d,
IDX_HEX_SALT = 0xff0e,
IDX_HEX_WORDLIST = 0xff0f,
IDX_INCREMENT = 'i',
IDX_INCREMENT_MAX = 0xff0e,
IDX_INCREMENT_MIN = 0xff0f,
IDX_INDUCTION_DIR = 0xff10,
IDX_KEEP_GUESSING = 0xff11,
IDX_INCREMENT_MAX = 0xff10,
IDX_INCREMENT_MIN = 0xff11,
IDX_INDUCTION_DIR = 0xff12,
IDX_KEEP_GUESSING = 0xff13,
IDX_KERNEL_ACCEL = 'n',
IDX_KERNEL_LOOPS = 'u',
IDX_KEYSPACE = 0xff12,
IDX_LEFT = 0xff13,
IDX_KEYSPACE = 0xff14,
IDX_LEFT = 0xff15,
IDX_LIMIT = 'l',
IDX_LOGFILE_DISABLE = 0xff14,
IDX_LOOPBACK = 0xff15,
IDX_MACHINE_READABLE = 0xff16,
IDX_MARKOV_CLASSIC = 0xff17,
IDX_MARKOV_DISABLE = 0xff18,
IDX_MARKOV_HCSTAT = 0xff19,
IDX_LOGFILE_DISABLE = 0xff16,
IDX_LOOPBACK = 0xff17,
IDX_MACHINE_READABLE = 0xff18,
IDX_MARKOV_CLASSIC = 0xff19,
IDX_MARKOV_DISABLE = 0xff1a,
IDX_MARKOV_HCSTAT = 0xff1b,
IDX_MARKOV_THRESHOLD = 't',
IDX_NONCE_ERROR_CORRECTIONS = 0xff1a,
IDX_NVIDIA_SPIN_DAMP = 0xff1b,
IDX_NONCE_ERROR_CORRECTIONS = 0xff1c,
IDX_NVIDIA_SPIN_DAMP = 0xff1d,
IDX_OPENCL_DEVICES = 'd',
IDX_OPENCL_DEVICE_TYPES = 'D',
IDX_OPENCL_INFO = 'I',
IDX_OPENCL_PLATFORMS = 0xff1c,
IDX_OPENCL_VECTOR_WIDTH = 0xff1d,
IDX_OUTFILE_AUTOHEX_DISABLE = 0xff1e,
IDX_OUTFILE_CHECK_DIR = 0xff1f,
IDX_OUTFILE_CHECK_TIMER = 0xff20,
IDX_OUTFILE_FORMAT = 0xff21,
IDX_OPENCL_PLATFORMS = 0xff1e,
IDX_OPENCL_VECTOR_WIDTH = 0xff1f,
IDX_OUTFILE_AUTOHEX_DISABLE = 0xff20,
IDX_OUTFILE_CHECK_DIR = 0xff21,
IDX_OUTFILE_CHECK_TIMER = 0xff22,
IDX_OUTFILE_FORMAT = 0xff23,
IDX_OUTFILE = 'o',
IDX_POTFILE_DISABLE = 0xff22,
IDX_POTFILE_PATH = 0xff23,
IDX_POWERTUNE_ENABLE = 0xff24,
IDX_QUIET = 0xff25,
IDX_REMOVE = 0xff26,
IDX_REMOVE_TIMER = 0xff27,
IDX_RESTORE = 0xff28,
IDX_RESTORE_DISABLE = 0xff29,
IDX_RESTORE_FILE_PATH = 0xff2a,
IDX_POTFILE_DISABLE = 0xff24,
IDX_POTFILE_PATH = 0xff25,
IDX_POWERTUNE_ENABLE = 0xff26,
IDX_QUIET = 0xff27,
IDX_REMOVE = 0xff28,
IDX_REMOVE_TIMER = 0xff29,
IDX_RESTORE = 0xff2a,
IDX_RESTORE_DISABLE = 0xff2b,
IDX_RESTORE_FILE_PATH = 0xff2c,
IDX_RP_FILE = 'r',
IDX_RP_GEN_FUNC_MAX = 0xff2b,
IDX_RP_GEN_FUNC_MIN = 0xff2c,
IDX_RP_GEN_FUNC_MAX = 0xff2d,
IDX_RP_GEN_FUNC_MIN = 0xff2e,
IDX_RP_GEN = 'g',
IDX_RP_GEN_SEED = 0xff2d,
IDX_RP_GEN_SEED = 0xff2f,
IDX_RULE_BUF_L = 'j',
IDX_RULE_BUF_R = 'k',
IDX_RUNTIME = 0xff2e,
IDX_SCRYPT_TMTO = 0xff2f,
IDX_RUNTIME = 0xff30,
IDX_SCRYPT_TMTO = 0xff31,
IDX_SEGMENT_SIZE = 'c',
IDX_SEPARATOR = 'p',
IDX_SESSION = 0xff30,
IDX_SHOW = 0xff31,
IDX_SESSION = 0xff32,
IDX_SHOW = 0xff33,
IDX_SKIP = 's',
IDX_STATUS = 0xff32,
IDX_STATUS_TIMER = 0xff33,
IDX_STDOUT_FLAG = 0xff34,
IDX_SPEED_ONLY = 0xff35,
IDX_PROGRESS_ONLY = 0xff36,
IDX_TRUECRYPT_KEYFILES = 0xff37,
IDX_USERNAME = 0xff38,
IDX_VERACRYPT_KEYFILES = 0xff39,
IDX_VERACRYPT_PIM = 0xff3a,
IDX_STATUS = 0xff34,
IDX_STATUS_TIMER = 0xff35,
IDX_STDOUT_FLAG = 0xff36,
IDX_SPEED_ONLY = 0xff37,
IDX_PROGRESS_ONLY = 0xff38,
IDX_TRUECRYPT_KEYFILES = 0xff39,
IDX_USERNAME = 0xff3a,
IDX_VERACRYPT_KEYFILES = 0xff3b,
IDX_VERACRYPT_PIM = 0xff3c,
IDX_VERSION_LOWER = 'v',
IDX_VERSION = 'V',
IDX_WEAK_HASH_THRESHOLD = 0xff3b,
IDX_WEAK_HASH_THRESHOLD = 0xff3d,
IDX_WORKLOAD_PROFILE = 'w'
} user_options_map_t;
@ -1203,6 +1206,9 @@ typedef struct dictstat
hc_stat_t stat;
char encoding_from[64];
char encoding_to[64];
} dictstat_t;
typedef struct dictstat_ctx
@ -1388,6 +1394,10 @@ typedef struct wl_data
u64 cnt;
u64 pos;
bool iconv_enabled;
iconv_t iconv_ctx;
char *iconv_tmp;
void (*func) (char *, u64, u64 *, u64 *);
} wl_data_t;
@ -1453,6 +1463,8 @@ typedef struct user_options
char *custom_charset_3;
char *custom_charset_4;
char *debug_file;
char *encoding_from;
char *encoding_to;
char *induction_dir;
char *markov_hcstat;
char *opencl_devices;

@ -108,6 +108,15 @@ CC_LINUX_64 := gcc
CC_WIN_32 := i686-w64-mingw32-gcc
CC_WIN_64 := x86_64-w64-mingw32-gcc
## To compile mingw iconv:
##
## ./configure --host=i686-w64-mingw32 --prefix=/opt/iconv-w32 && make install
## ./configure --host=x86_64-w64-mingw32 --prefix=/opt/iconv-w64 && make install
##
ICONV_WIN_32 := /opt/iconv-w32
ICONV_WIN_64 := /opt/iconv-w64
##
## Misc stuff
##
@ -184,7 +193,8 @@ CFLAGS_NATIVE := $(CFLAGS)
CFLAGS_NATIVE += -I$(OPENCL_HEADERS_KHRONOS)/
CFLAGS_NATIVE += -DWITH_HWMON
LFLAGS_NATIVE := $(LFLAGS)
LFLAGS_NATIVE += -lpthread -ldl
LFLAGS_NATIVE += -lpthread
LFLAGS_NATIVE += -ldl
endif # Linux
ifeq ($(UNAME),FreeBSD)
@ -192,7 +202,7 @@ ifndef PORTNAME
CFLAGS_NATIVE := $(CFLAGS)
CFLAGS_NATIVE += -I$(OPENCL_HEADERS_KHRONOS)/
LFLAGS_NATIVE := $(LFLAGS)
LFLAGS_NATIVE += -lpthread
LFLAGS_NATIVE += -lpthread
endif
endif # FreeBSD
@ -211,6 +221,7 @@ CFLAGS_NATIVE += -DWITH_HWMON
LFLAGS_NATIVE := $(LFLAGS)
LFLAGS_NATIVE += -Wl,--dynamicbase -Wl,--nxcompat
LFLAGS_NATIVE += -lpsapi
LFLAGS_NATIVE += -liconv
endif # CYGWIN
ifeq ($(UNAME),MSYS2)
@ -220,6 +231,7 @@ CFLAGS_NATIVE += -DWITH_HWMON
LFLAGS_NATIVE := $(LFLAGS)
LFLAGS_NATIVE += -Wl,--dynamicbase -Wl,--nxcompat
LFLAGS_NATIVE += -lpsapi
LFLAGS_NATIVE += -liconv
endif # MSYS2
##
@ -236,23 +248,31 @@ CFLAGS_CROSS_LINUX64 += -m64
CFLAGS_CROSS_LINUX64 += -DWITH_HWMON
CFLAGS_CROSS_WIN32 := $(CFLAGS)
CFLAGS_CROSS_WIN32 += -I$(OPENCL_HEADERS_KHRONOS)/
CFLAGS_CROSS_WIN32 += -I$(ICONV_WIN_32)/include/
CFLAGS_CROSS_WIN32 += -m32
CFLAGS_CROSS_WIN32 += -DWITH_HWMON
CFLAGS_CROSS_WIN64 := $(CFLAGS)
CFLAGS_CROSS_WIN64 += -I$(OPENCL_HEADERS_KHRONOS)/
CFLAGS_CROSS_WIN64 += -I$(ICONV_WIN_64)/include/
CFLAGS_CROSS_WIN64 += -m64
CFLAGS_CROSS_WIN64 += -DWITH_HWMON
LFLAGS_CROSS_LINUX32 := $(LFLAGS)
LFLAGS_CROSS_LINUX32 += -lpthread -ldl
LFLAGS_CROSS_LINUX32 += -lpthread
LFLAGS_CROSS_LINUX32 += -ldl
LFLAGS_CROSS_LINUX64 := $(LFLAGS)
LFLAGS_CROSS_LINUX64 += -lpthread -ldl
LFLAGS_CROSS_LINUX64 += -lpthread
LFLAGS_CROSS_LINUX64 += -ldl
LFLAGS_CROSS_WIN32 := $(LFLAGS)
LFLAGS_CROSS_WIN32 += -Wl,--dynamicbase -Wl,--nxcompat
LFLAGS_CROSS_WIN32 += -L$(ICONV_WIN_32)/lib/
LFLAGS_CROSS_WIN32 += -lpsapi
LFLAGS_CROSS_WIN32 += -liconv
LFLAGS_CROSS_WIN64 := $(LFLAGS)
LFLAGS_CROSS_WIN64 += -Wl,--dynamicbase -Wl,--nxcompat
LFLAGS_CROSS_WIN64 += -L$(ICONV_WIN_64)/lib/
LFLAGS_CROSS_WIN64 += -lpsapi
LFLAGS_CROSS_WIN64 += -liconv
##
## Objects

@ -18,6 +18,14 @@ int sort_by_dictstat (const void *s1, const void *s2)
d2->stat.st_atime = d1->stat.st_atime;
const int rc_from = strcmp (d1->encoding_from, d2->encoding_from);
if (rc_from != 0) return rc_from;
const int rc_to = strcmp (d1->encoding_to, d2->encoding_to);
if (rc_to != 0) return rc_to;
return memcmp (&d1->stat, &d2->stat, sizeof (struct stat));
}

@ -123,7 +123,22 @@ static int calc_stdin (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_par
char *buf = (char *) hcmalloc (HCBUFSIZ_LARGE);
const u32 attack_kern = user_options_extra->attack_kern;
bool iconv_enabled = false;
iconv_t iconv_ctx;
char *iconv_tmp = NULL;
if (strcmp (user_options->encoding_from, user_options->encoding_to))
{
iconv_enabled = true;
iconv_ctx = iconv_open (user_options->encoding_to, user_options->encoding_from);
if (iconv_ctx == (iconv_t) -1) return -1;
iconv_tmp = (char *) hcmalloc (HCBUFSIZ_TINY);
}
while (status_ctx->run_thread_level1 == true)
{
@ -144,10 +159,30 @@ static int calc_stdin (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_par
if (line_buf == NULL) break;
u32 line_len = (u32) in_superchop (line_buf);
size_t line_len = in_superchop (line_buf);
line_len = convert_from_hex (hashcat_ctx, line_buf, line_len);
// do the on-the-fly encoding
if (iconv_enabled == true)
{
char *iconv_ptr = iconv_tmp;
size_t iconv_sz = HCBUFSIZ_TINY;
const size_t iconv_rc = iconv (iconv_ctx, &line_buf, &line_len, &iconv_ptr, &iconv_sz);
if (iconv_rc == (size_t) -1)
{
line_len = PW_MAX1;
}
else
{
line_buf = iconv_tmp;
line_len = HCBUFSIZ_TINY - iconv_sz;
}
}
// post-process rule engine
char rule_buf_out[BLOCK_SIZE];
@ -176,6 +211,8 @@ static int calc_stdin (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_par
// hmm that's always the case, or?
const u32 attack_kern = user_options_extra->attack_kern;
if (attack_kern == ATTACK_KERN_STRAIGHT)
{
if ((line_len < hashconfig->pw_min) || (line_len > hashconfig->pw_max))
@ -241,6 +278,15 @@ static int calc_stdin (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_par
device_param->kernel_accel = 0;
device_param->kernel_loops = 0;
if (iconv_enabled == true)
{
iconv_close (iconv_ctx);
iconv_enabled = false;
hcfree (iconv_tmp);
}
hcfree (buf);
return 0;

@ -61,6 +61,8 @@ static const char *USAGE_BIG[] =
" --remove-timer | Num | Update input hash file each X seconds | --remove-timer=30",
" --potfile-disable | | Do not write potfile |",
" --potfile-path | Dir | Specific path to potfile | --potfile-path=my.pot",
" --encoding-from | Code | Force internal wordlist encoding from X | --encoding-from=iso-8859-15",
" --encoding-from | Code | Force internal wordlist encoding to X | --encoding-to=utf-32le",
" --debug-mode | Num | Defines the debug mode (hybrid only by using rules) | --debug-mode=4",
" --debug-file | File | Output file for debugging rules | --debug-file=good.log",
" --induction-dir | Dir | Specify the induction directory to use for loopback | --induction=inducts",

@ -30,6 +30,8 @@ static const struct option long_options[] =
{"custom-charset4", required_argument, 0, IDX_CUSTOM_CHARSET_4},
{"debug-file", required_argument, 0, IDX_DEBUG_FILE},
{"debug-mode", required_argument, 0, IDX_DEBUG_MODE},
{"encoding-from", required_argument, 0, IDX_ENCODING_FROM},
{"encoding-to", required_argument, 0, IDX_ENCODING_TO},
{"force", no_argument, 0, IDX_FORCE},
{"generate-rules-func-max", required_argument, 0, IDX_RP_GEN_FUNC_MAX},
{"generate-rules-func-min", required_argument, 0, IDX_RP_GEN_FUNC_MIN},
@ -108,6 +110,9 @@ static const struct option long_options[] =
{0, 0, 0, 0}
};
static char ENCODING_FROM[] = "utf-8";
static char ENCODING_TO[] = "utf-8";
static char RULE_BUF_R[] = ":";
static char RULE_BUF_L[] = ":";
@ -131,6 +136,8 @@ int user_options_init (hashcat_ctx_t *hashcat_ctx)
user_options->custom_charset_4 = NULL;
user_options->debug_file = NULL;
user_options->debug_mode = DEBUG_MODE;
user_options->encoding_from = ENCODING_FROM;
user_options->encoding_to = ENCODING_TO;
user_options->force = FORCE;
user_options->gpu_temp_abort = GPU_TEMP_ABORT;
user_options->gpu_temp_disable = GPU_TEMP_DISABLE;
@ -314,6 +321,8 @@ int user_options_getopt (hashcat_ctx_t *hashcat_ctx, int argc, char **argv)
case IDX_POTFILE_PATH: user_options->potfile_path = optarg; break;
case IDX_DEBUG_MODE: user_options->debug_mode = atoi (optarg); break;
case IDX_DEBUG_FILE: user_options->debug_file = optarg; break;
case IDX_ENCODING_FROM: user_options->encoding_from = optarg; break;
case IDX_ENCODING_TO: user_options->encoding_to = optarg; break;
case IDX_INDUCTION_DIR: user_options->induction_dir = optarg; break;
case IDX_OUTFILE_CHECK_DIR: user_options->outfile_check_dir = optarg; break;
case IDX_FORCE: user_options->force = true; break;
@ -2072,6 +2081,8 @@ void user_options_logger (hashcat_ctx_t *hashcat_ctx)
logfile_top_string (user_options->custom_charset_3);
logfile_top_string (user_options->custom_charset_4);
logfile_top_string (user_options->debug_file);
logfile_top_string (user_options->encoding_from);
logfile_top_string (user_options->encoding_to);
logfile_top_string (user_options->induction_dir);
logfile_top_string (user_options->markov_hcstat);
logfile_top_string (user_options->opencl_devices);

@ -184,6 +184,28 @@ void get_next_word (hashcat_ctx_t *hashcat_ctx, FILE *fd, char **out_buf, u32 *o
wl_data->pos += off;
// do the on-the-fly encoding
if (wl_data->iconv_enabled == true)
{
char *iconv_ptr = wl_data->iconv_tmp;
size_t iconv_sz = HCBUFSIZ_TINY;
size_t ptr_len = len;
const size_t iconv_rc = iconv (wl_data->iconv_ctx, &ptr, &ptr_len, &iconv_ptr, &iconv_sz);
if (iconv_rc == (size_t) -1)
{
len = PW_MAX1;
}
else
{
ptr = wl_data->iconv_tmp;
len = HCBUFSIZ_TINY - iconv_sz;
}
}
if (run_rule_engine (user_options_extra->rule_len_l, user_options->rule_buf_l))
{
int rule_len_out = -1;
@ -288,6 +310,12 @@ int count_words (hashcat_ctx_t *hashcat_ctx, FILE *fd, const char *dictfile, u64
d.stat.st_blocks = 0;
#endif
memset (d.encoding_from, 0, sizeof (d.encoding_from));
memset (d.encoding_to, 0, sizeof (d.encoding_to));
strncpy (d.encoding_from, user_options->encoding_from, sizeof (d.encoding_from));
strncpy (d.encoding_to, user_options->encoding_to, sizeof (d.encoding_to));
if (d.stat.st_size == 0)
{
*result = 0;
@ -351,7 +379,31 @@ int count_words (hashcat_ctx_t *hashcat_ctx, FILE *fd, const char *dictfile, u64
u64 len;
u64 off;
wl_data->func (wl_data->buf + i, wl_data->cnt - i, &len, &off);
char *ptr = wl_data->buf + i;
wl_data->func (ptr, wl_data->cnt - i, &len, &off);
// do the on-the-fly encoding
if (wl_data->iconv_enabled == true)
{
char *iconv_ptr = wl_data->iconv_tmp;
size_t iconv_sz = HCBUFSIZ_TINY;
size_t ptr_len = len;
const size_t iconv_rc = iconv (wl_data->iconv_ctx, &ptr, &ptr_len, &iconv_ptr, &iconv_sz);
if (iconv_rc == (size_t) -1)
{
len = PW_MAX1;
}
else
{
ptr = wl_data->iconv_tmp;
len = HCBUFSIZ_TINY - iconv_sz;
}
}
if (run_rule_engine (user_options_extra->rule_len_l, user_options->rule_buf_l))
{
@ -361,7 +413,7 @@ int count_words (hashcat_ctx_t *hashcat_ctx, FILE *fd, const char *dictfile, u64
{
char unused[BLOCK_SIZE] = { 0 };
rule_len_out = _old_apply_rule (user_options->rule_buf_l, user_options_extra->rule_len_l, wl_data->buf + i, len, unused);
rule_len_out = _old_apply_rule (user_options->rule_buf_l, user_options_extra->rule_len_l, ptr, len, unused);
}
if (rule_len_out < 0)
@ -476,6 +528,21 @@ int wl_data_init (hashcat_ctx_t *hashcat_ctx)
wl_data->func = get_next_word_lm;
}
/**
* iconv
*/
if (strcmp (user_options->encoding_from, user_options->encoding_to))
{
wl_data->iconv_enabled = true;
wl_data->iconv_ctx = iconv_open (user_options->encoding_to, user_options->encoding_from);
if (wl_data->iconv_ctx == (iconv_t) -1) return -1;
wl_data->iconv_tmp = (char *) hcmalloc (HCBUFSIZ_TINY);
}
return 0;
}
@ -487,5 +554,14 @@ void wl_data_destroy (hashcat_ctx_t *hashcat_ctx)
hcfree (wl_data->buf);
if (wl_data->iconv_enabled == true)
{
iconv_close (wl_data->iconv_ctx);
wl_data->iconv_enabled = false;
hcfree (wl_data->iconv_tmp);
}
memset (wl_data, 0, sizeof (wl_data_t));
}

Loading…
Cancel
Save