
Быстрый поиск
Введите фрагмент названия статьи для поиска

Построение карты памяти процесса
02.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Умение работать с памятью сторонних процессов - полезный навык адепта Темной стороны Силы. Таким способом можно найти нужные данные, хранящиеся в памяти, например, расшифрованные файлы, изображения, пароли, и еще много чего вкусного. Также этот навык пригодится при создании распаковщиков, лоадеров для программ и трейнеров для различных игр. Я привел лишь несколько примеров, на практике их можно найти гораздо больше.Для построения карты памяти процесса используется функция VirtualQueryEx и специальная структура MEMORY_BASIC_INFORMATION. В FASM она как обычно не определена, придется сделать это самостоятельно в сегменте данных:
Code (Assembler) : Убрать нумерацию
- ; Структура для чтения памяти процесса
- struct MEMORY_BASIC_INFORMATION
- BaseAddress dd ?
- AllocationBase dd ?
- AllocationProtect dd ?
- RegionSize dd ?
- State dd ?
- Protect dd ?
- Type dd ?
- ends
- ; Структура для чтения памяти процесса
- mbi MEMORY_BASIC_INFORMATION
Читать статью целиком »
Просмотров: 9019 | Комментариев: 8

Проверка и обнаружение зависших приложений
27.10.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда для работы требуется определение зависших приложений, окна которых не отвечают на сообщения. Для этого есть два способа. Первый - официально документированный, через функцию SendMessageTimeOut. Особенность ее работы заключается в том, что после отправки сообщения окну она ждет ответ заданное время, и, если ответа от приложения не последовало, то возвращает FALSE. Вот пример использования функции. Нужные константы, как обычно, в FASM не определены, пришлось брать их из других источников.Code (Assembler) : Убрать нумерацию
- ...
- ; Определить таймаут 50 миллисекунд
- TIMEOUT = 50
- ; Определить константу SMTO_ABORTIFHUNG
- SMTO_ABORTIFHUNG = 2
- ; hwnd - хэндл проверяемого окна
- invoke SendMessageTimeout,[hwnd],NULL,0,0,SMTO_ABORTIFHUNG,TIMEOUT,NULL
- ; Если вернулся 0, то приложение "висит"
- or eax,eax
- jz app_hung_up
- ...
Читать статью целиком »
Просмотров: 8377 | Комментариев: 2

Программы для создания патчей и лоадеров
02.02.2009 | Категория: Темная сторона Силы | Автор: ManHunter
Итак, защита успешно сломана, коммерческая программа перестала требовать денег и зарегистрирована на ваше имя. Теперь надо обязательно поделиться результатами своих трудов со всем миром! Для релиза вам может понадобиться патч, вносящий нужные изменения в файлы. Если есть время и желание, то можно написать свой, а можно воспользоваться готовыми программами для создания патчей и лоадеров. Рассмотрим некоторые из них.
Скриншот программы diablo2oo2's Universal Patcher
diablo2oo2's Universal Patcher. Бесспорный лидер среди программ для создания патчей. Написан полностью на Ассемблере, последняя версия на сегодняшний день 2.18, а промежуточные бета-версии можно время от времени проверять по прямой ссылке. Позволяет делать если не все, то очень многое: статичные и универсальные патчи, самообучающиеся лоадеры, inline-патчи для упакованных файлов, патчи реестра, запись на диск прикрепленных к патчу файлов и еще многое другое. В умелых руках dUP2 будет очень мощным инструментом. Создаваемые патчи можно дополнять трекерной музыкой в формате xm, mod, it, s3m, mtm, umx, v2m, ahx и sid, оформлять собственными скинами, в том числе и нестандартной формы, устанавливать прозрачность окна и менять главную иконку патча. Интерфейс и документация на английском языке. Отечественными умельцами для патчера написан русификатор, но в официальном комплекте его, к сожалению, нет.
Читать статью целиком »
Просмотров: 56528 | Комментариев: 111

Запрет запуска нескольких копий программы
25.12.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Запрет запуска нескольких копий программы бывает полезен если может возникнуть конфликт из-за занятых системных ресурсов, монопольно открытых файлов или если задачи приложения подразумевают наличие только одного его экземпляра. Проверка наличия работающей копии программы реализуется несколькими способами в зависимости от поставленной задачи.Первый способ основан на том, что в приложении можно определить расшаренную секцию, данные из которой будут доступны для всех его запущенных экземпляров. Достаточно прописать в ней некоторую переменную и присвоить ей уникальное значение. При старте выполняется проверка, и если значение переменной равно начальному, то считается что это старт первой копии, иначе приложение является второй копией и должно завершить свою работу. Поэтому первая копия приложения сразу после запуска и проверки должна заменить значение переменной на другое.
Code (Assembler) : Убрать нумерацию
- ; Расшаренная секция, общая для всех копий данного приложения
- section '.shared' data readable writeable shareable
- started dd 1 ; Флаг первого запуска
- ; Сегмент кода
- section '.code' code readable executable
- cmp [started],1 ; Уже запущен экземпляр программы?
- jne already_started ; Да, на выход
- xor eax,eax
- ; Префикс LOCK и команда XCHG используются для предотвращения
- ; возможных конфликтов на многопроцессорных машинах
- lock xchg eax,[started] ; Сбросить флаг
- ; Нормальный запуск программы
- ...
- already_started:
- ; Выход из программы
- ...
Читать статью целиком »
Просмотров: 16190 | Комментариев: 7

Повышение привилегий процесса
09.09.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Любой процесс в системе выполняется с правами какого-то пользователя или самой системы. Привилегии – это права процесса на совершение каких-либо действий по отношению ко всей системе, и при выполнении каких-либо привилегированных операций система проверяет, обладает ли пользователь соответствующей привилегией. Например, выключение и перезагрузка компьютера компьютера относятся как раз к таким операциям, и без повышения привилегий функция ExitWindowsEx завершится с ошибкой. Готовых решений на FASM найти не удалось, пришлось портировать из языков высокого уровня.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ; Определяем константы
- TOKEN_ADJUST_PRIVILEGES = 20h
- TOKEN_QUERY = 8h
- SE_PRIVILEGE_ENABLED = 2h
- ; Определяем необходимые структуры, потому что в FASM'е их нет
- struct LUID
- lowPart dd ?
- HighPart dd ?
- ends
- struct LUID_AND_ATTRIBUTES
- pLuid LUID
- Attributes dd ?
- ends
- struct _TOKEN_PRIVILEGES
- PrivilegeCount dd ?
- Privileges LUID_AND_ATTRIBUTES
- ends
- TTokenHd dd ?
- udtLUID LUID
- ; Важно! Структура _TOKEN_PRIVILEGES должна быть выровнена на границу 4 байт!
- align 4
- tkp _TOKEN_PRIVILEGES
- SE_SHUTDOWN_NAME db 'SeShutdownPrivilege',0
- ; Сегмент кода
- section '.code' code readable executable
- invoke GetCurrentProcess
- ; Открыть маркер доступа (access token), ассоциирующийся с процессом
- invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,TTokenHd
- or eax,eax
- jz loc_exit ; Ошибка
- ; Получить текущее значение привилегии на выключение и
- ; перезагрузку системы
- invoke LookupPrivilegeValue, NULL, SE_SHUTDOWN_NAME, udtLUID
- or eax,eax
- jz loc_exit ; Ошибка
- ; Заполнить структуры
- mov [tkp.PrivilegeCount],1
- mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED
- mov eax,[udtLUID.lowPart]
- mov [tkp.Privileges.pLuid.lowPart],eax
- mov eax,[udtLUID.HighPart]
- mov [tkp.Privileges.pLuid.HighPart],eax
- invoke AdjustTokenPrivileges,[TTokenHd],0,tkp,0,0,0
- ; Здесь будет код, требующий повышенных привилегий,
- ; например выключение компьютера
- invoke ExitWindowsEx,EWX_POWEROFF,NULL
- ...
- ; Выход
- loc_exit:
- invoke ExitProcess,0
Просмотров: 8760 | Комментариев: 7
