Недавно для своих нужд написал небольшой прокси-сервер, заменяющий содержимое ответа по заданному регулярному выражению. Интерфейс реализован на основе Tk, сам сервер построен на основе модуля HTTP::Proxy, так как в нем есть довольно удобная система фильтров.
Замена может производиться как по статическим строкам, так и по полноценным регулярным выражениям. Если в регулярном выражении производится захват некоторого фрагмента, то доступ к нему в подставляемом тексте осуществляется стандартным для перла способом ($1, $2, ...).
Скачать: proxy_regex
В процессе разработки столкнулся со следующими проблемами, на которые рекомендую обратить внимание:
1. При использовании Tk вместе с методами fork или async, необходимо закрывать хендлы STDIN и STDOUT. В противном случае, Perl будет крешиться (фича или баг библиотеки encoding.dll, если не закрывать хендлы, то в ней вызывается метод, приводящий к попытке разыменования указателя на недопустимую область памяти).
2. HTTP::Proxy по-умолчанию довольно специфично работает с кодировками, поэтому стоит использовать заготовки fizbin'a с perlmonks.
3. При запуске win* используется HTTP::Proxy::Engine::NoFork, все бы хорошо, но если существует потребность производить остановку сервера по сигналу, то содержимое метода run следует слегка модифицировать. Изначально начало метода выглядит так:
1 2 3 4 5 6 |
sub run { my $self = shift; my $proxy = $self->proxy; # check for new connections for my $fh ( $self->select->can_read() ) { |
Т.к. аргумента у метода can_read нет, то данный вызов является блокирующим. Соответственно, цикл из метода start (модуль HTTP::Proxy)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sub start { my $self = shift; $self->init; $SIG{INT} = $SIG{TERM} = sub { $self->{loop} = 0 }; # the main loop my $engine = $self->engine; $engine->start if $engine->can('start'); while( $self->loop ) { $engine->run; last if $self->max_connections && $self->conn >= $self->max_connections; } |
не сразу прекращается при получении сигнала. Поэтому я добавил аргумент в методе can_read для своевременной реакции на сигналы.
4. Ещё один неприятный момент состоит в том, что после выхода из цикла прокси не закрывает сокет. Решается добавлением строки после цикла.
1 |
$self->{daemon}->close(); |
Нормально!
Интересно!
Захожу к вам каждый день ))
2Arck подпишись на РСС ))
хорошая шутка - только не работает
d:\downloads\proxy>perl -v
This is perl, v5.10.1 (*) built for MSWin32-x86-multi-thread
Copyright 1987-2009, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
d:\downloads\proxy>ver
Microsoft Windows [Version 6.1.7601]
d:\downloads\proxy>perl start.pl
беру свои слова обратно, но UTF-8 все-равно как-то странно работает
На perl 5.8.9 под win вроде нормально работало с utf-8, по-крайней мере в контексте rambler.ru
Немного не в тему:
Каими на твоём блоге нашёл море полезной информации и софта. А не мог бы ты выложить рабочий брут акков mail.ru ?
Сколько искал, рабочих не нашёл
Брутить можно любым брутом с поддержкой pop3 + прокси нужны. Брут, например, hydra
спасибо, попробую гидрой.
Как на счет socks5 и фильтрации https (ssl)? ОЧЕНЬ нужна такая прокся как тут, но с фильтрацией securного трафика. В Charles есть расшифровка https (надо всего лишь установить сертификат и юзать socks5), но модуль rewrite не работает с https :( .
Fiddler вроде такое умеет
есть же 3proxy (с поддержкой upstream к тому же) + PCRE плагин к нему
http://www.3proxy.ru/plugins/PCREPlugin/?l=RU