 |

19.03.2017, 09:33
|
|
Флудер
Регистрация: 21.05.2015
Сообщений: 2,031
С нами:
5779766
Репутация:
72
|
|
Предупреждение: Все авторские права и сама статью принадлежат нашему форумчанину
SooLFaa.
Как и обещал публикую очередную статью нашего друга по форуму SooLFaa.
Вечер в хату, Арестанты. Приветствую вас господа. Попросил меня мой хороший товарищ, значится, написать такую программулину, которая будет менять вёрстку в браузере на лету, дабы похвастаться перед друзьями сколько много у него денег на счету или обмануть каких - нибудь людей "взломом вк".
Казалось бы, "Да чё нам стоит - дом построить", залез в исходный код элемента, нажал редактировать элемент, поменял в вёрстке на нужный элемент. Профит. Дело это, конечно, хорошее, но беда в том, что ничего из этого не выйдет и после перезагрузки страницы наш счет вернется на прежний. Что же давайте это поправим....
Итак, пишем собственного бота для работы со стороннем браузером на C# или прокси сервер.
Надо ли говорить, что в ненадежных руках, эта штука, представляет серьезную опасность, поэтому сорцы будут чуток битые.
Поехали.
Открываем Visual Studio, создаем консольный проект. А далее устанавливаем следующий пакет.
Код:
Install-Package Titanium.Web.Proxy
Как это сделать?
Открываем Консоль диспетчера пакетов
И в окне вводим команду выше.
А далее всё просто. Пишем следующий код.
Код:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ProxyServer proxy = new ProxyServer();
proxy.TrustRootCertificate = true;
proxy.BeforeRequest -= OnRequest; // Подписываем методы запрос
proxy.BeforeResponse -= OnResponse; // Подписываем методы ответа
proxy.ServerCertificateValidationCallback -= OnCertificateValidation; // Получени сертификата для SSL
proxy.ClientCertificateSelectionCallback -= OnCertificateSelection;
// Создаем точки входа и исключения
ExplicitProxyEndPoint explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Any, 8000, true);
proxy.AddEndPoint(explicitEndPoint);
proxy.Start();
var transparentEndPoint = new TransparentProxyEndPoint(IPAddress.Any, 8001, true)
{
GenericCertificateName = "google.com"
};
proxy.AddEndPoint(transparentEndPoint);
foreach (ProxyEndPoint endPoint in proxy.ProxyEndPoints)
Console.WriteLine("Listening on '{0}' endpoint at Ip {1} and port: {2} ",
endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port);
// Устанавливаем прокси
proxy.SetAsSystemHttpProxy(explicitEndPoint);
proxy.SetAsSystemHttpsProxy(explicitEndPoint);
Console.Read();
proxy.BeforeRequest -= OnRequest;
proxy.BeforeResponse -= OnResponse;
proxy.ServerCertificateValidationCallback -= OnCertificateValidation;
proxy.ClientCertificateSelectionCallback -= OnCertificateSelection;
proxy.Stop();
}
public static async Task OnRequest(object sender, SessionEventArgs e)
{
Console.WriteLine(e.WebSession.Request.Url);
requestHeaders = e.WebSession.Request.RequestHeaders;
var method = e.WebSession.Request.Method.ToUpper();
if ((method == "POST"))
{
byte[] bodyBytes = await e.GetRequestBody();
await e.SetRequestBody(bodyBytes);
string bodyString = await e.GetRequestBodyAsString();
await e.SetRequestBodyString(bodyString);
}
}
public static async Task OnResponse(object sender, SessionEventArgs e)
{
var responseHeaders = e.WebSession.Response.ResponseHeaders;
if (e.WebSession.Request.Method == "GET" || e.WebSession.Request.Method == "POST")
{
// Если всё ок возвращаем ответ
if (e.WebSession.Response.ResponseStatusCode == "200")
{
if (e.WebSession.Response.ContentType != null && e.WebSession.Response.ContentType.Trim().ToLower().Contains("text/html"))
{
byte[] bodyBytes = await e.GetResponseBody();
await e.SetResponseBody(bodyBytes);
// если запрашиваем вконтакте
if (e.WebSession.Request.Url.Contains("vk.com"))
{
//то изменяем верстку
string body = e.GetResponseBodyAsString();
await e.SetResponseBodyString(body.Replace(@"W.E.L.C.O.M.E..", @"Специально для Codeby"));
}
else
{
string body = await e.GetResponseBodyAsString();
await e.SetResponseBodyString(body);
}
}
}
}
}
public static Task OnCertificateValidation(object sender, CertificateValidationEventArgs e)
{
if (e.SslPolicyErrors = System.Net.Security.SslPolicyErrors.None)
e.IsValid = true;
return Task.FromResult(0);
}
public static Task OnCertificateSelection(object sender, CertificateSelectionEventArgs e)
{
return Task.FromResult(0);
}
}
}
Меня просили пилить видосики к статьям, вот Вам видосик.
Большое человеческое спасибо автору статей SooLFaaза разрешение публикации его статьи.
Ждем от таких их же интересных статей в дальнейшем.
|
|
|

