Prepare to rename project into hashcat

This release markes the fusion of "hashcat" and "oclHashcat" into "hashcat".
It combines all features of all hashcat projects in one project.
pull/332/head
jsteube 8 years ago
parent 768ffbdad8
commit e47030ed7d

3
.gitignore vendored

@ -1,7 +1,7 @@
*.exe *.exe
*.bin *.bin
*.app *.app
oclHashcat hashcat
*.restore *.restore
*.dictstat *.dictstat
*.pot *.pot
@ -11,3 +11,4 @@ deps/**
kernels/** kernels/**
lib/*.a lib/*.a
obj/*.o obj/*.o
include/CL

@ -14,7 +14,7 @@
/* */ /* */
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
/* */ /* */
/* Cleaned and optimized for GPU use with oclHashcat by Jens Steube */ /* Cleaned and optimized for GPU use with hashcat by Jens Steube */
/* 15 terms */ /* 15 terms */

@ -17,7 +17,7 @@
/* */ /* */
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
/* */ /* */
/* Cleaned and optimized for GPU use with oclHashcat by Jens Steube */ /* Cleaned and optimized for GPU use with hashcat by Jens Steube */
#define extract_byte(x,n) (((x) >> (8 * (n))) & 0xff) #define extract_byte(x,n) (((x) >> (8 * (n))) & 0xff)

