C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Задолбали спамом пора попытаться наказать, Использование TCppWebBrowser ???
Admin
Отправлено: 29.08.2005, 21:57


Владимир

Группа: Администратор
Сообщений: 1190



Интересует вот какой вопрос.

Есть некие нехорошие товарищи (а попросту козлы), которые
уже задолбали своим ... спамом. sad.gif

Ни на какие увещевания не реагируют продолжают егос слать и слать.
Очень хотелось бы их также чем нибудь зае-ть.

(да и не одни они такие, рекламой виагры задолбали и пр.
по 3 рекламы виагры за день приходит)

У них есть сайт на который приводит реклама:

http://www.timesteercool.com/shop/products.php

а на нем — разные формы загрузки, регистрации и пр.

Как мы знаем, мы можем программно из C++Builder
заполнить эти поля и программно нажать клавишу Submit
а если эту замечательную процедуру еще вставить
в цикл
CODE

for(int i=1; i< 1000000; i++){
     sentForm( );
     }

biggrin.gif biggrin.gif biggrin.gif

Вы поняли я думаю ...
Со своим безлимитным Стримом я это дело
могу поставить уходя на работу на весь день ... biggrin.gif

Но возникают некоторые вопросы ...

Допустим мы решили сделать это доброе дело,
воспользовавшись компонентом TCppWebBrowser:


Код отправки приблизительно следующий:
CODE

void __fastcall TFMain::sentForm(AnsiString sEmail, AnsiString sPass)
{
   IHTMLDocument2 *pHTMLDocument = NULL;
   if(SUCCEEDED(CppWebBrowser->Document->QueryInterface(
   IID_IHTMLDocument2, (LPVOID*)&pHTMLDocument)))
 {
    if(pHTMLDocument != NULL)
 {
   IHTMLElementCollection *pAll = NULL;
   if(SUCCEEDED(pHTMLDocument->get_all(&pAll)) && pAll)
   {
     TVariant vName1 = "email", vName2 = "pass";
     TVariant vIndex=0;

      // put into input element <input... email
     IDispatch *pDisp1=NULL;
     if(SUCCEEDED(pAll->item(vName1, vIndex, &pDisp1)) && pDisp1)
    {

       IHTMLInputElement *pInput = NULL;
       if(SUCCEEDED(pDisp1->QueryInterface(IID_IHTMLInputElement,
        (LPVOID*)&pInput)) && pInput)
        {
        pInput->put_value(WideString(sEmail));
        pInput->Release();
        }
        pDisp1->Release();
    }//pDisp1

     // put into input element <input...pass
     IDispatch *pDisp2=NULL;
      if(SUCCEEDED(pAll->item(vName2, vIndex, &pDisp2)) && pDisp2)
     {

        IHTMLInputElement *pInput = NULL;
        if(SUCCEEDED(pDisp2->QueryInterface(IID_IHTMLInputElement,
         (LPVOID*)&pInput)) && pInput)
         {
         pInput->put_value(WideString(sPass));
         pInput->Release();
         }
         pDisp2->Release();
     }//pDisp2

       }//pAll
        pAll->Release();

   }

     // click SUBMIT()
     IHTMLElementCollection *HTMLForms = NULL;
     if(SUCCEEDED(pHTMLDocument->get_forms(&HTMLForms)) && HTMLForms)
     {
       TVariant vName3; // имя формы у них не указано — определяем по индексу
       TVariant vIndex3 = 1; // индекс формы (вторая форма на странице)
       IDispatch *pDisp3 = NULL;
       if(SUCCEEDED(HTMLForms->item(vName3, vIndex3, &pDisp3)) && pDisp3)
       {
         IHTMLFormElement *HTMLForm = NULL;
         if(SUCCEEDED(pDisp3->QueryInterface(IID_IHTMLFormElement,
           (LPVOID*)&HTMLForm)) && HTMLForm)
         {
           HTMLForm->submit();
           HTMLForm->Release();
         }
         pDisp3->Release();
       }
       HTMLForms->Release();
     }

 pHTMLDocument->Release();
 }
}
//---------------------------------------------------------------------------
// Sent form

