Быстрый поиск
Введите фрагмент названия статьи для поиска
Assembler: сейчас на сайте 2 гостей и 3 новостей
27.10.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Немного отдохнем от ковыряния во внутренностях системы. Переписал на Ассемблере свою PHP-шную функцию для правильного склонения языковых конструкций вида "число + слово". Всю суть вопроса и теорию можете почитать в статье по ссылке. Сама функция получилась вот такой:Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------
- ; Функция для получения индекса массива с вариантами
- ; склонений слова в зависимости от числового значения.
- ; Массив слов формируется по принципу "1-2-5", то есть
- ; ("гость", "гостя", "гостей")
- ;-------------------------------------------------------
- ; На входе:
- ; dNum - число
- ; На выходе:
- ; EAX = [0..2] - индекс элемента массива
- ;-------------------------------------------------------
- proc num2word dNum:DWORD
- push ecx edx
- mov eax,[dNum]
- cdq
- mov ecx,100
- idiv ecx
- cmp edx,19
- jb @f
- mov eax,edx
- cdq
- mov ecx,10
- idiv ecx
- @@:
- xor eax,eax
- or edx,edx
- jz .case2
- cmp edx,1
- jz .case0
- cmp edx,4
- jbe .case1
- .case2:
- inc eax
- .case1:
- inc eax
- .case0:
- pop edx ecx
- ret
- endp
Читать статью целиком »
Просмотров: 1030 | Комментариев: 0
Универсальное субклассирование окон на Ассемблере
05.12.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Тема субклассирования окон уже не один раз поднималась в статьях на этом сайте. Теперь пришло время навести порядок и сделать наиболее удобное и универсальное решение для этой задачи. Воспользуемся функциями SetProp и GetProp, чтобы хранить адреса обработчиков прямо в свойствах окна без заведения дополнительных переменных.Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------------
- ; Наименования свойств. Можно переименовать, если конфликтуют с другими
- ; строками в программе
- ;-------------------------------------------------------------------------
- szOld db 'OldWndProc', 0
- szNew db 'NewWndProc', 0
- ;-------------------------------------------------------------------------
- ; Функция субклассирования окна
- ;-------------------------------------------------------------------------
- ; hWnd - хэндл окна для субклассирования
- ; SubclassProc - адрес нового обработчика окна
- ;-------------------------------------------------------------------------
- proc SubclassWindow hWnd:DWORD,SubclassProc:DWORD
- pusha
- ; Получить старый обработчик окна
- invoke GetWindowLong,[hWnd],GWL_WNDPROC
- ; Сохранить его в свойствах окна
- invoke SetProp,[hWnd],szOld,eax
- ; Сохранить в свойствах новый обработчик окна
- invoke SetProp,[hWnd],szNew,[SubclassProc]
- ; Назначить окну универсальную функцию обработки
- invoke SetWindowLong,[hWnd],GWL_WNDPROC,CommonSubclassProc
- popa
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ; Субклассировать поле ввода
- invoke GetDlgItem,[hwnddlg],ID_HEX
- stdcall SubclassWindow,eax,EditWindowProc
- ; Субклассировать кнопку
- invoke GetDlgItem,[hwnddlg],ID_BTN
- stdcall SubclassWindow,eax,ButtonProc
Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------------
- ; Функция снятия субклассирования с окна
- ;-------------------------------------------------------------------------
- ; hWnd - хэндл окна
- ;-------------------------------------------------------------------------
- proc UnSubclassWindow hWnd:DWORD
- pusha
- ; Получить сохраненный обработчик окна
- invoke GetProp,[hWnd],szOld
- or eax,eax
- ; Сохраненного обработчика нет
- jz .loc_ret
- ; Назначить окну старую функцию обработки
- invoke SetWindowLong,[hWnd],GWL_WNDPROC,eax
- ; Удалить сохраненные обработчики
- invoke RemoveProp,[hWnd],szOld
- invoke RemoveProp,[hWnd],szNew
- .loc_ret:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 1502 | Комментариев: 0
Преобразование символических ссылок в путь к файлу
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
Читать статью целиком »
Просмотров: 1844 | Комментариев: 2
Кодирование и декодирование чисел по алгоритму 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
Читать статью целиком »
Просмотров: 3826 | Комментариев: 4
Алгоритмы шифрования TEA и XTEA на Ассемблере
13.12.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритмы шифрования TEA и XTEA на Ассемблере
Tiny Encryption Algorithm (TEA) - один из видов блочных алгоритмов шифрования данных. Главными отличиями TEA являются высокая скорость работы, нетребовательность к памяти и простота реализации на различных языках программирования. Не обошлось и без недостатков в виде уязвимости к некоторым типам криптографических атак, но даже несмотря на это алгоритм завоевал широкую популярность в различных системах.
Читать статью целиком »
Просмотров: 2970 | Комментариев: 8