Print This Post Распаковываем Perl-скрипты, обработанные PerlApp

Воскресенье, 7. Август 2011
Раздел: C/C++, Perl, автор:

Как известно, для Perl, впрочем, как и для других скриптовых языков, существуют утилиты, позволяющие создавать из скрипта полноценный exe-файл, который можно переносить на другие компьютеры и запускать, даже если интерпретатор языка на них не установлен. В случае с perl'ом наиболее популярными утилитами являются Perl2Exe и PerlApp.
Принцип работы этих утилит довольно прост и состоит в упаковке внутрь результирующего exe-файла библиотеки перла, основного скрипта и зависимых модулей. Содержимое, естественно, сжимается, шифруется (с помощью XOR) и не хранится в открытом виде внутри файла. Исследуем чуть подробнее внутреннее устройство результирующих exe-файлов, которые получаются с помощью PerlApp.
Для начала, определим с помощью чего сжимаются данные. Это сделать довольно просто, например, с помощью PeID (с плагином Krypto Analyzer) или какого-нибудь hex-редактора. В случае с PeID все тривиально: указываем путь к файлу, запускаем плагин и получаем список найденных крипто-сигнатур.

С hex-редактором тоже просто: открываем нужный файл, нажимаем Alt+F6 (справедливо для Hiew), получаем список строковых ресурсов, гуглим эти строки.

Таким образом определяем, что для сжатия используется библиотека zlib, причем довольно старая версия - 1.1.4. Конечно, можно начать искать, где именно в файле хранятся сжатые данные, но мне захотелось пойти другим путем.
Читать дальше »

Print This Post Пишем простое клиент-серверное приложение на Perl

Понедельник, 1. Август 2011
Раздел: Perl, Для новичков, автор:

В этой статье я рассмотрю создание простого чата на Perl. Чат будет состоять из консольного сервера и клиента с GUI на основе Tk. Для начала реализуем серверную часть.
В серверной части мы не будем использовать процессы или потоки, а вместо этого воспользуемся мультиплексированием. Мультиплексирование довольно просто реализуется с помощью модуля IO::Select, который является классом-оболочкой над системной функцией select.
Функция select позволяет определить готовность дескриптора к записи/чтению. Также стоит отметить, что при использовании select следует избегать использования блокирующих вызовов, как, например, print, read, вместо них необходимо использовать syswrite, sysread.
Читать дальше »

Print This Post Regexp HTTP-proxy

Пятница, 4. Март 2011
Раздел: Perl, Софт, автор:

Недавно для своих нужд написал небольшой прокси-сервер, заменяющий содержимое ответа по заданному регулярному выражению. Интерфейс реализован на основе 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 следует слегка модифицировать. Изначально начало метода выглядит так:

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)

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. Ещё один неприятный момент состоит в том, что после выхода из цикла прокси не закрывает сокет. Решается добавлением строки после цикла.

$self->{daemon}->close();

Print This Post Socks5 Server

Суббота, 6. Ноябрь 2010
Раздел: Perl, автор:

Решил сделать небольшую поделку на основе двух существующих socks-серверов на perl'e. За основу были взяты sss и rdss.
Отличия:
[~] Вместо форка использованы треды
[~] Предварительно формируется пул потоков для обработки запросов
[~] Модуль MD5 выкинут, соответственно, пароль вводится в открытом виде
[~] Использует модуль IO::Select (эдакое мультиплексирование)
[~] Более читабельный код

В общем, надеюсь, кому-нибудь пригодится.
Скачать: serv.pl

Print This Post Модуль для работы с Web

Воскресенье, 18. Июль 2010
Раздел: Perl, автор:

Написал простой модуль для работы с web. Модуль довольно легкий, основан на IO::Socket::INET и IO::Socket::SSL.

Конструктор:
new()
new(arg => value, arg => value)

  Создает объект, который используется для дальнейших запросов. Доступные аргументы: agent (user-agent, который будет использоваться в запросе), timeout (таймаут соединения).