void __fastcall TFMain::tbPasteClick(TObject *Sender)
{
  for(int i=1; i< 1000000; i++){
     Application->ProcessMessages();
     AnsiString se = "ni"+IntToStr(i)+"@yandex.ru";
     AnsiString sp = "pizda"+IntToStr(i); // формируем email и пасс
     sentForm(se, sp);
     }
}
//---------------------------------------------------------------------------


И вот тут возникает вопрос — будет ли в цикле происходить
корректно заполнение/отправка формы или еще надо
как-то проверять, что форма после очередной отправки
данных готова к принятию и отправке новых данных ???

Еще какие будут предложения по завалу таких сайтов ?

** Admin
Отправлено: 29.08.2005, 22:30


Не зарегистрирован







Да, забыл сказать, еще испытал вот такой код

CODE

// Sent form

void __fastcall TFMain::tbPasteClick(TObject *Sender)
{
for(int i=1; i< 1000000; i++){
if(CppWebBrowser->Busy){
SBar->Panels->Items[1]->Text = "Браузер занят";
Application->ProcessMessages();
i--; continue;
}
else SBar->Panels->Items[1]->Text = "Цикл № "+IntToStr(i);
Application->ProcessMessages();
AnsiString se = "ni"+IntToStr(i)+"@yandex.ru";
AnsiString sp = "pizda"+IntToStr(i);
if(sentForm(se, sp) == false) i--;
}
}
//---------------------------------------------------------------------------

bool __fastcall TFMain::sentForm(AnsiString sEmail, AnsiString sPass)
{
bool isOk = true;

IHTMLDocument2 *pHTMLDocument = NULL;
if(SUCCEEDED(CppWebBrowser->Document->QueryInterface(
IID_IHTMLDocument2, (LPVOID*)&pHTMLDocument)))
{
if(pHTMLDocument != NULL)
{
IHTMLElementCollection *pAll = NULL;
if(SUCCEEDED(pHTMLDocument->get_all(&pAll)) && pAll)
{
TVariant vName1 = "email", vName2 = "pass";
TVariant vIndex=0;

// put into input element <input...
IDispatch *pDisp1=NULL;
if(SUCCEEDED(pAll->item(vName1, vIndex, &pDisp1)) && pDisp1)
{

IHTMLInputElement *pInput = NULL;
if(SUCCEEDED(pDisp1->QueryInterface(IID_IHTMLInputElement,
(LPVOID*)&pInput)) && pInput)
{
pInput->put_value(WideString(sEmail));
pInput->Release();
}else isOk = false;
pDisp1->Release();
}else isOk = false;//pDisp1

// put into input element <input...
IDispatch *pDisp2=NULL;
if(SUCCEEDED(pAll->item(vName2, vIndex, &pDisp2)) && pDisp2)
{

IHTMLInputElement *pInput = NULL;
if(SUCCEEDED(pDisp2->QueryInterface(IID_IHTMLInputElement,
(LPVOID*)&pInput)) && pInput)
{
pInput->put_value(WideString(sPass));
pInput->Release();
}else isOk = false;
pDisp2->Release();
}else isOk = false;//pDisp2

} else isOk = false;//pAll
pAll->Release();

} else isOk = false;

// click SUBMIT()
IHTMLElementCollection *HTMLForms = NULL;
if(SUCCEEDED(pHTMLDocument->get_forms(&HTMLForms)) && HTMLForms)
{
TVariant vName3; // íàçâàíèå íåèçâåñòíî — áåðåì ïî èíäåêñó
TVariant vIndex3 = 1;
IDispatch *pDisp3 = NULL;
if(SUCCEEDED(HTMLForms->item(vName3, vIndex3, &pDisp3)) && pDisp3)
{
IHTMLFormElement *HTMLForm = NULL;
if(SUCCEEDED(pDisp3->QueryInterface(IID_IHTMLFormElement,
(LPVOID*)&HTMLForm)) && HTMLForm)
{
HTMLForm->submit();
HTMLForm->Release();
}else isOk = false;
pDisp3->Release();
}
HTMLForms->Release();
} else isOk = false;

pHTMLDocument->Release();
} else return false;
return isOk;
}
//---------------------------------------------------------------------------


