Print This Post Quest 3 — Return to Classics — Полное прохождение

Четверг, 8. Март 2012
Раздел: Assembler, C/C++, C#, PHP, Windows, Для новичков, Это интересно, автор:


В этой статье я опишу полное прохождение нашего третьего квеста.

Напоминаю его адреса:

Русская версия
Английская версия

Очень жаль, что в него поиграло такое небольшое количество народу, по сравнению с первым или вторым, но, наверное, люди не доверяют exe-файлам или просто не любят ставить что-то на свой компьютер. А зря, квест действительно интересный и стоящий, он не даст вам заскучать, а часто даже повеселит вас, и вы в этом сможете убедиться, почитав его прохождение-описание.

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

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

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

Print This Post Читаем MBS

Воскресенье, 12. Февраль 2012
Раздел: C/C++, Windows, автор:

В связи с недавним помутнением сознания начал разбираться в некоторых аспектах написания драйверов, а также содержимом WRK. По ходу исследований внезапно потребовалось затронуть MBR, создаваемую Windows.
Как известно, MBR (Master Boot Record) у ОС семейства Windows совпадает по размеру с MBS (Master Boot Sector) и содержится в нём. Однако, в общем смысле, MBR в общем смысле, MBR может занимать часть пространства и за пределами MBS.
Короче, чтобы не утомлять занятых людей, суть исходного кода, приведенного ниже, сводится к тривиальной задаче чтения MBS, вывода нескольких необходимых мне параметров из виндовой MBR (информации о разделах) и подсчета MD5 хэш-суммы от содержимого сектора.
Мини-программа выглядит как-то так:

Программа: скачать
Для людей, которым по каким-то неведомым причинам необходим исходный код: скачать

P.S. Товарищи, зря вы пьете фенотропил, честно, это ведь один из легких способов быстро посадить печень, а здоровье беречь нужно.

Print This Post Встраиваем Flash в свое приложение

Вторник, 17. Январь 2012
Раздел: C/C++, Windows, автор:

Как-то раз при разработке одной программы у меня возникла необходимость встроить какую-нибудь красивую мини-игру в раздел About. Так как делать красивую игру средствами WinAPI - это то ещё удовольствие и по срокам и по времени, то я решил просто-напросто встроить flash-файл в свой проект. Примерное описание того, как это сделать, мы и рассмотрим далее. В примере мы пойдем чуть дальше, а именно не только встроим флеш-ролик в окно, но и добавим парочку элементов управления. В результате у нас получится нечто подобное:

Таким образом, разобрав пример, вы запросто сможете встроить этого замечательного (или какого-нибудь другого) единорога в свое приложение, пускай и цена этого выкрутаса будет ~2.5 мегабайта.
Читать дальше »

Print This Post Упаковщик PE-файлов (exe, dll)

Вторник, 27. Декабрь 2011
Раздел: Assembler, C/C++, Windows, автор:

На днях завершил крупный коммерческий проект, только собирался потратить вырученные средства на покупку очередного ноутбука Alienware и поездку на Гавайи, как ко мне в гости зашел Каями (с нехарактерно расширенными зрачками) и сказал, чтобы я что-нибудь написал в блог, дескать не солидно как-то ничего не запостить перед Новым Годом. Сам-то он якобы занят, но я подозреваю, чем он на самом деле занимается. В общем, его просьбу я выполнил. Каями, судя по всему, остался доволен и в ответ на ссылку на пост скинул мне в аську скриншот статы какой-то партнерки. Так что он тоже едет на Гавайи! Поэтому в ближайшие пару недель новых постов можно, пожалуй, не ждать.

Итак, выкладываю упаковщик PE-файлов собственного производства. Исходники самого упаковщика на C++ и стаба распаковщика на MASM32 в комплекте. Все с комментариями на английском языке. Привереды и не умеющие переводить технические тексты идут вон из комментариев к посту! Про PE-формат я цикл статей завершу когда-нибудь, а пока ловите хотя бы это, на остальное времени нет. Самое основное в упаковщике - это файл main.cpp размером 51 кб (лень было разбивать) и unpacker.asm. unpacker.cpp - это стаб распаковщика в скомпилированном виде (его исходник, соответственно, в unpacker.asm). Используется немного библиотек из boost.

Возможности упаковщика:
[+] Поддержка exe, dll-файлов. Драйвера (sys-файлы) не упаковываются.
[+] Дерьмовая степень сжатия, так как используются RtlCompressBuffer / RtlDecompressBuffer - чисто ради примера. Кроме того, упаковывается каждая секция отдельно, не слепляются вместе, как это делает UPX, это тоже влияет на степень сжатия.
[+] Поддержка экспортов (по ординалу, по имени, а также форвардов в другие dll).
[+] Само собой, поддержка импортов (по ординалу и по имени).
[+] Поддержка и умение упаковывать секцию ресурсов (из нее перемещаются иконки, информация о версии и манифест, так что упакованный файл внешне ничем не отличается от оригинала).
[+] Поддержка релокаций (фиксапов / перемещаемых элементов / назовите их как хотите).
[+] Изменение выравнивания файла.
[+] Возможность упаковки только конкретных секций
[+] Поддержка TLS (локальная память потока) (кроме TLS callbacks, которые ни один компилятор не умеет делать, насколько мне известно).
[+] Удаление rich overlay'а от Visual C++.
[+] Возможность упаковки PE-заголовка в DOS-заголовок.
[+] Поддержка бинарников Visual C++, Borland C++/Delphi, MinGW, MASM32 (другое не проверялось, но, скорее всего, тоже заработает).

Упаковщик поддерживает только PE32.

Пример использования:
pack.exe test_exe.exe

Дополнительные опции командной строки:

-o - позволяет задать имя запакованного файла. По умолчанию оно собирается из имени оригинального файла и слова "packed".
-i - если задана эта опция, в запакованный бинарник будет добавлена директория импорта, состоящая из одного импорта. Дело в том, что старым версиям Windows (например, XP) иногда может не нравиться отсутствие импортов у исполняемого файла. По умолчанию запакованный файл директории импорта не имеет.
-s - позволяет задать список имен секций, которые должны быть упакованы. По умолчанию пакуются все секции файла. Использование: -s .text .data
-r - позволяет включить/отключить упаковку секции ресурсов. Если у бинарника много места занимают иконки, то иногда выгоднее ее не паковать. Использование: -r 0 или -r 1.
-a - позволяет задать файловое выравнивание запакованного бинарника. Использование: -a 1024. По умолчанию это 512 (минимальное).
-d - позволяет включить опцию обрезки DOS-заголовков (поверх их будет записан PE-заголовок). По умолчанию выключена, так как на результирующий размер не влияет. Использование: -d 0 или -d 1.
-f - если задана данная опция, будет паковаться любое говно, которое вы подсунете упаковщику (дрова, .NET-бинарники, уже запакованные ранее файлы и т.д.), но результат, скорее всего, будет неработоспособным.
-m - опция включает/отключает перемещение иконок из директории ресурсов (если она пакуется) в секцию ресурсов упаковщика. По умолчанию включено, но можно отключать для файлов DLL, имеющих в ресурсах какие-то иконки - размер будет меньше. Использование: -m 0 или -m 1.

Любители няшных графических свистелок и перделок идут в лес за грибами.

Если вы дочитали до этого места, в комментариях отвечу на любые вопросы о работе упаковщика.

А вот и сам пакер с исходниками: Скачать!

UPDATE от 27.12.2011: Добавлена опция командной строки -i, добавлен вывод предупреждения, если файл имеет оверлей.
UPDATE от 28.12.2011: Добавлена опция командной строки -m.

Print This Post Обходим все популярные антивирусы, или лажовая защита в действии

Вторник, 22. Ноябрь 2011
Раздел: Assembler, Windows, Это интересно, автор:

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

Итак, я потратил около часа на то, чтобы написать программу, скачивающую из интернета exe-файл и сразу запускающую ее. Удалось обойти антивирусы Kaspersky Internet Security 2011, NOD32, Dr. Web, Microsoft Security Essentials и Avast. Скорее всего, и другие бы ничего не заметили, просто не проверял. А антивирусы из списка выше даже не пикнули, когда запускался файл, скачанный только что из интернета.

Сразу скажу - я приведу не только тот способ, которым воспользовался в своей программе, но и некоторые идеи по обходу, которые я не проверял, но которые вполне могут быть на руку (и это не шифрование строк простым xor'ом со статическим ключом).
Читать дальше »

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 Вызов функции без импорта

Суббота, 5. Ноябрь 2011
Раздел: Assembler, Windows, Сниппеты, автор:

Сегодня посмотрел очередную свежую серию MLP:FiM и понял, что мне нечем себя занять. В связи с этим решил включить трек моей любимой группы (как вы, наверное, догадались - это Ранетки :D) и написать что-нибудь эдакое на ассемблере.
По совету друзей, которые маются всякой фигней, вместо того, чтобы заняться чем-нибудь полезным и написать нормальную статью в блог, выбор пал на написание нескольких макросов, которые позволяют вызывать библиотечные функции без использования таблицы импорта.
Минусы: макросы базозависимые.
Плюсы: макросы потокобезопасные.
Anyway: на базе этих макросов можно достаточно быстро построить новые, удобные вам.

Пример использования получившихся макросов:

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

Print This Post Что у нас новенького

Вторник, 1. Ноябрь 2011
Раздел: C/C++, Windows, Жизнь, Софт, Это интересно, автор:

За октябрь мы сделали не так много новых записей в блог, вернее, ничего толком и не писали. Итак, что же произошло за последний месяц?

1. Во-первых, нами был написал proxy-сервис, проверяющий огромные списки паблик-прокси и выбирающий валидные серверы, проверяя их по разным критериям. К сожалению, спросом он не пользуется, но мы все-таки попытались. Загляните и вы, там есть простой бесплатный тариф: http://ironproxy.ru.

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

3. Мы с Kaimi перевели третий квест на английский язык. Наверное, время тоже было потрачено зря, потому что иностранцы подобного рода развлечениями не особо интересуются.

4. В честь перевода третьего квеста я добавил в него небольшую новую карту. Портал на эту карту имеется с карты warp-зоны, доступной после прохождения, а еще можно найти скрытый способ попасть на нее с первой карты (там, где стоит Соник), и за это вы даже получите достижение. Кстати было добавлено 2 новых достижения, а новая карта включает в себя одно несложное IT-задание.

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

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

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

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

Print This Post PE-формат. Часть 3 — Импорт

Воскресенье, 4. Сентябрь 2011
Раздел: C/C++, Windows, Для новичков, автор:

Импорт - это важнейший элемент любого исполняемого файла. Невозможно найти exe- или dll-файл без каких-либо таблиц, имеющих отношение к импорту, разве что у упакованных файлов и у вирусов. Импорт позволяет указать, какие внешние функции и из каких модулей требуются исполняемому файлу для нормальной работы. Например, если мы пишем простейший "Hello, world!", который выводит приветствие в MessageBox'е и завершает выполнение, то ему потребуются как минимум две функции: MessageBoxA (или MessageBoxW) из user32.dll и ExitProcess из kernel32.dll.

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