@ -1176,7 +1176,7 @@ void memcat8 (u32 block0[4], u32 block1[4], u32 block2[4], u32 block3[4], const
#define WORDSZ384 128 #define WORDSZ384 128
#define WORDSZ512 128 #define WORDSZ512 128
#define PWMAXSZ 32 // oclHashcat password length limit #define PWMAXSZ 32 // hashcat password length limit
#define BLMAXSZ BLSZ512 #define BLMAXSZ BLSZ512
#define WORDMAXSZ WORDSZ512 #define WORDMAXSZ WORDSZ512

@ -1,14 +1,16 @@
## *oclHashcat* ## ## *hashcat* ##
**oclHashcat** is the world's fastest and most advanced GPGPU-based password recovery utility, supporting five unique modes of attack for over 170 highly-optimized hashing algorithms. oclHashcat currently supports AMD (OpenCL) and Nvidia (CUDA) graphics processors on GNU/Linux and Windows 7/8/10, and has facilities to help enable distributed password cracking. **hashcat** is the world's fastest and most advanced password recovery utility, supporting five unique modes of attack for over 180 highly-optimized hashing algorithms. hashcat currently supports CPU's, GPU's other hardware-accelerators on Linux, Windows and OSX, and has facilities to help enable distributed password cracking.
** THE VERSION 3.00 IS CURRENTLY STILL IN BETA **
### License ### ### License ###
**oclHashcat** is licensed under the MIT license. Refer to [docs/license.txt](docs/license.txt) for more information. **hashcat** is licensed under the MIT license. Refer to [docs/license.txt](docs/license.txt) for more information.
### Installation ### ### Installation ###
Download the [latest release](https://hashcat.net/oclhashcat/) and unpack it in the desired location. Please remember to use `7z x` when unpacking the archive from the command line to ensure full file paths remain intact. Download the [latest release](https://hashcat.net/hashcat/) and unpack it in the desired location. Please remember to use `7z x` when unpacking the archive from the command line to ensure full file paths remain intact.
### Usage/Help ### ### Usage/Help ###
@ -16,7 +18,7 @@ Please refer to the [Hashcat Wiki](https://hashcat.net/wiki/) and the output of
### Building ### ### Building ###
Refer to [docs/BUILD.md](docs/BUILD.md) for instructions on how to build **oclHashcat** from source. Refer to [docs/BUILD.md](docs/BUILD.md) for instructions on how to build **hashcat** from source.
### Contributing ### ### Contributing ###
@ -41,8 +43,8 @@ Your pull request should fully describe the functionality you are adding/removin
Solve only one problem in each pull request. If you're fixing a bug and adding a new feature, you need to make two separate pull requests. If you're fixing three bugs, you need to make three separate pull requests. If you're adding four new features, you need to make four separate pull requests. So on, and so forth. Solve only one problem in each pull request. If you're fixing a bug and adding a new feature, you need to make two separate pull requests. If you're fixing three bugs, you need to make three separate pull requests. If you're adding four new features, you need to make four separate pull requests. So on, and so forth.
If your patch fixes a bug, please be sure there is an [issue](https://github.com/hashcat/oclHashcat/issues) open for the bug before submitting a pull request. If your patch aims to improve performance or optimizes an algorithm, be sure to quantify your optimizations and document the trade-offs, and back up your claims with benchmarks and metrics. If your patch fixes a bug, please be sure there is an [issue](https://github.com/hashcat/hashcat/issues) open for the bug before submitting a pull request. If your patch aims to improve performance or optimizes an algorithm, be sure to quantify your optimizations and document the trade-offs, and back up your claims with benchmarks and metrics.
In order to maintain the quality and integrity of the **oclHashcat** source tree, all pull requests must be reviewed and signed off by at least two [board members](https://github.com/orgs/hashcat/people) before being merged. The [project lead](https://github.com/jsteube) has the ultimate authority in deciding whether to accept or reject a pull request. Do not be discouraged if your pull request is rejected! In order to maintain the quality and integrity of the **hashcat** source tree, all pull requests must be reviewed and signed off by at least two [board members](https://github.com/orgs/hashcat/people) before being merged. The [project lead](https://github.com/jsteube) has the ultimate authority in deciding whether to accept or reject a pull request. Do not be discouraged if your pull request is rejected!
### Happy Cracking! ### Happy Cracking!

@ -1,4 +1,4 @@
oclHashcat build documentation hashcat build documentation
= =
# Revision: # Revision:
* 1.3 * 1.3
@ -8,12 +8,12 @@ oclHashcat build documentation
* Christoph Heuwieser <<dropdead@hashcat.net>> * Christoph Heuwieser <<dropdead@hashcat.net>>
* magnum <<john.magnum@hushmail.com>> * magnum <<john.magnum@hushmail.com>>
# Building oclHashcat for Linux and OSX # Building hashcat for Linux and OSX
Get a copy of the **oclHashcat** repository Get a copy of the **hashcat** repository
```sh ```sh
$ git clone https://github.com/hashcat/oclHashcat.git $ git clone https://github.com/hashcat/hashcat.git
``` ```
Run "make" Run "make"
@ -22,7 +22,7 @@ Run "make"
$ make $ make
``` ```
# Install oclHashcat for Linux # Install hashcat for Linux
The install target is linux FHS compatible and can be used like this: The install target is linux FHS compatible and can be used like this:
@ -32,12 +32,12 @@ $ make install
If you install it, cached kernels, session files, restore- and pot-files etc. will go to $HOME/.hashcat/ If you install it, cached kernels, session files, restore- and pot-files etc. will go to $HOME/.hashcat/
# Building oclHashcat for Windows # Building hashcat for Windows
Get a copy of the **oclHashcat** repository Get a copy of the **hashcat** repository
```sh ```sh
$ git clone https://github.com/hashcat/oclHashcat.git $ git clone https://github.com/hashcat/hashcat.git
``` ```
Basically all you need is the OpenCL Headers. Basically all you need is the OpenCL Headers.
@ -53,4 +53,4 @@ $ git clone https://github.com/KhronosGroup/OpenCL-Headers deps/OpenCL-Headers/C
$ make win32 win64 $ make win32 win64
``` ```
= =
Enjoy your fresh **oclHashcat** binaries ;) Enjoy your fresh **hashcat** binaries ;)

@ -3,7 +3,7 @@
This release markes the fusion of "hashcat" and "oclHashcat" into "hashcat". This release markes the fusion of "hashcat" and "oclHashcat" into "hashcat".
It combines all features of all hashcat projects in one project. It combines all features of all hashcat projects in one project.
** NOTE to beta users: that's what's planed for release ** ** THE VERSION 3.00 IS CURRENTLY STILL IN BETA **
## ##
## Features ## Features

@ -1,5 +1,7 @@
oclHashcat v2.10 hashcat v3.00
================ =============
** THE VERSION 3.00 IS CURRENTLY STILL IN BETA **
AMD users require AMD drivers 14.9 or later (recommended 15.12 or later) AMD users require AMD drivers 14.9 or later (recommended 15.12 or later)
Intel users require Intel OpenCL Runtime 14.2 or later (recommended 15.1 or later) Intel users require Intel OpenCL Runtime 14.2 or later (recommended 15.1 or later)
@ -10,11 +12,11 @@ NVidia users require NVidia drivers 346.59 or later (recommended 361.x or later)
## ##
- World's fastest password cracker - World's fastest password cracker
- World's first and only GPGPU-based rule engine - World's first and only in-kernel rule engine
- Free - Free
- Open-Source (MIT License) - Open-Source (MIT License)
- Multi-OS (Linux, Windows and OSX) - Multi-OS (Linux, Windows and OSX)
- Multi-Platform (CPU, GPU, FPGA, etc., everything that comes with an OpenCL runtime) - Multi-Platform (CPU, GPU, DSP, FPGA, etc., everything that comes with an OpenCL runtime)
- Multi-Hash (Cracking multiple hashes at the same time) - Multi-Hash (Cracking multiple hashes at the same time)
- Multi-Devices (Utilizing multiple devices in same system) - Multi-Devices (Utilizing multiple devices in same system)
- Multi-Device-Types (Utilizing mixed device types in same system) - Multi-Device-Types (Utilizing mixed device types in same system)
@ -28,7 +30,7 @@ NVidia users require NVidia drivers 346.59 or later (recommended 361.x or later)
- Supports automatic keyspace ordering markov-chains - Supports automatic keyspace ordering markov-chains
- Built-in benchmarking system - Built-in benchmarking system
- Integrated thermal watchdog - Integrated thermal watchdog
- 150+ Hash-types implemented with performance in mind - 160+ Hash-types implemented with performance in mind
## ##
## Hash-Types ## Hash-Types
@ -222,3 +224,15 @@ NVidia users require NVidia drivers 346.59 or later (recommended 361.x or later)
- Mesa/Clover - Mesa/Clover
- NVidia ForceWare - NVidia ForceWare
- pocl - pocl
##
## Supported OpenCL device types
##
- GPU
- CPU
- APU
- DSP
- FPGA
- Coprocessor

@ -42,7 +42,7 @@
#define RULE_OP_REJECT_CONTAINS '%' // reject plains that contain char X less than N times #define RULE_OP_REJECT_CONTAINS '%' // reject plains that contain char X less than N times
#define RULE_OP_REJECT_MEMORY 'Q' // reject plains that match the plain saved (see M), i.e. if unchanged #define RULE_OP_REJECT_MEMORY 'Q' // reject plains that match the plain saved (see M), i.e. if unchanged
/* hashcat only */ /* With -j or -k only */
#define RULE_OP_MANGLE_SWITCH_FIRST 'k' // switches the first 2 chars. ex: hello -> ehllo #define RULE_OP_MANGLE_SWITCH_FIRST 'k' // switches the first 2 chars. ex: hello -> ehllo
#define RULE_OP_MANGLE_SWITCH_LAST 'K' // switches the last 2 chars. ex: hello -> helol #define RULE_OP_MANGLE_SWITCH_LAST 'K' // switches the last 2 chars. ex: hello -> helol
@ -56,3 +56,4 @@
#define RULE_OP_MANGLE_DUPEBLOCK_FIRST 'y' // duplicates first n characters #define RULE_OP_MANGLE_DUPEBLOCK_FIRST 'y' // duplicates first n characters
#define RULE_OP_MANGLE_DUPEBLOCK_LAST 'Y' // duplicates last n characters #define RULE_OP_MANGLE_DUPEBLOCK_LAST 'Y' // duplicates last n characters
#define RULE_OP_MANGLE_TITLE 'E' // lowercase everything then upper case the first letter and every letter after a space #define RULE_OP_MANGLE_TITLE 'E' // lowercase everything then upper case the first letter and every letter after a space

File diff suppressed because it is too large Load Diff

@ -1,2 +1,2 @@
oclHashcat64.exe -t 32 -a 7 example0.hash ?a?a?a?a example.dict hashcat64.exe -t 32 -a 7 example0.hash ?a?a?a?a example.dict
pause pause

File diff suppressed because it is too large Load Diff

@ -1 +1 @@
./oclHashcat -t 32 -a 7 example0.hash ?a?a?a?a example.dict ./hashcat -t 32 -a 7 example0.hash ?a?a?a?a example.dict

@ -1,2 +1,2 @@
type example.dict | oclHashcat64.exe -m 400 example400.hash type example.dict | hashcat64.exe -m 400 example400.hash
pause pause

@ -1 +1 @@
$H$9y5boZ2wsUlgl2tI6b5PrRoADzYfXD1 $H$9y5boZ2wsUlgl2tI6b5PrRoADzYfXD1

@ -1 +1 @@
cat example.dict | ./oclHashcat -m 400 example400.hash cat example.dict | ./hashcat -m 400 example400.hash

@ -1,2 +1,2 @@
oclHashcat64.exe -m 500 example500.hash example.dict hashcat64.exe -m 500 example500.hash example.dict
pause pause

@ -1 +1 @@
$1$uOM6WNc4$r3ZGeSB11q6UUSILqek3J1 $1$uOM6WNc4$r3ZGeSB11q6UUSILqek3J1

@ -1 +1 @@
./oclHashcat -m 500 example500.hash example.dict ./hashcat -m 500 example500.hash example.dict

@ -4,19 +4,19 @@
## License.....: MIT ## License.....: MIT
## ##
OCLHASHCAT_ROOT="." HASHCAT_ROOT="."
# helper functions # helper functions
_oclHashcat_get_permutations () _hashcat_get_permutations ()
{ {
local num_devices=${1} local num_devices=${1}
oclHashcat_devices_permutation="" hashcat_devices_permutation=""
# Formula: Sum (k=1...num_devices) (num_devices! / (k! * (num_devices - k)!)) # Formula: Sum (k=1...num_devices) (num_devices! / (k! * (num_devices - k)!))
# or ofc (2 ^ num_devices) - 1 # or ofc (2 ^ num_devices) - 1
if [ "${num_devices}" -gt 0 ]; then if [ "${num_devices}" -gt 0 ]; then
oclHashcat_devices_permutation=$(seq 1 $num_devices) hashcat_devices_permutation=$(seq 1 $num_devices)
local k local k
@ -24,7 +24,7 @@ _oclHashcat_get_permutations ()
if [ "${k}" -eq ${num_devices} ];then if [ "${k}" -eq ${num_devices} ];then
oclHashcat_devices_permutation="${oclHashcat_devices_permutation} $(seq 1 $num_devices | tr '\n' ',' | sed 's/, *$//')" hashcat_devices_permutation="${hashcat_devices_permutation} $(seq 1 $num_devices | tr '\n' ',' | sed 's/, *$//')"
else else
@ -65,7 +65,7 @@ _oclHashcat_get_permutations ()
if [ "${pos_changed}" -eq 0 ]; then if [ "${pos_changed}" -eq 0 ]; then
oclHashcat_devices_permutation="${oclHashcat_devices_permutation} ${out_str}" hashcat_devices_permutation="${hashcat_devices_permutation} ${out_str}"
else else
@ -127,7 +127,7 @@ _oclHashcat_get_permutations ()
fi fi
} }
_oclHashcat_opencl_devices () _hashcat_opencl_devices ()
{ {
local num_devices=0 local num_devices=0
@ -144,7 +144,7 @@ _oclHashcat_opencl_devices ()
return ${num_devices} return ${num_devices}
} }
_oclHashcat_cpu_devices () _hashcat_cpu_devices ()
{ {
local num_devices=0 local num_devices=0
@ -157,7 +157,7 @@ _oclHashcat_cpu_devices ()
return ${num_devices} return ${num_devices}
} }
_oclHashcat_contains () _hashcat_contains ()
{ {
local haystack=${1} local haystack=${1}
local needle="${2}" local needle="${2}"
@ -173,7 +173,7 @@ _oclHashcat_contains ()
return 1 return 1
} }
_oclHashcat () _hashcat ()
{ {
local VERSION=2.10 local VERSION=2.10
@ -246,12 +246,12 @@ _oclHashcat ()
;; ;;
-d|--opencl-devices) -d|--opencl-devices)
_oclHashcat_opencl_devices _hashcat_opencl_devices
local num_devices=${?} local num_devices=${?}
_oclHashcat_get_permutations ${num_devices} _hashcat_get_permutations ${num_devices}
COMPREPLY=($(compgen -W "${oclHashcat_devices_permutation}" -- ${cur})) COMPREPLY=($(compgen -W "${hashcat_devices_permutation}" -- ${cur}))
return 0 return 0
;; ;;
@ -294,12 +294,12 @@ _oclHashcat ()
;; ;;
--cpu-affinity) --cpu-affinity)
_oclHashcat_cpu_devices _hashcat_cpu_devices
local num_devices=${?} local num_devices=${?}
_oclHashcat_get_permutations ${num_devices} _hashcat_get_permutations ${num_devices}
COMPREPLY=($(compgen -W "${oclHashcat_devices_permutation}" -- ${cur})) COMPREPLY=($(compgen -W "${hashcat_devices_permutation}" -- ${cur}))
return 0 return 0
;; ;;
@ -422,12 +422,12 @@ _oclHashcat ()
;; ;;
-d*) -d*)
_oclHashcat_opencl_devices _hashcat_opencl_devices
local num_devices=${?} local num_devices=${?}
_oclHashcat_get_permutations ${num_devices} _hashcat_get_permutations ${num_devices}
local opencl_devices_var="$(echo " "${oclHashcat_devices_permutation} | sed 's/ / -d/g')" local opencl_devices_var="$(echo " "${hashcat_devices_permutation} | sed 's/ / -d/g')"
COMPREPLY=($(compgen -W "${opencl_devices_var}" -- ${cur})) COMPREPLY=($(compgen -W "${opencl_devices_var}" -- ${cur}))
return 0 return 0
;; ;;
@ -450,7 +450,7 @@ _oclHashcat ()
local h=1 local h=1
local no_opts=0 local no_opts=0
local attack_mode=0 # also default of oclHashcat local attack_mode=0 # also default of hashcat
local has_charset_1=0 local has_charset_1=0
local has_charset_2=0 local has_charset_2=0
local has_charset_3=0 local has_charset_3=0
@ -504,13 +504,13 @@ _oclHashcat ()
fi fi
if _oclHashcat_contains "${OPTIONS}" "${COMP_WORDS[h]}"; then if _hashcat_contains "${OPTIONS}" "${COMP_WORDS[h]}"; then
h=$((h + 2)) h=$((h + 2))
else else
if ! _oclHashcat_contains "${LONG_OPTS}${SHORT_OPTS}" "${COMP_WORDS[h]}"; then if ! _hashcat_contains "${LONG_OPTS}${SHORT_OPTS}" "${COMP_WORDS[h]}"; then
local variants="-m -a -w -n -u -o -r -d" local variants="-m -a -w -n -u -o -r -d"
local skip=0 local skip=0
local v local v
@ -759,4 +759,4 @@ _oclHashcat ()
esac esac
} }
complete -F _oclHashcat -o filenames "${OCLHASHCAT_ROOT}"/oclHashcat64.bin "${OCLHASHCAT_ROOT}"/oclHashcat32.bin "${OCLHASHCAT_ROOT}"/oclHashcat oclHashcat complete -F _hashcat -o filenames "${HASHCAT_ROOT}"/hashcat64.bin "${HASHCAT_ROOT}"/hashcat32.bin "${HASHCAT_ROOT}"/hashcat hashcat