вставив проверки, но не уверен что эти проверки
правильные, может еще что надо проверять, чтобы
быть увереным что цикл не просто крутиться а все
нормально отсылает на сервер ?

Отредактировано Admin — 29/08/2005, 22:37
Admin
Отправлено: 29.08.2005, 22:42


Владимир

Группа: Администратор
Сообщений: 1190



Проект к C++Builder 6 прилагаю. (7 Кб)

User Attached Image Скачать файл
Wb.zip


Sl@Sh
Отправлено: 30.08.2005, 10:56


Мастер участка

Группа: Участник
Сообщений: 383



Согласен, спам задалбывает. Но может возникнуть такая проблема :
Авторегистрация не всегда проходит. В последнее время любая регистрация зашищается специальным кодом, который генерируется случайным образом в виде изображения.

Со спамом можно так : оповестить про этот сайт в службу спама (сайт не помню). + Любой нормальный почтальен способен делать такую вот штуку : если вам приходит письмо, он автоматом высылает ответ с подтверждением того, что отправитель действительно желает, чтобы вы получили письмо. Спамеры врядли сами письма отправляют, поэтому
на подобные подтвердительные письма ответят только те, кто не спамер.

А вообще нужно дырку в сайте поискать. Найти и залезть туда. На это время нужно, но если всё-таки найти ............... biggrin.gif

Отредактировано Sl@Sh — 30/08/2005, 11:02
Gedeon
Отправлено: 30.08.2005, 13:16


Ветеран

Группа: Модератор
Сообщений: 1742



Ну, Владимир, не знаю к чему приведет такая идея, но во первых можно по домену(адресу) отправителя просто забанить все эти письма и забыть. Можно найти действительно эти антиспамерские службы, товарищи моментально попадут в блэклисты, можно повоздействовать на их провайдера, а при такой ситуации им стоит поменять что-то в регистрации и все прийдется переделывать, мож почитать какие хакерские статейки и просто положить их сайт?
Admin
Отправлено: 30.08.2005, 15:39


Владимир

Группа: Администратор
Сообщений: 1190



Собственно чего хотел — реализовал и попробовал !!! biggrin.gif biggrin.gif biggrin.gif

Все эти письма забанить тяжело — во первых с IP адреса
могут идти реальные посетители, и вырубать IP — ха...ха...
а притом при каждом соединении со Стримом он мне выдает
разные IP адреса, причем сильно отличающиеся !!!


Программу (вариант Antispam-beta) написал.

Итак — возможности:

Программа автоматически заполняет форму
и отправляет ее указанное количество раз.

1/ вводим адрес страницы сайта спамера, где есть форма например
предлагается регистрация, покупка товара и прочее.

2/ Загружаем эту страницу

3/ Смотрим ее html-код (нужные нам имя формы или ее индекс,
названия полей, которые будем заполнять)

4/ Вносим название формы и этих полей в настройки.
5/ Указываем кол-во циклов. biggrin.gif
6/ Жмем кнопку Отправить ... любуемся процессом ....

Недостатки и недоделки (надеюсь устраню):

1/ В получаемом HTML-коде в RichEdit сделать выделение всего текста
внутри тегов form, чтобы сразу эти формы были нам видны.

2/ Сделать автоматический ввод данных помимо тегов input
и password в теги: userfile (загрузим гадам тонну файлов),
textarea, chechbox и radiobutton.

3/ Сделать запоминание настроек (хоть может и не стоит)
в файле.

Все можно скачивать и пробовать. (15 Кб)


User Attached Image Скачать файл
AntiSpam.zip


Лена
Отправлено: 30.08.2005, 16:23


Мастер участка