19.03.2017, 16:31
|
|
Новичок
Регистрация: 04.01.2016
Сообщений: 14
С нами:
5451446
Репутация:
0
|
|
Когда есть лохи делишки у нас не плохи!
|
|
|

19.03.2017, 18:21
|
|
Участник форума
Регистрация: 21.10.2007
Сообщений: 147
С нами:
9766110
Репутация:
31
|
|
UserJS и кастомные CSS тоже могут это сделать. И изобретать велосипед не надо. Хотя конечно кто с чем работает тот так все и видит.
|
|
|

19.03.2017, 20:55
|
|
Постоянный
Регистрация: 17.03.2014
Сообщений: 530
С нами:
6398966
Репутация:
154
|
|
Сообщение от LynXzp
↑
UserJS и кастомные CSS тоже могут это сделать. И изобретать велосипед не надо. Хотя конечно кто с чем работает тот так все и видит.
Эммм кастомные CSS?! Причем тут они? Задача была написать по факту прокси сервер. Чтобы любая тачка и любой браузер на лету мог видоизменять траффик. Это я приурочил как пример, в вкшке менял строку, а так идея куда глобальнее, чтобы с этим траффиком можно было в итоге программно работать ну и опять же кроссбраузерность.
|
|
|

19.03.2017, 20:57
|
|
Постоянный
Регистрация: 17.03.2014
Сообщений: 530
С нами:
6398966
Репутация:
154
|
|
Просьба к ТС только. Если форкаешь, то без уважаемых и дорогих друзей. На этом форуме есть люди, которые куда респектабельнее меня.
|
|
|

22.03.2017, 19:32
|
|
Участник форума
Регистрация: 21.10.2007
Сообщений: 147
С нами:
9766110
Репутация:
31
|
|
Сообщение от SooLFaa
↑
Задача была написать по факту прокси сервер. Чтобы любая тачка и любой браузер на лету мог видоизменять траффик.
А в посте:
Сообщение от None
программулину, которая будет менять вёрстку в браузере на лету
Ну... менять верстку и менять траффик не совсем одно и то же.
Сообщение от None
кросплатформенность
Greasemonkey и stylish есть практически для всех браузеров, а для которых нет - есть другие. А CSS и JS они в любом браузере одинаковы.
Конечно с их помощью все не сделаешь, прокси более универсально, но опять таки - для простых примеров они лучше подходят из-за скорости разработки и проверки, нажал Ctrl+S в скрипте - и сайт перерисовался.
|
|
|

22.03.2017, 19:34
|
|
Постоянный
Регистрация: 17.03.2014
Сообщений: 530
С нами:
6398966
Репутация:
154
|
|
Сообщение от LynXzp
↑
А в посте:
Ну... менять верстку и менять траффик не совсем одно и то же.
Greasemonkey и stylish есть практически для всех браузеров, а для которых нет - есть другие. А CSS и JS они в любом браузере одинаковы.
Конечно с их помощью все не сделаешь, прокси более универсально, но опять таки - для простых примеров они лучше подходят из-за скорости разработки и проверки, нажал Ctrl+S в скрипте - и сайт перерисовался.
Окей. А если задача скажем редиректить пользователя со всех сайтов оканчивающихся на домен .ru?
|
|
|

18.05.2017, 06:18
|
|
Участник форума
Регистрация: 08.05.2007
Сообщений: 100
С нами:
10004891
Репутация:
28
|
|
Сообщение от None
Вечер в хату, Арестанты.
Лучшее начало статьи, я считаю.
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|