ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи
   
Результаты опроса: Продолжать писать статьи?
Да 96 70.07%
Нет 9 6.57%
Мне пофиг 32 23.36%
Голосовавшие: 137. Вы ещё не участвовали в этом опросе

Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Пишем автореггер под Rambler.Ru
  #1  
Старый 10.09.2009, 21:11
Аватар для rankor777
rankor777
Познающий
Регистрация: 11.01.2008
Сообщений: 42
Провел на форуме:
95213

Репутация: 49
Отправить сообщение для rankor777 с помощью ICQ
Arrow Пишем автореггер под Rambler.Ru

В наше время спам через PHP-скрипты стал совсем неактуален – на большинстве хостингов спамерский аккаунт прикрывают чуть ли не сразу после регистрации. В связи с этим приходится искать новые лазейки, но самым простым и дешевым способом остается спам через SMTP-серверы известных почтовых сервисов. Также огромной популярностью пользуется спам по ICQ – кому из нас не приходили предложения посеить тот или иной порносайт? =)
Но для массовой рассылки писем требуется достаточно много учетных записей того или иного сервиса, и возникает вопрос – откуда их взять? И тут мы вспоминаем самые распространенные и известные способы:
1. Сбрутить. Да, брут ICQ – достаточно простое и незатратное занятие. А что насчет брутфорса e-mail’ов? Здесь все почти бесперспективно.
2. Вытащить из отчетов троянов. Данный способ еще хуже первого.
3. Зарегистрировать. А если регистрировать на сервере rambler.ru, то в придачу к мылу получаем еще и номер ICQ! Этот способ самый простой и выгодный.

Со способом добычи аккаунтов мы определились. Переходим на http://id.rambler.ru/scripts/newuser.cgi и регистрируемся. Как видишь, регистрация проходит в 2 этапа. На первом этапе мы вводим имя, фамилию и желаемый логин, а на втором заполняем остальную инфу – пароль, секретный вопрос, пол и каптчу. Нажимаем «Зарегистрироваться» - и получаем логин к почте на рамблере и, если повезет, новый номер ICQ.

Во время регистрации мы обнаруживаем две проблемы:
1. Номер ICQ регистрируется не всегда
2. Каптча
Но всё не так страшно, как кажется. Первая проблема решается элементарно – прокси. А вот со второй все немного сложнее. Чтобы не вбивать символы с картинки руками (мы ведь пишем автореггер, правда?), нам придется распознавать каптчу автоматически. Но как это сделать? Естественно, писать модуль для оптического распознавания текста мы не будем. Наверняка ты слышал про такой сервис, как anti-captcha, а если не слышал, то я расскажу. Общеизвестно, что в азиатских странах с работой очень туго, и люди там хватаются за любую возможность заработать. Ну и само собой нашлись предприимчивые жители СНГ, организовавшие сервис, в котором эти самые азиаты за сущие копейки перепечатывают текст с картинки в поле браузера. Нам цена 1000 распознаваний обходится в $1. А теперь представь, сколько получает среднестатистический азиат за день работы, учитывая, что до него доходит далеко не вся сумма. Ладно, что-то мы отвлеклись от темы, вернемся к нашему реггеру.
Для написания программы нам понадобятся:
1. Delphi, желательно 2007/2010
2. Набор компонентов Internet Direct, он же Indy.
3. Набор компонентов AlphaControls - по желанию
4. ACMan.pas – юнит, написанный OstWay’ем.

Прикинем примерный план действий. На распознавание каптчи уходит около 10 секунд + еще примерно 5 на остальные шаги регистрации. Итого 15 секунд на 1 аккаунт. Медленно, однако! Чтобы ускорить процесс регистрации, мы напишем многопоточную программу. Потоки реализуем на TThread. TThread - виртуальный класс для «затачивания» под нужды различных приложений, описанный в модуле Classes.
Напишем класс-наследник TThread, для этого нам надо переопределить методы Execute(), Create() и Destroy().


PHP код:
TRegThread = class(TThread)
    protected
      
procedure Execute(); override;
    public
      
constructor Create();
      
destructor Destroy(); override;
   
   
constructor TRegThread.Create();
begin
  inherited Create
(True);

  
AC    :=  TACMan.Create('http://ac-service.info/'APIKey);
end;

destructor TRegThread.Destroy();
begin
  CreateDestroy
(True);

  
inherited;
end
Назначение «лишних» строк я разъясню чуть позже.
Работать мы будем с протоколом HTTP, и в этом нам поможет Indy Http (модуль IdHttp).
Из этого модуля нам понадобится класс TIdHttp, в котором, в свою очередь, будем использовать следующие методы и свойства:
• Get(AURL: String): String – для выполнения GET-запросов
• Post (AURL: string; ASource: TStrings): String – для выполнения POST-запросов
• ProxyParams.ProxyServer - адрес прокси
• ProxyParams.ProxyPort – порт прокси

Также нужно каким-то образом хранить Cookie, и, чтобы не обрабатывать их вручную, подключим модуль IdCookieManager, из которого нам понадобится класс TIdCookieManager. Для начала создадим все нужные нам объекты, предварительно прописав их, а также некоторые вспомогательные переменные в разделе private нашего класса.

PHP код:
procedure TRegThread.CreateDestroy(DestBoolean False);
begin

  
if NOT Dest then   // Если надо создать
  
begin
    Http                  
:=  TIdHttp.Create(nil);
    
Cook                  :=  TIdCookieManager.Create(Http);
    
Http.CookieManager    :=  Cook;
    
Http.HandleRedirects  :=  True;

    
Http.ProxyParams.ProxyServer :=  PHost;
    
Http.ProxyParams.ProxyPort   :=  PPort;
    
Http.ConnectTimeout          :=  6000;
    
Http.ReadTimeout             :=  15000;

    Exit;
  
end;

  if 
Cook <> nil then  // Если надо уничтожить
    
Cook.Free();
  if 
Http <> nil then
    Http
.Free();
end
Именно эта процедура используется в деструкторе нашего класса.

Распознавание каптчи.

Наверняка тебе интересно, как же распознаются каптчи в нашем реггере? Давай оставим ненадолго наш поток и разберемся с классом TACMan.

Юнит ACMan.pas, содержащий описание класса TACMan написан моим другом с ником OstWay. Чтобы понять, как оно работает, желательно почитать документацию от сервиса Anti-captcha. Порядок действий выглядит примерно так:

1. Передать сервису картинку и свой API-Key.
2. В цикле ждать 1 секунду и запрашивать статус картинки
3. После получения картинки, если она неправильно распознана, можно «пожаловаться» на неправильное распознавание.

Мы будем использовать только первый и второй шаги, т.к. в 99% случаев картинка распознается верно.

Для передачи картинок используется протокол HTTP с content-type = multipart/data.
Чтобы не изобретать велосипедов, заюзаем Indy Http, тем более тут потери скорости не так важны =)

Для начала надо создать класс.

PHP код:
constructor TACMan.Create(const AACHost string; const AApiKey string);
begin
  FHTTP   
:= TIdHTTP.Create(nil);
  
FACHost := AACHost;
  
FApiKey := AApiKey;
end
• AACHost – текущий сайт сервера (на данный момент ac-service.info)

• AApiKey – ключ API, выданный сервисом.

Далее – передаем картинку сервису.

PHP код:
function TACMan.AntiCaptcha(const AFileName string;
                            
ImgCodec string
                            
Regsense BooleanMinMax Byte) : Boolean;
var
  
PostData  TIdMultiPartFormDataStream;
begin
  Result 
:= false;
  
PostData := TIdMultiPartFormDataStream.Create;
  try
    try
      
PostData.AddFormField('method','post');
      
PostData.AddFormField('key'FApiKey);
      