Группа: Участник
Сообщений: 501



Применены сторонние компоненты?
Ругается #include "RxRichEd.hpp" sad.gif
Admin
Отправлено: 30.08.2005, 16:27


Владимир

Группа: Администратор
Сообщений: 1190



Обычные компоненты RXlib.

Можете заменить RxRichEdit на обычные RichEdit (2 шт на форме FHTML)
или включите этот заголовок.
Sl@Sh
Отправлено: 31.08.2005, 12:57


Мастер участка

Группа: Участник
Сообщений: 383



Там форма регистрации проста как тип char smile.gif У многих есть гораздо более мудрёные и многостраничные.

А через несколько заполнений правда выдаёт — "You have submitted too many times!". И всё-же немного подбомбить удалось. Ради прикола можно ещё разок smile.gif
Admin
Отправлено: 31.08.2005, 13:27


Владимир

Группа: Администратор
Сообщений: 1190



Так в программе можно и настроить почти под любую форму регистрации, или покупки товара (если спамит интернет-магазин).

Главное что "бомбежка" работает. biggrin.gif

Работаю над доделкой — раскраска (выделение тегов form),
добавлении полей типа textarea , userfile и других.

А заодно есть и исходный код программы,
при необходимости кому надо могут что-то полезное
посмотреть для себя по работе с CppWebBrowser
с автоматическим заполнением полей формы и ее отправкой,
например переделать код для автоматичской передачи данных из
некоей базы данных.
Admin
Отправлено: 31.08.2005, 17:58


Владимир

Группа: Администратор
Сообщений: 1190



Завершил еще часть работы.

Добавил возможность автоматического добавление полей формы
типа textarea, hidden, userfile(отправка файлов в цикле)

Заменил сторонние компоненты RxRichEdit (из RxLib),
на стандартный RichEdit C++Builder 6.

Переработал код для подстановки переменных значений,
теперь вы сами выбираете переменное значение,
в котором вместо знака # будет подставлен номер цикла
(в том числе и в указанном вами email-адресе)
например вы указываете переменный email: name#@rambler.ru
для 3 циклов будут сформированы 3 адреса:
name1@rambler.ru name2@rambler.ru name3@rambler.ru

Вроде-бы решил проблему с перекидыванием/возвратом:
Так, после отправки формы часто адрес страницы меняется,
и необходимо перед новой отправкой данных дождаться
отправки введенных данных, полной загрузки новой страницы,
корректно вернуться на форму отправки (тоже дождавшись ее
полной загрузки ) и продолжить цикл отправки данных.
Вроде все работает.

В просматриваемый HTML-код добавил выделение красным цветом
текста между тегами
HTML
<form>...</form>
для простого
поиска и просмотра внутри этих тегов.

Также исправил некоторые неточности и ошибки,
добавил местами комментарии по коду.

Улучшения продолжаются ...

Новая версия программы AntiSpam2 (17 Кб)


User Attached Image Скачать файл
AntiSpam2.zip


Booster
  Отправлено: 01.09.2005, 20:14


Ученик-кочегар

Группа: Участник
Сообщений: 29



А моно в цикле отправить парочку милионов писем на указаное мыло?
Guest
Отправлено: 02.09.2005, 15:24


Не зарегистрирован







Оно отправляет не на мыло ! Это не спамерская программа,
а валит почти любые сайты, на которых есть формы для ввода
данных.
Иван
Отправлено: 03.09.2005, 13:13


Машинист паровоза

Группа: Участник
Сообщений: 207



