📄 mythread.pas
字号:
Unit MyThread;
Interface
Uses
SysUtils, Classes;
Type
TMyThread = Class(TThread)
Private
HashValue: String;
MyThreadID: Integer;
FormatType: Integer;
PasswordSalt: Array[0..7] Of Byte;
CurrStr: String;
Procedure UpdateCaption;
Function TestMD5(Password: String): Boolean;
Procedure OnMyThreadTerminate(Sender: TObject);
Public
Constructor Create(CreateSuspended: Boolean; SHash, InnoSalt: String; iThreadID, iFormatType: Integer); Overload;
Protected
Procedure Execute; Override;
End;
Implementation
Uses Main, Hash, Base64;
Constructor TMyThread.Create(CreateSuspended: Boolean; SHash, InnoSalt: String; iThreadID, iFormatType: Integer);
Begin
Inherited Create(CreateSuspended);
FreeOnTerminate := True;
OnTerminate := OnMyThreadTerminate;
HashValue := LowerCase(SHash);
MyThreadID := iThreadID;
FormatType := iFormatType;
ConvStringToArray(InnoSalt, PasswordSalt);
End;
Procedure TMyThread.OnMyThreadTerminate(Sender: TObject);
Begin
FrmMain.LogList.Items[MyThreadID] := Format('线程 [%d] 已停止.', [MyThreadID]);
End;
Procedure TMyThread.UpdateCaption;
Begin
If FrmMain.ChkShowThreadInfo.Checked Then
FrmMain.LogList.Items[MyThreadID] := Format('线程 [%d]:%s', [MyThreadID, CurrStr]);
End;
Function TMyThread.TestMD5(Password: String): Boolean;
Type
TempChar = Array[0..15] Of Char;
Var
Context: TMD5Context;
Hash: TMD5Digest;
S: String;
Begin
Result := false;
Case FormatType Of
0:
Begin
MD5Init(Context);
MD5Update(Context, PAnsiChar(Password)^, Length(Password));
MD5Final(Context, Hash);
Result := CompareText(MD5Print(Hash), HashValue) = 0;
End;
1: Result := CompareText(SHA1Print(SHA1String(Password)), HashValue) = 0;
2:
Begin
MD5Init(Context);
MD5Update(Context, PAnsiChar('PasswordCheckHash')^, Length('PasswordCheckHash'));
MD5Update(Context, PasswordSalt, SizeOf(PasswordSalt));
MD5Update(Context, Pointer(Password)^, Length(Password));
MD5Final(Context, Hash);
Result := CompareText(MD5Print(Hash), HashValue) = 0;
End;
3:
Begin
MD5Init(Context);
MD5Update(Context, PAnsiChar(Password)^, Length(Password));
MD5Final(Context, Hash);
Result := CompareText(Base64EnCodeStr(TempChar(Hash)), HashValue) = 0;
End;
4:
Begin
S := Copy(HashValue, 1, 2);
MD5Init(Context);
MD5Update(Context, PAnsiChar(S + Password)^, Length(S + Password));
MD5Final(Context, Hash);
Result := CompareText(MD5Print(Hash), Copy(HashValue, 3, MaxInt)) = 0;
End;
End;
End;
{ MyThread }
Procedure TMyThread.Execute;
Begin
While Not FrmMain.IsStop Do
Begin
CurrStr := GetByNextStr;
If CurrStr = '' Then Break;
Synchronize(UpdateCaption);
If TestMD5(CurrStr) Then
Begin
FrmMain.CmdStop.Click;
FrmMain.Log(Format('任务完成,结果:[%s].', [CurrStr]));
Break;
End;
Sleep(8);
End;
End;
End.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -