⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 说明:支持标准MD5、SHA1、Inno密码、QQ密码、Serv-U密码。 支持多线程。 支持进度保存、读取。
💻 PAS
字号:
Unit Main;

Interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, ExtCtrls, Mask, RzEdit, RzSpnEdt, ToolWin,
  RzCommon, ImgList, RzPanel, RzButton, RzRadChk, RzCmboBx, RzTabs,
  RzLstBox, IniFiles, RzTray;

Type
  TFrmMain = Class(TForm)
    PageControl: TRzPageControl;
    TabSheet1: TRzTabSheet;
    TabSheet2: TRzTabSheet;
    TabSheet3: TRzTabSheet;
    TabSheet4: TRzTabSheet;
    CBMD5Format: TRzComboBox;
    Label1: TLabel;
    CBStrMode: TRzComboBox;
    Label2: TLabel;
    Notebook: TNotebook;
    ChkNum: TRzCheckBox;
    ChkLowerLetters: TRzCheckBox;
    ChkUpperLetters: TRzCheckBox;
    ChkOtherString: TRzCheckBox;
    ChkCustomString: TRzCheckBox;
    TxtCustomString: TRzEdit;
    SE_ThreadNum: TRzSpinEdit;
    Label3: TLabel;
    TxtMD5: TRzEdit;
    Label4: TLabel;
    RzFrameController: TRzFrameController;
    RzToolbar: TRzToolbar;
    CmdStart: TRzToolButton;
    CmdPause: TRzToolButton;
    CmdStop: TRzToolButton;
    ImageList: TImageList;
    CmdLoad: TRzToolButton;
    CmdSave: TRzToolButton;
    CmdExit: TRzToolButton;
    ChkShowThreadInfo: TRzCheckBox;
    Timer: TTimer;
    Label5: TLabel;
    TxtTimeSave: TRzNumericEdit;
    Label6: TLabel;
    Label7: TLabel;
    SE_Min: TRzSpinEdit;
    SE_Max: TRzSpinEdit;
    TrayIcon: TRzTrayIcon;
    TxtSalt: TRzEdit;
    Label8: TLabel;
    Panel1: TPanel;
    LogList: TRzListBox;
    LogMemo: TRzMemo;
    Splitter: TSplitter;
    LBStrOK: TLabel;
    CmdAbout: TRzToolButton;
    RzSpacer1: TRzSpacer;
    RzSpacer2: TRzSpacer;
    RzSpacer3: TRzSpacer;
    Procedure CmdStartClick(Sender: TObject);
    Procedure CmdPauseClick(Sender: TObject);
    Procedure CmdStopClick(Sender: TObject);
    Procedure FormCreate(Sender: TObject);
    Procedure TimerTimer(Sender: TObject);
    Procedure FormClose(Sender: TObject; Var Action: TCloseAction);
    Procedure CmdSaveClick(Sender: TObject);
    Procedure CmdLoadClick(Sender: TObject);
    Procedure CmdExitClick(Sender: TObject);
    Procedure FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
    Procedure CBStrModeChange(Sender: TObject);
    Procedure TxtMD5Change(Sender: TObject);
    Procedure CBMD5FormatChange(Sender: TObject);
    Procedure CmdAboutClick(Sender: TObject);
  Private
    IntTimeSave: Integer;
    IsSuspend, IsReLoad: Boolean;
    Ini: TIniFile;
    Procedure LoadSettings(DefConfig, Sp: Boolean);
    Procedure SaveSettings(DefConfig, Sp: Boolean);
    Procedure EnabledControls(B: Boolean);
  Public
    IsStop: Boolean;
    Procedure Log(S: String);
  End;

Var
  FrmMain: TFrmMain;
Function GetByNextStr: String;
Procedure ConvStringToArray(S: String; Var P: Array Of Byte);
Implementation

{$R *.dfm}
Uses
  MyThread, MyBPString, Base64, About;

