[Back to ARCHIVES SWAG index] [Back to Main SWAG index] [Original]

    {
    > Do somebody have a ARJ 2.41 Password finder, because I have packed
    > some of my pascal codes and grabled it with password and now .... hmmmm
    > I can't extract the ARJ file with the password.  I must have typed a
    > different password when I pascked those files.

    In my next two messages is ARJCRACK.PAS.  It's a program that may
    help you find that password.  It's EXTREMELY slow, but if you are
    really really really (did i say really? :)) ) desperate about it
    you might want to give it a try.

    You will need to place this in a FAST machine (one you won't need
    for a LONG while) along with ARJ.EXE and the password-encrypted
    archive on the same drive & directory.

    Tips to speed it up:

     + Using "ARJ v archive," pick the smallest file you can find (but not
       less than about 10 bytes), that was archived using the store method
       (no compression)
     + Move ARJ.EXE, ARJCRACK.EXE and the archive in a ram drive.
     + Remove some characters in PassSet that you think you never used
       as the password (maybe  ~ ` ^ etc..)
     + Run it in plain old DOS *NOT* under Windows or DESQview or OS2.
     + Start off the [last_password] parameter with "a" x minimum-password-
       length-that-you-normaly-use.  Something like:

       arjcrack sources small.pas aaaa
                                  ^^^^
                 if you're sure that you never use passwords that are less
                 than 4 characters

    jon.zarate@vidgame.com
    }

    {$M 8192, 0, 0}
    {$V-}{$S-}{$G+}{$X+}{$R-}

    uses
     Crt, Dos;

    const
     PassSet : String =
       'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' +
       '0123456789`=\[];'',./~!@#$%^&*()_{}:';

    var
     Pw  : String;
     Arc : String;
     Fn  : String;
     Prev: String;

    procedure Sounder(R : Integer);
    var
     N : Integer;

    begin
     N:=2000;
     repeat
      Sound(N);
      N:=N + R;
      if (N < 50) then N:=2000 else
      if (N > 2000) then N:=50;
      Delay(2);
     until (KeyPressed);
     NoSound;
    end;

    procedure Crack;
    var
     I : Word;
     Pw: String[40];
     J : Word;
     X : Word;
     Y : Word;
     Z : array[1..41] of Byte;
     C : Word;

    begin
     FillChar(Z, SizeOf(Z), 0);

     if (Prev <> '') then
      begin
       for I:=1 to Length(Prev) do
        begin
         Z[I]:=Pos(Prev[I], PassSet);
         if (Z[I] = 0) then
          begin
           writeln('Invalid character in [last_password]');
           Halt;
          end;
        end;

       Pw:=Prev;
       X:=Length(Pw);
       J:=X;
      end else
      begin
       Pw:=PassSet[1];
       Z[1]:=1;
       X:=1;
       J:=1;
      end;

     repeat
      Pw[1]:=PassSet[Z[1]];

      writeln;
      writeln;
      writeln('////////////////////////////////////////////////////////////');
      writeln('ARJ t ', Arc, ' ', Fn, ' -g', Pw);
      writeln;
      SwapVectors;
      Exec('ARJ.EXE', 't ' + Arc + ' ' + Fn + ' -g' + Pw);
      SwapVectors;
      writeln('////////////////////////////////////////////////////////////');

      C:=DosExitCode;

      if ((C = 0) and (DosError = 0)) then
       begin
        writeln;
        writeln;
        writeln('Hey I found it!!');
        writeln('The password is -- ', Pw);
        writeln;
        Sounder(10);
        Halt
       end;

      if ((C <> 3) or (DosError <> 0)) then
       begin
        writeln;
        writeln('Duhh... What happened?? Why did I get an EXITCODE of ',
          C, ' and a DOSERROR of ', DosError, '??');
        Sounder(-30);
        Halt
       end;

      if (KeyPressed) then
       begin
        writeln('ARJCRACK aborted.');
        writeln('Last password used was --> ', Pw, ' <--');
        Halt;
       end;

      inc(Z[1]);
      for I:=1 to X do
       begin
        if (Z[I] > Length(PassSet)) then
         begin
          Z[I]:=1;
          inc(Z[I + 1]);
          if (I = J) then
           begin
            inc(J);
            inc(X);
            Pw[0]:=Chr(X);
            Pw[X]:=PassSet[1];
           end;
         end;
         Pw[I]:=PassSet[Z[I]];
        end;
     until (X > Length(Pw));

     writeln('Sorry, I can''t find the password!!');
     Sounder(-2);
    end;

    begin
     writeln;
     writeln;
     writeln('ARJ Password Cracker Version 0.10');
     writeln('by Jonathan Zarate');
     writeln;
     writeln('Password character set: ', PassSet);
     writeln;
     if ((ParamCount < 2) or (ParamCount > 3)) then
      begin
       writeln('Usage: ARJCRACK <archive> <file_to_crack> [last_password]');
       Halt;
      end;

     Arc:=ParamStr(1);
     Fn:=ParamStr(2);
     Prev:=ParamStr(3);
     Crack;
    end.

[Back to ARCHIVES SWAG index] [Back to Main SWAG index] [Original]