Быстрый поиск
Введите фрагмент названия статьи для поиска
Раскраска строк ListView на Ассемблере
23.07.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Элемент диалоговых окон ListView (или SysListView32) - очень удобный элемент, особенно для табличного отображения данных или ведения логов. При всем своем удобстве, у него есть недостаток, что при заполнении списка нельзя указывать цвета текста и фона для отдельных строк. Но способ раскрасить строки ListView все-таки есть. При отрисовке списка окну приложения посылается сообщение WM_NOTIFY, которое можно перехватить и самостоятельно обработать. В lParam сообщения передается указатель на структуру NMLVCUSTOMDRAW, в которой и описаны все подробности об отрисовываемой строке. Это составная структура и ее составляющие зависят от версии библиотеки Comctl32, но описываемый способ не сработает разве что на Windows 95, если вы его где-то откопаете. Однако компилятор FASM тоже ни сном, ни духом про структуру NMLVCUSTOMDRAW, придется сделать описание самостоятельно:Code (Assembler) : Убрать нумерацию
- ; Структура для обработки сообщений
- struct NMLVCUSTOMDRAW
- ; NMHDR
- hwndFrom dd ?
- idFrom dd ?
- code dd ?
- ; NMCUSTOMDRAWINFO
- dwDrawStage dd ?
- hdc dd ?
- left dd ?
- top dd ?
- right dd ?
- bottom dd ?
- dwItemSpec dd ?
- uItemState dd ?
- lItemlParam dd ?
- ; NMLVCUSTOMDRAW
- clrText dd ?
- clrTextBk dd ?
- ends
Читать статью целиком »
Просмотров: 5694 | Комментариев: 6
Расчет хеша Adler-32 на Ассемблере
12.07.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Adler-32 - хеш-функция, разработанная Марком Адлером, хорошо известным по его работам в области компрессии данных. Этот хеш используется в библиотеке zlib, соавтором которой и является Марк Адлер. По скорости работы Adler-32 превосходит CRC32, однако уступает ей по качеству обнаружения ошибок контрольной суммы, особенно на коротких строках. Есть несколько вариантов реализации алгоритма на разных языках и с разной степенью эффективности, мой вариант на Ассемблере такой:Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция вычисления хеша Adler-32
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ; На выходе:
- ; EAX = полученный хеш
- ;-----------------------------------------------------------------------
- proc Adler32 lpData:DWORD, dSize:DWORD
- push ebx ecx edx esi edi
- ; Инициализация
- mov edi,1 ; s1 = 1
- xor esi,esi ; s2 = 0
- ; Длина строки
- cmp [dSize],0
- je .loc_ret
- mov ebx,65521 ; base
- xor ecx,ecx
- @@:
- ; Получить символ из строки
- mov eax,[lpData]
- movzx eax,byte [eax+ecx]
- add eax,edi ; s1 = (s1 + buf[i]) % 65521
- xor edx,edx
- div ebx
- mov edi,edx
- add edx,esi ; s2 = (s2 + s1) % 65521
- mov eax,edx
- xor edx,edx
- div ebx
- mov esi,edx
- ; Следующий символ
- inc ecx
- cmp ecx,[dSize]
- jb @b
- .loc_ret:
- mov eax,esi ; adler32 = (s2 << 16) + s1
- rol eax,16
- add eax,edi
- pop edi esi edx ecx ebx
- ret
- endp
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ...
- somedata db 'Yeah! I like Flat Assembler!',0 ; Исходные данные для хеширования
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Расчет длины строки. Для бинарных данных lstrlen лучше не использовать
- invoke lstrlen,somedata
- ; Расчет Adler-32
- stdcall Adler32,somedata,eax
- ; EAX = 82E0095Dh
Читать статью целиком »
Просмотров: 5139 | Комментариев: 0
Алгоритм шифрования ROT13 на Ассемблере
14.06.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Шифр ROT13 - вариация "шифра Цезаря", в котором используется сдвиг букв в алфавите или простейшая подстановка. Алгоритм не обладает даже минимальной криптостойкостью, поэтому не может применяться в серьезных системах. Вместе с тем, он часто используется при кодировании PHP-скриптов (функция str_rot13), так что алгоритм обратного кодирования будет полезен при написании расшифровщиков. Вот что у меня получилось:Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция шифрования строки по алгоритму ROT13
- ; Copyright (C) ManHunter / PCL
- ; http://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ;-----------------------------------------------------------------------
- proc ROT13 lpData:DWORD, dSize:DWORD
- pusha
- ; Длина строки
- mov ecx,[dSize]
- or ecx,ecx
- jz .loc_ret
- ; Указатели на строку
- mov esi,[lpData]
- mov edi,esi
- .loc_crypt:
- ; Получить символ из строки
- lodsb
- inc edi
- ; Сохранить бит регистра
- mov ah,al
- and ah,20h
- ; Символ в верхний регистр
- and al,(0FFh-20h)
- cmp al,'A'
- ; Кодировать не надо
- jb .no_crypt
- cmp al,'Z'
- ; Кодировать не надо
- ja .no_crypt
- sub al,13
- ; Cимвол первой половины алфавита?
- cmp al,'A'
- jae @f
- add al,26
- @@:
- ; Восстановить бит регистра
- or al,ah
- dec edi
- ; Записать измененный символ
- stosb
- .no_crypt:
- ; Следующий символ
- loop .loc_crypt
- .loc_ret:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 8343 | Комментариев: 6
Расчет хеша SHA1 на Ассемблере
08.06.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм криптографического хеширования SHA1 (Secure Hash Algorithm 1) используется во многих криптографических приложениях и протоколах. В его основе лежат методы, очень похожие на MD5. В Интернете есть много реализаций этого алгоритма на разных языках программирования, но я не нашел ни одного нормального решения на Ассемблере. Пришлось разбираться самому и в результате у меня получилась достаточно быстрая функция расчета SHA1 участка памяти произвольной длины. Для работы в сегменте данных потребуются некоторые дополнительные переменные и массивы, они вынесены в глобальную область видимости, чтобы не загромождать код.Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- SHA1_h0 dd ? ; Переменные, в которых будет создан хеш SHA1
- SHA1_h1 dd ?
- SHA1_h2 dd ?
- SHA1_h3 dd ?
- SHA1_h4 dd ?
- SHA1_a dd ? ; Вспомогательные переменные для промежуточных
- SHA1_b dd ? ; вычислений
- SHA1_c dd ?
- SHA1_d dd ?
- SHA1_e dd ?
- SHA1_W rd 80 ; Массивы для промежуточных данных
- SHA1_Buff rb 64
Читать статью целиком »
Просмотров: 6714 | Комментариев: 13
Несколько полезных функций на Ассемблере
21.05.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Несколько полезных функций на Ассемблере
За время программирования на Ассемблере у меня накопилось несколько полезных решений. Выделять под каждое из них отдельную статью не хочется, а держать под рукой пригодится. Поэтому все сложу сюда, по мере надобности буду пополнять.
Читать статью целиком »
Просмотров: 28859 | Комментариев: 34