Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Как правильно запретить Windows переходить в спящий режим
12.03.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из предыдущих статей я описывал способ, как можно запретить Windows переходить в спящий режим. Там это было реализовано через имитацию активности пользователя. Способ действительно рабочий, но с точки зрения решения поставленной задачи не совсем корректный. Настало время исправить ситуацию. Итак, наиболее правильный способ запретить Windows переходить в спящий режим - это использование функции SetThreadExecutionState. В качестве параметра она принимает один или комбинацию из нескольких флагов:Code (Assembler) : Убрать нумерацию
- ES_CONTINUOUS = 0x80000000
- ES_DISPLAY_REQUIRED = 0x00000002
- ES_SYSTEM_REQUIRED = 0x00000001
- ES_AWAYMODE_REQUIRED = 0x00000040
Для разных задач использование SetThreadExecutionState может отличаться. Например, если ваше приложение должно оставаться активным только на время продолжительного выполнения какого-нибудь критического участка кода, то перед его началом надо зафиксировать состояние запрета перехода системы в спящий режим, а после окончания этот запрет снять.
Code (Assembler) : Убрать нумерацию
- ; Установить состояние постоянной активности системы и монитора
- invoke SetThreadExecutionState,ES_CONTINUOUS+ES_SYSTEM_REQUIRED+\
- ES_DISPLAY_REQUIRED
- ; Тут выполняется какой-то очень важный процесс, который
- ; нельзя прерывать
- ; Сбросить состояние постоянной активности
- invoke SetThreadExecutionState,ES_CONTINUOUS
Читать статью целиком »
Просмотров: 3121 | Комментариев: 4
Преобразование символических ссылок в путь к файлу
08.02.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
"По следам наших публикаций". В одной из недавних статей я использовал код для преобразования символических ссылок на файл в привычный путь. Немного поразмыслив, я решил доработать его до полноценной универсальной функции, которая будет приводить любые "кривые" пути и символические ссылки к человекопонятному виду. Функция разворачивает переменные окружения, исправляет обратные слеши, а также обрабатывает символические ссылки вида "\SystemRoot\explorer.exe", "\Device\HarddiskVolume1\WINDOWS\win.ini", "\??\E:\asm\" и "file:///C:/Windows/explorer.exe". Поддерживаются файлы, каталоги и диски.Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------
- ; Функция нормализации пути к файлу или каталогу
- ;------------------------------------------------------------
- ; Параметры:
- ; lpPath - указатель на исходный путь
- ; lpNorm - указатель на строку с нормализованным путем
- ; На выходе:
- ; EAX = 1 - путь успешно нормализован
- ; EAX = 0 - путь не найден
- ;------------------------------------------------------------
- proc normalize_path lpPath:DWORD,lpNorm:DWORD
- _OBJ_CASE_INSENSITIVE = 0x00000040
- _FILE_SYNCHRONOUS_IO_NONALERT = 0x00000020
- _FILE_READ_DATA = 1
- ; Тип запрашиваемой информации
- _ObjectNameInformation = 1
- ; Структура для получения результата
- struct _OBJECT_NAME_INFORMATION
- Length dw ?
- MaximumLength dw ?
- Buffer dd ?
- String rw MAX_PATH-1
- ends
- ; Структура для юникодной строки
- struct _UNICODE_STRING
- Length dw ?
- MaximumLength dw ?
- Buffer dd ?
- ends
- ; Структура для статуса выполнения операции
- struct _IO_STATUS_BLOCK
- Status dd ?
- Pointer dd ?
- Information dd ?
- ends
- ; Структура для атрибутов объекта
- struct _OBJECT_ATTRIBUTES
- Length dd ?
- RootDirectory dd ?
- ObjectName dd ?
- Attributes dd ?
- SecurityDescriptor dd ?
- SecurityQualityOfService dd ?
- ends
- locals
- hFile dd ?
- tmp_name rw MAX_PATH-1
- dDisk dd ?
- szDisk rw 4
- result dd ?
- szTmp rw MAX_PATH-1
- ObjectName _UNICODE_STRING
- ObjectAttributes _OBJECT_ATTRIBUTES
- IoStatusBlock _IO_STATUS_BLOCK
- dwSize dd ?
- ObjectNameInfo _OBJECT_NAME_INFORMATION
- endl
- pusha
- mov [result],0
- ; Преобразовать File URL в путь
- lea eax,[dwSize]
- mov dword [eax],MAX_PATH*2
- lea ebx,[szTmp]
- invoke PathCreateFromUrl,[lpPath],ebx,eax,0
- or eax,eax
- jz @f
- mov ebx,[lpPath]
- @@:
- ; Развернуть переменные окружения
- lea eax,[tmp_name]
- invoke ExpandEnvironmentStrings,ebx,eax,MAX_PATH*2
- ; Исправить обратные слеши
- lea ebx,[tmp_name]
- mov esi,ebx
- mov edi,ebx
- .loc_fix_slashes:
- lodsw
- cmp ax,'/'
- jne @f
- mov ax,'\'
- @@:
- stosw
- or ax,ax
- jnz .loc_fix_slashes
- ; Путь уже нормализован?
- cmp word [ebx+2],':'
- jne @f
- ; Больше ничего делать не требуется
- invoke lstrcpy,[lpNorm],ebx
- mov [result],1
- jmp .loc_ret
- @@:
- lea eax,[ObjectName]
- invoke RtlInitUnicodeString,eax,ebx
- push _FILE_SYNCHRONOUS_IO_NONALERT
- push FILE_SHARE_READ+FILE_SHARE_WRITE+FILE_SHARE_DELETE
- lea eax,[IoStatusBlock]
- push eax
- lea ebx,[ObjectAttributes]
- push ebx
- mov [ebx+_OBJECT_ATTRIBUTES.Length],sizeof._OBJECT_ATTRIBUTES
- lea eax,[ObjectName]
- mov [ebx+_OBJECT_ATTRIBUTES.ObjectName],eax
- mov [ebx+_OBJECT_ATTRIBUTES.Attributes],_OBJ_CASE_INSENSITIVE
- push _FILE_READ_DATA+SYNCHRONIZE
- lea eax,[hFile]
- push eax
- invoke NtOpenFile
- or eax,eax
- jz @f
- ; Файл открыть не удалось
- lea ebx,[tmp_name]
- invoke lstrcpy,[lpNorm],ebx
- jmp .loc_ret
- @@:
- lea ebx,[dwSize]
- ; Получить размер информации
- invoke NtQueryObject,[hFile],_ObjectNameInformation,NULL,0,ebx
- ; Получить информацию об объекте
- push ebx
- push [dwSize]
- lea eax,[ObjectNameInfo]
- push eax
- invoke NtQueryObject,[hFile],_ObjectNameInformation
- or eax,eax
- jz @f
- ; Имя объекта получить не удалось
- lea ebx,[tmp_name]
- invoke lstrcpy,[lpNorm],ebx
- invoke NtClose,[hFile]
- jmp .loc_ret
- @@:
- ; Сохранить полученное имя
- lea eax,[ObjectNameInfo]
- lea eax,[eax+_OBJECT_NAME_INFORMATION.String]
- lea ebx,[tmp_name]
- invoke lstrcpy,ebx,eax
- ; Закрыть открытый файл
- invoke NtClose,[hFile]
- ; Перебрать все диски, начиная с A:
- mov [dDisk],1
- .loc_find_drive:
- invoke GetLogicalDrives
- @@:
- test eax,[dDisk]
- jnz @f
- shl [dDisk],1
- jnz @b
- ; Диск определить не удалось
- lea ebx,[tmp_name]
- invoke lstrcpy,[lpNorm],ebx
- jmp .loc_ret
- @@:
- lea eax,[szDisk]
- mov dword [eax],0x003A0041 ; 'A:' в юникоде
- mov dword [eax+4],0
- mov ecx,[dDisk]
- bsr ecx,ecx
- add dword [eax],ecx
- ; Следующий диск
- shl [dDisk],1
- ; Преобразовать букву диска в строку типа \Device\HarddiskVolume1
- lea eax,[szDisk]
- lea ebx,[szTmp]
- invoke QueryDosDevice,eax,ebx,MAX_PATH*2
- or eax,eax
- ; Диска нет, пропускаем
- jz @f
- ; Сравнить начало пути со строкой устройства
- mov ecx,eax
- lea esi,[tmp_name]
- mov edi,ebx
- repe cmpsw
- or ecx,ecx
- jnz @f
- ; Только буква диска
- lea eax,[szDisk]
- invoke lstrcpy,[lpNorm],eax
- mov [result],1
- jmp .loc_ret
- @@:
- cmp ecx,1
- jne .loc_find_drive
- ; Дополнительная проверка корректности пути
- dec esi
- dec esi
- cmp word [esi],'\'
- jne .loc_find_drive
- ; Диск + оставшийся путь к файлу
- lea eax,[szDisk]
- invoke lstrcpy,[lpNorm],eax
- invoke lstrcat,[lpNorm],esi
- mov [result],1
- .loc_ret:
- popa
- mov eax,[result]
- ret
- endp
Читать статью целиком »
Просмотров: 1784 | Комментариев: 2
Как получить имя файла, зная его Handle
29.01.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной программе у меня появилась необходимость получить имя открытого файла, когда известен его хэндл. Полазив по этим вашим интернетам, я нашел немало решений этой задачи, в основном бездумно скопированных с одного сайта на другой. Пришлось разбираться и систематизировать все самому. Итак, самый простой и приятный способ, чтобы получить имя файла по его хэндлу - использовать функцию GetFinalPathNameByHandle.Code (Assembler) : Убрать нумерацию
- ; Получить имя файла по его хэндлу
- invoke GetFinalPathNameByHandle,[hFile],lpName,MAX_PATH,0
Code (Assembler) : Убрать нумерацию
- ; Создать проекцию файла
- invoke CreateFileMapping,[hFile],NULL,PAGE_READONLY,0,1,NULL
- mov [hFileMap],eax
- invoke MapViewOfFile,[hFileMap],FILE_MAP_READ,0,0,1
- mov [pMem],eax
- ; Получить имя спроецированного файла
- invoke GetCurrentProcess
- invoke GetMappedFileName,eax,[pMem],lpName,MAX_PATH
- ; Прибраться за собой
- invoke UnmapViewOfFile,[pMem]
- invoke CloseHandle,[hFileMap]
Читать статью целиком »
Просмотров: 2673 | Комментариев: 3
Кодирование и декодирование чисел по алгоритму Base58
22.01.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Base58 - вариант кодирования чисел в виде буквенно-цифрового текста на основе цифр и символов латинского алфавита. Алфавит Base58, как можно догадаться из названия, содержит 58 символов. Base58 был разработан для передачи данных и уменьшения количества ошибок у пользователей, которые вручную вводят данные на основе распечатанного текста или фотографии, то есть без возможности машинного копирования и вставки. Так, к примеру, Base58 используется для кодирования идентификаторов кошельков Bitcoin, для создания коротких ссылок на фотохостингах и т.п. В отличие от кодирования Base64, позволяющего работать с неограниченными объемами двоичных данных, Base58 предназначен для кодирования только одиночных числовых значений.Согласно спецификации, в алфавит Base58 не входят буквенно-цифровые символы, которые имеют сходное написание и могут неоднозначно восприниматься человеком (например, буква "О" и цифра "0"), а также символы, используемые при формировании URL. Вместе с тем, порядок следования символов в алфавите ничем не регламентирован, зависит только от сферы применения кодирования и может быть любым. Для этой статьи я выбрал следующий алфавит Base58:
Code (Assembler) : Убрать нумерацию
- alpha db '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
- alpha_len=$-alpha
Читать статью целиком »
Просмотров: 3650 | Комментариев: 4
Алгоритмы шифрования TEA и XTEA на Ассемблере
13.12.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритмы шифрования TEA и XTEA на Ассемблере
Tiny Encryption Algorithm (TEA) - один из видов блочных алгоритмов шифрования данных. Главными отличиями TEA являются высокая скорость работы, нетребовательность к памяти и простота реализации на различных языках программирования. Не обошлось и без недостатков в виде уязвимости к некоторым типам криптографических атак, но даже несмотря на это алгоритм завоевал широкую популярность в различных системах.
Читать статью целиком »
Просмотров: 2858 | Комментариев: 8