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 Пишем на русском в Native Mode

Среда, 26. Январь 2011
Раздел: C/C++, Windows, автор:

Недавно у меня возникла необходимость писать на русском в нативном приложении, но, как оказалось, добиться этого не так-то просто.
Для того, чтобы получить возможность вывода русских букв, нужно разобраться, где и в каком формате хранятся глифы символов, которые отображаются на экране. Если подробнее рассмотреть функцию winx_printf (в своем проекте я использовал ZenWINX и NDK для упрощения разработки приложения), то мы увидим, что она в свою очередь вызывает winx_print, далее вызывается NtDisplayString, которая преобразует входящую строку с помощью RtlUnicodeStringToOemString, далее идет вызов функции InbvDisplayString, которая обращается к VGA Boot Driver (bootvid.dll).
Читать дальше »

Print This Post Языки программирования для быстрого заработка

Среда, 1. Декабрь 2010
Раздел: $$$, Жизнь, Это интересно, автор:

Эта небольшая статья предназначена в первую очередь для тех людей, которые хотят определиться, какой же язык программирования изучить, чтобы и времени заняло немного, и написать на нем что-то более-менее серьезное можно было, и при этом еще и заработать. Заработок, конечно, подразумевается такой - написание небольших программ для рассылок, всевозможных чекеров-реггеров, словом, автоматизация работы с web. Если зайти на крупные форумы, такие как antichat.ru, zloy.org, xakep.ru и т.д., мы увидим большое количество объявлений "программистов" с предложениями своих услуг. На деле лишь немногие способны написать действительно стоящий продукт, и потребители знают, что заказывать написание софта следует с осторожностью, иначе можно случайно нарваться на вечно глючащее и плохо работающее г*вно. Разумеется, покупатели этого не хотят и в первую очередь требуют от исполнителя некоторое количество положительных отзывов, примеры работ и демо-версии.
Итак, мы плавно переходим к вопросу о том, как можно успешно закрепиться на рынке производства подобного софта. В первую очередь следует изучить годный язык программирования (об этом я расскажу далее). После некоторого освоения языка очень неплохо написать какую-либо несложную программу, демонстрирующую ваши возможности, которая была бы нужна людям. Конечно, нужно стараться все сделать хорошо, иначе потребители бесплатной программой пользоваться не будут, не говоря о том, чтобы в дальнейшем заказать у вас софт. По каким-то причинам многие разработчики делают откровенную лажу, а потом еще возмущаются, что пользователи недовольны и ничего не покупают. Второй вариант - делать демо-версию платного софта. Она должна иметь заранее урезанный функционал, чтобы ее нельзя было взломать, а полная версия должна продаваться независимо. Требование к хорошему качеству программы здесь также предъявляется.
Читать дальше »

Print This Post Simple Mail.ru Regger

Понедельник, 29. Ноябрь 2010
Раздел: Софт, автор:

Простой автоматический регистратор почтовых ящиков в сервисе mail.ru. Написан на Perl.

[+] Многопоточность
[+] Генерация логинов/паролей произвольно или из файла
[+] Имя и фамилия берутся из файлов, остальные поля заполняются случайным образом
[+] Поддержка antigate
[+] Возможность выбора используемых при регистрации поддоменов (mail.ru, bk.ru, inbox.ru, list.ru)
[+] Поддержка SOCKS5/HTTP прокси

Настройка производится путем редактирования файла config.txt.
Для работы необходим ActivePerl и модули GD, GD::Tiler (GD::Tiler есть в комплекте).

Скачать: reg_mail.

Print This Post Socks5 Server

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

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

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

Print This Post Yet Another Vkontakte Sender v2

Суббота, 7. Август 2010
Раздел: Социальные сети, автор:

Скрипт на perl'е для рассылки по ВКонтакту.

Возможности:
[+] Многопоточность
[+] Рассылка по друзьям, диапазону или списку id из файла
[+] Отправка сообщений на стену, в ПМ, заявку в друзья
[+] Установка лимита сообщений с одного аккаунта (при работе с диапазоном или списком id)
[+] Подстановка имени получателя
[+] Рандомизация сообщений
[+] Поддержка макросов: <<name>>, <<link>>, <<digit>>, <<trash>>
[+] Поддержка конструкций вида: {Привет|Салют}
[+] Ротация User Agent'ов
[+] Антикапча
[+] Поддержка прокси (HTTP/SOCKS5, в т.ч. с авторизацией)

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

Update 04.09.10: Устранены мелкие недочеты.
Update 10.12.10: Восстановлена работоспособность

Скачать: vk_sender_v2

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

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