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

📄 mythread.pas

📁 说明:支持标准MD5、SHA1、Inno密码、QQ密码、Serv-U密码。 支持多线程。 支持进度保存、读取。
💻 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 + -