Статьи Пишем автореггер под Rambler.Ru

Discussion in 'Статьи' started by rankor777, 10 Sep 2009.

?
  1. Да

    66.9%
  2. Нет

    6.6%
  3. Мне пофиг

    26.5%
  1. rankor777

    rankor777 Elder - Старейшина

    Joined:
    11 Jan 2008
    Messages:
    15
    Likes Received:
    23
    Reputations:
    0
    В наше время спам через 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
     
    12 people like this.
  2. Keltos

    Keltos Banned

    Joined:
    8 Jul 2009
    Messages:
    1,558
    Likes Received:
    920
    Reputations:
    520
    Исходник скинь пожалуйста

    Статья супер
     
    1 person likes this.
  3. rankor777

    rankor777 Elder - Старейшина

    Joined:
    11 Jan 2008
    Messages:
    15
    Likes Received:
    23
    Reputations:
    0
    wolmer, напиши компонент проще и лучше, чем инди =)
     
  4. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    Не плохая статья. Мне понравилась. Несколько замечаний: я где то читал, что при реализации антикапчи с помощью ac-service.info нужно при получении статуса сначала делать задержку в 8-10 сек., а потом в цикле каждые 5 сек., а не как в примере, - каждую секунду. Качество распознавания капчи не 99%, а где то 70-90% если капча не очень сложная.
     
    2 people like this.
  5. gisTy

    gisTy Elder - Старейшина

    Joined:
    24 May 2008
    Messages:
    432
    Likes Received:
    160
    Reputations:
    27
    из-за каждого куска кода создавать стотью? бред
     
  6. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    923
    Likes Received:
    838
    Reputations:
    402
    статья как статья, хотя ей болшее место в разделе кодинга.

    1. Автор, добавь ссылку на готовый исходный проект на Делфи. (ты ведь не считаешь свой код мего-превадным мего-тру творением?)
    Никто "опытный" это даже читать не будет, а новичку будет понятнее, если приложишь готовый рабочий исходник.
    2. Инди все равно сакс) Имхо.
     
    #6 ErrorNeo, 14 Sep 2009
    Last edited: 14 Sep 2009
  7. Freedom

    Freedom Elder - Старейшина

    Joined:
    2 Jul 2007
    Messages:
    38
    Likes Received:
    92
    Reputations:
    8
    выложи исходник плиз )
     
    7 people like this.
  8. ~Shapaev~

    ~Shapaev~ Member

    Joined:
    24 Oct 2009
    Messages:
    29
    Likes Received:
    7
    Reputations:
    0
    статья понравилась , так как описана работа с антикапчей , что есть гут , пиши еще статьи.
     
  9. denjf

    denjf Member

    Joined:
    12 Nov 2008
    Messages:
    88
    Likes Received:
    12
    Reputations:
    -1
    Спасибо автор! Статья хорошая, мне понравилось.

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

    .Life Banned

    Joined:
    26 Dec 2009
    Messages:
    81
    Likes Received:
    3
    Reputations:
    0
    Понравилось, вот только хотел повторить и вот что пишет
    bad.Free();
    if Hp <> nil tqwertn
    Http.Free();
    end;


    что я не так зделал?
     
  11. intNet

    intNet Member

    Joined:
    31 May 2009
    Messages:
    29
    Likes Received:
    14
    Reputations:
    5
    Code:
    bad.Free(); 
    if Hp <> nil[B][U] tqwertn[/U] [/B]
    Http.Free(); 
    end;
    Там должно быть then на месте подчёркнутого.
    Вообще не имея никаких понятий о языке полез в тему о созданни автореггера.
     
  12. warwar

    warwar Banned

    Joined:
    26 May 2009
    Messages:
    0
    Likes Received:
    55
    Reputations:
    6
    статья супер! Но есть одно НО, когда компилю вылезает много ошибок. Попозже скопирую суда лог.
     
  13. niger2010

    niger2010 Member

    Joined:
    10 Mar 2010
    Messages:
    0
    Likes Received:
    7
    Reputations:
    0
    Спс) пригодится)
     
  14. tshift

    tshift Member

    Joined:
    27 Apr 2009
    Messages:
    53
    Likes Received:
    16
    Reputations:
    0
    Сорри за оффтоп:
    Для УЧЕБНЫХ целей требуется исходник реггера(не авто) под ЛЮБОЙ сервис.
    Заранее благодарен.Язык delphi
     
  15. DdoNbAsS

    DdoNbAsS New Member

    Joined:
    6 Apr 2010
    Messages:
    22
    Likes Received:
    3
    Reputations:
    0
    Спс Уматная статья пополню свою базу!
     
  16. sasha_ba4on0K

    sasha_ba4on0K New Member

    Joined:
    3 Jan 2010
    Messages:
    0
    Likes Received:
    4
    Reputations:
    0
    Спс за статью всё гуд
     
  17. zloy_pryanik

    zloy_pryanik Member

    Joined:
    26 Dec 2009
    Messages:
    14
    Likes Received:
    13
    Reputations:
    0
    Отличная статья,спасибо!
     
  18. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Пожалуйста, выложите исходники любого автореггера, что бы понять как всё это работает и увидеть на глазах. Статья конечно хорошо... но исходники лучше.. повторюсь, исходники под любой автореггер, не важно где и что он будет регистрировать. Заренее спасибо.
     
  19. MaFFFia

    MaFFFia New Member

    Joined:
    29 Sep 2010
    Messages:
    60
    Likes Received:
    0
    Reputations:
    0
    Автору темы особая благодарность.
    Статья действительно хорошая!