Const
  MaxThreadNum = 100;
  Msg_Error = '错误';
  Msg_Warning = '警告';
  Ini_Config = 'Config';
  Ini_FormatType = 'FormatType';
  Ini_HashValue = 'HashValue';
  Ini_SaltValue = 'SaltValue';
  Ini_StringMode = 'StringMode';
  Ini_ChkNum = 'ChkNum';
  Ini_ChkLowerLetters = 'IsLowerLetters';
  Ini_ChkUpperLetters = 'IsUpperLetters';
  Ini_ChkOtherString = 'IsOtherString';
  Ini_ChkCustomString = 'IsCustomString';
  Ini_CustomString = 'CustomString';
  Ini_MinLen = 'MinLen';
  Ini_MaxLen = 'MaxLen';
  Ini_ThreadNum = 'ThreadCount';
  Ini_TimeSave = 'AutoSave';
  Ini_ShowThreadInfo = 'IsShowThreadInfo';

  Ini_EnumHash = 'EnumHash';
  Ini_E_S = 'E_S';
  Ini_E_I = 'E_I';
  Ini_E_Len = 'E_Len';
  Ini_E_P = 'E_P';
  Ini_E_Pi = 'E_Pi';
  Ini_E_Max = 'E_Max';

Var
  e: TMyEnumStrAny;
  Mh: Array[0..MaxThreadNum - 1] Of TMyThread;

Function GetByNextStr: String;
Begin
  If Not MyEnumStrAny(e) Then Exit;
  Result := MyGetEnumStr(e);
End;

//是否十六进制字符
Function IsHex(Const Str: String): Boolean;
Var
  LIntLoop: Integer;
Begin
  Result := Trim(Str) <> '';
  If Result Then
    For LIntLoop := 1 To Length(Str) Do
      If Not (Str[LIntLoop] In ['0'..'9', 'a'..'f', 'A'..'F']) Then
      Begin
        Result := false;
        Break;
      End;
End;

Function ConvArrayToString(P: Array Of Byte): String;
Var
  I: Integer;
Begin
  For I := Low(P) To High(P) Do
    Result := Result + IntToHex(P[I], 2);
  //Result := Trim(Result);
End;

Function HexToBin(Text: PChar; Var Buffer: Array Of Byte; BufSize: Integer): Integer; Assembler;
Const
  Convert: Array['0'..'f'] Of SmallInt =
  (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
    -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
    -1, 10, 11, 12, 13, 14, 15);
Var
  I: Integer;
Begin
  I := BufSize;
  While I > 0 Do
  Begin
    If Not (Text[0] In ['0'..'f']) Or Not (Text[1] In ['0'..'f']) Then Break;
    Buffer[BufSize - I] := Ord((Convert[Text[0]] Shl 4) + Convert[Text[1]]);
    Inc(Text, 2);
    Dec(I);
  End;
  Result := BufSize - I;
End;

Procedure ConvStringToArray(S: String; Var P: Array Of Byte);
Begin
  If S = '' Then Exit;
  S := StringReplace(S, ' ', '', [rfReplaceAll]);
  S := StringReplace(S, ',', '', [rfReplaceAll]);
  HexToBin(PChar(Trim(S)), P, High(P) + 1);
End;

Procedure TFrmMain.Log(S: String);
Begin
  LogMemo.Lines.Add(FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + '> ' + S);
  LogMemo.Perform(WM_VSCROLL, SB_PAGEDOWN, 0);
End;

