Print This Post Пишем упаковщик по шагам. Шаг третий. Распаковываем.

Понедельник, 17. Сентябрь 2012
Раздел: Assembler, C/C++, Windows, Для новичков, автор:

Предыдущий шаг здесь.

Идем дальше! Пришло время написать распаковщик, именно этим мы начнем заниматься в этом шаге. Обрабатывать исходную таблицу импорта мы пока не будем, так как и в этом уроке нам будет, чем заняться.

Начнем мы вот с чего. Для работы распаковщика нам стопроцентно потребуются две WinAPI-функции: LoadLibraryA и GetProcAddress. В своем старом упаковщике я писал стаб распаковщика на MASM32 и вообще не создавал таблицу импорта. Я искал адреса этих функций в ядре, что несколько сложно и хардкорно, кроме того, это может вызвать неиллюзорные подозрения у антивирусов. Давайте в этот раз создадим обычную таблицу импортов и сделаем так, чтобы загрузчик сам нам сообщил адреса этих функций! Разумеется, набор из двух этих функций в таблице импорта так же подозрителен, как и полное их отсутствие, но ничто нам не мешает в будущем добавить еще другие левые случайные импорты из различных DLL-файлов. Куда загрузчик будет записывать адреса этих двух функций? Пора расширить нашу структуру packed_file_info!
Читать дальше »

Print This Post Пишем упаковщик по шагам. Шаг второй. Пакуем.

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

Предыдущий шаг здесь

Сразу скажу, что по мере написания этого цикла статей я кое-что правлю и дорабатываю в своей библиотеке для работы с PE-файлами. Поэтому вам стоит ее перекачать и пересобрать - сейчас уже есть версия 0.1.3.

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

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

Print This Post Пишем упаковщик PE-файлов по шагам. Шаг первый.

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

Раз уж я закончил разработку библиотеки на C++ для работы с PE-файлами, грех не использовать ее в каком-то более-менее серьезном проекте. Поэтому я разработаю с ее помощью упаковщик, поясняя по шагам, что я делаю, а либа на C++ сильно упростит нам жизнь. Итак, с чего же начать разработку упаковщика? Наверное, с выбора какого-нибудь несложного бесплатного алгоритма сжатия. После непродолжительных поисков таковой был мной найден: LZO. Он поддерживает множество различных видов сжатия (можно считать, разновидностей), и LZO1Z999 - самая эффективная по степени сжатия из всех доступных. Это, конечно, не ZIP, но приближается к нему по эффективности: 550-килобайтный файл был сжат zip'ом с максимальной степенью сжатия в 174 килобайта, в то время как LZO сжал тот же файл до 185 килобайтов. Однако у LZO гораздо более быстрый распаковщик. Он также оказался базонезависимым, то есть, его можно разместить по любому виртуальному адресу, и он будет работать без всяких корректировок адресов. Размер распаковщика приятно удивил: Visual Studio с оптимизациями по размеру и отключением исключений и проверок буферов дала результат в 613 байтов кода! Этот алгоритм нам подойдет.

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

Print This Post Winamp QIP 2005 x-status plugin

Вторник, 11. Сентябрь 2012
Раздел: Assembler, Windows, Софт, автор:

Наконец-то доделал плагин для популярного плеера Winamp, который был мною задуман еще несколько лет назад. Этот плагин позволяет устанавливать в вашем QIP Classic (2005) статус в зависимости от той композиции, которую вы прослушиваете в Winamp'е. Наверняка, уже достаточно малое количество людей используют этот ICQ-клиент, тем не менее, такие люди еще остались.

С момента создания в плагине имелась довольно неприятная ошибка, точнее, недоработка, которую мне лень было исправлять, поэтому он и лежал так долго без дела. А как известно, QIP 2005 в принципе не имел никакой системы (SDK) для создания плагинов, поэтому приходилось играться с оконными сообщениями (Kaimi предлагал читать и исполнять память процесса, но это еще хардкорнее). Однако, ошибка была исправлена, я добавил пару новых полезных функций, и теперь плагин полностью работоспособен. Выкладываю его вместе с исходниками на MASM32 (без комментариев, но если кому-то будет интересно...): Winamp QIP Classic X-Status Plugin

Ставится плагин так: распаковываем архив и копируем файл gen_qip.dll в папку плагинов Winamp (например, C:\Program Files\Winamp\Plugins), после чего перезапускаем Winamp, идем в настройки (Ctrl+P), заходим в пункт плагинов Plug-ins - General Purpose и видим там в списке плагинов имя QIP-плагина. Двойной клик на имени откроет окно настроек (как выше на скриншоте).

Если кому-то интересны детали работы и то, в чем была проблема...
Читать дальше »

Print This Post Библиотека для работы с PE-файлами (C++)

Суббота, 8. Сентябрь 2012
Раздел: C/C++, автор:

Выкладываю более-менее завершенную библиотеку для работы с Portable Executable (PE) файлами - PE Bliss.

Основные фичи библиотеки:
[+] Чтение 32-разрядных и 64-разрядных PE-файлов (PE, PE+) для Windows, возможность единообразной работы с обоими форматами
[+] Создание PE/PE+ образов с чистого листа
[+] Пересборка 32-разрядных и 64-разрядных PE-файлов
[+] Работа с директориями и заголовками
[+] Конвертирование адресов
[+] Чтение и редактирование секций PE-файла
[+] Чтение и редактирование таблицы импортов
[+] Чтение и редактирование таблицы экспортов
[+] Чтение и редактирование таблиц релокаций
[+] Чтение и редактирование ресурсов
[+] Чтение и редактирование TLS
[+] Чтение конфигурации образа (image config)
[+] Чтение базовой информации .NET
[+] Чтение информации о привязанном импорте
[+] Чтение директории исключений (только PE+)
[+] Чтение отладочной директории с расширенной информацией
[+] Вычисление энтропии
[+] Изменение файлового выравнивания
[+] Изменение базового адреса загрузки
[+] Работа с DOS Stub'ом и Rich overlay
[+] Высокоуровневое чтение ресурсов: картинки, иконки, курсоры, информация о версии, строковые таблицы, таблицы сообщений
[+] Высокоуровневое редактирование ресурсов: картинки, иконки, курсоры, информация о версии

Словом, все, что вы хотели сделать с PE, но боялись спросить, как. Весь код библиотеки снабжен обильными комментариями на английском языке. В проект включено 25 примеров работы с библиотекой, которые показывают, как работать с той или иной частью библиотеки (комментарии на русском языке). Имеются солюшены для MSVC++ 2008 и 2010. Справочной информации пока нет, возможно, соберусь ее как-нибудь написать.

Библиотека не использует WinAPI или другие библиотеки, только STL.

Библиотека и примеры собираются под Windows x86 и x64, но для того, чтобы работать с PE+, собирать под x64 необязательно. Библиотека не исполняет считываемые файлы, не маппит их в память, поэтому с ее помощью можно спокойно открывать подозрительные исполняемые файлы и работать с ними. Теперь собирается еще и под Linux.

Проект залит на code.google.com на случай возможных правок и улучшений, так как сейчас библиотека в стадии альфа-версии.

Репозиторий: http://code.google.com/p/portable-executable-library/
Скачать архив с сорсами версии 0.1.11 (годятся для сборки упаковщика по ману, который тут в блоге есть): ZIP
Скачать архив с последними сорсами (1.0.0): ZIP

Print This Post Путешествия

Вторник, 4. Сентябрь 2012
Раздел: Жизнь, автор:

Я вернулся из своего небольшого отпуска (если кто-то не в курсе, я путешествовал по западному побережью - Вегас, Лос-Анджелес) и сразу принялся за дела, так что в скором времени стоит ждать новых содержательных постов. К сожалению, Kaimi поехать со мной не смог по причине сильной занятости учебой. Тем не менее, он успел для вас кое-что приготовить - это обновленный модуль для работы с антикапчей на Perl: вот тут.
Небольшой фотоотчет:
Читать дальше »

Print This Post Небольшие новости

Понедельник, 30. Июль 2012
Раздел: Assembler, C/C++, Perl, PHP, автор:

Привет всем нашим читателям! Мы решили ради интереса на какое-то время попробовать себя в области ревьюинга чужоко кода.

Более простыми словами - вы присылаете нам на письмо с темой "Код на ревью", в которое вкладываете свой более-менее логически завершенный и отформатированный исходник размером не более 10 килобайтов и небольшое пояснение, что этот код призван делать. Мы ваши исходные коды детально изучаем и раз в одну-две недели создаем пост с ревью (обзорами) самых интересных присланных нам исходников. Также можете указать свой ник или еще какие-то данные в письме, если желаете, чтобы мы написали их в посте. E-mail адреса разглашать мы, разумеется, не будем. Пока что принимаются языки PHP, Perl, C++ (C), MASM32.

Хотите узнать, что у вас не очень хорошо написано и как бы сделать это получше и оптимальнее? Не постесняйтесь воспользоваться нашей помощью! Ну а совсем хорошие и красивые сорсы мы будем выкладывать как образец для подражания. А мы для себя отметим, приживется ли такая рубрика.

И еще: в комментариях к этому посту можете в свободной форме написать, о чем бы вы хотели еще почитать в нашем блоге.

Print This Post Игрища с USB в Windows (отслеживаем и контролируем)

Четверг, 19. Июль 2012
Раздел: C/C++, Windows, Для новичков, Сниппеты, автор:

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

Итак, в статье я расскажу, как:
[+] отследить появление новой флешки или USB-диска в системе (даже если это хитрожопая флешка, которая монтируется как CD-ROM+Flash, например, или флешка, разбитая на пару дисков)
[+] отслеживать безопасное извлечение флешек и манипулировать им
[+] самому безопасно извлечь любой извлекаемый USB-девайс по букве его диска
[+] отследить прочие события, а именно небезопасное извлечение флешки и отказ в безопасном извлечении

Само-собой, никаких драйверов, только уровень пользователя! Я также поделюсь с вами исходником класса на C++, который реализует все вышеописанные задачи. Давно я не писал годных толстых статей...
Читать дальше »

Print This Post Время

Вторник, 17. Июль 2012
Раздел: Жизнь, автор:

Пару дней назад я случайно нашел свои старые архивы - скрипты на php, какие-то html-ки с яваскриптами, программы на Visual Basic 6 и игрушки на Dark Basic... Это все относилось еще к тому времени, когда я только узнавал, как создаются и работают программы, что лежит в основе интернетов и всякие другие интересные штуки, казавшиеся в то время мне такими необычными и новыми. Но это не автобиографическая статья. Я подниму более интересный вопрос.
Читать дальше »

Print This Post Все новое — хорошо забытое старое

Среда, 11. Июль 2012
Раздел: .NET, Assembler, PHP, Windows, Софт, Социальные сети, автор:


Мы с Kaimi решили привести информацию на блоге в более актуальный вид, в связи с этим:

[+] Обновлен до версии 1.3 Proxy Checker Lite (теперь сорсы прилагаются).
[+] Обновлен и ускорен KWM-брутфорс
[+] Перезалита База ВКонтакте
[+] Приведен в рабочее состояние VK Link Checker
[+] Обновлен + выложен новый сорс скрипта People Search (база данных не пополнялась, просто скрипт сохранен в рабочем состоянии)
[+] Блог доступен по протоколу https (пока не очень удачная навигация)
[+] Страница 404 стала более разнообразной (F5)

Надеемся, каждый найдет для себя что-то интересное среди этих апдейтов.