Skip to content

Releases: Cynosureprime/procrule

v1.36

Choose a tag to compare

@Waffle2 Waffle2 released this 18 Oct 00:39

procrule release notes

v1.36

-u works again, as an alias for -8

v1.35 removed -u outright, so procrule -u exited with
procrule: invalid option -- u and every script, alias and job file carrying
it stopped. Both spellings are now accepted and mean exactly the same thing,
so a run written against either side of that change works.

-8 is still the spelling to use, and the reason is unchanged: mdxfind -8
selects the same engine there, because mdxfind -u already loads a userid
file and could never have carried this meaning. One letter, one meaning, in
both tools.

-u is kept rather than restored as the primary. procrule has no userid file,
so the letter is free and there is nothing for it to collide with — keeping it
costs nothing and breaking it cost everyone with a -u in a job file.

If you have been carrying a -u, nothing needs to change. If you are writing
something new, write -8.

Nothing else changed

The rule engines, the dispatch between them, discovery and the output format
are untouched. The whole source change is the option parse: one character in
each of the two getopt strings, a fall-through case label, and the help text.
A byte-mode run and a -8 run produce exactly what v1.35 produced.

Documentation

procrule(1) documents the alias inside the -8 entry, naming -8 as the
spelling to prefer and -u as kept for scripts written against v1.30 and
earlier. SYNOPSIS still shows -8 alone, deliberately. mdxfind(1) has
dropped its claim that procrule spells this switch -8: that was written
against procrule v1.30, where it was -u, and it told the reader to type
something the binary of the day rejected.

v1.35

Choose a tag to compare

@Waffle2 Waffle2 released this 15 Sep 14:05
Correct usage() against the options it describes

-8 said "Replaces the former -u", which documents what was rather than what is;
the rename belongs in RELEASE_NOTES.md and nowhere else. -L said "Implies -u"
and -G said "Honours -u", both naming a flag that now exits with "invalid
option -- u". And -A was described as keeping a candidate equal to its input
and an empty candidate, when it emits a MARKER in place of the absent line, and
has five of them rather than the two the text named.

The -A entry now names :SAME, :EMPTY, :REJECT, :BADRULE and :NEG, and states
the property that makes the option worth having: both engines report the same
marker for the same outcome, which is what lets a byte stream and a -8 stream be
diffed line for line.

No functional change, fprintf text only. Every option the optstring accepts now
appears in the help, and nothing appears that it does not accept.

v1.30

Choose a tag to compare

@Waffle2 Waffle2 released this 06 Sep 15:15
Discovery output could not be checked, ranked, or survive a kill

-l was never connected to discovery: Linefile appears nowhere in
run_discovery, so -G wrote an empty audit file however it was driven.
Without word:rule:result a discovered rule cannot be verified, and
truncate and extract rules reach short targets from almost any long base
word. Both discovery workers now emit audit records in the normal-mode
format, including $HEX[] on the word.

-s carried bare rule names, so a rule matching 500 times looked like one
matching once; a real run produced 48,816 rules at 1.04 matches each. It
now leads with the count, and marks rules whose matches came from a
non-ASCII base word. -o stays bare, because it is fed back to procrule
and hashcat and must remain a valid rule file. -H previously filtered
only Phase 2 chains and now applies to Phase 1 singles as well.

Progress meters wrote a carriage return with no newline unconditionally,
which in a redirected log is one very long line burying the summaries.
They are suppressed unless stderr is a terminal; -q forces quiet.

-r was accepted with -G and silently ignored, which is how someone
concludes a seed rule set was tested when it was not. It now warns.

A run killed after Phase 1 lost everything, since all output was written
at completion. SIGINT and SIGTERM now set a flag the workers check, so
partial results are written through the normal path. An interrupt during
Phase 2 preserved 969,473 rules and 1,988,367 audit records.

-C restricts the catalog by rule class, reusing the existing CatalogValid
mechanism. -Z dumps the catalog with class and validity and needs no
inputs, separating "rule absent" from "engine did not match".