Procedure TFrmMain.LoadSettings(DefConfig, Sp: Boolean);
Begin
  If DefConfig Then
  Begin
    CBMD5Format.ItemIndex := Ini.ReadInteger(Ini_Config, Ini_FormatType, 0);
    TxtMD5.Text := Ini.ReadString(Ini_Config, Ini_HashValue, '');
    TxtSalt.Text := Ini.ReadString(Ini_Config, Ini_SaltValue, '');
    CBStrMode.ItemIndex := Ini.ReadInteger(Ini_Config, Ini_StringMode, 0);
    ChkNum.Checked := Ini.ReadBool(Ini_Config, Ini_ChkNum, false);
    ChkLowerLetters.Checked := Ini.ReadBool(Ini_Config, Ini_ChkLowerLetters, true);
    ChkUpperLetters.Checked := Ini.ReadBool(Ini_Config, Ini_ChkUpperLetters, false);
    ChkOtherString.Checked := Ini.ReadBool(Ini_Config, Ini_ChkOtherString, false);
    ChkCustomString.Checked := Ini.ReadBool(Ini_Config, Ini_ChkCustomString, false);
    TxtCustomString.Text := Ini.ReadString(Ini_Config, Ini_CustomString, '');
    SE_Min.IntValue := Ini.ReadInteger(Ini_Config, Ini_MinLen, 1);
    SE_Max.IntValue := Ini.ReadInteger(Ini_Config, Ini_MaxLen, 8);
    SE_ThreadNum.IntValue := Ini.ReadInteger(Ini_Config, Ini_ThreadNum, 1);
    TxtTimeSave.IntValue := Ini.ReadInteger(Ini_Config, Ini_TimeSave, 60);
    ChkShowThreadInfo.Checked := Ini.ReadBool(Ini_Config, Ini_ShowThreadInfo, true);
  End;

  If Sp Then
  Begin
    e.S := Ini.ReadString(Ini_EnumHash, Ini_E_S, '');
    e.si := Ini.ReadInteger(Ini_EnumHash, Ini_E_I, 1);
    e.sLen := Ini.ReadInteger(Ini_EnumHash, Ini_E_Len, Ord(e.S[0]));
    ConvStringToArray(Ini.ReadString(Ini_EnumHash, Ini_E_P, ''), e.P);
    e.Pi := Ini.ReadInteger(Ini_EnumHash, Ini_E_Pi, 1);
    e.pMax := Ini.ReadInteger(Ini_EnumHash, Ini_E_Max, 8);
    IsReLoad := true;
  End;
End;

Procedure TFrmMain.SaveSettings(DefConfig, Sp: Boolean);
Begin
  If DefConfig Then
  Begin
    Ini.WriteInteger(Ini_Config, Ini_FormatType, CBMD5Format.ItemIndex);
    Ini.WriteString(Ini_Config, Ini_HashValue, TxtMD5.Text);
    Ini.WriteString(Ini_Config, Ini_SaltValue, TxtSalt.Text);
    Ini.WriteInteger(Ini_Config, Ini_StringMode, CBStrMode.ItemIndex);
    Ini.WriteBool(Ini_Config, Ini_ChkNum, ChkNum.Checked);
    Ini.WriteBool(Ini_Config, Ini_ChkLowerLetters, ChkLowerLetters.Checked);
    Ini.WriteBool(Ini_Config, Ini_ChkUpperLetters, ChkUpperLetters.Checked);
    Ini.WriteBool(Ini_Config, Ini_ChkOtherString, ChkOtherString.Checked);
    Ini.WriteBool(Ini_Config, Ini_ChkCustomString, ChkCustomString.Checked);
    Ini.WriteString(Ini_Config, Ini_CustomString, TxtCustomString.Text);
    Ini.WriteInteger(Ini_Config, Ini_MinLen, SE_Min.IntValue);
    Ini.WriteInteger(Ini_Config, Ini_MaxLen, SE_Max.IntValue);
    Ini.WriteInteger(Ini_Config, Ini_ThreadNum, SE_ThreadNum.IntValue);
    Ini.WriteInteger(Ini_Config, Ini_TimeSave, TxtTimeSave.IntValue);
    Ini.WriteBool(Ini_Config, Ini_ShowThreadInfo, ChkShowThreadInfo.Checked);
  End;

  If Sp Then
  Begin
    Ini.WriteString(Ini_EnumHash, Ini_E_S, e.S);
    Ini.WriteInteger(Ini_EnumHash, Ini_E_I, e.si);
    Ini.WriteInteger(Ini_EnumHash, Ini_E_Len, e.sLen);
    Ini.WriteString(Ini_EnumHash, Ini_E_P, ConvArrayToString(e.P));
    Ini.WriteInteger(Ini_EnumHash, Ini_E_Pi, e.Pi);
    Ini.WriteInteger(Ini_EnumHash, Ini_E_Max, e.pMax);
  End;