@ -1,4 +1,4 @@
run: run:
source ./install source ./install
OR OR
source ./oclHashcat.sh # not working permanently (i.e. not working after a reboot) source ./hashcat.sh # not working permanently (i.e. not working after a reboot)

@ -1,11 +1,11 @@
#!/bin/bash #!/bin/bash
# Programmable bash completion for oclHashcat # Programmable bash completion for hashcat
# this script was tested under ubuntu, please verify if on your # this script was tested under ubuntu, please verify if on your
# distro /etc/bash_completion.d/ exists (otherwise it won't work) # distro /etc/bash_completion.d/ exists (otherwise it won't work)
COMPGENSCRIPT=/etc/bash_completion COMPGENSCRIPT=/etc/bash_completion
COMPGENFOLDER=${COMPGENSCRIPT}.d COMPGENFOLDER=${COMPGENSCRIPT}.d
COMPGENTARGET=${COMPGENFOLDER}/oclHashcat.sh COMPGENTARGET=${COMPGENFOLDER}/hashcat.sh
BASHRC=~/.bashrc BASHRC=~/.bashrc
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
@ -131,15 +131,15 @@ fi
if [ -d "${COMPGENFOLDER}" ]; then if [ -d "${COMPGENFOLDER}" ]; then
# remove the old version of oclHashcat64.sh (was renamed to just oclHashcat.sh) # remove the old version of hashcat64.sh (was renamed to just hashcat.sh)
rm -f "${COMPGENTARGET}"/oclHashcat64.sh rm -f "${COMPGENTARGET}"/hashcat64.sh
# copy the script to target folder # copy the script to target folder
cp ${ROOT}/oclHashcat.sh "${COMPGENTARGET}" cp ${ROOT}/hashcat.sh "${COMPGENTARGET}"
# adjust paths to the main binaries of oclHashcat # adjust paths to the main binaries of hashcat
sed -ri "s!^(ROOT=).*!\1\"${ROOT_PARENT}\"!" "${COMPGENTARGET}" sed -ri "s!^(ROOT=).*!\1\"${ROOT_PARENT}\"!" "${COMPGENTARGET}"
@ -162,7 +162,7 @@ EOF
if source_completion; then if source_completion; then
echo "Bash completion scripts for oclHashcat were successfully installed, but since you didn't 'source' this file, you need to run:" echo "Bash completion scripts for hashcat were successfully installed, but since you didn't 'source' this file, you need to run:"
echo "source ${COMPGENTARGET} # or source ${BASHRC}" echo "source ${COMPGENTARGET} # or source ${BASHRC}"
echo echo
echo "in order to be able to use the tab completion within the current shell." echo "in order to be able to use the tab completion within the current shell."