Методы:
set_cookie($arg)
  Устанавливает аргумент в качестве кукисов.

header(%arg)
  Устанавливает дополнительные заголовки.

proxy_auth($login, $passw)
  Устанавливает логин и пароль для авторизации при работе с http-прокси.

socks_auth($login, $passw)
  Устанавливает логин и пароль для авторизации при работе с socks-прокси.

proxy($proxy_type, $proxy)
  Включает работу через прокси.
  $proxy_type может принимать следующие значения: 0 - без прокси, 1 - http-прокси, 2 - socks5 прокси.
  $proxy в формате ip:port

request($method, $host, $port, $uri, $payload, $limit)
  Метод для непосредственного выполнения запроса
  $method - GET, POST, HEAD,
  $host - адрес сайта с http:// (например, http://rambler.ru),
  $port - порт,
  $uri - путь запроса (например, /index.php),
  $payload - тело POST-запроса,
  $limit - количество байт, которые необходимо считать из сокета (0 - считать весь ответ).

Примеры работы с модулем
Получение веб-страницы в переменную и вывод содержимого ответа на экран:

use Web;
my $w = Web->new(timeout => 10, agent => 'FireFox');
my $page = $w->request('GET', 'http://rambler.ru', 80, '/', '', 0);
print $page;

Работа через прокси:

use Web;
my $w = Web->new(timeout => 10, agent => 'FireFox');
$w->proxy(2, '127.0.0.1:1080'); #2 - socks5 прокси
my $page = $w->request('GET', 'https://mini.webmoney.ru', 443, '/', '', 0);
print $page;

POST запрос через прокси:

use Web;
my $w = new Web;
my $page = $w->request('POST', 'http://site.com', 80, '/auth.php', 'login=vasya&pass=petya', 0);
print $page;

Скачать: web.pm

Print This Post Simple Engine Scanner

Пятница, 16. Июль 2010
Раздел: C#, Perl, автор:

Simple Engine Scanner - инструмент для автоматического сканирования веб-сайтов на наличие уязвимостей по заранее созданной базе. Инструмент состоит из двух частей: скрипт для определения уязвимостей (Perl) и программа на C# для облегченного создания базы уязвимостей, которую этот скрипт использует.

База представляет собой XML-документ. Описывать структуру не буду, сделаю некоторые пояснения по программе, которая позволяет эти XML'ки редактировать.
(База-пример лежит в архиве, ее можно открыть и полистать для того, чтобы понятнее было.)

База содержит информацию о движках для проверки. Можно добавлять новые. Каждый движок имеет секцию "Соответствие", в которой задаются критерии, по которым двиг будет идентифицирован. Эта секция позволяет делать запросы, проверять наличие файлов на сайте, проверять, присутствуют ли заданные строки в полученном запросом контенте и проверять его соответствие заданными регулярными выражениями. Можно задать число необходимых совпадений для идентификации движка.
Секции движков также содержат подраздел "Модули", куда можно добавлять уязвимости модулей движка. Имеется такая же секция соответствия (она тут вполне может быть пустой). Можно добавить системную секцию для создания временных переменных, необходимых для тестирования модуля. Созданные переменные можно использовать для тестирования текущего модуля - они вставляются с помощью фигурных скобок, например, {myvar}. Вставка работает в запросах, в данных POST-запросов, в Cookies, в именах и описаниях уязвимостей. Обязательно парсите переменную перед тем, как ее использовать. Системная секция выполняется перед всеми остальными запросами модуля, и поэтому может быть только одна. В секцию модуля можно также добавлять уязвимости, которые опять-таки детектируются с помощью уже знакомых соответствий.

В программе редактирования БД после изменения параметров не забудьте нажать кнопку "Сохранить", а после завершения редактирования - "Сохранить БД...".

