| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790 |
- /**
- * Author......: Jens Steube <jens.steube@gmail.com>
- * License.....: MIT
- */
- #ifndef COMMON_H
- #define COMMON_H
- #define _GNU_SOURCE
- #define _FILE_OFFSET_BITS 64
- #define __MSVCRT_VERSION__ 0x0700
- #include <assert.h>
- #include <ctype.h>
- #include <dirent.h>
- #include <errno.h>
- #include <math.h>
- #include <getopt.h>
- #include <search.h>
- #include <signal.h>
- #include <stdarg.h>
- #include <stdint.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/stat.h>
- #include <sys/time.h>
- #include <time.h>
- #include <unistd.h>
- #include <gmp.h>
- #ifdef OSX
- #include <emmintrin.h>
- #else
- #include <x86intrin.h>
- #endif
- #define SHARED_H
- #include "constants.h"
- #define PROGNAME (const char *) "hashcat"
- #define POTFILE "hashcat.pot"
- #define VERSION_TXT "2.00"
- #define VERSION_BIN 200
- #define BLOCK_SIZE 64
- #define MIN_THREADS 1
- #define MAX_THREADS 512
- #define ETC_MAX (60 * 60 * 24 * 365 * 10)
- #ifndef BUFSIZ
- #define BUFSIZ 0x2000
- #endif
- #define CHARSIZ 0x100
- #define BYTESWAP(x) __asm__ __volatile__ ("bswap %0": "=r" (x): "0" (x))
- #ifdef __x86_64__
- #define BYTESWAP64(x) __asm__ __volatile__ ("bswap %q0": "=r" (x): "0" (x))
- #else
- #define BYTESWAP64(x) x = \
- ((((x) & 0xff00000000000000ull) >> 56) \
- | (((x) & 0x00ff000000000000ull) >> 40) \
- | (((x) & 0x0000ff0000000000ull) >> 24) \
- | (((x) & 0x000000ff00000000ull) >> 8) \
- | (((x) & 0x00000000ff000000ull) << 8) \
- | (((x) & 0x0000000000ff0000ull) << 24) \
- | (((x) & 0x000000000000ff00ull) << 40) \
- | (((x) & 0x00000000000000ffull) << 56))
- #endif
- #ifndef MIN
- #define MIN(a,b) ((a) < (b)) ? (a) : (b)
- #endif
- #ifndef MAX
- #define MAX(a,b) ((a) > (b)) ? (a) : (b)
- #endif
- #ifdef WINDOWS
- #include <windows.h>
- #include <process.h>
- #include <intrin.h>
- typedef HANDLE THREAD;
- typedef HANDLE MUTEX;
- typedef unsigned (__stdcall *PTHREAD_START) (void *);
- #define ACCreateThreadEx(Dthread,Dstart,Darg,Did) Dthread = (HANDLE) _beginthreadex (NULL, 0, (PTHREAD_START) Dstart, Darg, 0, Did)
- #define ACMutexLock(Dmutex) WaitForSingleObject (Dmutex, INFINITE)
- #define ACMutexUnlock(Dmutex) ReleaseMutex (Dmutex)
- #define ACMutexInit(Dmutex) Dmutex = CreateMutex (0, FALSE, 0)
- #endif
- #if defined LINUX || defined OSX || defined FREEBSD
- #include <pthread.h>
- typedef pthread_t THREAD;
- typedef pthread_mutex_t MUTEX;
- #define ACCreateThreadEx(Dthread,Dstart,Darg,Did) pthread_create (&Dthread, NULL, (void *) Dstart, Darg)
- #define ACMutexLock(Dmutex) pthread_mutex_lock (&Dmutex)
- #define ACMutexUnlock(Dmutex) pthread_mutex_unlock (&Dmutex)
- #define ACMutexInit(Dmutex) pthread_mutex_init (&Dmutex, NULL)
- #endif
- #ifdef WINDOWS
- #define SetPriorityLow() { HANDLE hProc = GetCurrentProcess(); SetPriorityClass (hProc, IDLE_PRIORITY_CLASS); }
- #define SetPriorityNormal() { HANDLE hProc = GetCurrentProcess(); SetPriorityClass (hProc, NORMAL_PRIORITY_CLASS); }
- #define SetPriorityHigh() { HANDLE hProc = GetCurrentProcess(); SetPriorityClass (hProc, HIGH_PRIORITY_CLASS); }
- #endif
- #if defined LINUX || defined OSX || defined FREEBSD
- #include <sys/resource.h>
- #define SetPriorityLow() setpriority (PRIO_PROCESS, 0, 1)
- #define SetPriorityNormal() setpriority (PRIO_PROCESS, 0, 0)
- #define SetPriorityHigh() setpriority (PRIO_PROCESS, 0, -1)
- #endif
- #ifdef WINDOWS
- #define hc_sleep(x) Sleep ((x) * 1000);
- #endif
- #if defined LINUX || defined OSX || defined FREEBSD
- #define hc_sleep(x) sleep ((x));
- #endif
- #ifdef WINDOWS
- typedef UINT8 uint8_t;
- typedef UINT16 uint16_t;
- typedef UINT32 uint32_t;
- typedef UINT64 uint64_t;
- typedef INT8 int8_t;
- typedef INT16 int16_t;
- typedef INT32 int32_t;
- typedef INT64 int64_t;
- #endif
- typedef uint32_t uint;
- typedef uint64_t uint64;
- /*
- * types
- */
- typedef unsigned int bool;
- typedef struct
- {
- uint8_t w_buf[16];
- uint8_t w_len;
- } hc_wchar_t;
- typedef struct
- {
- hc_wchar_t tbl_buf[4096];
- uint32_t tbl_cnt;
- } tbl_t;
- typedef struct
- {
- char cs_buf[CHARSIZ];
- uint32_t cs_len;
- uint8_t cs_pos;
- uint8_t buf_pos;
- } cs_t;
- typedef struct
- {
- uint pke[25];
- uint eapol[64];
- int eapol_size;
- int keyver;
- } wpa_t;
- typedef struct
- {
- char *URI_server;
- char *URI_client;
- char *user;
- char *realm;
- char *method;
- char *URI_prefix;
- char *URI_resource;
- char *URI_suffix;
- char *nonce;
- char *nonce_client;
- char *nonce_count;
- char *qop;
- char *directive; // only "MD5" supported, no support for MD5-sess yet
- } sip_t;
- typedef struct
- {
- char essid[36];
- unsigned char mac1[6];
- unsigned char mac2[6];
- unsigned char nonce1[32];
- unsigned char nonce2[32];
- unsigned char eapol[256];
- int eapol_size;
- int keyver;
- unsigned char keymic[16];
- } hccap_t;
- typedef struct
- {
- char *cache_buf;
- uint64_t cache_cnt;
- uint64_t cache_avail;
- char **words_buf;
- uint32_t *words_len;
- uint64_t words_cnt;
- uint64_t words_avail;
- } words_t;
- typedef struct
- {
- char **rules_buf;
- uint32_t *rules_len;
- uint64_t rules_cnt;
- uint64_t rules_avail;
- void *root_rule;
- } rules_t;
- typedef struct
- {
- char *user_name;
- uint user_len;
- } user_t;
- typedef union
- {
- uint32_t md4[8];
- uint32_t md5[4];
- uint32_t sha1[5];
- uint32_t sha256[8];
- uint64_t sha512[8];
- uint32_t mysql[2];
- uint32_t descrypt[2];
- uint32_t bcrypt[6];
- uint64_t keccak[25];
- uint32_t gost[8];
- char plain[64];
- } digest_types_u;
- typedef struct
- {
- digest_types_u buf;
- char *plain;
- uint32_t found;
- user_t *user;
- } digest_t;
- typedef struct
- {
- union
- {
- uint8_t buf8[128];
- uint32_t buf32[16];
- uint64_t buf64[8];
- __m128i buf128[4];
- };
- } digest_md5_sse2_t;
- typedef struct
- {
- union
- {
- uint8_t buf8[128];
- uint32_t buf32[16];
- uint64_t buf64[8];
- __m128i buf128[4];
- };
- } digest_md4_sse2_t;
- typedef struct
- {
- union
- {
- uint8_t buf8[160];
- uint32_t buf32[20];
- uint64_t buf64[10];
- __m128i buf128[5];
- };
- } digest_sha1_sse2_t;
- typedef struct
- {
- union
- {
- uint8_t buf8[256];
- uint32_t buf32[32];
- uint64_t buf64[16];
- __m128i buf128[8];
- };
- } digest_sha256_sse2_t;
- typedef struct
- {
- union
- {
- uint8_t buf8[512];
- uint32_t buf32[64];
- uint64_t buf64[32];
- __m128i buf128[16];
- };
- } digest_sha512_sse2_t;
- typedef struct
- {
- union
- {
- uint8_t buf8[192];
- uint32_t buf32[24];
- uint64_t buf64[12];
- __m128i buf128[6];
- };
- } digest_bcrypt_sse2_t;
- typedef struct
- {
- digest_t **digests_buf;
- uint64_t digests_cnt;
- uint64_t digests_avail;
- uint64_t digests_found;
- } index_t;
- typedef struct
- {
- uint32_t nr_buf[16];
- uint32_t nr_len;
- uint32_t msg_buf[128];
- uint32_t msg_len;
- } ikepsk_t;
- typedef struct
- {
- uint user_len;
- uint domain_len;
- uint srvchall_len;
- uint clichall_len;
- uint userdomain_buf[16];
- uint chall_buf[256];
- } netntlm_t;
- typedef struct
- {
- union
- {
- uint8_t buf8[256];
- uint32_t buf[64];
- uint64_t buf64[32];
- __m128i buf128[16];
- };
- uint32_t len;
- char *debug_buf;
- int debug_len;
- uint64_t pos;
- } plain_t;
- typedef struct
- {
- char *salt_plain_buf;
- uint32_t salt_plain_len;
- plain_t salt_plain_struct[4];
- plain_t additional_plain_struct[4];
- char *salt_prehashed_buf;
- uint32_t salt_prehashed_len;
- uint32_t *ipad_prehashed_buf;
- uint32_t *opad_prehashed_buf;
- uint64_t *ipad_prehashed_buf64;
- uint64_t *opad_prehashed_buf64;
- uint32_t netntlmv1_pc;
- netntlm_t *netntlm;
- ikepsk_t *ikepsk;
- wpa_t *wpa;
- sip_t *sip;
- char md5chap_idbyte;
- uint32_t keccak_rsiz;
- uint32_t keccak_mdlen;
- uint32_t iterations;
- char *signature;
- index_t **indexes_buf;
- uint64_t indexes_cnt;
- uint64_t indexes_avail;
- uint64_t indexes_found;
- uint32_t scrypt_N;
- uint32_t scrypt_r;
- uint32_t scrypt_p;
- } salt_t;
- typedef struct
- {
- rules_t *rules;
- words_t *words;
- salt_t **salts_buf;
- uint64_t salts_cnt;
- uint64_t salts_avail;
- uint64_t salts_found;
- } db_t;
- typedef struct
- {
- digest_t digest;
- salt_t *salt;
- void *esalt;
- } hash_t;
- typedef struct
- {
- char plain_buf[256];
- int plain_len;
- hash_t hash;
- uint pot_cnt;
- } pot_t;
- typedef uint8_t u8;
- typedef uint16_t u16;
- typedef uint32_t u32;
- typedef uint64_t u64;
- #define IN_LEN_MIN 1
- #define IN_LEN_MAX 32
- #define OUT_LEN_MAX 32 /* Limited by (u32)(1 << pw_len - 1) */
- #define ELEM_CNT_MIN 1
- #define ELEM_CNT_MAX 8
- typedef struct
- {
- int len;
- u64 cnt;
- } pw_order_t;
- typedef struct
- {
- u8 *buf;
- } elem_t;
- typedef struct
- {
- u8 *buf;
- int cnt;
- mpz_t ks_cnt;
- mpz_t ks_pos;
- } chain_t;
- typedef struct
- {
- elem_t *elems_buf;
- u64 elems_cnt;
- u64 elems_alloc;
- chain_t *chains_buf;
- int chains_cnt;
- int chains_pos;
- int chains_alloc;
- u64 cur_chain_ks_poses[OUT_LEN_MAX];
- } db_entry_t;
- typedef struct
- {
- uint32_t attack_mode;
- uint32_t hash_mode;
- uint32_t hash_type;
- uint32_t debug_mode;
- uint32_t salt_type;
- uint32_t num_threads;
- uint32_t cache_size;
- uint64_t words_skip;
- uint64_t words_limit;
- uint32_t hex_salt;
- uint32_t hashcat_status;
- uint32_t benchmark;
- char *mask;
- uint32_t maskcnt;
- uint32_t maskpos;
- cs_t *css_buf;
- uint32_t css_cnt;
- uint32_t pw_len;
- uint32_t perm_min;
- uint32_t perm_max;
- uint32_t table_min;
- uint32_t table_max;
- tbl_t table_buf[256];
- char separator;
- uint32_t output_autohex;
- uint32_t username;
- uint32_t show;
- uint32_t left;
- uint32_t remove;
- uint32_t quiet;
- struct timeval timer_paused;
- float ms_paused;
- uint32_t status_timer;
- uint32_t runtime;
- uint32_t status_automat;
- uint32_t hex_charset;
- char *file_words;
- char *file_hashes;
- char *file_output;
- char *file_debug;
- char *file_pot;
- uint32_t output_format;
- uint32_t plain_size_max;
- pot_t *pot;
- } engine_parameter_t;
- typedef struct __thread_parameter
- {
- uint32_t hash_type;
- uint32_t thread_id;
- uint32_t num_threads;
- uint64_t thread_words_skip;
- uint64_t thread_words_limit;
- uint64_t thread_words_done;
- uint64_t thread_plains_done;
- uint32_t plain_size_max;
- void (*indb) (struct __thread_parameter *, plain_t *, digest_t *, salt_t *);
- void (*hashing) (struct __thread_parameter *, plain_t *);
- int (*compare_digest) (const void *, const void *);
- void (*store_out) (plain_t *, digest_t *, salt_t *);
- void (*store_debug) (char *, int);
- void (*done) ();
- uint32_t *hashcat_status;
- uint32_t (*get_index) (digest_t *);
- db_t *db;
- digest_t *quick_digest;
- cs_t *css_buf;
- uint32_t css_cnt;
- uint32_t pw_len;
- tbl_t *table_buf;
- uint32_t debug_mode;
- char *debug_file;
- uint32_t fake;
- char separator;
- uint32_t *scrypt_P[4];
- __m128i *scrypt_V;
- __m128i *scrypt_X;
- __m128i *scrypt_Y;
- /**
- * prince
- */
- int order_cnt;
- mpz_t total_ks_cnt;
- mpz_t total_ks_pos;
- mpz_t total_ks_left;
- db_entry_t *db_entries;
- pw_order_t *pw_orders;
- u64 *wordlen_dist;
- } thread_parameter_t;
- typedef struct
- {
- engine_parameter_t *engine_parameter;
- db_t *db;
- struct timeval cache_start;
- struct timeval cache_current;
- uint64_t segment_pos;
- uint64_t segment_cnt;
- uint64_t proc_words;
- uint64_t proc_hashes;
- uint64_t proc_recovered;
- uint64_t proc_saved;
- } status_info_t;
- typedef struct
- {
- uint64_t state[8];
- union
- {
- uint64_t w[16];
- uint8_t buf[128];
- };
- int len;
- } hc_sha512_ctx;
- typedef struct
- {
- uint32_t state[8];
- union
- {
- uint32_t w[16];
- uint8_t buf[64];
- };
- int len;
- } hc_sha256_ctx;
- /*
- * functions
- */
- void dump_hex (const char *s, size_t size);
- void log_info (const char *fmt, ...);
- void log_warning (const char *fmt, ...);
- void log_error (const char *fmt, ...);
- uint32_t get_random_num (uint32_t min, uint32_t max);
- void *mycalloc (size_t nmemb, size_t size);
- void *mymalloc (size_t size);
- void *malloc_tiny (const size_t size);
- void myfree (void *ptr);
- void *myrealloc (void *ptr, size_t size);
- char *mystrdup (const char *s);
- int in_superchop (char *buf);
- /*
- * bits rotate/shift
- */
- #define ROTL32(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
- #define ROTR32(x, n) (((x) >> (n)) | ((x) << (32 - (n))))
- #define ROTL64(x, n) (((x) << (n)) | ((x) >> (64 - (n))))
- #define ROTR64(x, n) (((x) >> (n)) | ((x) << (64 - (n))))
- #define SHR(x, n) ((x) >> (n))
- #define SHR32_SSE(x, n) _mm_srli_epi32 ((x), (n))
- #define SHR64_SSE(x, n) _mm_srli_epi64 ((x), (n))
- #ifdef __XOP__
- #define ROTL32_SSE(x, n) _mm_roti_epi32 ((x), (n))
- #define ROTL64_SSE(x, n) _mm_roti_epi64 ((x), (n))
- #define ROTR64_SSE(x, n) _mm_roti_epi64 ((x), (-n))
- #else
- #define ROTL32_SSE(x, n) _mm_or_si128 (_mm_slli_epi32 ((x), (n)), _mm_srli_epi32 ((x), (32 - (n))))
- #define ROTL64_SSE(x, n) _mm_or_si128 (_mm_slli_epi64 ((x), (n)), _mm_srli_epi64 ((x), (64 - (n))))
- #define ROTR64_SSE(x, n) _mm_or_si128 (_mm_srli_epi64 ((x), (n)), _mm_slli_epi64 ((x), (64 - (n))))
- #endif /* __XOP___*/
- #ifdef __SSSE3__
- #define SWAP64_SSE(v) _mm_shuffle_epi8 (v, _mm_set_epi32 (0x08090a0b, 0x0c0d0e0f, 0x00010203, 0x04050607))
- #else
- #define SWAP64_SSE(v) \
- _mm_slli_epi64 (v, 56) \
- | _mm_and_si128 (_mm_slli_epi64 (v, 40), _mm_set1_epi64 ((__m64 ) 0x00FF000000000000ULL)) \
- | _mm_and_si128 (_mm_slli_epi64 (v, 24), _mm_set1_epi64 ((__m64 ) 0x0000FF0000000000ULL)) \
- | _mm_and_si128 (_mm_slli_epi64 (v, 8), _mm_set1_epi64 ((__m64 ) 0x000000FF00000000ULL)) \
- | _mm_and_si128 (_mm_srli_epi64 (v, 8), _mm_set1_epi64 ((__m64 ) 0x00000000FF000000ULL)) \
- | _mm_and_si128 (_mm_srli_epi64 (v, 24), _mm_set1_epi64 ((__m64 ) 0x0000000000FF0000ULL)) \
- | _mm_and_si128 (_mm_srli_epi64 (v, 40), _mm_set1_epi64 ((__m64 ) 0x000000000000FF00ULL)) \
- | _mm_srli_epi64 (v, 56)
- #endif
- #ifdef __SSSE3__
- #define SWAP32_SSE(v) _mm_shuffle_epi8 (v, _mm_set_epi32 (0x0c0d0e0f, 0x08090a0b, 0x04050607, 0x00010203))
- #else
- #define SWAP32_SSE(v) \
- _mm_slli_epi32 (v, 24) \
- | _mm_and_si128 (_mm_slli_epi32 (v, 8), _mm_set1_epi32 (0x00FF0000)) \
- | _mm_and_si128 (_mm_srli_epi32 (v, 8), _mm_set1_epi32 (0x0000FF00)) \
- | _mm_srli_epi32 (v, 24)
- #endif
- #endif /* COMMON_H */
|