@ -15,7 +15,7 @@
# - A line can not start with a space or a tab # - A line can not start with a space or a tab
# - Comment lines are allowed, use a # as first character # - Comment lines are allowed, use a # as first character
# - Invalid lines are ignored # - Invalid lines are ignored
# - The Device-Name is the OpenCL Device-Name. It's shown on oclHashcat startup. # - The Device-Name is the OpenCL Device-Name. It's shown on hashcat startup.
# - If the device contains spaces, replace all spaces with _ character. # - If the device contains spaces, replace all spaces with _ character.
# - The Device-Name can be assigned an alias. This is useful if many devices share the same chip # - The Device-Name can be assigned an alias. This is useful if many devices share the same chip
# - There's also a hard-wired Device-Name which matches all device types called: # - There's also a hard-wired Device-Name which matches all device types called:

@ -162,7 +162,7 @@ typedef struct ADLODPerformanceLevel
/* /*
* Attention: we had to change this struct due to an out-of-bound problem mentioned here: * Attention: we had to change this struct due to an out-of-bound problem mentioned here:
* https://github.com/hashcat/oclHashcat/issues/244 * https://github.com/hashcat/hashcat/issues/244
* the change: ADLODPerformanceLevel aLevels [1] -> ADLODPerformanceLevel aLevels [2] * the change: ADLODPerformanceLevel aLevels [1] -> ADLODPerformanceLevel aLevels [2]
*/ */
@ -229,7 +229,7 @@ typedef struct ADLOD6PerformanceLevel
/* /*
* Attention: we had to change this struct due to an out-of-bound problem mentioned here: * Attention: we had to change this struct due to an out-of-bound problem mentioned here:
* https://github.com/hashcat/oclHashcat/issues/244 * https://github.com/hashcat/hashcat/issues/244
* the change: ADLOD6PerformanceLevel aLevels [1] -> ADLOD6PerformanceLevel aLevels [2] * the change: ADLOD6PerformanceLevel aLevels [1] -> ADLOD6PerformanceLevel aLevels [2]
*/ */

