	
dkbf - General 
=============
dkbf HAS  ABSOLUTELY NO WARRANTIES EITHER EXPRESS OR IMPLIED, NOR 
WARRANTIES OF MERCHANTABILITY.  BY RUNNING THIS SOFTWARE YOU AGREE
TO NOT HOLD ANY AUTHOR, CONTRIBUTOR, DEVELOPER, OR OTHER PERSONS RELATED
TO THE PRODUCTION OR DISTRIBUTION OF THIS SOFTWARE LIABLE FOR ANY DAMAGES, 
INCLUDING THOSE CAUSED BY DIRECT OR INDIRECT USE OF THIS SOFTWARE. 

DO NOT USE THIS SOFTWARE AGAINST ANY COMPUTERS, SYSTEMS, NETWORKS,
OR EQUIPMENT THAT YOU DO NOT PERSONALLY OWN OR ARE NOT RESPONSIBLE FOR.  
THIS SOFTWARE WAS DEVELOPED FOR AUDITING COMPUTER/NETWORK SECURITY ONLY.  
THE AUTHOR DOES NOT CONDONE ANY MISUSE OR MALICIOUS USE OF THIS SOFTWARE.

Minimum Requirements:
	Software:  Linux, MPI
	Hardware:  One x86 chip (and a computer).

REALISTIC REQUIREMENTS:
	Software: Same as minimum
	Hardware: 3 or more x86 boxen (preferably with dual procuessors) 
		  connected via LAN 
	  
This program was developed using MPI-Pro and RedHat Linux 6.1.  

This program is really a layer of MPI and synchronization features for
distributing L0phtcrack. dkbf has not been endorsed by the L0pht.

The distributed algorithm models that of projects like distributed.net.
Keys (or generated passwords) are grouped into blocks.  
Blocks are served out from the master to slaves or compute nodes.  
Block sizes are configurable.  

dkbf works by calculating the total number of passwords possible given
a character set and a password length. Each block is only a number 
(base 10) that signifies the beginning password. The block also contains how many 
passwords should be in that block.  This is the block size.  Thus, a
compute node recieves a block and iterates through it, until it
reaches the number of passwords designated for that block.  

Passwords are encrypted using the same method Windows NT 4.0 uses
and then compared to their hashes.  If the hashes match, you have the 
password.  Cracked accounts or partially cracked accounts are sent back 
to the master immediately.  Nodes recieve an update of all account information
every time they request a new block.  

Useage: 

dkbf, itself, takes only one command line paramater.  This is indicated
with the -i option, followed by a space, and the name of the ini file
that contains the job's settings.  No other flags or parameters are 
accepted by dkbf on the command line.  However, MPI may require its own
set of options.
	
I recommend running your MPI jobs via the "pg_file" method.  Put a line with 
this syntax in your pg file.  (this may vary depending on your MPI distribution):
	
<hostname>	<number of processes>	<path to dkbf> <cmd line options>

The entries are the hostname (not IP), number of processes to run on that host,
the location of the binary, and any options. One line per node you will 
have running the job.  For SMP machines, you can specify one process for 
every CPU, but need only one copy of the binary on that machine. 

Only the master process needs the -i option.  If no -i option is specified,
dkbf will look for a file "dkbf.ini" in the current working directory.  
All options are set in this file, and broadcast to all nodes.  
Thus, the ini file does not need to be copied to all nodes.  Only the binary
need be on all nodes along with any MPI libraries.

I don't recommend running a slave  process on the master node but it is possible.
Your total keyrate will go up but "less linearly" if you put a process on the 
master.  Very little processing power is required on the master - generally.  If you
have a lot of nodes, more CPU on the master will be needed.  

Increasing block sizes will help to reduce network traffic and reduce CPU time 
on the master.  As a rule of thumb, if, while running a job you are watching
the terminal and cannot read the output to the console, you are probably 
setting your blocksize too small.  It's best to play around with the sample 
data enclosed to get a feel for blocksizes.

If you don't have multiple CPUs or boxen you can still run dkbf with a
couple of process on the same machine.  It won't be better than running other
crackers though, but for debugging and testing it will work just fine.

This program makes use of multiple boxen, not just multiple processors on
one machine.  This program will not and is not intended to replace L0phtcrack.  
If you have a quad box or just need any account broken, run L0phtcrack
against.  If you need a specific account broken and have multiple
boxen available, run L0phtcrack on one of them first and then run dkbf on the rest.

Each machine must be able to see the master and vice
versa.  Check your .rhosts and /etc/hosts files. 

Logging is done to several files.  
The files are [jobname]_master.log, [jobname]_slave.log, and [jobname]_cracks.log.  

I *strongly* recommend running a dictionary and hybrid-dictionary attack with
L0phtcrack first.

dkbf runs better with fewer user accounts, but future versions will hopefully 
allow jobs to scale better.

Because of the difficulties of signal catching when using MPI, I have not 
caught signals.  Unfortunately, this prevents the user from closing the term
window.

Putting the executable in the same exact path on all machines is recommended.
For example, use /home/<your folder>/dkbf/bin/ on the master AND all compute
nodes.  

Please also read the OPTIONS file.  


dkbf - Utilities
====================

In the making of dkbf, I've written a number of small utilities to help me
configure my MPI jobs.  Included in this release is one called "tk" (for
Total Keys).  This utitility computes the number of total keys for given job.
Compile dkbf_tk.c in the src/ folder.  This utility can also be run via
a javascript form on the website at http://dkbf.sourceforge.net/.


dkbf - Changes
==========================


Version 0.1.1 - initial release
	* Brute force routines for Lanman and/or NT hashes from both pwdump
	  and SMB sniffer logs.
	* Customizable character sets and blocksizes 
	* Pasword filtering definable and applied for all applicable attacks
	* Password filtering based on passfilt.dll standards
	* Adjustable scheduling priority for compute nodes
	* Rudimentary node staggering
	* Logging


dkbf - Contact
=====================
Website: http://dkbf.sourceforge.net/  

d3b0rg@hotmail.com (with a zero).

I'm intersted in:
	
	* assembly-optimized DES routines (help!)
	* bugs
	* ports 
	* _constructive_ coding or design tips and suggestions
	* feature requests
	* features or improvements you've coded 
	* requests to add algorithms for other OSs or products
	* other similar projects (distributed brute forcing)
	* links to sites that will help other users of this software
		with Clustering, Hashing, Sniffing, Bruting
	
dkbf - PLANS
=======================

I am not planning on adding an attack for Unix.  John the Ripper,
in the documentation, states that a distributed form of that is coming.
Crack is also distributed.  dkbf does not intend to replace these well-
developed tools.  It really has been written with a very narrow focus:
Crack Windows NT passwords that can't be cracked with a dictionary attack 
or some form of a brute-force/dictionary hybrid attack.  


dkbf - Possible Future Feature List (no promises; depending on demand)
==========================

	* Block expiration and block re-issue (priority)
	* Sorting hashings to optimize comparison routines (priority)
	* Integrated Benchmarking; Dynamic Block sizes based on each individual 
		nodes' performance
	* Handling sockets natively so that MPI is not required
	* Splitting the client and master into seperate binaries that 
		run as daemons;
	* Lookup attack using a MySQL DB and/or Dictionary attack
	* MySQL DB to track issued blocks;
	* Some kind of "incremental" mode that cycles through all
		various attacks lookup, dictionary, brute
	* Allow additions of accounts while a job is running
	* Email alerts
	* Tracking blocks via MySQL DB
	* Better job and node stats (est time left, etc)
	* Log rotation 
	* More flexibility when it comes to issuing blocks of various sizes;
		perhaps allowing the compute nodes to request the size of the
		block based on its own benchmarks.
	* Option to specify letters that _must_ be contained in the password

