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

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

Simple Packer by DX:
  -o [ --out-file ] arg          Output file name
  -i [ --add-import ]            Add fake import table to packed image
  -r [ --pack-rsrc ] arg (=1)    Pack .rsrc section (image resources)
  -m [ --move-icons ] arg (=1)   Move application icons to new .rsrc
  -s [ --pack-sections ] arg     Explicit sections name(s) to pack
  -a [ --file-align ] arg (=512) Packed file alignment
  -d [ --strip-dos ] arg (=0)    Strip DOS headers
  -f [ --force ]                 Force packing of possibly incorrect binaries

-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: на базе этих макросов можно достаточно быстро построить новые, удобные вам.

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

.486
.model flat, stdcall
option casemap :none
 
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
include \masm32\macros\no_import.asm
 
 
.code
start PROC
    LOCAL buf[128]:BYTE
    LOCAL sz:DWORD
    mov sz, 127
    ;подготовка возможности вызовов без таблицы импорта
    noimport_call_prepare
 
    noimport_invoke_load chr$("GetUserNameA"), chr$("advapi32.dll"), addr buf, addr sz
 
    ;вызов MessageBoxA с предварительной загрузкой библиотеки user32.dll
    noimport_invoke_load chr$("MessageBoxA"), chr$("user32.dll"), 0, addr buf, chr$("ЙАААЗЬ"), 0
 
    ;kernel32.dll всегда в памяти, ее не надо предварительно грузить
    noimport_invoke chr$("ExitProcess"), chr$("kernel32.dll"), 0
ret
start ENDP
end start

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

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.

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

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

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

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

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

Print This Post PE-формат. Часть 2 — Немного практики: выводим информацию о секциях исполняемого файла

Вторник, 2. Август 2011
Раздел: C/C++, Windows, Для новичков, автор:

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

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

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