End;

Procedure TFrmMain.EnabledControls(B: Boolean);
Begin
  CmdStart.Enabled := B;
  CmdPause.Enabled := Not B;
  CmdStop.Enabled := Not B;
  If IsSuspend Then
    CmdLoad.Enabled := false
  Else
    CmdLoad.Enabled := B;
  CmdExit.Enabled := CmdLoad.Enabled;
  Timer.Enabled := Not B;

  PageControl.Enabled := B;
End;

Procedure TFrmMain.CmdStartClick(Sender: TObject);
Var
  I: Integer;
  S: String;
Begin
  If IsSuspend Then
  Begin
    For I := 0 To SE_ThreadNum.Tag - 1 Do
      If Mh[I].Suspended Then
      Begin
        //LogList.Items[I] := Format('线程 [%d] 已恢复.', [I]);
        //Sleep(100);
        Mh[I].Resume;
      End;
    EnabledControls(IsStop);
    Log('全部线程已恢复.');
    Exit;
  End;
  S := '';
  If ChkNum.Checked Then S := '0123456789';
  If ChkLowerLetters.Checked Then S := S + 'abcdefghijklmnopqrstuvwxyz';
  If ChkUpperLetters.Checked Then S := S + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  If ChkOtherString.Checked Then S := S + '!@#$%^&*()_+[{}]\|;:",<>./?`~''';
  If ChkCustomString.Checked Then S := S + TxtCustomString.Text;
  If S = '' Then
  Begin
    MessageBox(Handle, '请设置字符集。', PChar(Msg_Error), MB_ICONHAND);
    Exit;
  End;
  If TxtMD5.Text = '' Then
  Begin
    MessageBox(Handle, '请设置待破解的密文。', PChar(Msg_Error), MB_ICONHAND);
    Exit;
  End;
  If SE_Max.IntValue < SE_Min.IntValue Then
  Begin
    MessageBox(Handle, '最大长度不能小于最小长度。', PChar(Msg_Error), MB_ICONHAND);
    Exit;
  End;
  If Not IsReLoad Then
  Begin
    e.S := S;                           {字符元素串}
    e.si := 1;                          {起始字符元素位置}
    e.sLen := Ord(e.S[0]);              {字符元素总数}
    e.Pi := SE_Min.IntValue;            {起始档位置}
    e.pMax := SE_Max.IntValue;          {最大长度}
    For I := Low(e.P) To High(e.P) Do
      If SE_Min.IntValue >= I Then
        e.P[I] := 1;
  End else
  begin
    if e.S = '' Then
    begin
      e.S := S;
      e.sLen := Ord(e.S[0]);
    end;
  end;
  IsReLoad := false;
  If (e.pMax > SizeOf(e.P)) Then Exit;
  IntTimeSave := 0;
  IsSuspend := false;
  IsStop := false;
  LogList.Items.Clear;
  PageControl.ActivePageIndex := 0;
  If SE_ThreadNum.IntValue > MaxThreadNum Then SE_ThreadNum.IntValue := 100;
  SE_ThreadNum.Tag := SE_ThreadNum.IntValue;  
  For I := 0 To SE_ThreadNum.Tag - 1 Do
  Begin
    LogList.Items.Add(Format('线程 [%d] 已启动...', [I]));
    LogList.Refresh;
    Sleep(100);
    Mh[I] := TMyThread.Create(true, TxtMD5.Text, TxtSalt.Text, I, CBMD5Format.ItemIndex);
    Mh[I].Resume;
  End;
  Log('全部线程已启动.');
  EnabledControls(IsStop);