PostData.AddFile('file'AFileNameImgCodec);
      if 
Regsense then PostData.AddFormField('regsense''1')
                  else 
PostData.AddFormField('regsense''0');
      
PostData.AddFormField('min_len'Inttostr(Min));
      
PostData.AddFormField('max_len'Inttostr(Max));
      
CID := FHTTP.Post(FACHost 'in.php'PostData);
      
Result := Pos('OK|'CID) > 0;
      
CID := StringReplace(CID'OK|''', [rfReplaceAll]);
    
except
      on E 
Exception do
        if 
Assigned(FOnErrorthen
          FOnError
(SelfE.Message);
    
end;
  finally
    
PostData.Free;
  
end;
end
Полезные параметры:
• RegSense : Boolean – чувствительны ли символы к регистру
• Max, Min : Byte – максимальная и минимальная длина текста на картинке.

Ну и последняя функция, вызываемая для проверки статуса каптчи.

PHP код:
function TACMan.GetCaptchaStatus TACStatus;
var
  
res string;
begin
  Result 
:= csNone;
  try
    
res := FHTTP.Get(FACHost 'res.php?key=' FApiKey +
                     
'&action=get&id=' CID);
    if 
Pos('ERROR_'res) > 0 then
      Result 
:= csError
    
else
    if 
Pos('CAPCHA_NOT_READY'res) > 0 then
      Result 
:= csReady
    
else
    if 
Pos('OK|'res) > 0 then begin
      Result 
:= csOk;
      
FCaptchaCode := StringReplace(res'OK|''', [rfReplaceAll]);
    
end;
  
except
    on E 
Exception do
      if 
Assigned(FOnErrorthen
        FOnError
(SelfE.Message);
  
end;
end
Ну и для того, чтобы понять, распозналась ли каптча, напишем еще одну функцию, уже в классе TRegThread.

PHP код:
function TRegThread.RecognCap(const AFileNameString): String;
var
  
i  Byte;
  
cs TACStatus;
begin
  Result 
:= '';
  if 
AC.AntiCaptcha(AFileName'image/pjpeg'true00then
    
for := 1 to 15 do
    
begin
        Sleep
(1000);
        
cs := AC.GetCaptchaStatus;
        if 
cs csReady then
          
Continue
        else
        if 
cs csOk then
          Result 
:= AC.CaptchaCode;
        Break;
    
end;
end
Функция возвращает либо код с картинки, либо пустую строку.

Более подробно ознакомиться с классом ты можешь открыв прилагаемый к статье юнит.
Многопоточность

Вернемся к классу TRegThread. Для того, чтобы зарегистрировать акк, нужно выполнить следующие действия:
1. Пройти первый этап регистрации, отправив имя, фамилию и желательный логин.
2. Получить страницу второго этапа регистрации, из нее выдрать картинку
3. Распознать картинку, передать ее вместе с остальными параметрами в скрипт
4. Разобраться, зарегистрировали ли нас

Всего для выполнения этих действий у нас будет 2 метода, рассмотрим их по порядку.

PHP код:
function TRegThread.GetCaptcha(): String;
var
  
Str   String;
  
SL    TStringList;
  
MS    TMemoryStream;
begin
  Result  
:=  '#ERROR';

  
SL  :=  TStringList.Create();

  
Generate();
  
  try
    
Str :=  Http.Get('http://id.rambler.ru/script/newuser.cgi');
  
except
    
{$IFDEF RDEBUG}
    
SL.Text :=  Str;
    
SL.Free();
    {
$ENDIF}
    Exit;
  
end;

  
Pass  :=  Name IntToStr(Random(9));

  
SL.Add('back=&step=one&login=' Nick '&firstname=' Name +
         
'&lastname=' SNAME);

  try
    
Str :=  Http.Post('http://id.rambler.ru/script/newuser.cgi'SL);
  
Except
    SL
.Free();
    Exit;
  
end;

  
Num :=  Copy(StrPos('/captcha/'Str) + 940);
  
Num :=  Copy(Num1Pos('.jpg'Num) - 1);
  
Num :=  Trim(Num);

  
MS  :=  TMemoryStream.Create();

  try
    
Http.Get('http://id.rambler.ru/captcha/' Num '.jpg'MS);
  
except
    MS
.Free();
    Exit;
  
end;

  
MS.SaveToFile(FPath Num '.jpg');
  
MS.Free();

  
Result  :=  RecognCap(FPath Num '.jpg');
end
Функция GetCaptcha() выполняет первый шаг, получает и распознает каптчу.


PHP код:
function TRegThread.RegNew(ImgString): Boolean;
var
  
Str   String;
  
SL    TStringList;
begin
  Result  
:=  False;
  
SL      :=  TStringList.Create();
  
SL.Add('back=&step=two&step=one&login='+Nick+'&domain=rambler.ru&firstname=' +
         
Name+'&lastname='+SNAME+'&password='+Pass+'&password2='+Pass+
         
'&question=Девичья фамилия матери&answer=as223as&recoverpassword='+
         
'&icq_mode=getnew&icq_nick='+Name+'&icq=&icq_passw='+Pass+'&bday=&bmonth='+
         
'&byear=&gender=1&number='+Num+'&hash='+Img);

  try
    
Str :=  Http.Post('http://id.rambler.ru/script/newuser.cgi'SL);

  
except

    
if Http.ResponseCode <> 302 then
    begin
      SL
.Free();
      Exit;
    
end;

  
end;


  
ICQ :=  Copy(StrPos('"icq.cgi">'Str) + 109);
  If 
NOT IsNumber(ICQthen
   ICQ 
:= ‘’;
    
  
end;
  
  
SL.Free();

  
Result  :=  True;
  
end
Функция RegNew() завершает регистрацию, в случае успешной реги возвращает True и копирует номер ICQ в переменную ICQ (String), в противном случае – возвращает False.

Остался главный метод потока – Execute().

PHP код:
procedure TRegThread.Execute();
var
  
Capt  String;
begin

  
while not Stop do
  
begin

    NextProxy
(PHostPPort);
    
CreateDestroy();
    
Capt  :=  GetCaptcha();

    if 
Capt '#ERROR' then
    begin
      AddList
(''0);
      
CreateDestroy(False);
      Continue;
    
end;

    if 
RegNew(Captthen
      AddList
(Nick ';' Pass);
    
CreateDestroy(True);
  
end;
end
Неизвестные тебе функции ты можешь найти в юните RegThread.pas, т.к. в статью они просто не влезут =(

Заключение

В этой статье я рассказал о самом простом методе обхода Captcha – защиты, применимом к любому сайту, где для регистрации надо ввести текст с картинки. Вооружившись знаниями, полученными после ее прочтения, и классом TACMan ты сможешь написать хоть автореггер ICQ, хоть спамер по социальным сетям, а также многие другие приложения.
Разработка GUI и всего остального юнита Main ложится на твои плечи (Ну, если уж станет совсем влом это делать, качай компонент AlphaControls и используй мои исходники, только не забывай про копирайты )

P.S. Исходники выкладывать не буду, по понятным причинам. Кому надо - тот допишет

RankoR, Ax-Soft.Ru, ICQ - 210091. (с) 2009
 
Ответить с цитированием

  #2  
Старый 10.09.2009, 21:12
Аватар для Keltos
Keltos
Iron Man#2
Регистрация: 08.07.2009
Сообщений: 2,084
Провел на форуме:
3896191

Репутация: 2562


По умолчанию

Исходник скинь пожалуйста

Статья супер
 
Ответить с цитированием

  #3  
Старый 11.09.2009, 20:07
Аватар для rankor777
rankor777
Познающий
Регистрация: 11.01.2008
Сообщений: 42
Провел на форуме:
95213

Репутация: 49
Отправить сообщение для rankor777 с помощью ICQ
По умолчанию

wolmer, напиши компонент проще и лучше, чем инди =)
 
Ответить с цитированием

  #4  
Старый 14.09.2009, 00:38
Аватар для Chrome~
Chrome~
Постоянный
Регистрация: 13.12.2008
Сообщений: 354
Провел на форуме:
1747641

Репутация: 175
Отправить сообщение для Chrome~ с помощью ICQ
По умолчанию

Не плохая статья. Мне понравилась. Несколько замечаний: я где то читал, что при реализации антикапчи с помощью ac-service.info нужно при получении статуса сначала делать задержку в 8-10 сек., а потом в цикле каждые 5 сек., а не как в примере, - каждую секунду. Качество распознавания капчи не 99%, а где то 70-90% если капча не очень сложная.
 
Ответить с цитированием

  #5  
Старый 14.09.2009, 01:19
Аватар для gisTy
gisTy
Постоянный
Регистрация: 24.05.2008
Сообщений: 589
Провел на форуме:
3629857

Репутация: 504


По умолчанию

из-за каждого куска кода создавать стотью? бред
 
Ответить с цитированием

  #6  
Старый 14.09.2009, 02:12
Аватар для ErrorNeo
ErrorNeo
Moderator - Level 7
Регистрация: 02.05.2009
Сообщений: 894
Провел на форуме:
4297091

Репутация: 2261


Отправить сообщение для ErrorNeo с помощью ICQ
По умолчанию

статья как статья, хотя ей болшее место в разделе кодинга.

1. Автор, добавь ссылку на готовый исходный проект на Делфи. (ты ведь не считаешь свой код мего-превадным мего-тру творением?)
Никто "опытный" это даже читать не будет, а новичку будет понятнее, если приложишь готовый рабочий исходник.
2. Инди все равно сакс) Имхо.

Последний раз редактировалось ErrorNeo; 14.09.2009 в 02:15..
 
Ответить с цитированием

  #7  
Старый 14.09.2009, 05:59
Аватар для Freedom
Freedom
Участник форума
Регистрация: 02.07.2007
Сообщений: 189
Провел на форуме:
1843300

Репутация: 212
По умолчанию

выложи исходник плиз )
 
Ответить с цитированием

  #8  
Старый 08.11.2009, 15:56
Аватар для ~Shapaev~
~Shapaev~
Новичок
Регистрация: 24.10.2009
Сообщений: 26
Провел на форуме:
306200

Репутация: 10
По умолчанию

статья понравилась , так как описана работа с антикапчей , что есть гут , пиши еще статьи.
 
Ответить с цитированием

  #9  
Старый 27.11.2009, 04:07
Аватар для denjf
denjf
Участник форума
Регистрация: 12.11.2008
Сообщений: 146
Провел на форуме:
592199

Репутация: 21
По умолчанию

Спасибо автор! Статья хорошая, мне понравилось.

Автор если тебя не затруднит распиши подробно работу с потоками, желательно до самых мелочей!
 
Ответить с цитированием

  #10  
Старый 27.12.2009, 19:28
Аватар для .Life
.Life
Banned
Регистрация: 26.12.2009
Сообщений: 152
Провел на форуме:
86338

Репутация: 0
По умолчанию

Понравилось, вот только хотел повторить и вот что пишет
bad.Free();
if Hp <> nil tqwertn
Http.Free();
end;


что я не так зделал?
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ICQ под Дату Рождения Chessman ICQ - Покупка, продажа 30 14.06.2010 18:34
Почти два миллиона компьютеров в мире находятся под контролем хакеров Jardon Мировые новости 16 11.05.2009 12:27
Скомпилировать GeoIPCity под Linux Eugene-N С/С++, C#, Delphi, .NET, Asm 0 14.04.2009 22:39
Дневник кота {((((((((((((]}{ ТЕМА!!! Болталка 3 14.03.2009 23:50



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