Теперь немного о скрипте для проведения тестирования.
Запускается он следующим образом:

check.pl http://example.com/forum vuln_xml_file delay log_type log_file

Первый параметр - сайт для тестирования, vuln_xml_file - имя базы, по которой будет проводиться тестирование, delay - задержка между запросами, log_type - тип логирования (0 - простой вывод в консоль краткой информации, 1 - вывод в консоль и также запись лога в файл log_file, 2 - вывод в консоль краткой информации и в файл полной информации с найденными уязвимостями и информацией о них (этот режим и рекомендуем)).

Опциональные параметры:
-encoding
Примеры использования:
-encoding=auto - автоопределение кодировки сайта;
-encoding=enc (например, -encoding=utf8) - явное задание кодировки сайта.

-redirect404
Если она указана, то 301 и 302 редиректы будут считаться за страницу 404. Полезно, например, при работе с хостингом majordomo. Если она не указана, то скрипт теперь автоматически определит, стоит ли считать 301 и 302 редиректы за страницу 404. Стоит заметить, что такие вещи работают только с HEAD-запросами (и как раз с проверками существования файлов).

Также в скрипте есть строки, позволяющие при необходимости задать http-прокси или socks5 для проведения запросов:

#Proxy
my $proxy = '127.0.0.1:8080';
#0 - no proxy; 1 - http; 2 - socks5
my $ptype = 0;

Скачать: simple engine scanner

Print This Post Simple mp3 broadcaster

Пятница, 11. Июнь 2010
Раздел: Perl, Windows, автор:

Простой консольный скрипт на Perl'е для вещания mp3 потока в сеть. Проигрывает треки случайным образом из заданной директории.

Желающие также могут воспользоваться .bat файлом и netcat для этих целей:

@ECHO OFF
SET music=C:\music\
SET port=1234
 
FOR /R %music% %%G IN (*.mp3) DO (
	echo Playing: %%G
	echo.
	(
		echo "HTTP/1.0 200 OK\r\nContent-Type: audio/x-mp3stream\r\n\r\n"
		type "%%G"
	) | nc -l -p %port% > NUL
)

Скачать: pl+bat

Print This Post Small VK notifier

Суббота, 13. Март 2010
Раздел: Perl, Социальные сети, автор:

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

Для работы необходим модуль Win32::GUI.

Скачать: vkmon

P.S.
Обновил Yet Anoter Odnoklassniki Sender (добавил поддержку антикапчи, макрос <<smile>>): Скачать
И несколько сигнатур для патчера: Скачать

Print This Post Mini Facebook Sender

Суббота, 27. Февраль 2010
Раздел: Perl, Социальные сети, автор:

Написал небольшой скрипт рассылки по фейсбуку

[!] На данный момент шлет только по друзьям
[+] Многопоточность
[+] Антикапча
[+] Ротация сообщений
[+] Автообновление

Настройка скрипта производится в файле config.cfg.
Скрипт практически не тестировался. Обо всех ошибках и пожеланиях просьба сообщать в комментариях.

P.S. Если используете аккаунты, не подтвержденные по смс, то будет много капчи.

Скрипт: скачать

Print This Post Конкурс ВКонтакте

Воскресенье, 13. Декабрь 2009
Раздел: Perl, Социальные сети, автор:

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

- покупка зарубежного траффика
- реклама на зарубежных сайтах
- приглашение средствами контакта

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

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

Первый способ показался мне слишком медленным, так как контакт лимитирует частоту обращения к своим страницам, то реальная скорость получается ~2-3 приглашения в секунду. Второй способ позволяет отправлять типовые сообщения по списку email'ов, то есть скорость возрастает на несколько порядков (я пробовал отправлять по 500 приглашений за один запрос с задержкой 400 мс).

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

Скрипт: скачать

P.S. Не забудьте сменить язык на английский в настройках Вашего аккаунта.

Страница 1 из 3123