?? main.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 + -