home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume23 / crack / part02 < prev    next >
Encoding:
Text File  |  1991-09-22  |  54.5 KB  |  2,985 lines

  1. Newsgroups: comp.sources.misc,alt.sources,alt.security
  2. From: aem@aber.ac.uk (Alec David Muffett)
  3. Subject:  v23i002:  crack - The Password Cracker, version 3.3c, Part02/05
  4. Message-ID: <1991Sep22.050702.13601@sparky.imd.sterling.com>
  5. X-Md4-Signature: d494175c7c3bc2ad16f7b9e94c15044a
  6. Date: Sun, 22 Sep 1991 05:07:02 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: aem@aber.ac.uk (Alec David Muffett)
  10. Posting-number: Volume 23, Issue 2
  11. Archive-name: crack/part02
  12. Environment: UNIX
  13. Supersedes: crack: Volume 22, Issue 49-52
  14.  
  15. #! /bin/sh
  16. # it by saving it into a file and typing "sh file".  To overwrite existing
  17. # files, type "sh file -c".  You can also feed this as standard input via
  18. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  19. # will see the following message at the end:
  20. #        "End of archive 2 (of 5)."
  21. # Contents:  BUGS Crack DictSrc/bad_pws.dat Scripts/Crack.network
  22. #   Scripts/RCrack Scripts/network.conf Sources/conf.h
  23. #   Sources/crack-lib.c Sources/crack-pp.c Sources/goodpass.c
  24. # Wrapped by aem@aberda on Fri Sep 20 12:26:53 1991
  25. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  26. if test -f 'BUGS' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'BUGS'\"
  28. else
  29. echo shar: Extracting \"'BUGS'\" \(3288 characters\)
  30. sed "s/^X//" >'BUGS' <<'END_OF_FILE'
  31. X---------------------------------------------------------------------------
  32. XKnown bugs as of Sept 18th, 1991.
  33. X---------------------------------------------------------------------------
  34. X* At least one version of Crack has gotten away from me with the
  35. X  DEVELOPMENT_VERSION symbol #defined.  This is OK if you are on a DEC
  36. X  Risc-Ultrix box, but probably not otherwise.  Doublecheck this.
  37. X
  38. X  STATUS - check this one out during installation.
  39. X---------------------------------------------------------------------------
  40. X* AWK : Someone at Nottingham complained that "RCrack" fell over when he
  41. X  ran it, because he was using version 2 of "awk".  I'm not sure
  42. X  he meant "nawk" by this, but he said that it was fixed by editing
  43. X  "RCrack" and invoking "/bin/awk" literally.  This MAY also affect
  44. X  "joinfiles" and "Crack.network".
  45. X
  46. X  STATUS - SHOULD BE FIXED in v3.2b and upwards.  Some versions of AWK need
  47. X  a newline between statements
  48. X---------------------------------------------------------------------------
  49. X* There was a major bug in the pre-release of v3.2a crack-pwc.c which
  50. X  I have fixed.  Around line 633 of Sources/crack-pwc.c, there is a line
  51. X  which read:-
  52. X
  53. X        if (!TryManyUsers (head, scratch))
  54. X
  55. X  and this was changed to :-
  56. X
  57. X        if (!TryManyUsers (head, scratch->word))
  58. X
  59. X  for Crack to function properly.  If you are reading this, it is fixed
  60. X  in this distribution.
  61. X
  62. X  STATUS - FIXED in v3.2a RELEASE and upwards.
  63. X---------------------------------------------------------------------------
  64. X* "Scripts/do_dicts" - some people complain that the 'sort' command in
  65. X  this script fills the "/tmp" filestore whilst compacting the
  66. X  dictionaries.  There is little I can do about this, unless you have
  67. X  the option to specify the directory where "sort" keeps its temp files
  68. X  (usually this is the "-T" option) - check your man pages.
  69. X
  70. X  If you edit line 67 to read:-
  71. X
  72. X     sort -r -T /big/filestore/area $i | uniq > Dicts/$i
  73. X
  74. X  the problem should clear up.  If your current partition is large
  75. X  enough, use "." in place of /big/filestore/area
  76. X
  77. X  STATUS - FIX is NON PORTABLE but simple, and problem sporadic, and so
  78. X  is left to user to implement.
  79. X---------------------------------------------------------------------------
  80. X* "Scripts/crack.mf" - contains the name of one dictionary which is
  81. X  assumed to exist on every machine : /usr/dict/words.  On other
  82. X  architectures, this may become /usr/lib/dist/words, or something
  83. X  completely other.  Amend this if necessary.
  84. X
  85. X  STATUS - what the hell, I'm not a perfectionist really
  86. X---------------------------------------------------------------------------
  87. X* "Scripts/RCrack" - when running in non-NFS mode on NFS filestore, if
  88. X  you use the same filing tree your die files can recurse over the
  89. X  network.  Server calls client which calls client which calls client...
  90. X
  91. X  STATUS - Don't do it. If you have NFS, use it.
  92. X---------------------------------------------------------------------------
  93. X* "Scripts/RCrack" - when running in non-NFS mode, specifying an
  94. X  alternative username for 'rsh' to work under can cause problems if
  95. X  "rsh" insists on reading a password from your /dev/tty (bad .rhost setup)
  96. X
  97. X  STATUS - Don't do it. Bugger all I can do about it anyway.
  98. X---------------------------------------------------------------------------
  99. END_OF_FILE
  100. if test 3288 -ne `wc -c <'BUGS'`; then
  101.     echo shar: \"'BUGS'\" unpacked with wrong size!
  102. fi
  103. # end of 'BUGS'
  104. fi
  105. if test -f 'Crack' -a "${1}" != "-c" ; then 
  106.   echo shar: Will not clobber existing file \"'Crack'\"
  107. else
  108. echo shar: Extracting \"'Crack'\" \(5763 characters\)
  109. sed "s/^X//" >'Crack' <<'END_OF_FILE'
  110. X#!/bin/sh
  111. X
  112. X###
  113. X# This program written by ADE Muffett (aem@aber.ac.uk), August 1991,
  114. X# as part of the 'Crack' password cracking package.
  115. X###
  116. X
  117. X###
  118. X# CRACK_HOME: You must put DOUBLE QUOTES around this and have /bin/csh if
  119. X# you work relative to ~username - this is the Crack installation directory.
  120. X###
  121. X
  122. XCRACK_HOME="~aem/EXTRA2/crack33"
  123. X
  124. X###
  125. X# CRACK_OUT: This is the directory into which all the password guesser
  126. X# output files are to be stored. This affects only the "out.*" files, and
  127. X# not "die.*" or "point.*", due to restraints on the support scripts.
  128. X###
  129. X
  130. XCRACK_OUT="$CRACK_HOME"
  131. X
  132. X###
  133. X# Umask for security's sake - stops files being world readable (if you
  134. X# don't have it in your .login)
  135. X###
  136. X
  137. Xumask 077
  138. X
  139. X###
  140. X# DEFAULT_BIN : For non-network cracks, you can leave this as 'generic'.
  141. X#
  142. X# For Network Cracks, DEFAULT_BIN is slightly more important because it
  143. X# specifies the binary type of the local machine upon which dictionaries
  144. X# are made - however, yo don't REALLY have to change it from 'generic',
  145. X# unless you intend to have the binary type 'generic' named in your
  146. X# "network.conf".
  147. X#
  148. X# Setting this to `arch` is non-portable.
  149. X###
  150. X
  151. XDEFAULT_BIN="generic"
  152. X
  153. X############### FROM HERE ON IN IT'S ALL MY FAULT ###############
  154. X
  155. Xversion="3.3c --- RELEASE ---"
  156. Xremote=""
  157. Xforeground=""
  158. Xfeedback=""
  159. Xtrash="/dev/null"
  160. Xtmpfile="/tmp/pw.$$"    # This variable name is referenced in PWC for deletion
  161. Xnet_cf="Scripts/network.conf"
  162. X
  163. XCRACK_HOME_UNRES="$CRACK_HOME"
  164. X
  165. Xif [ -f "/bin/csh" ]    # -x bombs on Ultrix, why ? I dunno...
  166. Xthen
  167. X    # Note that csh must be invoked with -f as some versions
  168. X    # of csh echo the user prompt without it. bct@hull.cs
  169. X
  170. X    CRACK_HOME=` /bin/csh -fc "echo $CRACK_HOME" `
  171. X    CRACK_OUT=` /bin/csh -fc "echo $CRACK_OUT" `
  172. Xfi
  173. X
  174. Xif [ ! -d "$CRACK_OUT" ]
  175. Xthen
  176. X    CRACK_OUT="."
  177. Xfi
  178. X
  179. Xexport CRACK_HOME
  180. Xexport CRACK_OUT
  181. Xexport DEFAULT_BIN
  182. Xexport CRACK_HOME_UNRES        # so that ~user still works...
  183. X
  184. X###
  185. X# Check existance of a home directory
  186. X###
  187. X
  188. Xif [ "$CRACK_HOME" != "" -a -d "$CRACK_HOME" ]
  189. Xthen
  190. X
  191. X    cd $CRACK_HOME || exit 1
  192. Xelse
  193. X    echo "Error: The directory $CRACK_HOME does not exist."
  194. X    echo ""
  195. X    echo "Please set the value of CRACK_HOME in the Crack script to the CRACK31"
  196. X    echo "installation directory."
  197. X    echo ""
  198. X    echo "The current working directory is" `pwd`
  199. X    exit 1
  200. Xfi
  201. X
  202. X###
  203. X# Announce ourselves.
  204. X###
  205. X
  206. Xecho "Crack $version Password Cracker by ADE Muffett, 1991"
  207. X
  208. X###
  209. X# Check that we have arguments
  210. X###
  211. X
  212. Xif [ $# = 0 ]
  213. Xthen
  214. X
  215. X    echo "Usage:    $0 [options] [bindir] passwdfile [...]"
  216. X    echo "Or:       $0 -network [options] passwdfile [...]"
  217. X    echo "With options:-"
  218. X    echo "    -f        - to run in foreground (output to stdout)"
  219. X    echo "    -v              - to produce verbose output (if configured)"
  220. X    echo "    -F        - to create/use feedback files"
  221. X    echo "    -nnicevalue     - to run niced to 'nicevalue'"
  222. X    echo "    -rpointfile     - to recover a crashed-out job"
  223. X    echo "    -Rpointfile     - to recover (with verify) a crashed-out job"
  224. X    exit 1
  225. Xfi
  226. X
  227. X###
  228. X# Parse command line
  229. X###
  230. X
  231. Xecho "Invoked as: $0 $*"
  232. X
  233. Xif [ "x$1" = "x-network" ]                  # Push onto the remote machines
  234. Xthen
  235. X    shift
  236. X    Scripts/Crack.network $*
  237. X    exit 0
  238. Xfi
  239. X
  240. Xargl=""
  241. X
  242. Xwhile :
  243. Xdo
  244. X    case $1 in
  245. X        -network)
  246. X            echo "Error: -network (if specified) must be first argument"
  247. X            exit 0
  248. X            ;;                 # Redundant
  249. X
  250. X        -remote)                   # This is being called remotely
  251. X            remote="-N"
  252. X            shift
  253. X            ;;
  254. X
  255. X        -f*)                # Foreground
  256. X            foreground="-f"
  257. X            shift
  258. X            ;;
  259. X
  260. X        -F*)                # Feedback
  261. X            feedback="-F"
  262. X            shift
  263. X            ;;
  264. X
  265. X        -v*|-n*|-r*|-R|-U*)        # Valid options
  266. X            argl="$argl $1"
  267. X            shift
  268. X            ;;
  269. X
  270. X        -*)
  271. X            echo "Crack: unknown argument $1"
  272. X            shift
  273. X            ;;
  274. X
  275. X        *)
  276. X            break
  277. X            ;;                         # Redundant
  278. X    esac
  279. Xdone
  280. X
  281. X###
  282. X# Test first non-switch argument for existance
  283. X###
  284. X
  285. Xif [ -f "$1" ]
  286. Xthen
  287. X
  288. X    crack_arch="$CRACK_HOME/$DEFAULT_BIN"
  289. Xelse
  290. X    crack_arch="$CRACK_HOME/$1"
  291. X    shift
  292. Xfi
  293. X
  294. X###
  295. X# Now to tidy up the source directory up a bit
  296. X###
  297. X
  298. Xmake -f Scripts/crack.mf cleanprogs > /dev/null 2>&1
  299. X
  300. X###
  301. X# State our intentions - calls to do_install made by do_pwc & do_dicts
  302. X###
  303. X
  304. Xecho "Using Binaries in directory: $crack_arch"
  305. X
  306. X###
  307. X# Do the dictionaries
  308. X###
  309. X# The problem is that the crack_arch variable has got to go through the
  310. X# Makefile invisibly and portably, otherwise I wouldn't be using
  311. X# environment variables.
  312. X###
  313. X
  314. XCRACK_ARCH=$crack_arch ; export CRACK_ARCH
  315. X
  316. Xmake -f Scripts/crack.mf dictstamp || exit 1
  317. X
  318. X###
  319. X# Make the password cracker
  320. X###
  321. X
  322. XScripts/do_pwc $crack_arch || exit 1
  323. X
  324. X###
  325. X# Check how we have been invoked : ergo how we get our data.
  326. X###
  327. X
  328. Xif [ "x$remote" = "x-N" ]
  329. Xthen
  330. X    cat > $tmpfile                                  # Use stdin
  331. Xelse
  332. X    warn=$CRACK_OUT/out.init.$$
  333. X
  334. X    Scripts/do_join $feedback $warn $* > $tmpfile || exit 1
  335. X
  336. X    if [ "x$foreground" = "x-f" ]
  337. X    then
  338. X        cat $warn || exit 1
  339. X        rm $warn
  340. X    fi
  341. Xfi
  342. X
  343. X
  344. X###
  345. X# Check the runtime scratch file directory for pwc
  346. X###
  347. X
  348. Xif [ ! -d Runtime ]
  349. Xthen
  350. X    echo "Creating Runtime Directory."
  351. X    mkdir Runtime || exit 1
  352. Xfi
  353. X
  354. X###
  355. X# Kick it off into the background ?
  356. X###
  357. X# This is the message which has drawn the most complaints...  However, I
  358. X# have no way of knowing the name in advance, and I can't have crack-pwc
  359. X# print it on stdout due to hanging file descriptors which bollox a
  360. X# network crack.  Hence I HAVE to be vague...
  361. X###
  362. X
  363. Xif [ "x$foreground" = "x-f" ]
  364. Xthen
  365. X    echo "Running program..."
  366. X
  367. X    $CRACK_ARCH/crack-pwc $argl -f -i$tmpfile $remote $feedback \
  368. X        Dicts/dict.* < /dev/null
  369. Xelse
  370. X    echo "Backgrounding program..."
  371. X
  372. X    nohup $CRACK_ARCH/crack-pwc $argl -i$tmpfile $remote $feedback \
  373. X        Dicts/dict.* </dev/null >$trash 2>&1 &
  374. X
  375. X    echo "Output will be written to a file in directory $CRACK_OUT"
  376. X    echo "named 'out.<something>'"
  377. X
  378. X    sleep 3        # FOR MY PEACE OF MIND
  379. Xfi
  380. X
  381. Xsleep 1
  382. X
  383. Xtest -f nohup.out && rm nohup.out
  384. X
  385. X###
  386. X# There are horrible timeraces involved in removing $tmpfile, so I dont.
  387. X# Crack-pwc does.
  388. X###
  389. END_OF_FILE
  390. if test 5763 -ne `wc -c <'Crack'`; then
  391.     echo shar: \"'Crack'\" unpacked with wrong size!
  392. fi
  393. chmod +x 'Crack'
  394. # end of 'Crack'
  395. fi
  396. if test -f 'DictSrc/bad_pws.dat' -a "${1}" != "-c" ; then 
  397.   echo shar: Will not clobber existing file \"'DictSrc/bad_pws.dat'\"
  398. else
  399. echo shar: Extracting \"'DictSrc/bad_pws.dat'\" \(6485 characters\)
  400. sed "s/^X//" >'DictSrc/bad_pws.dat' <<'END_OF_FILE'
  401. X0
  402. X1
  403. X123456
  404. X12345678
  405. X2
  406. X3
  407. X4
  408. X5
  409. X6
  410. X7
  411. X8
  412. X9
  413. XA
  414. XAdrian
  415. XAdrianna
  416. XAlasdair
  417. XAlbert
  418. XAlex
  419. XAlexander
  420. XAlice
  421. XAlicia
  422. XAlisa
  423. XAlison
  424. XAlistair
  425. XAlister
  426. XAllison
  427. XAmanda
  428. XAmber
  429. XAmy
  430. XAndrea
  431. XAnduin
  432. XAngela
  433. XAngie
  434. XAnita
  435. XAnn
  436. XAnna
  437. XAnne
  438. XAnnette
  439. XApril
  440. XArlene
  441. XArthur
  442. XAthena
  443. XB
  444. XBBROYGBVGW
  445. XBailey
  446. XBarbara
  447. XBart
  448. XBartman
  449. XBecky
  450. XBeryl
  451. XBeth
  452. XBetsie
  453. XBetty
  454. XBeverly
  455. XBishop
  456. XBob
  457. XBrandi
  458. XBrandy
  459. XBrenda
  460. XBridget
  461. XC
  462. XCalvin
  463. XCamille
  464. XCandi
  465. XCandy
  466. XCaren
  467. XCarla
  468. XCarmen
  469. XCarol
  470. XCarole
  471. XCarolina
  472. XCaroline
  473. XCarrie
  474. XCatherine
  475. XCathy
  476. XCecily
  477. XCharity
  478. XCharles
  479. XChristina
  480. XChristine
  481. XChristy
  482. XCindy
  483. XClaudia
  484. XCollins
  485. XConnie
  486. XCornelius
  487. XCristina
  488. XCrystal
  489. XCynthia
  490. XD
  491. XDaisy
  492. XDana
  493. XDaniel
  494. XDanielle
  495. XDawn
  496. XDeb
  497. XDebbie
  498. XDeborah
  499. XDenise
  500. XDesiree
  501. XDiana
  502. XDiane
  503. XDoobrie
  504. XDulce
  505. XDuncan
  506. XE
  507. XEdwina
  508. XEileen
  509. XEinstein
  510. XElaine
  511. XElanor
  512. XElizabeth
  513. XEllen
  514. XEmily
  515. XEmmanuel
  516. XErica
  517. XErika
  518. XErin
  519. XEvelyn
  520. XF
  521. XFelicia
  522. XG
  523. XGabriel
  524. XGeorge
  525. XGertrude
  526. XGilly
  527. XGina
  528. XGinger
  529. XH
  530. XHarvey
  531. XHeather
  532. XHeidi
  533. XHiawatha
  534. XHobbes
  535. XHolly
  536. XI
  537. XIngrid
  538. XIrene
  539. XJ
  540. XJackie
  541. XJane
  542. XJanet
  543. XJanice
  544. XJanie
  545. XJasmin
  546. XJean
  547. XJeanne
  548. XJen
  549. XJenni
  550. XJennifer
  551. XJenny
  552. XJessica
  553. XJill
  554. XJoanne
  555. XJody
  556. XJohnny
  557. XJoseph
  558. XJoshua
  559. XJoy
  560. XJoyce
  561. XJudith
  562. XJudy
  563. XJulia
  564. XJulie
  565. XJune
  566. XK
  567. XKaren
  568. XKarie
  569. XKarina
  570. XKate
  571. XKathleen
  572. XKathrine
  573. XKathy
  574. XKatina
  575. XKatrina
  576. XKelly
  577. XKeri
  578. XKerri
  579. XKerrie
  580. XKerry
  581. XKim
  582. XKimberly
  583. XKitten
  584. XKrista
  585. XKristen
  586. XKristi
  587. XKristie
  588. XKristin
  589. XKristine
  590. XKristy
  591. XL
  592. XLana
  593. XLara
  594. XLaura
  595. XLeah
  596. XLeslie
  597. XLinda
  598. XLisa
  599. XLiz
  600. XLois
  601. XLori
  602. XLorin
  603. XLorraine
  604. XLouis
  605. XLouise
  606. XLucy
  607. XLynn
  608. XLynne
  609. XM
  610. XMVEMJSUNP
  611. XMalcolm
  612. XMara
  613. XMarci
  614. XMarcy
  615. XMaria
  616. XMarietta
  617. XMarni
  618. XMary
  619. XMaurice
  620. XMeagan
  621. XMegan
  622. XMelissa
  623. XMichael
  624. XMichele
  625. XMichelle
  626. XMickey
  627. XMonica
  628. XMortis
  629. XN
  630. XNancy
  631. XNicole
  632. XNita
  633. XNoreen
  634. XO
  635. XOlivia
  636. XP
  637. XPam
  638. XPamela
  639. XPat
  640. XPatricia
  641. XPatty
  642. XPaula
  643. XPenelope
  644. XPierre
  645. XPolly
  646. XQ
  647. XR
  648. XRachel
  649. XRachelle
  650. XRebecca
  651. XRenee
  652. XRobin
  653. XRobyn
  654. XRochelle
  655. XRonald
  656. XRonnie
  657. XRose
  658. XRosemary
  659. XS
  660. XSamantha
  661. XSandra
  662. XSandy
  663. XSara
  664. XSarah
  665. XShannon
  666. XSharon
  667. XSherri
  668. XShirley
  669. XSnarfel
  670. XSondra
  671. XSonia
  672. XSonya
  673. XStacey
  674. XStaci
  675. XStacie
  676. XStacy
  677. XSteph
  678. XStephanie
  679. XSusan
  680. XSusanne
  681. XSusie
  682. XSuzanne
  683. XSuzie
  684. XSybil
  685. XT
  686. XTamara
  687. XTami
  688. XTamie
  689. XTammy
  690. XTara
  691. XTheresa
  692. XTiffany
  693. XTina
  694. XTraci
  695. XTracie
  696. XTracy
  697. XTrisha
  698. XU
  699. XUrsula
  700. XV
  701. XValerie
  702. XVeronica
  703. XVicky
  704. XVirginia
  705. XW
  706. XWOBAFGKMRNS
  707. XWarren
  708. XWendi
  709. XWendy
  710. XWhitney
  711. XWilliam
  712. XWillie
  713. XWilma
  714. XX
  715. XY
  716. XYolanda
  717. XZ
  718. Xa
  719. Xaaa
  720. Xabc
  721. Xabcd
  722. Xabcde
  723. Xabcdef
  724. Xabcdefg
  725. Xabcdefgh
  726. Xacademia
  727. Xacademic
  728. Xaccess
  729. Xada
  730. Xadmin
  731. Xaerobics
  732. Xairplane
  733. Xalbany
  734. Xalbatross
  735. Xalf
  736. Xalgebra
  737. Xalias
  738. Xaliases
  739. Xalpha
  740. Xalphabet
  741. Xama
  742. Xamadeus
  743. Xamorphous
  744. Xanalog
  745. Xanchor
  746. Xandromache
  747. Xandy
  748. Xanimals
  749. Xanswer
  750. Xanthropogenic
  751. Xanvils
  752. Xanything
  753. Xaria
  754. Xariadne
  755. Xarrow
  756. Xasd
  757. Xasdfgh
  758. Xasm
  759. Xasshole
  760. Xatmosphere
  761. Xaztecs
  762. Xazure
  763. Xb
  764. Xbacchus
  765. Xbadass
  766. Xbanana
  767. Xbananas
  768. Xbandit
  769. Xbanks
  770. Xbarber
  771. Xbaritone
  772. Xbasic
  773. Xbass
  774. Xbassoon
  775. Xbatch
  776. Xbatman
  777. Xbeach
  778. Xbeater
  779. Xbeauty
  780. Xbeaver
  781. Xbeethoven
  782. Xbeetledrive
  783. Xbeloved
  784. Xbenz
  785. Xbeowulf
  786. Xberkeley
  787. Xberlin
  788. Xberliner
  789. Xbeta
  790. Xbicameral
  791. Xbitch
  792. Xbizzy
  793. Xbradley
  794. Xbrian
  795. Xbroadway
  796. Xbsd
  797. Xbuggerall
  798. Xbumbling
  799. Xburgess
  800. Xbuzby
  801. Xc
  802. Xcad
  803. Xcampanile
  804. Xcantor
  805. Xcardinal
  806. Xcarmen
  807. Xcarolina
  808. Xcarson
  809. Xcascades
  810. Xcastle
  811. Xcat
  812. Xcayuga
  813. Xceltics
  814. Xcerulean
  815. Xchange
  816. Xcharles
  817. Xcharming
  818. Xcharon
  819. Xchat
  820. Xcheesecake
  821. Xchem
  822. Xchemistry
  823. Xchess
  824. Xchester
  825. Xchocolate
  826. Xcigar
  827. Xcinelli
  828. Xclass
  829. Xclassic
  830. Xcluster
  831. Xclusters
  832. Xcode
  833. Xcoffee
  834. Xcoke
  835. Xcollins
  836. Xcommrades
  837. Xcomputer
  838. Xcomrade
  839. Xcomrades
  840. Xcondo
  841. Xcondom
  842. Xconnect
  843. Xconsole
  844. Xcookie
  845. Xcookie
  846. Xcooper
  847. Xcornelius
  848. Xcouscous
  849. Xcreate
  850. Xcreation
  851. Xcreosote
  852. Xcretin
  853. Xcriminal
  854. Xcshrc
  855. Xd
  856. Xdaemon
  857. Xdancer
  858. Xdaniel
  859. Xdanny
  860. Xdapper
  861. Xdata
  862. Xdave
  863. Xdecember
  864. Xdefault
  865. Xdefoe
  866. Xdeluge
  867. Xdesperate
  868. Xdevelop
  869. Xdevice
  870. Xdial
  871. Xdiet
  872. Xdieter
  873. Xdigital
  874. Xdisc
  875. Xdiscbox
  876. Xdiscovery
  877. Xdisk
  878. Xdisney
  879. Xdog
  880. Xdos
  881. Xdrought
  882. Xe
  883. Xeager
  884. Xearth
  885. Xeasier
  886. Xeasy
  887. Xeatme
  888. Xedges
  889. Xedinburgh
  890. Xedwin
  891. Xegghead
  892. Xeiderdown
  893. Xelephant
  894. Xemail
  895. Xemerald
  896. Xenemy
  897. Xengine
  898. Xengineer
  899. Xenterprise
  900. Xenzyme
  901. Xersatz
  902. Xestablish
  903. Xestate
  904. Xeternity
  905. Xeuclid
  906. Xeugene
  907. Xextension
  908. Xf
  909. Xfairway
  910. Xfender
  911. Xfermat
  912. Xferrari
  913. Xfidelity
  914. Xfield
  915. Xfile
  916. Xfinite
  917. Xfishers
  918. Xflakes
  919. Xfloat
  920. Xflower
  921. Xflowers
  922. Xfoolproof
  923. Xfootball
  924. Xforesight
  925. Xformat
  926. Xforsythe
  927. Xfourier
  928. Xfred
  929. Xfriend
  930. Xfrighten
  931. Xfun
  932. Xfunction
  933. Xfungible
  934. Xg
  935. Xgabriel
  936. Xgames
  937. Xgardner
  938. Xgarfield
  939. Xgatt
  940. Xgauss
  941. Xgeorge
  942. Xgertrude
  943. Xgibson
  944. Xglacier
  945. Xgnu
  946. Xgolf
  947. Xgolfer
  948. Xgorgeous
  949. Xgorges
  950. Xgosling
  951. Xgouge
  952. Xgraham
  953. Xgrahm
  954. Xgrass
  955. Xgroup
  956. Xgryphon
  957. Xgucci
  958. Xguess
  959. Xguest
  960. Xguitar
  961. Xgumption
  962. Xguntis
  963. Xgweledigaeth
  964. Xh
  965. Xhack
  966. Xhacker
  967. Xhal
  968. Xhamlet
  969. Xhandily
  970. Xhappening
  971. Xharmony
  972. Xharold
  973. Xhawaii
  974. Xhebrides
  975. Xheinlein
  976. Xhello
  977. Xhelp
  978. Xherbert
  979. Xhibernia
  980. Xhidden
  981. Xhobbit
  982. Xhomework
  983. Xhoney
  984. Xhorse
  985. Xhorus
  986. Xhutchins
  987. Xhydrogen
  988. Xibm
  989. Xiluvben
  990. Ximbroglio
  991. Ximperial
  992. Xinclude
  993. Xingres
  994. Xingress
  995. Xinna
  996. Xinnocuous
  997. Xinternet
  998. Xirishman
  999. Xisis
  1000. Xizzy
  1001. Xj
  1002. Xjapan
  1003. Xjester
  1004. Xjixian
  1005. Xjohnny
  1006. Xjuggle
  1007. Xjupiter
  1008. Xk
  1009. Xkalajira
  1010. Xkermit
  1011. Xkernel
  1012. Xkey
  1013. Xkipper
  1014. Xkirkland
  1015. Xknight
  1016. Xl
  1017. Xladle
  1018. Xlager
  1019. Xlambda
  1020. Xlamination
  1021. Xlarkin
  1022. Xlarry
  1023. Xlazarus
  1024. Xlebesgue
  1025. Xlee
  1026. Xleland
  1027. Xleroy
  1028. Xlewis
  1029. Xlibrary
  1030. Xlight
  1031. Xlisp
  1032. Xllareggub
  1033. Xlock
  1034. Xlockout
  1035. Xlove
  1036. Xm
  1037. Xmacintosh
  1038. Xmack
  1039. Xmaggot
  1040. Xmagic
  1041. Xmail
  1042. Xmaint
  1043. Xmalcom
  1044. Xmanager
  1045. Xmark
  1046. Xmarkus
  1047. Xmars
  1048. Xmarty
  1049. Xmarvin
  1050. Xmaster
  1051. Xmath
  1052. Xmaurice
  1053. Xmellon
  1054. Xmemory
  1055. Xmercury
  1056. Xmerlin
  1057. Xmets
  1058. Xmgr
  1059. Xmichael
  1060. Xmike
  1061. Xminimum
  1062. Xminsky
  1063. Xmit
  1064. Xmodem
  1065. Xmogul
  1066. Xmoguls
  1067. Xmoose
  1068. Xmorley
  1069. Xmortis
  1070. Xmouse
  1071. Xmozart
  1072. Xmuser
  1073. Xmutant
  1074. Xn
  1075. Xnagel
  1076. Xnapoleon
  1077. Xnasa
  1078. Xnepenthe
  1079. Xneptune
  1080. Xness
  1081. Xnet
  1082. Xnetwork
  1083. Xnew
  1084. Xnews
  1085. Xnewton
  1086. Xnext
  1087. Xnobody
  1088. Xnoxious
  1089. Xnuclear
  1090. Xnutrition
  1091. Xnyquist
  1092. Xo
  1093. Xoceanography
  1094. Xocelot
  1095. Xoerhrdle
  1096. Xoffice
  1097. Xolivetti
  1098. Xolivia
  1099. Xopen
  1100. Xoperator
  1101. Xoracle
  1102. Xorca
  1103. Xorchid
  1104. Xorwell
  1105. Xosiris
  1106. Xoutlaw
  1107. Xoxford
  1108. Xp
  1109. Xpacific
  1110. Xpad
  1111. Xpainless
  1112. Xpakistan
  1113. Xpaper
  1114. Xpapers
  1115. Xpass
  1116. Xpassword
  1117. Xpencil
  1118. Xpenguin
  1119. Xpenis
  1120. Xpeoria
  1121. Xpercolate
  1122. Xpersimmon
  1123. Xpersona
  1124. Xpete
  1125. Xpeter
  1126. Xphilip
  1127. Xphoenix
  1128. Xphone
  1129. Xpierre
  1130. Xpizza
  1131. Xplane
  1132. Xplayboy
  1133. Xplover
  1134. Xpluto
  1135. Xplymouth
  1136. Xpolynomial
  1137. Xpondering
  1138. Xpork
  1139. Xporsche
  1140. Xposter
  1141. Xpower
  1142. Xpraise
  1143. Xprecious
  1144. Xprelude
  1145. Xpresto
  1146. Xprince
  1147. Xprinceton
  1148. Xpriv
  1149. Xprivate
  1150. Xprivs
  1151. Xprofessor
  1152. Xprofile
  1153. Xprogram
  1154. Xprotect
  1155. Xprotozoa
  1156. Xpub
  1157. Xpublic
  1158. Xpumpkin
  1159. Xpuneet
  1160. Xpuppet
  1161. Xq
  1162. Xqwerty
  1163. Xqwertyui
  1164. Xr
  1165. Xrabbit
  1166. Xrachmaninoff
  1167. Xrainbow
  1168. Xraindrop
  1169. Xraleigh
  1170. Xrandom
  1171. Xrascal
  1172. Xreagan
  1173. Xreally
  1174. Xregional
  1175. Xremote
  1176. Xrick
  1177. Xripple
  1178. Xrisc
  1179. Xrje
  1180. Xrobot
  1181. Xrobotics
  1182. Xrochester
  1183. Xrodent
  1184. Xrolex
  1185. Xromano
  1186. Xronald
  1187. Xroot
  1188. Xrosebud
  1189. Xroses
  1190. Xruben
  1191. Xrules
  1192. Xruth
  1193. Xs
  1194. Xsal
  1195. Xsaturn
  1196. Xsaxon
  1197. Xscamper
  1198. Xscheme
  1199. Xschool
  1200. Xscott
  1201. Xscotty
  1202. Xsecret
  1203. Xsecurity
  1204. Xsensor
  1205. Xserenity
  1206. Xservice
  1207. Xsesame
  1208. Xsex
  1209. Xsharc
  1210. Xsharks
  1211. Xsharon
  1212. Xsheffield
  1213. Xsheldon
  1214. Xshell
  1215. Xshit
  1216. Xshitforbrains
  1217. Xshiva
  1218. Xshivers
  1219. Xshuttle
  1220. Xsignature
  1221. Xsilverlake
  1222. Xsimon
  1223. Xsimple
  1224. Xsimpsons
  1225. Xsinger
  1226. Xsingle
  1227. Xsmile
  1228. Xsmiles
  1229. Xsmooch
  1230. Xsmother
  1231. Xsnatch
  1232. Xsnoopy
  1233. Xsoap
  1234. Xsocrates
  1235. Xsomebody
  1236. Xsossina
  1237. Xsparrows
  1238. Xspit
  1239. Xsplatter
  1240. Xsplodge
  1241. Xspring
  1242. Xspringer
  1243. Xsquires
  1244. Xstrangle
  1245. Xstratford
  1246. Xstudent
  1247. Xstuttgart
  1248. Xsubway
  1249. Xsuccess
  1250. Xsucker
  1251. Xsummer
  1252. Xsun
  1253. Xsuper
  1254. Xsuperstage
  1255. Xsuperuser
  1256. Xsupport
  1257. Xsupported
  1258. Xsurfer
  1259. Xswearer
  1260. Xsymmetry
  1261. Xsys
  1262. Xsysadmin
  1263. Xsystem
  1264. Xt
  1265. Xtangerine
  1266. Xtape
  1267. Xtarget
  1268. Xtarragon
  1269. Xtaylor
  1270. Xteabag
  1271. Xtech
  1272. Xtelephone
  1273. Xtemptation
  1274. Xtennis
  1275. Xterminal
  1276. Xtest
  1277. Xthailand
  1278. Xthanatos
  1279. Xtiger
  1280. Xtoggle
  1281. Xtomato
  1282. Xtopography
  1283. Xtortoise
  1284. Xtoxic
  1285. Xtoyota
  1286. Xtrails
  1287. Xtransfer
  1288. Xtrivial
  1289. Xtrombone
  1290. Xtty
  1291. Xtubas
  1292. Xtuttle
  1293. Xu
  1294. Xumesh
  1295. Xunhappy
  1296. Xunicorn
  1297. Xunix
  1298. Xunknown
  1299. Xuranus
  1300. Xurchin
  1301. Xutil
  1302. Xutility
  1303. Xuucp
  1304. Xv
  1305. Xvasant
  1306. Xvenus
  1307. Xvertigo
  1308. Xvillage
  1309. Xvirgin
  1310. Xvisitor
  1311. Xvortex
  1312. Xw
  1313. Xwargames
  1314. Xwarren
  1315. Xwater
  1316. Xweenie
  1317. Xwhatever
  1318. Xwhatnot
  1319. Xwhiting
  1320. Xwhitney
  1321. Xwholesale
  1322. Xwill
  1323. Xwilliam
  1324. Xwilliamsburg
  1325. Xwillie
  1326. Xwinston
  1327. Xwisconsin
  1328. Xwizard
  1329. Xwizzy
  1330. Xwombat
  1331. Xwoodwind
  1332. Xword
  1333. Xwork
  1334. Xwormwood
  1335. Xwyoming
  1336. Xx
  1337. Xxerox
  1338. Xxfer
  1339. Xxmodem
  1340. Xxyz
  1341. Xy
  1342. Xyaco
  1343. Xyang
  1344. Xyellowstone
  1345. Xyosemite
  1346. Xz
  1347. Xzap
  1348. Xzerox
  1349. Xzimmerman
  1350. Xzmodem
  1351. Xzxcvbn
  1352. END_OF_FILE
  1353. if test 6485 -ne `wc -c <'DictSrc/bad_pws.dat'`; then
  1354.     echo shar: \"'DictSrc/bad_pws.dat'\" unpacked with wrong size!
  1355. fi
  1356. # end of 'DictSrc/bad_pws.dat'
  1357. fi
  1358. if test -f 'Scripts/Crack.network' -a "${1}" != "-c" ; then 
  1359.   echo shar: Will not clobber existing file \"'Scripts/Crack.network'\"
  1360. else
  1361. echo shar: Extracting \"'Scripts/Crack.network'\" \(4084 characters\)
  1362. sed "s/^X//" >'Scripts/Crack.network' <<'END_OF_FILE'
  1363. X#!/bin/sh
  1364. X
  1365. X###
  1366. X# This program written by ADE Muffett (aem@aber.ac.uk), August 1991,
  1367. X# as part of the 'Crack' password cracking package.
  1368. X###
  1369. X
  1370. X###
  1371. X# This program reads the network.conf and breaks up the sorted password
  1372. X# file and kicks "Crack" up on all the machines and feeds the file to it.
  1373. X###
  1374. X
  1375. X###
  1376. X# Okay, if you don't like this bit of code, YOU think of a totally
  1377. X# portable way to do this - in shell scripts without using PERL - Alec.
  1378. X###
  1379. X
  1380. Xcf=Scripts/network.conf
  1381. Xtf=/tmp/mcp.$$
  1382. X
  1383. X###
  1384. X# Check that the config file is in place
  1385. X###
  1386. X
  1387. Xif [ ! -f $cf -o ! -s $cf ]
  1388. Xthen
  1389. X    echo "Crack.network: empty or missing config file: $cf"
  1390. X    exit 1
  1391. Xfi
  1392. X
  1393. X###
  1394. X# Parse arguments
  1395. X###
  1396. X
  1397. Xargs=""
  1398. Xfiles=""
  1399. Xlocalfeedback=""
  1400. X
  1401. Xfor i in $*
  1402. Xdo
  1403. X    if [ -f "$i" ]
  1404. X    then
  1405. X        files="$files $i"
  1406. X    else
  1407. X        case $i in
  1408. X            -f*)
  1409. X                echo "Crack: -f option on COMMAND LINE incompatible with networking - Ignored"
  1410. X                ;;
  1411. X            -F*)
  1412. X                localfeedback="-F"
  1413. X                args="$args $i"
  1414. X                ;;
  1415. X            *)
  1416. X                args="$args $i"
  1417. X                ;;
  1418. X        esac
  1419. X    fi
  1420. Xdone
  1421. X
  1422. X###
  1423. X# Do the dictionaries locally !
  1424. X###
  1425. X# We don't know what the architecture of the local host is, nor am I
  1426. X# compelled to try looking it up in the network.conf, so, lets cheat and
  1427. X# say it's DEFAULT_BIN, imported from "Crack".
  1428. X#
  1429. X# Very few ppl are going to put the word 'generic' into a network.conf, so
  1430. X# that should be safe, and anyway, we are only going to be compiling
  1431. X# crack-pp, so, barring an extra directory, there is no wastage.
  1432. X###
  1433. X
  1434. Xecho "Making dictionaries locally, assuming local architecture $DEFAULT_BIN"
  1435. X
  1436. XCRACK_ARCH=$CRACK_HOME/$DEFAULT_BIN ; export CRACK_ARCH
  1437. X
  1438. Xmake -f Scripts/crack.mf dictstamp || exit 1
  1439. X
  1440. XCRACK_ARCH=""
  1441. X
  1442. Xecho "Dictionaries done ok."
  1443. X
  1444. X###
  1445. X# Get on with your proper job
  1446. X###
  1447. X
  1448. Xecho "Merging input data."
  1449. X
  1450. Xif [ "$CRACK_OUT" != "" ]
  1451. Xthen
  1452. X    warn=$CRACK_OUT/out.init.$$
  1453. Xelse
  1454. X    warn=out.init.$$
  1455. Xfi
  1456. X
  1457. XScripts/do_join $localfeedback $warn $files > $tf
  1458. X
  1459. X###
  1460. X# Statistics gathering
  1461. X###
  1462. X
  1463. Xlines=`wc -l < $tf`
  1464. Xsaltlines=`Scripts/saltcount < $tf`
  1465. X
  1466. X# Must not quote $lines/$saltlines here for comparison to work
  1467. X
  1468. Xif [ $lines = 0 -o $saltlines = 0 ]
  1469. Xthen
  1470. X    echo "Crack: no uncracked input to distribute."
  1471. X    exit 1
  1472. Xfi
  1473. X
  1474. Xecho "Starting analysis for Network-Crack."
  1475. X
  1476. Xcat $cf |
  1477. Xgrep -v '^#' |
  1478. Xsort -t: +2 -n |
  1479. Xawk -F: '
  1480. XBEGIN {
  1481. X    hostcount = 0;
  1482. X    totalweight = 0;
  1483. X    linecount = '"$lines"';
  1484. X    saltlinecount = '"$saltlines"';
  1485. X    iargs = "'"$args"'";
  1486. X    file = "'"$tf"'";
  1487. X}
  1488. X
  1489. X/^[a-zA-Z0-9]/ {
  1490. X    hostname[hostcount] = $1;
  1491. X
  1492. X    bintype[hostcount] = $2;
  1493. X
  1494. X    relpow[hostcount] = $3;
  1495. X
  1496. X    powtot += $3;
  1497. X
  1498. X    if (index($6, "-f") == 0)
  1499. X    {
  1500. X        asynch[hostcount] = "";
  1501. X    } else
  1502. X    {
  1503. X        asynch[hostcount] = "-asynch";
  1504. X    }
  1505. X
  1506. X    crackf[hostcount] = $6 " " iargs;  # useropts go second get priority
  1507. X
  1508. X    if ($4 == "")
  1509. X    {
  1510. X        rshuser[hostcount] = "";
  1511. X    } else
  1512. X    {
  1513. X        rshuser[hostcount] = "-l " $4;
  1514. X        crackf[hostcount] = crackf[hostcount] " -U" $4;
  1515. X    }
  1516. X
  1517. X    if ($5 == "")
  1518. X    {
  1519. X        crackp[hostcount] = "$CRACK_HOME_UNRES/Crack";
  1520. X    } else
  1521. X    {
  1522. X        crackp[hostcount] = $5;
  1523. X    }
  1524. X    crackf[hostcount] = iargs " " $6;
  1525. X    hostcount++;
  1526. X}
  1527. X
  1528. XEND {
  1529. X    # Improvements to load balancing algorithm by chris stassen@com.alc
  1530. X    done = 1;
  1531. X    slice = 0.0;
  1532. X    remainder = 0.0;
  1533. X    todo = saltlinecount;
  1534. X    print "echo Users:", linecount;
  1535. X    print "echo Salts:", saltlinecount;
  1536. X    print "echo Remote Hosts:", hostcount;
  1537. X    print "echo Total power:", powtot;
  1538. X
  1539. X    for (i = 0; i < hostcount; i++)
  1540. X    {
  1541. X        if (i < hostcount - 1)
  1542. X        {
  1543. X            slice = relpow[i] / powtot;        # fraction
  1544. X            slice *= saltlinecount;            # percentage
  1545. X            slice = slice + remainder;        # add excess
  1546. X            remainder = slice - int(slice);        # remove excess
  1547. X            slice = int(slice);            # round down
  1548. X            todo -= slice;                # remainder
  1549. X        } else
  1550. X        {
  1551. X            slice = todo;    # fastest machine gets the rest.
  1552. X            todo = 0;
  1553. X        }
  1554. X        if (slice > 0)
  1555. X        {
  1556. X            print "echo Calling", hostname[i], "for", slice, "different salts";
  1557. X
  1558. X            line = sprintf( \
  1559. X       "Scripts/RCrack %s %d %d %s %s \"%s\" -remote %s %s < %s", \
  1560. X                asynch[i], \
  1561. X                done, \
  1562. X                done + slice - 1, \
  1563. X                hostname[i], \
  1564. X                rshuser[i], \
  1565. X                crackp[i], \
  1566. X                crackf[i], \
  1567. X                bintype[i], \
  1568. X                file);
  1569. X#            print "echo", line;
  1570. X            print line;
  1571. X        }
  1572. X        done += slice;
  1573. X    }
  1574. X}'| sh        # I'll bet you didn't expect this...
  1575. X
  1576. Xrm $tf
  1577. X
  1578. Xexit 0
  1579. END_OF_FILE
  1580. if test 4084 -ne `wc -c <'Scripts/Crack.network'`; then
  1581.     echo shar: \"'Scripts/Crack.network'\" unpacked with wrong size!
  1582. fi
  1583. chmod +x 'Scripts/Crack.network'
  1584. # end of 'Scripts/Crack.network'
  1585. fi
  1586. if test -f 'Scripts/RCrack' -a "${1}" != "-c" ; then 
  1587.   echo shar: Will not clobber existing file \"'Scripts/RCrack'\"
  1588. else
  1589. echo shar: Extracting \"'Scripts/RCrack'\" \(3312 characters\)
  1590. sed "s/^X//" >'Scripts/RCrack' <<'END_OF_FILE'
  1591. X#!/bin/sh
  1592. X
  1593. X###
  1594. X# This program written by ADE Muffett (aem@aber.ac.uk), August 1991,
  1595. X# as part of the 'Crack' password cracking package.
  1596. X###
  1597. X
  1598. X###
  1599. X# Amendments (especially of the rsh variety) suggested by bct@hull.cs
  1600. X###
  1601. X# For those ignorant of 'rsh', what I am trying to build is a line of
  1602. X# the form
  1603. X#          rsh hostname [-n] [-l remoteuser] command [args ...]
  1604. X#
  1605. X###
  1606. Xmachine=`(uname) 2>&1`            # What architecture are we on ?
  1607. X
  1608. X###
  1609. X# Map architecture to rsh-equivalent...
  1610. X###
  1611. X
  1612. Xcase $machine in
  1613. X    "HP_UX")            # Hewlett Packard boxen
  1614. X        remote_shell="remsh"
  1615. X        ;;
  1616. X#     "XENIX"|"Xenix")        # Just a suggestion...
  1617. X#        remote_shell="rcmd"
  1618. X#        ;;
  1619. X    *)                # default
  1620. X        remote_shell="rsh"
  1621. X        ;;
  1622. Xesac
  1623. X
  1624. X###
  1625. X# Are we going to kick rsh into the background, or are we going to
  1626. X# background the thing on the remote end ?
  1627. X###
  1628. X
  1629. Xasynch_mode=""
  1630. X
  1631. Xif [ "x$1" = "x-asynch" ]
  1632. Xthen
  1633. X    echo "(asynchronous $remote_shell mode)"
  1634. X    asynch_mode="$1"
  1635. X    shift
  1636. Xelse
  1637. X    echo "(remotely backgrounded mode)"
  1638. Xfi
  1639. X
  1640. X###
  1641. X# Segments of input data to read.
  1642. X###
  1643. X
  1644. Xstartline=$1
  1645. Xshift
  1646. Xstopline=$1
  1647. Xshift
  1648. X
  1649. X###
  1650. X# Let the user know what we are doing.
  1651. X###
  1652. X
  1653. Xdataf=/tmp/rcrk.$1.$$        # temporary data file
  1654. X
  1655. X###
  1656. X# Awk reads from stdin... Create an input file for rsh...
  1657. X###
  1658. X
  1659. Xawk -F: '
  1660. XBEGIN {
  1661. X    usercount = 0;
  1662. X    saltcount = 0;
  1663. X    startsalt = '"$startline"';
  1664. X    stopsalt = '"$stopline"';
  1665. X}
  1666. X
  1667. X{
  1668. X    if (substr($3, 1, 2) != last)
  1669. X    {
  1670. X        saltcount++;
  1671. X        last = substr($3, 1, 2);
  1672. X    }
  1673. X
  1674. X    if (saltcount >= startsalt && saltcount <= stopsalt)
  1675. X    {
  1676. X        usercount++;
  1677. X        print $0;
  1678. X    }
  1679. X}' > $dataf
  1680. X
  1681. X###
  1682. X# Test that we should actually bother to do anything.
  1683. X###
  1684. X
  1685. Xnumlines=`wc -l < $dataf`
  1686. X
  1687. X# Must not quote $numlines here for comparison to work
  1688. X
  1689. Xif [ $numlines = 0 ]
  1690. Xthen
  1691. X    echo "RCrack: Nothing left to dispatch to remote host."
  1692. X    rm -f $dataf
  1693. X    exit 0
  1694. Xelse
  1695. X    echo Salted Segment comprises $numlines users    # Don't quote this...
  1696. Xfi    
  1697. X
  1698. X###
  1699. X# Now for the important bits.
  1700. X###
  1701. X
  1702. Xif [ "x$asynch_mode" = "x-asynch" ]
  1703. Xthen
  1704. X    # variable setup
  1705. X
  1706. X    dief=Runtime/die.$1.$$
  1707. X    outfile=$CRACK_OUT/out.$1.$$
  1708. X
  1709. X    # We know where we're going, but we don't know who we are...
  1710. X
  1711. X    remhost=$1
  1712. X    remuser=`awk -F: '$1=="'"$remhost"'"{print $4}' <Scripts/network.conf`
  1713. X
  1714. X    if [ "$remuser" != "" ]
  1715. X    then
  1716. X        remuser="-l $remuser"    # THIS IS THE FORMAT FOR THE USER FLAGS
  1717. X    fi
  1718. X
  1719. X    # create a die file which points to the remote plaster
  1720. X    # reading from the network.conf
  1721. X
  1722. X    awk -F: '
  1723. XBEGIN {
  1724. X    rsh = "'"$remote_shell"'";
  1725. X    host = "'"$remhost"'";
  1726. X}
  1727. X
  1728. X$1 == host {
  1729. X    if ($4 != "")        # rsh user
  1730. X    {
  1731. X        rshf = "-l " $4 " -n";
  1732. X    } else
  1733. X    {
  1734. X        rshf = "-n";
  1735. X    }
  1736. X
  1737. X    if ($5 != "")        # assemble new crack home
  1738. X    {
  1739. X        nf = split($5, path, "/");
  1740. X        ch = path[1];
  1741. X        for (i = 2; i < nf; i++)    # Up to last but one...
  1742. X        {
  1743. X            ch = ch "/" path[i];
  1744. X        }
  1745. X    } else
  1746. X    {
  1747. X        ch = "'"$CRACK_HOME_UNRES"'";
  1748. X    }
  1749. X}
  1750. X
  1751. XEND {
  1752. X    print "#!/bin/sh";
  1753. X    print "rm $0 && " rsh, host, rshf, "\"cd " ch "; Scripts/plaster\"";
  1754. X}' < Scripts/network.conf > $dief
  1755. X
  1756. X    # Make diefile executable
  1757. X    chmod 700 $dief
  1758. X
  1759. X    # Run the 'rsh' ... Shouldn't this be "nohup"ed or something ?
  1760. X    # Nope... experimentally it's fine... rsh survives the sh exiting
  1761. X
  1762. X    echo "Invoking: $remote_shell $@ < $dataf > $outfile 2>&1 && rm -f $dataf $dief &"
  1763. X    $remote_shell "$@" < $dataf > $outfile 2>&1 && rm -f $dataf $dief &
  1764. Xelse
  1765. X    # Perfectly ordinary network crack.
  1766. X    echo "Invoking: $remote_shell $@ < $dataf"
  1767. X    $remote_shell "$@" < $dataf
  1768. X    rm -f $dataf
  1769. Xfi
  1770. X
  1771. Xexit 0
  1772. END_OF_FILE
  1773. if test 3312 -ne `wc -c <'Scripts/RCrack'`; then
  1774.     echo shar: \"'Scripts/RCrack'\" unpacked with wrong size!
  1775. fi
  1776. chmod +x 'Scripts/RCrack'
  1777. # end of 'Scripts/RCrack'
  1778. fi
  1779. if test -f 'Scripts/network.conf' -a "${1}" != "-c" ; then 
  1780.   echo shar: Will not clobber existing file \"'Scripts/network.conf'\"
  1781. else
  1782. echo shar: Extracting \"'Scripts/network.conf'\" \(2027 characters\)
  1783. sed "s/^X//" >'Scripts/network.conf' <<'END_OF_FILE'
  1784. X###
  1785. X# Format of this file:-
  1786. X###
  1787. X#
  1788. X# host:binary type:relative power:rsh flags:crack path:crack flags:comment
  1789. X#
  1790. X#    host = hostname to 'rsh' to
  1791. X#    binary type = type of executable to build on this sort of machine
  1792. X#    relative power = power of host relative to weakest machine
  1793. X#    rsh user = username to 'rsh -l' to, if not same as current user.
  1794. X#    crack path = full path name of Crack on host (deft: $CRACK_HOME/Crack)
  1795. X#    crack flags = additional flags to add to crack command line on that host
  1796. X#    comment = anything, really, for your reference
  1797. X#
  1798. X#    1) Don't bother specifying "-F" amongst "crack flags" as the 
  1799. X#    one which you use on the command line will be passed across.
  1800. X#
  1801. X#    2) You CAN specify "-f" here, to throw the remote password cracker 
  1802. X#    into foreground mode for non-NFS working, but please read the docs
  1803. X#    thoroughly first.
  1804. X###
  1805. X# I have specified relative power here as the number of fcrypts per second
  1806. X# that each host is (roughly) capable of. This is a perfectly good way to
  1807. X# define relative power, but if you are at a loss, call your weakest machine
  1808. X# '1', and measure all others in terms of that.
  1809. X###
  1810. Xaberda:mipsel:550:::-n4: Mainframe Dec 5830
  1811. Xaberdb:mipsel:550:::-n4: Mainframe Dec 5830
  1812. Xaberdc:mipsel:565:::: Mainframe DecStation 5000/200
  1813. Xaberdq:sun4:340:::-f: Mainframe Sun 4/330
  1814. X###
  1815. Xdecgca:mipsel:275:::-n4: Graphics Room DecStation 2100
  1816. Xdecgcb:mipsel:275:::-n4: Graphics Room DecStation 2100
  1817. Xdecgcc:mipsel:275:::-n4: Graphics Room DecStation 2100
  1818. Xdecgcd:mipsel:275:::-n4: Graphics Room DecStation 2100
  1819. X# decgce:mipsel:275:::-n4:Nigel's DecStation 2100 which gets switched off nites
  1820. X###
  1821. Xdecgma:mipsel:275:::-n4: Graphics Room DecStation 2100
  1822. X# decgmb:mipsel:275:::-n4:DecStation 2100 cannabalised for parts
  1823. Xdecgmc:mipsel:275:::-n4: Graphics Room DecStation 2100
  1824. Xdecgmd:mipsel:275:::-n4: Graphics Room DecStation 2100
  1825. Xdecgme:mipsel:275:::-n4: Graphics Room DecStation 2100
  1826. X###
  1827. X# sunga:sun3:60:::-n4: Graphics Room Sun 3/60
  1828. X# sunga:sun3:60:::-n4: Graphics Room Sun 3/60
  1829. X# sunga:sun3:60:::-n4: Graphics Room Sun 3/60
  1830. X###
  1831. END_OF_FILE
  1832. if test 2027 -ne `wc -c <'Scripts/network.conf'`; then
  1833.     echo shar: \"'Scripts/network.conf'\" unpacked with wrong size!
  1834. fi
  1835. # end of 'Scripts/network.conf'
  1836. fi
  1837. if test -f 'Sources/conf.h' -a "${1}" != "-c" ; then 
  1838.   echo shar: Will not clobber existing file \"'Sources/conf.h'\"
  1839. else
  1840. echo shar: Extracting \"'Sources/conf.h'\" \(5941 characters\)
  1841. sed "s/^X//" >'Sources/conf.h' <<'END_OF_FILE'
  1842. X#include <stdio.h>
  1843. X#include <ctype.h>
  1844. X#include <pwd.h>
  1845. X#include <signal.h>
  1846. X
  1847. X/*
  1848. X * This switch is for my use - if defined, overrides the defaults below and
  1849. X * sets up my own.  It's simplest if you UNDEFINE AND IGNORE this switch.
  1850. X */
  1851. X
  1852. X#define DEVELOPMENT_VERSION
  1853. X
  1854. X/*
  1855. X * !!!! ---------- EVERYBODY ELSE START HERE ---------- !!!!
  1856. X */
  1857. X
  1858. X/*
  1859. X * define this symbol if you are on a system where you don't have the
  1860. X * strchr() function in your standard library (usually this means you are on
  1861. X * a BSD based system) but instead, you DO have the equivalent index()
  1862. X * function.
  1863. X */
  1864. X
  1865. X#undef INDEX_NOT_STRCHR
  1866. X
  1867. X/*
  1868. X * What bytesex is your machine ? Select one of the two below, if you have
  1869. X * some really weird machine - otherwise the program should be able to work
  1870. X * it out itself.
  1871. X */
  1872. X
  1873. X#undef BIG_ENDIAN
  1874. X#undef LITTLE_ENDIAN
  1875. X
  1876. X/* If you haven't selected one of the above options... */
  1877. X#if    !defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN)
  1878. X
  1879. X/* Can we work out if we are little endian ? */
  1880. X#if     defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) ||\
  1881. X    defined(MIPSEL) || defined(BIT_ZERO_ON_RIGHT)
  1882. X#define LITTLE_ENDIAN        /* YES */
  1883. X#endif
  1884. X
  1885. X/* Can we work out if we are bigendian ? */
  1886. X#if    defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) ||\
  1887. X    defined(is68k) || defined(tahoe) || defined(ibm032) ||\
  1888. X    defined(ibm370) || defined(MIPSEB) || defined(__convex__) ||\
  1889. X    defined(hpux) || defined(apollo) || defined (BIT_ZERO_ON_LEFT) || \
  1890. X    defined(m68k) || defined(m88k)
  1891. X#define BIG_ENDIAN        /* YES */
  1892. X#endif
  1893. X
  1894. X/* end of trying to guess things */
  1895. X#endif
  1896. X
  1897. X/* are we schitzophrenic ? */
  1898. X#if    defined(BIG_ENDIAN) && defined(LITTLE_ENDIAN)
  1899. XERROR_BAD_BIT_ORDER;        /* YES */
  1900. X#endif
  1901. X
  1902. X/* are we still ignorant ? */
  1903. X#if    !defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN)
  1904. XERROR_NO_BIT_ORDER;        /* YES */
  1905. X#endif
  1906. X
  1907. X/*
  1908. X * If defined, this will insert code for verbose options
  1909. X */
  1910. X
  1911. X#define CRACK_VERBOSE
  1912. X
  1913. X/*
  1914. X * Define this if you have _toupper() - check your manpages
  1915. X */
  1916. X
  1917. X#undef FAST_TOCASE
  1918. X
  1919. X/*
  1920. X * define this if you are on a Sys V type system with a uname() system call
  1921. X * and have no gethostname() - it fakes up a BSD gethostname() so you can use
  1922. X * CRACK_NETWORK; see crack-port.c
  1923. X */
  1924. X
  1925. X#undef CRACK_UNAME
  1926. X
  1927. X/*
  1928. X * define this if you are running multiple Cracks over a network; if you
  1929. X * aren't using "rsh" to do this, edit "Scripts/RCrack" as well
  1930. X */
  1931. X
  1932. X#undef CRACK_NETWORK
  1933. X
  1934. X/*
  1935. X * Define this to search gecos entry for possible passwords - I RECOMMEND
  1936. X * THIS VERY VERY STRONGLY
  1937. X */
  1938. X
  1939. X#define CRACK_GECOS
  1940. X
  1941. X/*
  1942. X * Define this to make a dictionary pass of pluralised words
  1943. X */
  1944. X
  1945. X#define CRACK_PLURAL
  1946. X
  1947. X/*
  1948. X * Define this to make a dictionary pass of words with TRAILING 0's and 1's.
  1949. X * If you want to add other leading/trailing characters, edit the
  1950. X * "trailing_chars[]" string in "crack-pp.c"
  1951. X */
  1952. X
  1953. X#define CRACK_TRAILING
  1954. X
  1955. X/*
  1956. X * Define this to make a dictionary pass of words with LEADING 0's and 1's.
  1957. X * If you want to add other leading/trailing characters, edit the
  1958. X * "trailing_chars[]" string in "crack-pp.c"
  1959. X */
  1960. X
  1961. X#define CRACK_LEADING
  1962. X
  1963. X/*
  1964. X * Define this to print the guessed password if you crack it. This is useful
  1965. X * for interests sake, and you can find interesting correlations this way
  1966. X * too.
  1967. X */
  1968. X
  1969. X/*
  1970. X * NOTE: DEFINING CRACK_PRINTOUT IS MANDATORY FOR "FEEDBACK" MODE TO WORK.
  1971. X */
  1972. X
  1973. X#define CRACK_PRINTOUT
  1974. X
  1975. X/*
  1976. X * Define this to print the ENCRYPTED VERSION of password if you crack it.
  1977. X * This is useful if you will want to doublecheck that the user HAS changed
  1978. X * his password, after you have warned him.
  1979. X */
  1980. X
  1981. X#define CRACK_PRINTOUT2
  1982. X
  1983. X/*
  1984. X * if defined, tries guesses < 5 chars long - this wastes time if you are
  1985. X * unlikely to have REALLY short passwords, try it once though.
  1986. X */
  1987. X
  1988. X#define CRACK_SHORT_PASSWDS
  1989. X
  1990. X/*
  1991. X * if defined, do sanity checks on the DES password - this gets round expiry
  1992. X * mechanisms appending extra characters to signify "things"
  1993. X */
  1994. X
  1995. X#define CRACK_PW_VERIFY
  1996. X
  1997. X/*
  1998. X * define this if you are using fcrypt() - you might not want to if fcrypt()
  1999. X * doesn't work properly
  2000. X */
  2001. X
  2002. X#define FCRYPT
  2003. X
  2004. X/*
  2005. X * The following symbols pertain ONLY to fcrypt() usage
  2006. X */
  2007. X
  2008. X/*
  2009. X * if defined use builtin clearing in preference to using bzero(), for 4 or 8
  2010. X * byte long ints
  2011. X */
  2012. X
  2013. X#define BUILTIN_CLEAR
  2014. X
  2015. X/*
  2016. X * define if you have a bzero and do not want to use BUILTIN_CLEAR
  2017. X */
  2018. X
  2019. X#define BZERO
  2020. X
  2021. X/*
  2022. X * define this if you have a 4 byte "long_int" on RISC machines and want a
  2023. X * speedup - it should not hurt CISC machines either. Do NOT define it on a
  2024. X * 8-byte int machine...
  2025. X */
  2026. X
  2027. X#undef FDES_4BYTE
  2028. X
  2029. X/*
  2030. X * define this if you are on a Cray or something with an 8-byte int, to
  2031. X * enable Matthew Kaufman's fcrypt fix. I hope it works okay, cos I can't
  2032. X * test it - AEM.
  2033. X */
  2034. X
  2035. X#undef FDES_8BYTE
  2036. X
  2037. X/*
  2038. X * undef this if your compiler knows the fact that 6*x == x<<1 + x<<2
  2039. X */
  2040. X
  2041. X#undef BRAINDEAD6
  2042. X
  2043. X/*
  2044. X * Personal stuff only - I recommend you ignore stuff below this line, unless
  2045. X * you know what you're doing
  2046. X */
  2047. X
  2048. X#ifdef DEVELOPMENT_VERSION
  2049. X/*
  2050. X * for my personal use, this is my configuration on a DS5000/200
  2051. X */
  2052. X#undef BRAINDEAD6
  2053. X
  2054. X#ifndef BUILTIN_CLEAR
  2055. X#define BUILTIN_CLEAR
  2056. X#endif                /* BUILTIN_CLEAR */
  2057. X
  2058. X#undef BZERO
  2059. X
  2060. X#ifndef CRACK_GECOS
  2061. X#define CRACK_GECOS
  2062. X#endif                /* CRACK_GECOS */
  2063. X
  2064. X#ifndef CRACK_NETWORK
  2065. X#define CRACK_NETWORK
  2066. X#endif                /* CRACK_NETWORK */
  2067. X
  2068. X#ifndef CRACK_PLURAL
  2069. X#define CRACK_PLURAL
  2070. X#endif                /* CRACK_PLURAL */
  2071. X
  2072. X#ifndef CRACK_PRINTOUT
  2073. X#define CRACK_PRINTOUT
  2074. X#endif                /* CRACK_PRINTOUT */
  2075. X
  2076. X#ifndef CRACK_PRINTOUT2
  2077. X#define CRACK_PRINTOUT2
  2078. X#endif                /* CRACK_PRINTOUT2 */
  2079. X
  2080. X#ifndef CRACK_PW_VERIFY
  2081. X#define CRACK_PW_VERIFY
  2082. X#endif                /* CRACK_PW_VERIFY */
  2083. X
  2084. X#undef CRACK_SHORT_PASSWDS
  2085. X
  2086. X#ifndef CRACK_TRAILING
  2087. X#define CRACK_TRAILING
  2088. X#endif                /* CRACK_TRAILING */
  2089. X
  2090. X#undef CRACK_UNAME
  2091. X
  2092. X#ifndef CRACK_VERBOSE
  2093. X#define CRACK_VERBOSE
  2094. X#endif                /* CRACK_VERBOSE */
  2095. X
  2096. X#undef FAST_TOCASE
  2097. X
  2098. X#ifndef FCRYPT
  2099. X#define FCRYPT
  2100. X#endif                /* FCRYPT */
  2101. X
  2102. X#ifndef FDES_4BYTE
  2103. X#define FDES_4BYTE
  2104. X#endif                /* FDES_4BYTE */
  2105. X
  2106. X#undef FDES_8BYTE
  2107. X
  2108. X#endif                /* DEVELOPMENT VERSION */
  2109. END_OF_FILE
  2110. if test 5941 -ne `wc -c <'Sources/conf.h'`; then
  2111.     echo shar: \"'Sources/conf.h'\" unpacked with wrong size!
  2112. fi
  2113. # end of 'Sources/conf.h'
  2114. fi
  2115. if test -f 'Sources/crack-lib.c' -a "${1}" != "-c" ; then 
  2116.   echo shar: Will not clobber existing file \"'Sources/crack-lib.c'\"
  2117. else
  2118. echo shar: Extracting \"'Sources/crack-lib.c'\" \(2352 characters\)
  2119. sed "s/^X//" >'Sources/crack-lib.c' <<'END_OF_FILE'
  2120. X#include "crack.h"
  2121. X
  2122. X/*
  2123. X * This program is copyright (c) Alec Muffett 1991 except for certain
  2124. X * portions of code ("crack-fcrypt.c") copyright (c) Robert Baldwin, Icarus
  2125. X * Sparry and Alec Muffett.  The author(s) disclaims all responsibility or
  2126. X * liability with respect to it's usage or its effect upon hardware or
  2127. X * computer systems.  This software is in freely redistributable PROVIDED
  2128. X * that this notice remains intact.
  2129. X */
  2130. X
  2131. Xvoid
  2132. XTrim (string)            /* remove trailing whitespace from a string */
  2133. X    register char *string;
  2134. X{
  2135. X    register char *ptr;
  2136. X
  2137. X    for (ptr = string; *ptr; ptr++);
  2138. X    while ((--ptr >= string) && isspace (*ptr));
  2139. X    *(++ptr) = '\0';
  2140. X}
  2141. X
  2142. Xchar *
  2143. XReverse (str)            /* return a pointer to a reversal */
  2144. X    register char *str;
  2145. X{
  2146. X    register int i;
  2147. X    register int j;
  2148. X    register char *ptr;
  2149. X    static char area[STRINGSIZE];
  2150. X
  2151. X    j = i = strlen (str);
  2152. X    while (*str)
  2153. X    {
  2154. X    area[--i] = *str++;
  2155. X    }
  2156. X    area[j] = '\0';
  2157. X    return (area);
  2158. X}
  2159. X
  2160. Xchar *
  2161. XUppercase (str)            /* return a pointer to an uppercase */
  2162. X    register char *str;
  2163. X{
  2164. X    register char *ptr;
  2165. X    static char area[STRINGSIZE];
  2166. X
  2167. X    ptr = area;
  2168. X    while (*str)
  2169. X    {
  2170. X    *(ptr++) = islower (*str) ? toupper (*str) : *str;
  2171. X    str++;
  2172. X    }
  2173. X    *ptr = '\0';
  2174. X
  2175. X    return (area);
  2176. X}
  2177. X
  2178. Xchar *
  2179. XLowercase (str)            /* return a pointer to an lowercase */
  2180. X    register char *str;
  2181. X{
  2182. X    register char *ptr;
  2183. X    static char area[STRINGSIZE];
  2184. X
  2185. X    ptr = area;
  2186. X    while (*str)
  2187. X    {
  2188. X    *(ptr++) = isupper (*str) ? tolower (*str) : *str;
  2189. X    str++;
  2190. X    }
  2191. X    *ptr = '\0';
  2192. X
  2193. X    return (area);
  2194. X}
  2195. X
  2196. Xchar *
  2197. XInitcap (str)            /* return a pointer to an capitalised */
  2198. X    register char *str;
  2199. X{
  2200. X    register char *ptr;
  2201. X    static char area[STRINGSIZE];
  2202. X
  2203. X    ptr = area;
  2204. X
  2205. X    while (*str)
  2206. X    {
  2207. X    *(ptr++) = isupper (*str) ? tolower (*str) : *str;
  2208. X    str++;
  2209. X    }
  2210. X
  2211. X    *ptr = '\0';
  2212. X
  2213. X    if (islower (area[0]))
  2214. X    {
  2215. X    area[0] = toupper (area[0]);
  2216. X    }
  2217. X    return (area);
  2218. X}
  2219. X
  2220. Xchar *
  2221. XClone (string)
  2222. X    char *string;
  2223. X{
  2224. X    int len;
  2225. X    char *retval;
  2226. X
  2227. X    retval = (char *) malloc (strlen (string) + 1);
  2228. X    strcpy (retval, string);
  2229. X    return (retval);
  2230. X}
  2231. X
  2232. Xint
  2233. XSuffix (word, suffix)
  2234. X    char *word;
  2235. X    char *suffix;
  2236. X{
  2237. X    register int i;
  2238. X    register int j;
  2239. X
  2240. X    i = strlen (word);
  2241. X    j = strlen (suffix);
  2242. X
  2243. X    if (i > j)
  2244. X    {
  2245. X    return (strcmp ((word + i - j), suffix));
  2246. X    } else
  2247. X    {
  2248. X    return (-1);
  2249. X    }
  2250. X}
  2251. END_OF_FILE
  2252. if test 2352 -ne `wc -c <'Sources/crack-lib.c'`; then
  2253.     echo shar: \"'Sources/crack-lib.c'\" unpacked with wrong size!
  2254. fi
  2255. # end of 'Sources/crack-lib.c'
  2256. fi
  2257. if test -f 'Sources/crack-pp.c' -a "${1}" != "-c" ; then 
  2258.   echo shar: Will not clobber existing file \"'Sources/crack-pp.c'\"
  2259. else
  2260. echo shar: Extracting \"'Sources/crack-pp.c'\" \(5502 characters\)
  2261. sed "s/^X//" >'Sources/crack-pp.c' <<'END_OF_FILE'
  2262. X#include "crack.h"
  2263. X
  2264. X/*
  2265. X * This program is copyright (c) Alec Muffett 1991 except for certain
  2266. X * portions of code ("crack-fcrypt.c") copyright (c) Robert Baldwin, Icarus
  2267. X * Sparry and Alec Muffett.  The author(s) disclaims all responsibility or
  2268. X * liability with respect to it's usage or its effect upon hardware or
  2269. X * computer systems.  This software is in freely redistributable PROVIDED
  2270. X * that this notice remains intact.
  2271. X */
  2272. X
  2273. X/*
  2274. X * The characters 1 and ! have the highest probability of hits of all the
  2275. X * ascii set tried. Using zero and space have a much lower probability based
  2276. X * on observation of several thousands of passwords. bct@hull.cs
  2277. X */
  2278. X
  2279. X/*
  2280. X * Sir! I disagree! Most of the trailing character passwords I have ever seen
  2281. X * have been of a numeric type.  However I will assent to your changes.  8-)
  2282. X * aem@aber
  2283. X */
  2284. X
  2285. X/* THIS IS THE STRING TO MODIFY TO ADD OTHER LEADING/TRAILING CHARS */
  2286. X
  2287. Xchar trailing_chars[] = "01!?";
  2288. X
  2289. X/* These used to be enums. Oh well... non-portability rules OK */
  2290. X#define ORDER_LCF    0
  2291. X#define ORDER_LCFP    1
  2292. X#define ORDER_MCF    2
  2293. X#define ORDER_LCFT    3
  2294. X#define ORDER_LCB    4
  2295. X#define ORDER_LCFL    5
  2296. X#define ORDER_UCF    6
  2297. X#define ORDER_MCB    8
  2298. X#define ORDER_UCB    7
  2299. X#define NUMFILES    9
  2300. X
  2301. Xint
  2302. Xmain (argc, argv)
  2303. X    int argc;
  2304. X    char *argv[];
  2305. X{
  2306. X    register int i;
  2307. X    register char *ptr;
  2308. X    int length;
  2309. X    int all_print;
  2310. X    int all_digits;
  2311. X    int all_letters;
  2312. X    int all_letters_upper;
  2313. X    int all_letters_lower;
  2314. X    char buffer[STRINGSIZE];
  2315. X
  2316. X    FILE *fp;
  2317. X    FILE *fps[NUMFILES];
  2318. X
  2319. X    if (argc == 1)
  2320. X    {
  2321. X    printf ("Usage:\t%s dictsrc [dictsrc ...]\n", argv[0]);
  2322. X    exit (1);
  2323. X    }
  2324. X    for (i = 0; i < NUMFILES; i++)
  2325. X    {
  2326. X    char scratch[255];
  2327. X
  2328. X    fps[i] = (FILE *) 0;
  2329. X
  2330. X#ifndef CRACK_PLURAL        /* if not defined, skip opening it */
  2331. X    if (i == ORDER_LCFP)
  2332. X    {
  2333. X        continue;
  2334. X    }
  2335. X#endif                /* CRACK_PLURAL */
  2336. X
  2337. X#ifndef CRACK_LEADING        /* if not defined, skip opening it */
  2338. X    if (i == ORDER_LCFL)
  2339. X    {
  2340. X        continue;
  2341. X    }
  2342. X#endif                /* CRACK_LEADING */
  2343. X
  2344. X#ifndef CRACK_TRAILING        /* if not defined, skip opening it */
  2345. X    if (i == ORDER_LCFT)
  2346. X    {
  2347. X        continue;
  2348. X    }
  2349. X#endif                /* CRACK_TRAILING */
  2350. X
  2351. X    sprintf (scratch, "dict.%c", i + 'a');
  2352. X    if (!(fps[i] = fopen (scratch, "w")))
  2353. X    {
  2354. X        perror (scratch);
  2355. X        exit (3);
  2356. X    }
  2357. X    }
  2358. X
  2359. X    for (i = 1; argv[i]; i++)
  2360. X    {
  2361. X    if (!(fp = fopen (argv[i], "r")))
  2362. X    {
  2363. X        perror (argv[i]);
  2364. X        continue;
  2365. X    }
  2366. X    printf ("dictpp: sourcing from file '%s'\n", argv[i]);
  2367. X
  2368. X    while (fgets (buffer, STRINGSIZE, fp))
  2369. X    {
  2370. X        Trim (buffer);
  2371. X
  2372. X        /* skip single letters and comments */
  2373. X        if (!*buffer || !buffer[1] || buffer[0] == '#')
  2374. X        {
  2375. X        continue;
  2376. X        }
  2377. X        length = strlen (buffer);
  2378. X
  2379. X#ifndef CRACK_SHORT_PASSWDS
  2380. X        if (length < 5)
  2381. X        {
  2382. X        continue;
  2383. X        }
  2384. X#endif
  2385. X        all_letters_upper = 1;
  2386. X        all_letters_lower = 1;
  2387. X        all_digits = 1;
  2388. X        all_letters = 1;
  2389. X        all_print = 1;
  2390. X
  2391. X        for (ptr = buffer; *ptr; ptr++)
  2392. X        {
  2393. X        if (!isdigit (*ptr))
  2394. X        {
  2395. X            all_digits = 0;
  2396. X        }
  2397. X        if (!isprint (*ptr))
  2398. X        {
  2399. X            all_print = 0;
  2400. X        }
  2401. X        if (!isalpha (*ptr))
  2402. X        {
  2403. X            all_letters = 0;
  2404. X        }
  2405. X        if (isupper (*ptr))
  2406. X        {
  2407. X            all_letters_lower = 0;
  2408. X        } else if (islower (*ptr))
  2409. X        {
  2410. X            all_letters_upper = 0;
  2411. X        }
  2412. X        }
  2413. X
  2414. X        if (!all_print)
  2415. X        {
  2416. X        fprintf (fps[ORDER_LCF], "%.8s\n", buffer);
  2417. X        continue;    /* inputs with funnies in it */
  2418. X        }
  2419. X        if (all_letters)
  2420. X        {
  2421. X        fprintf (fps[ORDER_MCF], "%.8s\n", Initcap (buffer));
  2422. X        fprintf (fps[ORDER_MCB], "%.8s\n", Reverse (Initcap (buffer)));
  2423. X        }
  2424. X
  2425. X#ifdef CRACK_PLURAL        /* slightly improved pluralisation algorithm */
  2426. X        if (all_letters && length < 8)
  2427. X        {
  2428. X        /* linguistic flames to /dev/null, please */
  2429. X        char pluralbuff[STRINGSIZE];
  2430. X
  2431. X        strcpy (pluralbuff, Lowercase (buffer));
  2432. X
  2433. X        if (!Suffix (buffer, "ch") ||
  2434. X            !Suffix (buffer, "ex") ||
  2435. X            !Suffix (buffer, "ix") ||
  2436. X            !Suffix (buffer, "sh") ||
  2437. X            !Suffix (buffer, "ss"))
  2438. X        {
  2439. X            /* bench -> benches */
  2440. X            strcat (pluralbuff, "es");
  2441. X        } else if (length > 2 && buffer[length - 1] == 'y')
  2442. X        {
  2443. X            if (strchr ("aeiou", buffer[length - 2]))
  2444. X            {
  2445. X            /* alloy -> alloys */
  2446. X            strcat (pluralbuff, "s");
  2447. X            } else
  2448. X            {
  2449. X            /* gully -> gullies */
  2450. X            strcpy (pluralbuff + length - 1, "ies");
  2451. X            }
  2452. X        } else if (buffer[length - 1] == 's')
  2453. X        {
  2454. X            /* bias -> biases */
  2455. X            strcat (pluralbuff, "es");
  2456. X        } else
  2457. X        {
  2458. X            /* catchall */
  2459. X            strcat (pluralbuff, "s");
  2460. X        }
  2461. X
  2462. X        fprintf (fps[ORDER_LCFP], "%.8s\n", pluralbuff);
  2463. X        }
  2464. X#endif                /* CRACK_PLURAL */
  2465. X
  2466. X        if (!all_letters_upper)
  2467. X        {
  2468. X        fprintf (fps[ORDER_UCF], "%.8s\n", Uppercase (buffer));
  2469. X        fprintf (fps[ORDER_UCB], "%.8s\n", Uppercase (Reverse (buffer)));
  2470. X        } else
  2471. X        {
  2472. X        fprintf (fps[ORDER_UCF], "%.8s\n", buffer);
  2473. X        fprintf (fps[ORDER_UCB], "%.8s\n", Reverse (buffer));
  2474. X        }
  2475. X
  2476. X        if (!all_letters_lower)
  2477. X        {
  2478. X        fprintf (fps[ORDER_LCF], "%.8s\n", Lowercase (buffer));
  2479. X        fprintf (fps[ORDER_LCB], "%.8s\n", Lowercase (Reverse (buffer)));
  2480. X        } else
  2481. X        {
  2482. X        fprintf (fps[ORDER_LCF], "%.8s\n", buffer);
  2483. X        fprintf (fps[ORDER_LCB], "%.8s\n", Reverse (buffer));
  2484. X        }
  2485. X
  2486. X#if defined(CRACK_LEADING) || defined(CRACK_TRAILING)
  2487. X        if (length < 8)
  2488. X        {
  2489. X        for (ptr = trailing_chars; *ptr; ptr++)
  2490. X        {
  2491. X#ifdef CRACK_LEADING
  2492. X            fprintf (fps[ORDER_LCFL], "%c%.7s\n", *ptr, buffer);
  2493. X#endif                /* CRACK_LEADING */
  2494. X#ifdef CRACK_TRAILING
  2495. X            fprintf (fps[ORDER_LCFT], "%.7s%c\n", buffer, *ptr);
  2496. X#endif                /* CRACK_TRAILING */
  2497. X        }
  2498. X        }
  2499. X#endif
  2500. X    }
  2501. X    }
  2502. X    fclose (fp);
  2503. X
  2504. X    for (i = 0; i < NUMFILES; i++)
  2505. X    {
  2506. X    if (fps[i])
  2507. X    {
  2508. X        fclose (fps[i]);
  2509. X    }
  2510. X    }
  2511. X
  2512. X    exit (0);
  2513. X}
  2514. END_OF_FILE
  2515. if test 5502 -ne `wc -c <'Sources/crack-pp.c'`; then
  2516.     echo shar: \"'Sources/crack-pp.c'\" unpacked with wrong size!
  2517. fi
  2518. # end of 'Sources/crack-pp.c'
  2519. fi
  2520. if test -f 'Sources/goodpass.c' -a "${1}" != "-c" ; then 
  2521.   echo shar: Will not clobber existing file \"'Sources/goodpass.c'\"
  2522. else
  2523. echo shar: Extracting \"'Sources/goodpass.c'\" \(8361 characters\)
  2524. sed "s/^X//" >'Sources/goodpass.c' <<'END_OF_FILE'
  2525. X#include <ctype.h>
  2526. X#include <pwd.h>
  2527. X#include <stdio.h>
  2528. X#include <string.h>
  2529. X#include <sys/file.h>
  2530. X
  2531. X/*
  2532. X * goodpass.c : A simple yes/no password sensibility function to be wired
  2533. X * into "passwd" & "yppasswd", etc.  (c) ADE Muffett, 1991 (aem@aber.ac.uk).
  2534. X * This module is freely redistributable for use in software so long as this
  2535. X * copyright notice remains intact.  Distributed as part of the 'Crack' suite
  2536. X * of password testing programs.
  2537. X */
  2538. X
  2539. X/* Usage:- */
  2540. X/* char *result = GoodPass(char *password); */
  2541. X/* where password is a text string to be tested for suitability */
  2542. X/* GoodPass returns NULL if the password is OK */
  2543. X/* GoodPass returns a diagnostic string if the password is NOT ok */
  2544. X
  2545. X#define PWLENGTH    8    /* significant length of text */
  2546. X#define MINDIFF        5    /* minimum number of different characters */
  2547. X#define MAXSTEP        3    /* max number of steps up/down in char set */
  2548. X#define MINLENGTH    6    /* minimum length of a password */
  2549. X#define STRINGSIZE    255    /* a standard buffer size */
  2550. X#define STRIDE        4    /* word skipping length */
  2551. X#undef DEBUG
  2552. X
  2553. Xstatic char *dikshunarys[] =
  2554. X{
  2555. X    "/usr/dict/words",
  2556. X    "/usr/local/lib/bad_pws.dat",
  2557. X    NULL
  2558. X};
  2559. X
  2560. Xstatic int
  2561. XPmatch (control, string)
  2562. X    char *control;
  2563. X    char *string;
  2564. X{
  2565. X    while (*control)
  2566. X    {
  2567. X    if (!*string)
  2568. X    {
  2569. X        return (0);
  2570. X    }
  2571. X    switch (*control)
  2572. X    {
  2573. X    case 'u':
  2574. X        if (!isupper (*string))
  2575. X        {
  2576. X        return (0);
  2577. X        }
  2578. X        break;
  2579. X    case 'l':
  2580. X        if (!islower (*string))
  2581. X        {
  2582. X        return (0);
  2583. X        }
  2584. X        break;
  2585. X    case 'd':
  2586. X        if (!isdigit (*string))
  2587. X        {
  2588. X        return (0);
  2589. X        }
  2590. X        break;
  2591. X    case 'c':
  2592. X        if (!isalpha (*string))
  2593. X        {
  2594. X        return (0);
  2595. X        }
  2596. X        break;
  2597. X    case '.':
  2598. X    default:
  2599. X        if (!isalnum (*string))
  2600. X        {
  2601. X        return (0);
  2602. X        }
  2603. X        break;
  2604. X    }
  2605. X    control++;
  2606. X    string++;
  2607. X    }
  2608. X    return (1);
  2609. X}
  2610. X
  2611. Xstatic void
  2612. XTrim (string)            /* remove trailing whitespace from a string */
  2613. X    register char *string;
  2614. X{
  2615. X    register char *ptr;
  2616. X
  2617. X    for (ptr = string; *ptr; ptr++);
  2618. X    while ((--ptr >= string) && isspace (*ptr));
  2619. X    *(++ptr) = '\0';
  2620. X}
  2621. X
  2622. Xstatic char *
  2623. XReverse (str)            /* return a pointer to a reversal */
  2624. X    register char *str;
  2625. X{
  2626. X    register int i;
  2627. X    register int j;
  2628. X    register char *ptr;
  2629. X    static char area[STRINGSIZE];
  2630. X
  2631. X    j = i = strlen (str);
  2632. X    while (*str)
  2633. X    {
  2634. X    area[--i] = *str++;
  2635. X    }
  2636. X    area[j] = '\0';
  2637. X    return (area);
  2638. X}
  2639. X/******* THE TEST FUNCTION *******/
  2640. X
  2641. Xstatic int
  2642. XTry (input, guess)
  2643. X    register char *input;
  2644. X    register char *guess;
  2645. X{
  2646. X    if (!strncasecmp (input, guess, PWLENGTH) ||
  2647. X    !strncasecmp (input, Reverse (guess), PWLENGTH))
  2648. X    {
  2649. X    return (-1);
  2650. X    }
  2651. X    return (0);
  2652. X}
  2653. X/******* DICTIONARY SEARCHING *******/
  2654. X
  2655. Xstatic int
  2656. XGetWord (fp, buff)
  2657. X    FILE *fp;
  2658. X    char *buff;
  2659. X{
  2660. X    register int c;
  2661. X
  2662. X    for (;;)
  2663. X    {
  2664. X    c = getc (fp);
  2665. X    if (c == EOF)
  2666. X    {
  2667. X        return (-1);
  2668. X    }
  2669. X    if (c == '\n')
  2670. X    {
  2671. X        break;
  2672. X    }
  2673. X    *(buff++) = (char) c;
  2674. X    }
  2675. X    *buff = 0;
  2676. X    return (0);
  2677. X}
  2678. X
  2679. Xstatic int
  2680. XDictSearch (input)
  2681. X    char *input;
  2682. X{
  2683. X    int i;
  2684. X    int loops;
  2685. X    register long top;
  2686. X    register long bot;
  2687. X    register long mid;
  2688. X    long scratch;
  2689. X    char word[STRINGSIZE];
  2690. X    FILE *fp;
  2691. X    char **dictionary;
  2692. X
  2693. X    for (dictionary = dikshunarys; *dictionary; dictionary++)
  2694. X    {
  2695. X    if (!(fp = fopen (*dictionary, "r")))
  2696. X    {
  2697. X        perror (*dictionary);
  2698. X        continue;
  2699. X    }
  2700. X    bot = 0L;        /* start of file */
  2701. X    fseek (fp, 0L, 2);    /* to end of file */
  2702. X    top = ftell (fp);
  2703. X
  2704. X    for (loops = 0; loops < 1000; loops++)
  2705. X    {
  2706. X        mid = (top + bot) / 2;    /* calculate the middle */
  2707. X        scratch = mid;
  2708. X
  2709. X      stride_loop:
  2710. X
  2711. X        scratch -= STRIDE;    /* calculate a bit beforehand */
  2712. X        if (scratch < 0)    /* error fixing */
  2713. X        {
  2714. X        mid = scratch = 0L;
  2715. X        fseek (fp, 0L, 0);
  2716. X        } else
  2717. X        {            /* find the start of the current word */
  2718. X        fseek (fp, scratch, 0);    /* go read the scratch buffer */
  2719. X        fread (word, 1, STRIDE, fp);
  2720. X
  2721. X        for (i = STRIDE - 1; i >= 0; i--)
  2722. X        {
  2723. X            if (word[i] == '\n')    /* where 'mid' is is start of
  2724. X                         * word */
  2725. X            {
  2726. X            break;
  2727. X            } else
  2728. X            {        /* mid is between words */
  2729. X            mid--;
  2730. X            }
  2731. X        }
  2732. X        if (i < 0)
  2733. X        {
  2734. X            goto stride_loop;
  2735. X        }
  2736. X        }
  2737. X
  2738. X        fseek (fp, mid, 0);
  2739. X        GetWord (fp, word);
  2740. X
  2741. X        i = strncasecmp (input, word, PWLENGTH);
  2742. X
  2743. X        if (i > 0)
  2744. X        {
  2745. X        bot = mid + strlen (word) + 1;    /* why retest this word ever */
  2746. X        } else if (i < 0)
  2747. X        {
  2748. X        if (mid >= top)
  2749. X        {
  2750. X            break;
  2751. X        }
  2752. X        top = mid;
  2753. X        } else
  2754. X        {
  2755. X        fclose (fp);
  2756. X        return (-1);    /* found it */
  2757. X        }
  2758. X    }
  2759. X    fclose (fp);
  2760. X    }
  2761. X
  2762. X    return (0);
  2763. X}
  2764. X/******* THE EXTERNAL CALL *******/
  2765. X
  2766. Xchar *
  2767. XGoodPass (input)
  2768. X    char *input;
  2769. X{
  2770. X    register int i;
  2771. X    register char *ptr;
  2772. X    register char *ptr2;
  2773. X    struct passwd *pwd;
  2774. X    char junk[STRINGSIZE];
  2775. X    char password[STRINGSIZE];
  2776. X
  2777. X    /* back it up. */
  2778. X    strcpy (password, input);
  2779. X    Trim (password);
  2780. X
  2781. X    /* who is it ? */
  2782. X    pwd = getpwuid (getuid ());
  2783. X    if (!pwd)
  2784. X    {
  2785. X    perror ("getpwuid");
  2786. X    return ("Error - no password entry found to verify against.");
  2787. X    }
  2788. X    /* size */
  2789. X    if (strlen (password) < MINLENGTH)
  2790. X    {
  2791. X    return ("it is too short - use more characters.");
  2792. X    }
  2793. X    /* username */
  2794. X    if (Try (password, pwd -> pw_name))
  2795. X    {
  2796. X    return ("it is your username");
  2797. X    }
  2798. X    /* usernameusername */
  2799. X    strcpy (junk, pwd -> pw_name);
  2800. X    strcat (junk, pwd -> pw_name);
  2801. X    if (Try (password, junk))
  2802. X    {
  2803. X    return ("it is your username, doubled");
  2804. X    }
  2805. X    /* Gecos information field */
  2806. X    strcpy (junk, pwd -> pw_gecos);
  2807. X    ptr = junk;
  2808. X    if (*ptr == '-')        /* never seen this, but... */
  2809. X    {
  2810. X    ptr++;
  2811. X    }
  2812. X    if (ptr2 = strchr (ptr, ';'))    /* trim off junk */
  2813. X    {
  2814. X    *ptr2 = '\0';
  2815. X    }
  2816. X    if (ptr2 = strchr (ptr, ','))    /* trim off more junk */
  2817. X    {
  2818. X    *ptr2 = '\0';
  2819. X    }
  2820. X    for (;;)
  2821. X    {
  2822. X    if (ptr2 = strchr (ptr, ' '))
  2823. X    {
  2824. X        *(ptr2++) = '\0';
  2825. X    }
  2826. X    if (Try (password, ptr))
  2827. X    {
  2828. X        return ("it is part of your name. Use something less obvious.");
  2829. X    }
  2830. X    if (ptr2)
  2831. X    {
  2832. X        ptr = ptr2;
  2833. X        while (*ptr && isspace (*ptr))
  2834. X        {
  2835. X        ptr++;
  2836. X        }
  2837. X    } else
  2838. X    {
  2839. X        break;
  2840. X    }
  2841. X    }
  2842. X
  2843. X    /* check for repeated characters */
  2844. X    bzero (junk, sizeof (junk));
  2845. X    for (i = 0; i < PWLENGTH && password[i]; i++)
  2846. X    {
  2847. X    if (!strchr (junk, password[i]))
  2848. X    {
  2849. X        strncat (junk, password + i, 1);
  2850. X    }
  2851. X    }
  2852. X    if (strlen (junk) < MINDIFF)
  2853. X    {
  2854. X    return ("it does not contain enough different characters.\nUse more different characters.");
  2855. X    }
  2856. X    /* check for over simplicity */
  2857. X    i = 0;
  2858. X    ptr = password;
  2859. X    while (ptr[0] && ptr[1])
  2860. X    {
  2861. X    if ((ptr[1] == (ptr[0] + 1)) ||
  2862. X        (ptr[0] == (ptr[1] + 1)))
  2863. X    {
  2864. X        i++;
  2865. X    }
  2866. X    ptr++;
  2867. X    }
  2868. X    if (i > MAXSTEP)
  2869. X    {
  2870. X    return ("it is too simplistic. Try something more random.");
  2871. X    }
  2872. X    /* lets get a little silly... */
  2873. X    if (Pmatch ("cdddccc", password))
  2874. X    {
  2875. X    return ("it looks like a new style car registration.");
  2876. X    }
  2877. X    if (Pmatch ("cccdddc", password))
  2878. X    {
  2879. X    return ("it looks like a old style car registration.");
  2880. X    }
  2881. X    if (Pmatch ("cccddd", password) || Pmatch ("dddccc", password))
  2882. X    {
  2883. X    return ("it looks like an old-style car registration.");
  2884. X    }
  2885. X    if (Pmatch ("ccddddddc", password))
  2886. X    {
  2887. X    return ("it looks like a National Insurance number.");
  2888. X    }
  2889. X    strcpy (junk, input);
  2890. X
  2891. X    /* do a dictionary search here */
  2892. X    if (DictSearch (junk))
  2893. X    {
  2894. X    return ("it is a guessable dictionary word.");
  2895. X    }
  2896. X    if (DictSearch (Reverse (junk)))
  2897. X    {
  2898. X    return ("it is a guessable reversed dictionary word.");
  2899. X    }
  2900. X    /* strip off possible initial number and do a dictionary search here */
  2901. X    if (isdigit (junk[0]))
  2902. X    {
  2903. X    if (DictSearch (junk + 1))
  2904. X    {
  2905. X        return ("it is a digit + guessable dictionary word.");
  2906. X    }
  2907. X    if (DictSearch (Reverse (junk + 1)))
  2908. X    {
  2909. X        return ("it is a digit + guessable reversed dictionary word.");
  2910. X    }
  2911. X    }
  2912. X    i = strlen (junk) - 1;
  2913. X    if (isdigit (junk[i]))
  2914. X    {
  2915. X    junk[i] = '\0';
  2916. X    if (DictSearch (junk))
  2917. X    {
  2918. X        return ("it is a guessable dictionary word + digit.");
  2919. X    }
  2920. X    if (DictSearch (Reverse (junk)))
  2921. X    {
  2922. X        return ("it is a guessable reversed dictionary word + digit.");
  2923. X    }
  2924. X    } else if (junk[i] == 's')
  2925. X    {
  2926. X    junk[i] = '\0';
  2927. X    if (DictSearch (junk))
  2928. X    {
  2929. X        return ("it is a pluralised dictionary word.");
  2930. X    }
  2931. X    }
  2932. X    return ((char *) NULL);
  2933. X}
  2934. X#ifdef DEBUG
  2935. Xmain (argc, argv)
  2936. X    int argc;
  2937. X    char *argv[];
  2938. X{
  2939. X    int i;
  2940. X    char *p;
  2941. X
  2942. X    for (i = 1; i < argc; i++)
  2943. X    {
  2944. X    printf ("'%s'\n", argv[i]);
  2945. X
  2946. X    if (p = GoodPass (argv[i]))
  2947. X    {
  2948. X        printf ("\t%s\n", p);
  2949. X    } else
  2950. X    {
  2951. X        printf ("\tok\n");
  2952. X    }
  2953. X    }
  2954. X}
  2955. X#endif
  2956. END_OF_FILE
  2957. if test 8361 -ne `wc -c <'Sources/goodpass.c'`; then
  2958.     echo shar: \"'Sources/goodpass.c'\" unpacked with wrong size!
  2959. fi
  2960. # end of 'Sources/goodpass.c'
  2961. fi
  2962. echo shar: End of archive 2 \(of 5\).
  2963. cp /dev/null ark2isdone
  2964. MISSING=""
  2965. for I in 1 2 3 4 5 ; do
  2966.     if test ! -f ark${I}isdone ; then
  2967.     MISSING="${MISSING} ${I}"
  2968.     fi
  2969. done
  2970. if test "${MISSING}" = "" ; then
  2971.     echo You have unpacked all 5 archives.
  2972.     rm -f ark[1-9]isdone
  2973. else
  2974.     echo You still need to unpack the following archives:
  2975.     echo "        " ${MISSING}
  2976. fi
  2977. ##  End of shell archive.
  2978. exit 0
  2979. exit 0 # Just in case...
  2980. -- 
  2981. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  2982. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  2983. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  2984. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  2985.