Print This Post Пишем простой cкринсейвер

Воскресенье, 20. Ноябрь 2011
Раздел: C/C++, Windows, автор:

Скринсейвер (или хранитель экрана) - это, по сути, обычная программа, в которой определены несколько специальных процедур для обработки сообщений, посылаемых ОС, при запуске и конфигурировании скринсейвера.
Программы-скринсейверы обычно хранятся в директории %WINDIR%\System32 и обладают расширением .scr. Таким образом, при переходе на страницу выбора заставки, Windows ищет в системной директории все файлы с соответствующим расширением и формирует из них список возможных скринсейверов. Также следует упомянуть несколько важных аспектов написания.

– Скринсейвер должен экспортировать функции ScreenSaverConfigureDialog, ScreenSaverProc.
– Название скринсейвера в окне настройки определяется строковым ресурсом с идентификатором IDS_DESCRIPTION, который должен быть равен 1.
– Идентификатор диалогового окна, которое будет появляться при нажатии клавиши "Параметры", т.е. при попытке настроить скринсейвер, должен быть DLG_SCRNSAVECONFIGURE и равняться числу 2003.
– Программа также должна содержать реализацию функции RegisterDialogClasses.

В принципе, почти всё это описано в MSDN. В нашем скринсейвере будет изображена вращающаяся изометрическая проекция куба. Выглядеть результат будет следующим образом:

Экран выбора скринсейвера


Читать дальше »

Print This Post Дорабатываем DLL для LastFM

Понедельник, 3. Октябрь 2011
Раздел: Assembler, C/C++, Windows, автор:

