Быстрый поиск
Введите фрагмент названия статьи для поиска
Замена деления умножением на Ассемблере
07.07.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Замена деления умножением на Ассемблере
При написании на Ассемблере алгоритмов, использующих деление на константу, операции деления можно заменять на операции умножения. Зачем это надо? Дело в том, что процессор выполняет операцию умножения в несколько раз быстрее, чем операцию деления. К примеру, на умножение тратится 5-9 тактов процессора (знаковое умножение) или 4-8 (беззнаковое умножение), тогда как для деления необходимо 22-47 тактов (знаковое деление) или 17-41 тактов (беззнаковое деление). В высокооптимизированных алгоритмах, таких как шифрование, математические расчеты, архивация больших объемов данных, подсчет контрольных сумм и других подобных задачах, экономия каждого такта процессора может дать значительный прирост общей скорости работы программы.
В руководстве по оптимизации "AMD Athlon Processor x86 Code Optimization Guide" вопрос замены деления умножением расписан очень подробно. Рассмотрены частные случаи деления, такие как деление на степень двойки, описан выбор алгоритма для знакового и беззнакового деления и приведен код для вычисления вспомогательных корректирующих значений. Кроме этого, в руководстве описаны методы оптимизации и других математических операций. Даже если вы никогда не будете использовать на практике замену деления умножением, почитать о других способах оптимизации будет очень полезно.
Читать статью целиком »
Просмотров: 14410 | Комментариев: 4
Получение информации о другом процессе
17.05.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Возможность получения информации о стороннем процессе раскрывает перед программистами и пользователями широкие возможности. Это могут быть продвинутые менеджеры процессов, антивирусные и антитроянские программы, утилиты для реверсной инженерии и многое другое. У меня, к примеру, подобные функции используются в программе Quick Task Terminator. Давайте посмотрим, как это делается. Для начала надо описать структуры, необходимые для работы с процессами. В стандартном комплекте FASM их, естественно, нет, но это и неудивительно.Code (Assembler) : Убрать нумерацию
- ; Структура для получения данных о процессе под Win32
- struct PROCESS_BASIC_INFORMATION
- ExitStatus dd ?
- PebBaseAddress dd ?
- AffinityMask dd ?
- BasePriority dd ?
- uUniqueProcessId dd ?
- uInheritedFromUniqueProcessId dd ?
- ends
- ; Структура PEB процесса под Win32
- ; Process Enviroment Block или блок окружения процесса
- ; Содержит все параметры пользовательского режима, ассоциированные
- ; системой с текущим процессом
- struct PEB
- InheritedAddressSpace db ?
- ReadImageFileExecOptions db ?
- BeingDebugged db ?
- b003 db ?
- Mutant dd ?
- ImageBaseAddress dd ?
- Ldr dd ?
- ProcessParameters dd ?
- ends
- ; Юникодная строка в Win32
- struct UNICODE_STRING
- Length dw ?
- MaximumLength dw ?
- Buffer dd ?
- ends
- ; Структура RTL_USER_PROCESS_PARAMETERS под Win32
- struct RTL_USER_PROCESS_PARAMETERS
- MaximumLength dd ?
- Length dd ?
- Flags dd ?
- DebugFlags dd ?
- ConsoleHandle dd ?
- ConsoleFlags dd ?
- StdInputHandle dd ?
- StdOutputHandle dd ?
- StdErrorHandle dd ?
- CurrentDirectoryPath UNICODE_STRING
- CurrentDirectoryHandle dd ?
- DllPath UNICODE_STRING
- ImagePathName UNICODE_STRING
- CommandLine UNICODE_STRING
- ends
Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- ...
- ; Данные о 32-битных процессах
- Info PROCESS_BASIC_INFORMATION
- peb PEB
- pparam RTL_USER_PROCESS_PARAMETERS
Читать статью целиком »
Просмотров: 9860 | Комментариев: 6
Запись в архивы ACE, HA и LIM без помощи архиватора
22.04.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Предлагаю вашему вниманию третью, заключительную (надеюсь) статью про запись в архивы различных форматов без помощи архиваторов. Напомню, что в первой части были описаны наиболее популярные архиваторы, во второй части я начал рассказывать про более редкие и экзотические архиваторы, а сейчас тему экзотики можно будет закончить. Как и в предыдущей статье, к каждому примеру приложен сам архиватор и описание внутреннего формата его архивов, чтобы вам не пришлось их искать.Начну с формата ACE. Это сравнительно свеженький продукт, по крайней мере есть версия под Windows, а сайт датирован 2000-м годом. Разработчики утверждают, что по степени сжатия чуть ли не превосходят архиватор RAR. Однако, в дикой природе я пока что не встречал чего-либо, упакованного этим архиватором, поэтому он и попал в категорию экзотических. Но внутренний формат архивных файлов .ACE очень простой. Не используются никакие "хвосты" в конце архива, есть только главный заголовок архива, после которого идут подряд упакованные файлы с заголовками. Формат заголовка следующий:
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; ACE Header
- ;---------------------------------------------
- ahcrc dw ? ; CRC32x of the header
- ahsize dw ? ; Size of the header
- ahtype db ? ; Header type (01 = files)
- aflags dw ? ; Header flags (8001h)
- acsize dd ? ; Compressed file size
- aosize dd ? ; Original file size
- adtm dd ? ; Date/Time
- aattr dd ? ; File attributes
- afcrc dd ? ; CRC32x of the file
- ainfo dd ? ; Type and quality of compression
- ares dw ? ; Unknown
- aflen dw ? ; Filename size
- afname rb (?) ; Filename (ASCII)
Читать статью целиком »
Просмотров: 6376 | Комментариев: 18
Как узнать название шрифта в диалоговом окне приложения
14.03.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для того, чтобы получить информацию о шрифте, используемом в окне или его отдельном элементе, можно применить следующий код.Code (Assembler) : Убрать нумерацию
- ; Отправить окну запрос на получение информации о шрифте
- invoke SendMessage,[hWindow],WM_GETFONT,NULL,NULL
- or eax,eax
- ; Данные о шрифте получить не удалось
- jz cant_get_font
- ; Получить объект с описанием шрифта
- invoke GetObject,eax,sizeof.LOGFONT,font
- ; Теперь в font.lfFaceName строка названия шрифта
Читать статью целиком »
Просмотров: 9251 | Комментариев: 7
Запись в архивы ARC, ZOO и LHZ без помощи архиватора
20.02.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
В первой части статьи о записи в архивы без помощи архиваторов я разобрал внутренний формат наиболее популярных современных архиваторов. Как я понял, особого интереса статья не вызвала, но материал на новую статью уже был практически подготовлен. Не пропадать же добру. В этой части я расскажу о том, как внедряться в более редкие форматы архивов: ARC, ZOO и LHZ без использования сторонних приложений. Поскольку такие раритеты найти уже проблематично, к каждому примеру я приложил сам архиватор и описание внутреннего формата его архивов. Ну а совсем экзотические архиваторы рассмотрены в третьей части статьи.ARC - формат архивов одноименного архиватора от компании System Enhancement Associates, который был достаточно широко распространен в 80-90-х годах прошлого века. Примечательно, что параметры его командной строки в последующем стали эталоном практически для всех других архиваторов с их появления и до нашего времени. Этот же формат архивов (но с расширением .PAK) также имеет архиватор PAK. Сейчас для операционных систем Windows появился архиватор FreeArc, который создает архивы с таким же расширением .ARC, но они имеют другой формат. Здесь я рассмотрю именно старый, DOS'овский формат архивов ARC.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------
- ; ARC/PAK Header
- ;---------------------------------------------
- csig db ? ; Sign
- cmeth db ? ; Compression method (2 = store)
- cfname rb 13 ; 12 char File name ASCIIZ
- ccsize dd ? ; Compressed file size
- cdtm dd ? ; Date/Time
- cfcrc dw ? ; 16-bit CRC
- cosize dd ? ; Original file size
Code (Assembler) : Убрать нумерацию
- ; Признак окончание архива
- tail db 1Ah,00
- tail_length = $-tail
Читать статью целиком »
Просмотров: 7873 | Комментариев: 4