@ -161,7 +161,7 @@ static inline int CPU_ISSET (int num, cpu_set_t *cs) { return (cs->count & (1 <
#define SP_ROOT_CNT (SP_PW_MAX * CHARSIZ) #define SP_ROOT_CNT (SP_PW_MAX * CHARSIZ)
#define SP_MARKOV_CNT (SP_PW_MAX * CHARSIZ * CHARSIZ) #define SP_MARKOV_CNT (SP_PW_MAX * CHARSIZ * CHARSIZ)
#define TUNING_DB_FILE "hashcat_tuning.hctab" #define TUNING_DB_FILE "hashcat.hctune"
#define INDUCT_DIR "induct" #define INDUCT_DIR "induct"
#define OUTFILES_DIR "outfiles" #define OUTFILES_DIR "outfiles"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -6,7 +6,7 @@
## License.....: MIT ## License.....: MIT
## ##
PROG_NAME := oclHashcat PROG_NAME := hashcat
## ##
## Detect Operating System ## Detect Operating System
@ -43,7 +43,8 @@ SHARED_FOLDER ?= $(PREFIX)/share/$(PROG_NAME)
DOCUMENT_FOLDER ?= $(PREFIX)/share/doc/$(PROG_NAME) DOCUMENT_FOLDER ?= $(PREFIX)/share/doc/$(PROG_NAME)
## ##
## Dependencies, cross compilation only ## Dependencies
## You may ignore them if you have your own headers somewhere
## ##
OPENCL_HEADERS_KHRONOS := deps/OpenCL-Headers OPENCL_HEADERS_KHRONOS := deps/OpenCL-Headers
@ -86,7 +87,7 @@ VERSION_SUM := $(shell git describe --tags --dirty=+ | cut -d- -f3)
## Compiler flags ## Compiler flags
## ##
CFLAGS := -pipe -W -Wall -std=c99 -Iinclude/ CFLAGS := -pipe -W -Wall -std=c99 -Iinclude/ -I$(OPENCL_HEADERS_KHRONOS)/
ifndef DEBUG ifndef DEBUG
CFLAGS += -O2 CFLAGS += -O2
@ -155,7 +156,7 @@ CFLAGS_CROSS_LINUX += -s
endif endif
CFLAGS_CROSS_LINUX += $(CFLAGS) CFLAGS_CROSS_LINUX += $(CFLAGS)
CFLAGS_CROSS_LINUX += -I$(OPENCL_HEADERS_KHRONOS)/ CFLAGS_CROSS_LINUX +=
ifneq (,$(filter 1,$(WITH_ADL) $(WITH_NVML))) ifneq (,$(filter 1,$(WITH_ADL) $(WITH_NVML)))
CFLAGS_CROSS_LINUX += -DHAVE_HWMON CFLAGS_CROSS_LINUX += -DHAVE_HWMON
@ -176,7 +177,6 @@ CFLAGS_CROSS_WIN += -s
endif endif
CFLAGS_CROSS_WIN += $(filter-out -fsanitize=address,$(CFLAGS)) CFLAGS_CROSS_WIN += $(filter-out -fsanitize=address,$(CFLAGS))
CFLAGS_CROSS_WIN += -I$(OPENCL_HEADERS_KHRONOS)/
ifneq (,$(filter 1,$(WITH_ADL) $(WITH_NVAPI))) ifneq (,$(filter 1,$(WITH_ADL) $(WITH_NVAPI)))
CFLAGS_CROSS_WIN += -DHAVE_HWMON CFLAGS_CROSS_WIN += -DHAVE_HWMON
@ -240,22 +240,22 @@ endif
## Targets: Global ## Targets: Global
## ##
native: oclHashcat native: hashcat
binaries: linux32 linux64 win32 win64 binaries: linux32 linux64 win32 win64
clean: clean:
$(RM) -f obj/*.o *.bin *.exe *.app *.restore *.out *.pot *.dictstat *.log oclHashcat core $(RM) -f obj/*.o *.bin *.exe *.app *.restore *.out *.pot *.dictstat *.log hashcat core
$(RM) -rf *.induct $(RM) -rf *.induct
$(RM) -rf *.outfiles $(RM) -rf *.outfiles
$(RM) -rf *.dSYM $(RM) -rf *.dSYM
$(RM) -rf kernels $(RM) -rf kernels
linux32: oclHashcat32.bin linux32: hashcat32.bin
linux64: oclHashcat64.bin linux64: hashcat64.bin
win32: oclHashcat32.exe win32: hashcat32.exe
win64: oclHashcat64.exe win64: hashcat64.exe
## ##
## Targets: Linux install ## Targets: Linux install
@ -285,7 +285,7 @@ install: native
$(INSTALL) -m 755 -d $(SHARED_FOLDER)/rules $(INSTALL) -m 755 -d $(SHARED_FOLDER)/rules
$(CP) -a rules/* $(SHARED_FOLDER)/rules/ $(CP) -a rules/* $(SHARED_FOLDER)/rules/
$(INSTALL) -m 644 hashcat.hcstat $(SHARED_FOLDER)/ $(INSTALL) -m 644 hashcat.hcstat $(SHARED_FOLDER)/
$(INSTALL) -m 644 hashcat_tuning.hctab $(SHARED_FOLDER)/ $(INSTALL) -m 644 hashcat.hctune $(SHARED_FOLDER)/
$(INSTALL) -m 755 $(BINARY_NATIVE) $(INSTALL_FOLDER)/ $(INSTALL) -m 755 $(BINARY_NATIVE) $(INSTALL_FOLDER)/
uninstall: uninstall:
@ -294,17 +294,17 @@ uninstall:
$(RM) -rf $(DOCUMENT_FOLDER) $(RM) -rf $(DOCUMENT_FOLDER)
## ##
## native compiled oclHashcat ## native compiled hashcat
## ##
obj/%.NATIVE.o: src/%.c obj/%.NATIVE.o: src/%.c
$(CC_NATIVE) $(CFLAGS_NATIVE) -c -o $@ $< $(CC_NATIVE) $(CFLAGS_NATIVE) -c -o $@ $<
oclHashcat: src/oclHashcat.c $(NATIVE_OBJS) hashcat: src/hashcat.c $(NATIVE_OBJS)
$(CC_NATIVE) $(CFLAGS_NATIVE) -o $(BINARY_NATIVE) $^ $(LFLAGS_NATIVE) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" $(CC_NATIVE) $(CFLAGS_NATIVE) -o $(BINARY_NATIVE) $^ $(LFLAGS_NATIVE) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\"
## ##
## cross compiled oclHashcat for binary release version ## cross compiled hashcat for binary release version
## ##
obj/%.LINUX.32.o: src/%.c obj/%.LINUX.32.o: src/%.c
@ -319,14 +319,14 @@ obj/%.WIN.32.o: src/%.c
obj/%.WIN.64.o: src/%.c obj/%.WIN.64.o: src/%.c
$(CC_WIN_64) $(CFLAGS_CROSS_WIN) $(CFLAGS_CROSS_64) -c -o $@ $< $(CC_WIN_64) $(CFLAGS_CROSS_WIN) $(CFLAGS_CROSS_64) -c -o $@ $<
oclHashcat32.bin: src/oclHashcat.c $(LINUX_32_OBJS) hashcat32.bin: src/hashcat.c $(LINUX_32_OBJS)
$(CC_LINUX_32) $(CFLAGS_CROSS_LINUX) $(CFLAGS_CROSS_32) -o $@ $^ $(LFLAGS_CROSS_LINUX) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" $(CC_LINUX_32) $(CFLAGS_CROSS_LINUX) $(CFLAGS_CROSS_32) -o $@ $^ $(LFLAGS_CROSS_LINUX) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\"
oclHashcat64.bin: src/oclHashcat.c $(LINUX_64_OBJS) hashcat64.bin: src/hashcat.c $(LINUX_64_OBJS)
$(CC_LINUX_64) $(CFLAGS_CROSS_LINUX) $(CFLAGS_CROSS_64) -o $@ $^ $(LFLAGS_CROSS_LINUX) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" $(CC_LINUX_64) $(CFLAGS_CROSS_LINUX) $(CFLAGS_CROSS_64) -o $@ $^ $(LFLAGS_CROSS_LINUX) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\"
oclHashcat32.exe: src/oclHashcat.c $(WIN_32_OBJS) hashcat32.exe: src/hashcat.c $(WIN_32_OBJS)
$(CC_WIN_32) $(CFLAGS_CROSS_WIN) $(CFLAGS_CROSS_32) -o $@ $^ $(LFLAGS_CROSS_WIN) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -static-libgcc $(CC_WIN_32) $(CFLAGS_CROSS_WIN) $(CFLAGS_CROSS_32) -o $@ $^ $(LFLAGS_CROSS_WIN) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -static-libgcc
oclHashcat64.exe: src/oclHashcat.c $(WIN_64_OBJS) hashcat64.exe: src/hashcat.c $(WIN_64_OBJS)
$(CC_WIN_64) $(CFLAGS_CROSS_WIN) $(CFLAGS_CROSS_64) -o $@ $^ $(LFLAGS_CROSS_WIN) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -static-libgcc $(CC_WIN_64) $(CFLAGS_CROSS_WIN) $(CFLAGS_CROSS_64) -o $@ $^ $(LFLAGS_CROSS_WIN) -DCOMPTIME=$(COMPTIME) -DVERSION_TAG=\"$(VERSION_TAG)\" -DVERSION_SUM=\"$(VERSION_SUM)\" -static-libgcc

@ -15,9 +15,9 @@
#include <rp_kernel_on_cpu.h> #include <rp_kernel_on_cpu.h>
#include <getopt.h> #include <getopt.h>
const char *PROGNAME = "oclHashcat"; const char *PROGNAME = "hashcat";
const uint VERSION_BIN = 210; const uint VERSION_BIN = 300;
const uint RESTORE_MIN = 210; const uint RESTORE_MIN = 300;
double TARGET_MS_PROFILE[3] = { 8, 16, 96 }; double TARGET_MS_PROFILE[3] = { 8, 16, 96 };
@ -754,7 +754,7 @@ const char *USAGE_BIG[] =
}; };
/** /**
* oclHashcat specific functions * hashcat specific functions
*/ */
static double get_avg_exec_time (hc_device_param_t *device_param, const int last_num_entries) static double get_avg_exec_time (hc_device_param_t *device_param, const int last_num_entries)
@ -1688,7 +1688,7 @@ static void status_benchmark ()
} }
/** /**
* oclHashcat -only- functions * hashcat -only- functions
*/ */
static void generate_source_kernel_filename (const uint attack_exec, const uint attack_kern, const uint kern_type, char *shared_dir, char *source_file) static void generate_source_kernel_filename (const uint attack_exec, const uint attack_kern, const uint kern_type, char *shared_dir, char *source_file)
@ -5578,7 +5578,7 @@ int main (int argc, char **argv)
if (session == NULL) session = (char *) PROGNAME; if (session == NULL) session = (char *) PROGNAME;
/** /**
* folders, as discussed on https://github.com/hashcat/oclHashcat/issues/20 * folders, as discussed on https://github.com/hashcat/hashcat/issues/20
*/ */
char *exec_path = get_exec_path (); char *exec_path = get_exec_path ();
@ -5671,7 +5671,7 @@ int main (int argc, char **argv)
return (-1); return (-1);
} }
// this allows the user to use --show and --left while cracking (i.e. while another instance of oclHashcat is running) // this allows the user to use --show and --left while cracking (i.e. while another instance of hashcat is running)
if ((show == 1) || (left == 1)) if ((show == 1) || (left == 1))
{ {
restore_disable = 1; restore_disable = 1;
@ -13061,7 +13061,7 @@ int main (int argc, char **argv)
log_info (""); log_info ("");
log_info ("ATTENTION! Unsupported or incorrect installed catalyst driver detected!"); log_info ("ATTENTION! Unsupported or incorrect installed catalyst driver detected!");
log_info ("You are STRONGLY encouraged to use the official supported catalyst driver for good reasons"); log_info ("You are STRONGLY encouraged to use the official supported catalyst driver for good reasons");
log_info ("See oclHashcat's homepage for official supported catalyst drivers"); log_info ("See hashcat's homepage for official supported catalyst drivers");
#ifdef _WIN #ifdef _WIN
log_info ("Also see: http://hashcat.net/wiki/doku.php?id=upgrading_amd_drivers_how_to"); log_info ("Also see: http://hashcat.net/wiki/doku.php?id=upgrading_amd_drivers_how_to");
#endif #endif
@ -13971,7 +13971,7 @@ int main (int argc, char **argv)
// we don't have sm_* on vendors not NV but it doesn't matter // we don't have sm_* on vendors not NV but it doesn't matter
snprintf (build_opts, sizeof (build_opts) - 1, "-cl-std=CL1.1 -I\"%s/\" -DVENDOR_ID=%u -DCUDA_ARCH=%d -DVECT_SIZE=%u -DDEVICE_TYPE=%u -DKERN_TYPE=%u -D_unroll", shared_dir, device_param->vendor_id, (device_param->sm_major * 100) + device_param->sm_minor, device_param->vector_width, (u32) device_param->device_type, kern_type); snprintf (build_opts, sizeof (build_opts) - 1, "-cl-nv-verbose -cl-std=CL1.1 -I\"%s/\" -DVENDOR_ID=%u -DCUDA_ARCH=%d -DVECT_SIZE=%u -DDEVICE_TYPE=%u -DKERN_TYPE=%u -D_unroll", shared_dir, device_param->vendor_id, (device_param->sm_major * 100) + device_param->sm_minor, device_param->vector_width, (u32) device_param->device_type, kern_type);
/** /**
* main kernel * main kernel
@ -16597,7 +16597,7 @@ int main (int argc, char **argv)
log_info (""); log_info ("");
log_info ("ATTENTION!"); log_info ("ATTENTION!");
log_info (" The wordlist or mask you are using is too small."); log_info (" The wordlist or mask you are using is too small.");
log_info (" Therefore, oclHashcat is unable to utilize the full parallelization power of your device(s)."); log_info (" Therefore, hashcat is unable to utilize the full parallelization power of your device(s).");
log_info (" The cracking speed will drop."); log_info (" The cracking speed will drop.");
log_info (" Workaround: https://hashcat.net/wiki/doku.php?id=frequently_asked_questions#how_to_create_more_work_for_full_speed"); log_info (" Workaround: https://hashcat.net/wiki/doku.php?id=frequently_asked_questions#how_to_create_more_work_for_full_speed");
log_info (""); log_info ("");

@ -19985,7 +19985,7 @@ void *thread_keypress (void *p)
if (ch == 0) continue; if (ch == 0) continue;
//https://github.com/hashcat/oclHashcat/issues/302 //https://github.com/hashcat/hashcat/issues/302
//#ifdef _POSIX //#ifdef _POSIX
//if (ch != '\n') //if (ch != '\n')
//#endif //#endif
@ -20081,7 +20081,7 @@ void *thread_keypress (void *p)
break; break;
} }
//https://github.com/hashcat/oclHashcat/issues/302 //https://github.com/hashcat/hashcat/issues/302
//#ifdef _POSIX //#ifdef _POSIX
//if (ch != '\n') //if (ch != '\n')
//#endif //#endif

@ -5,8 +5,8 @@
## License.....: MIT ## License.....: MIT
## ##
export IN=$HOME/oclHashcat export IN=$HOME/hashcat
export OUT=$HOME/xy/oclHashcat-2.10 export OUT=$HOME/xy/hashcat-3.00
rm -rf $OUT rm -rf $OUT
rm -rf $OUT.7z rm -rf $OUT.7z
@ -14,35 +14,36 @@ rm -rf $OUT.7z
mkdir -p $OUT mkdir -p $OUT
mkdir -p $OUT/include mkdir -p $OUT/include
cp $IN/oclHashcat??.exe $OUT/ cp $IN/hashcat??.exe $OUT/
cp $IN/oclHashcat??.bin $OUT/ cp $IN/hashcat??.bin $OUT/
cp $IN/hashcat.hcstat $OUT/ cp $IN/hashcat.hcstat $OUT/
cp $IN/hashcat_tuning.hctab $OUT/ cp $IN/hashcat.hctune $OUT/
cp -r $IN/docs $OUT/ cp -r $IN/docs $OUT/
cp -r $IN/charsets $OUT/ cp -r $IN/charsets $OUT/
cp -r $IN/masks $OUT/ cp -r $IN/masks $OUT/
cp -r $IN/rules $OUT/ cp -r $IN/rules $OUT/
cp -r $IN/extra $OUT/ cp -r $IN/extra $OUT/
cp $IN/example.dict $OUT/ cp $IN/example.dict $OUT/
cp $IN/example[0123456789]*.hash $OUT/ cp $IN/example[0123456789]*.hash $OUT/
cp $IN/example[0123456789]*.cmd $OUT/ cp $IN/example[0123456789]*.cmd $OUT/
cp -r $IN/include/constants.h $OUT/include cp -r $IN/include/constants.h $OUT/include
cp -r $IN/include/kernel_functions.c $OUT/include cp -r $IN/include/kernel_functions.c $OUT/include
cp -r $IN/include/kernel_vendor.h $OUT/include cp -r $IN/include/kernel_vendor.h $OUT/include
cp -r $IN/include/rp_kernel.h $OUT/include cp -r $IN/include/rp_kernel.h $OUT/include
cp -r $IN/OpenCL $OUT/ cp -r $IN/OpenCL $OUT/
# since for the binary distribution we still use .bin, we need to rewrite the commands # since for the binary distribution we still use .bin, we need to rewrite the commands
# within the example*.sh files # within the example*.sh files
for example in example[0123456789]*.sh; do for example in example[0123456789]*.sh; do
sed 's!./oclHashcat !./oclHashcat64.bin !' $IN/${example} > $OUT/${example} sed 's!./hashcat !./hashcat64.bin !' $IN/${example} > $OUT/${example}
done done
dos2unix $OUT/masks/*.hcmask
dos2unix $OUT/rules/*.rule dos2unix $OUT/rules/*.rule
dos2unix $OUT/rules/hybrid/*.rule dos2unix $OUT/rules/hybrid/*.rule
dos2unix $OUT/docs/* dos2unix $OUT/docs/*
@ -53,28 +54,31 @@ unix2dos $OUT/rules/*.rule
unix2dos $OUT/rules/hybrid/*.rule unix2dos $OUT/rules/hybrid/*.rule
unix2dos $OUT/docs/* unix2dos $OUT/docs/*
unix2dos $OUT/example*.cmd unix2dos $OUT/example*.cmd
unix2dos $OUT/include/*
unix2dos $OUT/OpenCL/*
unix2dos $OUT/hashcat.hctune
chmod 700 $OUT chmod 755 $OUT
chmod 700 $OUT/rules chmod 755 $OUT/rules
chmod 600 $OUT/rules/* chmod 644 $OUT/rules/*
chmod 700 $OUT/docs chmod 755 $OUT/docs
chmod 600 $OUT/docs/* chmod 644 $OUT/docs/*
chmod 700 $OUT/charsets chmod 755 $OUT/charsets
chmod 700 $OUT/charsets/* chmod 755 $OUT/charsets/*
chmod 700 $OUT/masks chmod 755 $OUT/masks
chmod 600 $OUT/masks/* chmod 644 $OUT/masks/*
chmod 600 $OUT/example* chmod 644 $OUT/example*
chmod 700 $OUT/example*.sh chmod 755 $OUT/example*.sh
chmod 700 $OUT/extra chmod 755 $OUT/extra
chmod 700 $OUT/extra/tab_completion/*.sh chmod 755 $OUT/extra/tab_completion/*.sh
chmod 700 $OUT/extra/tab_completion/install chmod 755 $OUT/extra/tab_completion/install
chmod 700 $OUT/include chmod 755 $OUT/include
chmod 600 $OUT/include/* chmod 644 $OUT/include/*
chmod 700 $OUT/OpenCL chmod 755 $OUT/OpenCL
chmod 600 $OUT/OpenCL/* chmod 644 $OUT/OpenCL/*
chmod 600 $OUT/*.exe chmod 644 $OUT/*.exe
chmod 700 $OUT/*.bin chmod 755 $OUT/*.bin
chmod 600 $OUT/hashcat.hcstat chmod 644 $OUT/hashcat.hcstat
chmod 600 $OUT/hashcat_tuning.hctab chmod 644 $OUT/hashcat.hctune
time 7z a -t7z -m0=lzma2:d31 -mx=9 -mmt=8 -ms=on $OUT.7z $OUT time 7z a -t7z -m0=lzma2:d31 -mx=9 -mmt=8 -ms=on $OUT.7z $OUT

@ -41,7 +41,7 @@ use Net::DNS::RR::NSEC3;
use Convert::EBCDIC qw (ascii2ebcdic); use Convert::EBCDIC qw (ascii2ebcdic);
use Digest::SipHash qw/siphash/; use Digest::SipHash qw/siphash/;
my $hashcat = "./oclHashcat"; my $hashcat = "./hashcat";
my $MAX_LEN = 55; my $MAX_LEN = 55;
@ -1649,7 +1649,7 @@ sub verify
# WPA/WPA2 # WPA/WPA2
elsif ($mode == 2500) elsif ($mode == 2500)
{ {
print "ERROR: verify currently not supported for WPA/WPA2 (because of oclHashcat's output format)\n"; print "ERROR: verify currently not supported for WPA/WPA2 (because of hashcat's output format)\n";
exit (1); exit (1);
} }
@ -2689,7 +2689,7 @@ sub verify
} }
elsif ($mode == 5600) elsif ($mode == 5600)
{ {
# oclHashcat outputs the user name always upper-case, we need # hashcat outputs the user name always upper-case, we need
next unless (substr ($line, 0, $len) eq $hash_out); next unless (substr ($line, 0, $len) eq $hash_out);
my $found = 0; my $found = 0;

@ -1578,7 +1578,7 @@ EOF
exit 1 exit 1
} }
BIN="oclHashcat" BIN="hashcat"
MARKOV="enabled" MARKOV="enabled"
ATTACK=0 ATTACK=0
MODE=0 MODE=0

Loading…
Cancel
Save