Как оказалось, библиотека для LastFM из статьи от 31.08.11 оказалась не особо юзабельной из-за нескольких досадных недоработок:
1. Клавиши управления не работали, если окно свернуто (связано с тем, что управление производилось с помощью SendMessage, но в свернутом состоянии окно не обрабатывает оконные сообщения, поэтому они переставали реагировать). (Спасибо Artik'у за наводку)
2. При сворачивании окна в трей и последующем восстановлении пропадали элементы управления, так как окно "уничтожалось".

Чтобы исправить эти моменты, я решил переписать библиотеку. В этой статье я опишу изменившиеся методы (к слову, CreateThumbnailToolbar и EnumWindowsProc остались без изменений).
Читать дальше »

Print This Post Получаем лицензионный Minecraft почти бесплатно

Среда, 21. Сентябрь 2011
Раздел: Жизнь, автор:

There is no security on this earth; there is only opportunity.
– Douglas MacArthur

Недавно ко мне в гости приехали родственники из СНГ и привезли всяких забавных "вкусняшек", которые я сразу же решил попробовать. Особенно хочется отметить такую вещь, как: метионил-глутамил-гистидил-фенилаланил-пролил-глицил-пролин (или просто Семакс). На удивление один из, по-моему, немногих препаратов производства СНГ, обладающий ярко выраженным эффектом, который ощущается практически сразу после начала приема, причем вроде как без серьезных противопоказаний. Концентрация запредельная.

Но что-то мы отошли от темы. Листал я интернеты в поисках чего-нибудь эдакого и наткнулся на чье-то игровое видео по Minecraft. Полез на официальный сайт игры (minecraft.net) и с сожалением обнаружил, что игра платная, причем стоит не очень-то дешево.
Зарегистрировался на сайте, посмотрел способы оплаты и решил посмотреть, как происходит процесс оплаты игры. Платить можно через PayPal или банковской картой. В качестве агрегатора платежей (для всех вариантов, кроме PayPal) используется Moneybookers, казалось бы, откуда взяться проблеме, но, видимо, не перевелись ещё "гениальные девелоперы", которые кладут на документацию системы обслуживания оплаты.

Встречайте глупый и примитивный баг: если выбрать оплату игры кредитной картой (главное не через PayPal, там, слава богу, косяков не допустили), нажать кнопку Proceed to checkout, перехватить запрос и поменять в нем сумму с 21.95$ (цена для США), на, например, 0.7$ (сумма обусловлена минимальным размером платежа через систему), а затем ввести данные своей или виртуальной карты и оплатить, то оплата успешно пройдет и Premium account будет удачно оплачен (или можно купить gift-кодов, я проверял на них).

Конечно, небольшой минус состоит в том, что не у всех есть банковская карта, а некоторым не хочется светить данные своей карты, но это не проблема, так как всегда можно купить Visa Virtual с необходимым номиналом (например, на плати.ру: долларовая карта, рублевая карта).
Для тех, кто не понял, что и как надо делать, чтобы купить майнкрафт дешево:
Читать дальше »

Print This Post Добавляем в LastFM управление через панель задач

Среда, 31. Август 2011
Раздел: C/C++, Windows, автор:

С появлением Windows 7 в системе появилась полезная фишка, позволяющая размещать элементы управления в панели задач, а именно в превью, которое высвечивается при наведении на элемент в панели. Однако, редко встретишь приложение, которое её использует. Из множества приложений, которыми я пользуюсь, на ум приходит только одно - Media Player Classic. Вот так выглядят элементы управления для него:

Так сложилось, что я люблю слушать "полу-радио", в частности, Last.fm. Но, к сожалению, в клиенте Last.fm нет поддержки этих модных кнопочек, поэтому мне захотелось добавить их в него собственноручно. Перечень действий, которые необходимо для этого, примерно следующий:
1. Находим хендл основного окна клиента.
2. Добавляем элементы управления.
3. Ставим свой обработчик оконных сообщений, в котором задаем поведение элементов управления.
Читать дальше »

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 Заработок на торрентах

Воскресенье, 17. Июль 2011
Раздел: $$$, автор:

В этой статье речь пойдет о преимущественно зарубежной схеме заработка на торрентах. Тема довольно избита, но все ещё работоспособна и позволяет обеспечить по крайней мере небольшой приток денег.
Основой схемы является известная партнерская программа Sharecash, которая относится к классу PPA. Алгоритм работы с ней можно описать следующим образом:
1. Регистрируетесь в партнерской программе.
2. Загружаете файлы (лимит 200МБ).
3. По ссылкам на загруженные файлы перед скачиванием предлагается пройти какой-нибудь тест (например, перейти на чей-нибудь платник и совершить там некие бесплатные действия).
4. Человек проходит "тест", потом качает Ваш файл.
5. Вам за это платят примерно от 0.2$ до 1$.

Такая методика в некотором смысле лучше, чем СМС, хотя субъективно менее прибыльна. С другой стороны, потенциальная прибыль зависит от умения заинтересовать пользователя, дабы он все-таки выполнил необходимые действия и скачал файл.

Теперь вернемся к торрентам. Смысл торрентов в контексте этой и подобных партнерских программ состоит в распространении файлов с Вашей ссылкой. Это организуется за счет создания на публичных торрент-трекерах (например, thepiratebay.org) фейковых раздач с заведомо популярными названиями. Самым очевидным материалом для таких раздач являются ещё не вышедшие фильмы. Список готовящихся к выходу фильмов можно взять на Wikipedia или IMDB.
После выбора названия создаете архив, называете его, например: Mission Impossible - Ghost Protocol 2011 Leaked Excerpt. В архив можно поместить что угодно с соответствующим названием и расширением, но не забудьте добавить readme-файл или комментарий к архиву с призывом перейти по ссылке партнерской программы для получения пароля к архиву. Выглядеть архив будет примерно так:

Остается только создать раздачи на нескольких трекерах и ждать, пока массы подтянутся и скачают. На thepiratebay пиры появляются буквально через 15-40 минут. Да, схема действительно простая и избитая, но один знакомый недавно её протестировал и вот что у него получилось:

Чтобы увеличить прибыль, следует загружать файл на как можно большее число трекеров, неплохой список которых можно составить, воспользовавшись сайтом torrents.to. Также важно создавать раздачи с правдоподобными размерами, вряд ли кто-нибудь станет качать "новинку киноиндустрии", если она весит 5 килобайт. При регистрации на трекерах необходимо пользоваться прокси, так как многие ресурсы ведут борьбу с такими раздачами.

P.S. Если кто-нибудь будет пробовать подобное на СНГ-трафике, то отпишите о результатах.

Print This Post Класс-инжектор на C++

Среда, 13. Июль 2011
Раздел: C/C++, автор:

Давеча наелся всяких плацебо"витаминчиков" и захотелось странного, а именно - выучить C++ за неделю. Начинание примечательно тем, что это первый раз, когда я изучаю что-то, связанное с программированием, по книге (обычно руководствовался примерами из гугла). Да и подобные языки мне до этого не приходилось изучать, в общем-то. Книжку выбрал первую попавшуюся на Amazon - Herbert Schildt "C++: The Complete Reference".
Результат своего непродолжительного изучения оформил в следующий класс, который позволяет грузить DLL или произвольный код в 32- и 64- разрядные процессы. Код, правда, написан не в соответствии с модным стандартом C++0x, и в нем не используется такая мощная вещь как шаблоны (хотя сомневаюсь, что они тут серьезно пригодились бы), но, тем не менее, базовые возможности языка я постарался задействовать.
Использовать класс довольно просто, например:

#include "injector.hpp"
 
int main()
{
	injector a;
	a.set_blocking(false);
 
	try
	{
		a.inject(L"CFF Explorer.exe", L"x64.dll");
	}
	catch(const injector_exception& e)
	{
		e.show_error();
	}
 
	return 0;
}

Доступные методы:

//Инжект DLL в процесс с указанным именем
void inject(const std::wstring& proc_name, const std::wstring& dll_name);
//Инжект кода в процесс с указанным именем
void inject(const std::wstring& proc_name, const BYTE * code, unsigned long int code_size);
//Инжект DLL в процесс с указанным PID
void inject(unsigned int pid, const std::wstring& dll_name);
//Инжект кода в процесс с указанным PID
void inject(unsigned int pid, const BYTE * code, unsigned long int code_size);
//Снятие/Установка блокирующего режима (вызывать ли WaitForSingleObject и VirtualFreeEx после создания удаленного потока или нет)
void set_blocking(bool active);

Для работы с 64-разрядными процессами достаточно просто скомпилировать класс под соответствующую архитектуру.

Скачать: cpp-injector-class

Print This Post Почему я не люблю программировать

Среда, 22. Июнь 2011
Раздел: Жизнь, автор:

Для начала стоит условно разделить программистов на подтипы. Лично я выделяю следующие:
1. Фанатик - человек, который получает удовольствие непосредственно от процесса программирования или решения возникающих в процессе задач.
2. Материалист - человек, который рассматривает программирование в большей степени как средство заработка или приобретения популярности в определенных кругах.
3. Быдлокодер - эдакая смесь, зачастую выражающаяся в довольно поверхностном изучении программирования. Причем основной движущей силой здесь является ощущение причастности к каким-то якобы "сакральным" знаниям/секте и желание самоутвердиться перед теми, кто вообще не разбирается в данном вопросе. А если ещё удастся впарить свои поделки кому-нибудь и срубить денег на очередной айфон - так это вообще идеально и является пределом мечтаний.

Естественно, встречаются и переходные варианты. Разделение довольно специфическое и субъективное, но в нем есть рациональное зерно.
Далее рассмотрим нишу, для которой мне доводилось писать, и типичных заказчиков. Ниша, в общем-то, всем известная - автоматизация действий в сети или, по-простому, всякие скрипты для массовых рассылок (aka спам, aka SMO в понятии некоторых личностей), сбора информации, автоматической регистрации и тому подобного унылого говна. Почему УГ? Да потому что никакой технической сложности или интереса в них нет (то есть, согласно моему списку подтипов, этим занимаются в основном Быдлокодеры и суровые Материалисты, которые, по-моему, довольно часто не слишком дальновидны или смотрят на мир сквозь "розовые очки"), раз за разом пишутся примерно одни и те же действия, например: авторизоваться, получить список друзяшек, разослать им сообщения, авторизоваться следующей учетной записью...
Читать дальше »

Print This Post Фишка WebMoney Keeper Classic

Суббота, 14. Май 2011
Раздел: C#, Windows, автор:

Недавно, от нечего делать, копался в WebMoney Keeper Classic и заметил одну забавную особенность, которую можно использовать с некоторой пользой.
Как известно, оплата через Keeper Classic не интегрируется непосредственно в установленные на компьютере браузеры, то есть инициировать оплату можно из любого приложения, если кипер запущен. Система инициации простая: при включении кипер поднимает обычный веб-сервер (на 2803 порту), который при определенном запросе к нему отображает пользователю окно с деталями о платеже. Мне казалось, что при такой схеме было бы логично предположить, что веб-сервер биндится на localhost, однако это не так.

Кипер позволяет обращаться к своему веб-серверу извне, таким образом, если вы не сидите за роутером/прокси/чем-угодно-защищающем-порты и у вас запущен кипер, то любой может сформировать и отправить вашему киперу запрос, в результате которого вы увидите окно оплаты, например, такое:

Содержимое полей "продавец", "сумма" и "товар" можно формировать самостоятельно. Конечно, данное действо не позволяет провести сколько-нибудь деструктивное воздействие на целевой компьютер, но все же есть несколько негативных моментов:

– Можно задалбывать пользователя всплывающими окнами (некоторые после этого начинают полагать, что их компьютер взломали)
– Если пользователь введет что-нибудь в поле для кода подтверждения, то в ответ вы получите URL с редиректом, содержащим его WMID
– Теоретически возможно купить таким образом товар за чужой счет, если перейти в веб-интерфейсе на форму оплаты какого-либо товара, подсмотреть данные платежа в исходном коде страницы, число на картинке (код подтверждения), а потом отправить запрос с интересующей суммой какому-нибудь недалекому человеку и в описании товара указать что-нибудь вроде: Введите код 12345

Возможно, существуют и другие опасности, например, я заметил, что при указании больших чисел в качестве суммы платежа начинает частично затираться содержимое поля с описанием товара. В общем, будьте бдительны.
Для тех, кто хочет поиграться с составлением запросов - маленькая программка на шарпе, которая позволяет указывать ip, порт, сумму, описание платежа и отправлять запрос.

В нижнем поле окна программы отображается ответ сервера.
Скачать: zip