The UTF-32 engine refused any rule using a literal double quote, reading
it as an operand that opens and never closes. That was the whole of its
divergence from the byte engine: 138 of the 17,320 catalog rules. The
compiler now asks the parser twice, once with quoted operands and, only
on failure, once with quotes as plain characters. All 17,182 previously
valid rules produce byte identical output, and the two engines now agree
at 17,320.

ruleproc.c takes the 61 opcode defines from rule_ops.h rather than
keeping a second copy.

v1.28

Choose a tag to compare

@Waffle2 Waffle2 released this 06 Sep 12:52
Define Neon here: procrule's link has no other definition

procrule.c declared

    extern int Neon;

and nothing in procrule's link defines it. The only definition is in mdxfind.c,
which is a different program. Every non-ARM build compiled the reference out,
so it linked everywhere and the gap stayed invisible until the release began
passing a real ARM value rather than a bare -DARM.

AArch64 was safe too: get32_init selects get32_neon64 first and get32_neon32
is never compiled there. It is 32-bit ARM at ARM >= 7 that needs the symbol,
and it failed with an undefined reference to Neon at link.

Defining it and leaving it zero would not be enough. Neon gates the NEON hex
decoder at runtime, so a bare definition links and then always picks
get32_scalar -- a silent no-op of exactly the kind this file was corrected for
one revision ago. get32 is a lazy-init function pointer, so the probe sits in
get32_init immediately before the choice it feeds: no change to main, and it
cannot run too late.

The probe reads Features from /proc/cpuinfo and looks for neon or simd, the
same test mdxfind makes. These are static binaries run on whatever board turns
out to be present, so asking the kernel beats trusting the -march they were
built with. A missing or unreadable /proc/cpuinfo answers no, which costs speed
and not correctness -- get32_scalar decodes the same bytes.

Verified on arm-linux-gnueabihf: armv6, armv7 and armv8 32-bit all compile and
link, where armv7 and armv8 previously failed at link. armv7 and armv8 grow
from 228K to 584K, which is the NEON path now actually being built. Intel is
unchanged and the 1.27 known-answer tests still pass.

v1.26

Choose a tag to compare

@Waffle2 Waffle2 released this 05 Sep 02:25
Discovery (-G) now honours -u

phase1_worker, discover_worker and the catalog validation all called the
byte engine directly, so procrule -u -G searched in byte terms regardless.
That is worse than no benefit: it reports zero rules, which cannot be told
apart from no rule existing. A word and its grapheme-correct reversal in
vocalised Arabic found nothing either way, though the rule that explains it
exists and the engine can run it. All three sites now branch, and the rule
catalog is validated by whichever compiler will execute it -- the two accept
and refuse different sets. A locale-ambiguous rule counts as a hit if any of
its variants reaches the target. That case now yields seven rules, each
verified; ASCII discovery is unchanged.

The usage text was also missing six options -- u, L, M, p, B and V. Every
getopt letter is now listed.

v1.22a

Choose a tag to compare

@Waffle2 Waffle2 released this 22 Apr 22:08
Define NOTINTEL for non-Intel platforms before mdxfind.h include

v1.20

Choose a tag to compare

@Waffle2 Waffle2 released this 24 Mar 00:19
Runtime SSE2/SSSE3/NEON dispatch for get32, sync ruleproc.c with mdxfind

v1.16

Choose a tag to compare

@Waffle2 Waffle2 released this 26 Feb 02:46

Fix SSSE3 get32: unsigned long → uint64_t for Windows x64 (LLP64) compatibility.

On Windows x64, unsigned long is 4 bytes (LLP64) vs 8 bytes on Linux/macOS (LP64). This caused the SSE hex decoder to produce corrupted output for $HEX[] encoded input on Windows.

Bug found by @Blazer.

v1.15

Choose a tag to compare

@Waffle2 Waffle2 released this 23 Feb 23:13
Fix Xeon benchmark numbers; simplify README