как то, еще на старом форуме задавал вопрос о том как заполнять формы в интернете и програмно нажать submit, и кто то сказал что такое нельзя, правда там задача немного другая наверное(отсылка sms с сайта, "нельзя сказал, работник компании сотовой связи)
но сейчас там есть поле ввода числа с картинки sad.gif
как это обойти?

Отредактировано Иван — 03/09/2005, 13:46
Admin
Отправлено: 03.09.2005, 14:01


Владимир

Группа: Администратор
Сообщений: 1190



Число на картинке никак не обойти, остальное обходиться
и отсылается, испытания на спамерах идут успешно smile.gif
скоро выложу новый вариант с описанием того, что
пришлось обходить и как, и что добавил в новый вариант
программы. Остальное все нормально работает.
Admin
Отправлено: 03.09.2005, 16:50


Владимир

Группа: Администратор
Сообщений: 1190



Как и обещал, внес некоторые дополнения и изменения.

В их числе:

1/ добавил возможность программного заполнения
полей типа input type=radio , input type=checkbox, и select

2/ В связи с тем, что на некоторых сайтах есть режим флуд-контроля
(20-30 секунд и пр) в программу введен параметр
"режим задержки между отправками" куда можно ввести это число.

3/ В связи с тем, что на некоторых спамерских сайтах при
каждом новом заходе на страничку выдается уникальный id номер,
появилась возможность получать значения полей автоматически
"с сайта". Прописываете полю значение "с сайта" и при каждом
цикле программа считывает новое значение этого номера
и подставляет его автоматически в значение поля.

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

4/ Изменился код отправки формы и возврата в форму заполнения.

P.S. Испытания-улучшения продолжаются.

Измененный улучшшенный вариант AntiSpam3 (17 Кб)


User Attached Image Скачать файл
AntiSpam3.zip


Иван
Отправлено: 05.09.2005, 09:27


Машинист паровоза

Группа: Участник
Сообщений: 207



QUOTE (Admin @ 29/08/2005, 21:57)
Со своим безлимитным Стримом ...

Дайте пожалуйста ссылку на сайт вашего провайдера, а еще лучще на описание вашего "безлимитного", интересно сколько у вас интернет стоит smile.gif

Отредактировано Иван — 05/09/2005, 09:28
Admin
Отправлено: 05.09.2005, 09:38


Владимир

Группа: Администратор
Сообщений: 1190



http://stream.ru
Тарифные планы на: http://stream.ru/tariffs/
Лена
Отправлено: 05.09.2005, 13:20


Мастер участка

Группа: Участник
Сообщений: 501



Вы говорили, что убрали RXLib.
Проект не компилируется пишет:
[C++ Warning] Unit1.cpp(529): W8070 Function should return a value
[C++ Warning] Unit2.cpp(22): W8004 'pItem' is assigned a value that is never used
[Linker Fatal Error] Fatal: Unable to open file 'RXDB6.LIB'
sad.gif
Admin
Отправлено: 05.09.2005, 13:26


Владимир

Группа: Администратор
Сообщений: 1190



мммм... Убрал.
на Warning можете внимания не обращать.
Значение имеет Linker Fatal Error.

Зайдите в .bpr файл каким-нибудь редактором, который не портит
код ("блокнот" его портит, что-то там удаляет/добавляет)
(я обычно это делаю в FAR-е по F4) и вручную удалите
все ссылки на файлы Rx... проект откомпилиться.

В следующей версии (надеюсь сегодня выложу)
сам пройдусь по .bpr и удалю лишнее, C++Builder
сам зачем-то включает эти библиотеки в .bpr, хоть я их
в этом проекте и не использую.
Лена
Отправлено: 05.09.2005, 13:36


Мастер участка

Группа: Участник
Сообщений: 501



QUOTE (Admin @ 05/09/2005, 13:26)



В следующей версии (надеюсь сегодня выложу)
сам пройдусь по .bpr и удалю лишнее, C++Builder

Подожду новой версии.
Только комментариев побольше smile.gif
Admin
Отправлено: 05.09.2005, 15:11


Владимир

Группа: Администратор
Сообщений: 1190



Сделал.

Убрал эти библиотеки из bpr, должно все корректно компилиться.

Добавил:

1/ Редактирование полей (было только добавить/удалить)

2/ Сохранение полей форм в файл, чтобы потом не надо
было для каждой страницы вводить эти поля заново.
Теперь можно 1 раз заполнить поля формы после
чего сохранить эти поля в файл,
и по быстрому их доставать из файла и отправлять.
( сохраняются в папке с программой в файле Sites.ini )

Думаю что больше доделывать/переделывать не буду,
эта версия будет тут окончательной. wink.gif

Писал для себя на скорую руку, по хорошему для более серьезных
вещей там нужно многое делать более корректно
(ничего особо сложного нет, только нужно время и желание):

оформить всё через классы и их методы, использовать векторы,
изменить функцию получения значений полей "с сайта" (как уже
сделано присвоение значений — через COM-интерфейс к полям формы)
(pInput->get_value(...)), таким путем вообще можно автоматически
при получении страницы получить и СРАЗУ ЗАПОЛНИТЬ список форм
страницы и их полей.(хотя бы присвоив им всем значения "с сайта"),
так было бы и удобней и правильней, соответственно на одной
интернет-странице может быть несколько нужных для отправки
форм, значит переделать интерфейс, для выбора нужной формы,
если их на странице несколько и т.д., поколдовать с циклом
отправки ...

Проект прилагается (21Кб)

P.S. Кстати, за это время испытал программу на десятке разных
сайтов и форумов и интернет-магазинов, очень многие из
посещенных (95%) не защищены от нее никак.

Отредактировано Admin — 05/09/2005, 15:18

User Attached Image Скачать файл
AntiSpam4.zip


AHDPE
Отправлено: 10.09.2005, 15:12


Ученик-кочегар

Группа: Участник
Сообщений: 25



А как можно открывать страницы и отсылать данные через прокси?

Отредактировано AHDPE — 10/09/2005, 15:13
Guest
Отправлено: 10.09.2005, 18:23


Не зарегистрирован







Если я правильно понимаю, то TCppWebBrowser
это фактически лишь оболочка от InternetExplorer (IE)
то есть фактически Вы в программе работаете с IE через
COM-интерфейсы.
То есть — какой доступ в настройках IE пропишите -
такой доступ и будет.
Пропишите в свойствах IE доступ через прокси -
будете и из этой программы получать доступ через
прокси.

AHDPE
Отправлено: 11.09.2005, 07:38


Ученик-кочегар

Группа: Участник
Сообщений: 25



То, что TCppWebBrowser использует настройки IE, я нашел, а как поменять в разрабатываемом приложении прокси я не знаю. Порылся в реестре, нешел какие-то ключи, но ничего не получается — TCppWebBrowser иснользует настройки, которые меняешь вручную.
Guest
Отправлено: 11.09.2005, 09:36


Не зарегистрирован







Я тоже не знаю, поэтому самый простой выход -
поменять их предварительно в IE.
Sl@Sh
Отправлено: 11.09.2005, 17:30


Мастер участка

Группа: Участник
Сообщений: 383



Admin, а почему бы вам просто не сделать прогу, аля RoboForm. Это даст вам пользу сразу в двух направлениях — прогой будут пользоваться не только для борьбы со спамом, а вы сможите и для этого применять.
GIZMO
Отправлено: 16.09.2005, 10:06


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Guest @ 11/09/2005, 09:36)
Я тоже не знаю, поэтому самый простой выход -
поменять их предварительно в IE.

Поиск иногда помогает:
https://rxlib.ru/forums/index.php?ac...d69bbde3742cce9
aquanet sk
Отправлено: 13.01.2007, 01:52


Станционный диспетчер

Группа: Участник
Сообщений: 87



Я вижу тут неплохо разбираются теперь в компоненте CppWebBrowser.

Подскажите, как реализовать следующее, думаю побочно это тоже можно отнести к данной теме.
Поскольку я управляю страничкой эмулцией нажатия клавиши Tab, кода никакого нет, только забиваю число нажатий для перехода к полю ввода или кнопке.
Итак,
мне надо чтобы перемещение кнопокой Tab по страничке, загруженной в CppWebBrowser, происходило как в Opere, т.е. только по полям ввода, кнопкам и радиокнопкам.

Буду рад любой помощи.

Вернуться в Вопросы программирования в C++Builder