End;

Procedure TFrmMain.CmdPauseClick(Sender: TObject);
Var
  I: Integer;
Begin
  For I := 0 To SE_ThreadNum.Tag - 1 Do
    If Not Mh[I].Suspended Then
    Begin
      Mh[I].Suspend;
      //Sleep(100);
      //LogList.Items[I] := Format('线程 [%d] 已挂起.', [I]);
    End;
  IsSuspend := true;
  Log('全部线程已暂停.');
  EnabledControls(Not IsStop);
End;

Procedure TFrmMain.CmdStopClick(Sender: TObject);
Begin
  IsStop := true;
  IsSuspend := false;
  EnabledControls(IsStop);
  Log('全部线程已停止.');
End;

Procedure TFrmMain.FormCreate(Sender: TObject);
Begin
  SE_Min.Max := SizeOf(e.P);
  SE_Max.Max := SizeOf(e.P);
  SE_ThreadNum.Max := MaxThreadNum;
  SE_ThreadNum.Min := 1;
  IsReLoad := false;
  IsStop := true;
  Ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
  LoadSettings(true, false);
End;

Procedure TFrmMain.TimerTimer(Sender: TObject);
Begin
  If TxtTimeSave.IntValue = 0 Then Exit;

  Inc(IntTimeSave);
  If IntTimeSave >= TxtTimeSave.IntValue Then
  Begin
    IntTimeSave := 0;
    SaveSettings(false, true);
    Log('定时保存进度...');
  End;
End;

Procedure TFrmMain.FormClose(Sender: TObject; Var Action: TCloseAction);
Begin
  //SaveSettings(true, false);
  Ini.Free;
End;

Procedure TFrmMain.CmdSaveClick(Sender: TObject);
Begin
  SaveSettings(true, true);
  Log('保存进度...');
End;

Procedure TFrmMain.CmdLoadClick(Sender: TObject);
Begin
  LoadSettings(true, true);
  Log('读取进度...');
End;

Procedure TFrmMain.CmdExitClick(Sender: TObject);
Begin
  close;
End;

Procedure TFrmMain.FormCloseQuery(Sender: TObject; Var CanClose: Boolean);
Begin
  If Not IsStop Then
  Begin
    CanClose := false;
    MessageBox(Handle, '正在线程破解Hash值,不能退出。', PChar(Msg_Warning), MB_ICONWARNING);
    Exit;
  End;
End;

Procedure TFrmMain.CBStrModeChange(Sender: TObject);
Begin
  Notebook.PageIndex := CBStrMode.ItemIndex;
End;

Procedure TFrmMain.TxtMD5Change(Sender: TObject);
Const
  ChkHash: Array[Boolean] Of String = ('×', '√');
Var
  S: String;
Begin
  S := TxtMD5.Text;
  Case CBMD5Format.ItemIndex Of
    0, 2: LBStrOK.Caption := ChkHash[IsHex(S) And (Length(S) = 32)];
    1: LBStrOK.Caption := ChkHash[IsHex(S) And (Length(S) = 40)];
    3: LBStrOK.Caption := ChkHash[IsBase64(S) And (Length(S) = 24)];
    4: LBStrOK.Caption := ChkHash[IsHex(Copy(S, 3, MAXINT)) And (S[1] In ['a'..'z']) And (S[2] In ['a'..'z']) And (Length(S) = 34)];
  End;
  If LBStrOK.Caption = ChkHash[true] Then
    LBStrOK.Font.Color := clRed Else LBStrOK.Font.Color := clBlack;
End;

Procedure TFrmMain.CBMD5FormatChange(Sender: TObject);
Begin
  TxtMD5Change(Sender);
  TxtSalt.Enabled := CBMD5Format.ItemIndex = 2;
End;

Procedure TFrmMain.CmdAboutClick(Sender: TObject);
Begin
  ShellAboutEx(Self, Application.Icon, Application.Title, '1.0');
End;

End.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -