Blog. Just Blog

Быстрый поиск

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

Замена деления умножением на Ассемблере

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 их, естественно, нет, но это и неудивительно.
  1. ; Структура для получения данных о процессе под Win32
  2. struct PROCESS_BASIC_INFORMATION
  3.     ExitStatus       dd ?
  4.     PebBaseAddress   dd ?
  5.     AffinityMask     dd ?
  6.     BasePriority     dd ?
  7.     uUniqueProcessId dd ?
  8.     uInheritedFromUniqueProcessId dd ?
  9. ends
  10.  
  11. ; Структура PEB процесса под Win32
  12. ; Process Enviroment Block или блок окружения процесса
  13. ; Содержит все параметры пользовательского режима, ассоциированные
  14. ; системой с текущим процессом
  15. struct PEB
  16.     InheritedAddressSpace    db ?
  17.     ReadImageFileExecOptions db ?
  18.     BeingDebugged            db ?
  19.     b003                     db ?
  20.     Mutant                   dd ?
  21.     ImageBaseAddress         dd ?
  22.     Ldr                      dd ?
  23.     ProcessParameters        dd ?
  24. ends
  25.  
  26. ; Юникодная строка в Win32
  27. struct UNICODE_STRING
  28.     Length                   dw ?
  29.     MaximumLength            dw ?
  30.     Buffer                   dd ?
  31. ends
  32.  
  33. ; Структура RTL_USER_PROCESS_PARAMETERS под Win32
  34. struct RTL_USER_PROCESS_PARAMETERS
  35.     MaximumLength            dd ?
  36.     Length                   dd ?
  37.     Flags                    dd ?
  38.     DebugFlags               dd ?
  39.     ConsoleHandle            dd ?
  40.     ConsoleFlags             dd ?
  41.     StdInputHandle           dd ?
  42.     StdOutputHandle          dd ?
  43.     StdErrorHandle           dd ?
  44.     CurrentDirectoryPath     UNICODE_STRING
  45.     CurrentDirectoryHandle   dd ?
  46.     DllPath                  UNICODE_STRING
  47.     ImagePathName            UNICODE_STRING
  48.     CommandLine              UNICODE_STRING
  49. ends
В сегменте данных на основании структур опишем необходимые нам массивы для чтения данных о процессе.
  1. section '.data' data readable writeable
  2. ...
  3. ; Данные о 32-битных процессах
  4. Info            PROCESS_BASIC_INFORMATION
  5. peb             PEB
  6. pparam          RTL_USER_PROCESS_PARAMETERS
Подготовительный этап завершен, можно переходить к основной части. Получение информации о процессе выполняется в несколько стадий. Сперва надо открыть процесс для чтения и получения данных, затем с помощью функции NtQueryInformationProcess надо прочитать общую информацию о процессе в структуру PROCESS_BASIC_INFORMATION (с параметром ProcessBasicInformation). Имейте в виду, что приложение, которое выполняет такой запрос, должно обладать соответствующими привилегиями. Затем надо прочитать блок окружения процесса PEB, который находится по адресу, определенному в PebBaseAddress структуры PROCESS_BASIC_INFORMATION. Дальше нам надо загрузить параметры процесса в структуру RTL_USER_PROCESS_PARAMETERS, адрес которой определен в структуре PEB параметром ProcessParameters. На самом деле в PEB содержится гораздо больше различных значений, но нас интересует только эта структура. Именно в ней записана нужная нам информация - путь к исполняемому файлу процесса и его командная строка.

Читать статью целиком »
Просмотров: 9860 | Комментариев: 6

Запись в архивы ACE, HA и LIM без помощи архиватора

22.04.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Предлагаю вашему вниманию третью, заключительную (надеюсь) статью про запись в архивы различных форматов без помощи архиваторов. Напомню, что в первой части были описаны наиболее популярные архиваторы, во второй части я начал рассказывать про более редкие и экзотические архиваторы, а сейчас тему экзотики можно будет закончить. Как и в предыдущей статье, к каждому примеру приложен сам архиватор и описание внутреннего формата его архивов, чтобы вам не пришлось их искать.

Начну с формата ACE. Это сравнительно свеженький продукт, по крайней мере есть версия под Windows, а сайт датирован 2000-м годом. Разработчики утверждают, что по степени сжатия чуть ли не превосходят архиватор RAR. Однако, в дикой природе я пока что не встречал чего-либо, упакованного этим архиватором, поэтому он и попал в категорию экзотических. Но внутренний формат архивных файлов .ACE очень простой. Не используются никакие "хвосты" в конце архива, есть только главный заголовок архива, после которого идут подряд упакованные файлы с заголовками. Формат заголовка следующий:
  1. ;---------------------------------------------
  2. ; ACE Header
  3. ;---------------------------------------------
  4. ahcrc   dw      ?                       ; CRC32x of the header
  5. ahsize  dw      ?                       ; Size of the header
  6. ahtype  db      ?                       ; Header type (01 = files)
  7. aflags  dw      ?                       ; Header flags (8001h)
  8. acsize  dd      ?                       ; Compressed file size
  9. aosize  dd      ?                       ; Original file size
  10. adtm    dd      ?                       ; Date/Time
  11. aattr   dd      ?                       ; File attributes
  12. afcrc   dd      ?                       ; CRC32x of the file
  13. ainfo   dd      ?                       ; Type and quality of compression
  14. ares    dw      ?                       ; Unknown
  15. aflen   dw      ?                       ; Filename size
  16. afname  rb      (?)                     ; Filename (ASCII)
Архиватор ACE поддерживает длинные имена файлов Windows, поэтому поле для хранения имени файла afname обозначено уже знакомым вам мнемокодом (?), то есть текстовая строка неопределенной длины. В нашем случае хватит MAX_PATH или другой фиксированной длины.

Читать статью целиком »
Просмотров: 6376 | Комментариев: 18

Как узнать название шрифта в диалоговом окне приложения

14.03.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для того, чтобы получить информацию о шрифте, используемом в окне или его отдельном элементе, можно применить следующий код.
  1.         ; Отправить окну запрос на получение информации о шрифте
  2.         invoke  SendMessage,[hWindow],WM_GETFONT,NULL,NULL
  3.         or      eax,eax
  4.         ; Данные о шрифте получить не удалось
  5.         jz      cant_get_font
  6.  
  7.         ; Получить объект с описанием шрифта
  8.         invoke  GetObject,eax,sizeof.LOGFONT,font
  9.         ; Теперь в font.lfFaceName строка названия шрифта
Сперва окну посылается сообщение WM_GETFONT, которое возвращает хэндл объекта-описателя шрифта. Если хэндл получить не удалось, то окно использует системный шрифт по умолчанию или не обрабатывает это сообщение. Но это еще не все. Чтобы получить подробное описание со всеми характеристиками шрифта, надо при помощи функции GetObject из полученного хэндла заполнить структуру LOGFONT. Один из параметров этой структуры lfFaceName - строка ASCIIZ с названием шрифта, максимальная длина которой 32 символа. Очень быстро и просто. У меня такой трюк используется в программе WinDowzer.

Читать статью целиком »
Просмотров: 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.
  1. ;---------------------------------------------
  2. ; ARC/PAK Header
  3. ;---------------------------------------------
  4. csig    db      ?                       ; Sign
  5. cmeth   db      ?                       ; Compression method (2 = store)
  6. cfname  rb      13                      ; 12 char File name ASCIIZ
  7. ccsize  dd      ?                       ; Compressed file size
  8. cdtm    dd      ?                       ; Date/Time
  9. cfcrc   dw      ?                       ; 16-bit CRC
  10. cosize  dd      ?                       ; Original file size
Обратите внимание, что поле для хранения имени файла имеет фиксированный размер 13 символов (формат имени 8.3 + нулевой символ). Когда создавался этот архиватор, про длинные имена файлов никто даже не мечтал.
  1. ; Признак окончание архива
  2. tail    db      1Ah,00
  3. tail_length   = $-tail
Признаком окончания архива является двухбайтовый "хвост", который записан после последнего файла. Больше никаких особенностей нет, формат очень простой, многотомные архивы, блокировки от изменений и прочие новомодные штучки не поддерживаются, поэтому процесс внедрения также очень простой.

Читать статью целиком »
Просмотров: 7873 | Комментариев: 4

01 ... 50 51 52 53 54 55 56 ... 70
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 3 (0.0168 сек.) / Память: 4.5 Mb
Наверх