Быстрый поиск
Введите фрагмент названия статьи для поиска
Алгоритм шифрования 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
Читать статью целиком »
Просмотров: 8142 | Комментариев: 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
Читать статью целиком »
Просмотров: 6185 | Комментариев: 13
Несколько полезных функций на Ассемблере
21.05.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Несколько полезных функций на Ассемблере
За время программирования на Ассемблере у меня накопилось несколько полезных решений. Выделять под каждое из них отдельную статью не хочется, а держать под рукой пригодится. Поэтому все сложу сюда, по мере надобности буду пополнять.
Читать статью целиком »
Просмотров: 28372 | Комментариев: 34
Обработка подключения и отключения съемного накопителя
18.04.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
С расширением рынка переносных устройств и USB-накопителей становится актуальной задача по обработке их взаимодействия с компьютером. Сегодня разберем обработку подключения и отключения съемных накопителей, таких как Flash-диски, карты памяти и USB-диски. Начинаем с теории. При подключении или отключении съемного накопителя система посылает всем окнам (через глобальный хэндл HWND_BROADCAST) сообщение WM_DEVICECHANGE. Но это сообщение всего лишь о самом факте изменения состояния съемного накопителя, а более подробные значения содержатся в параметрах lParam и wParam этого сообщения. В wParam приходит расшифровка произошедшего события: подключение, отключение, изменения состояния, отмена отключения и т.п. Нас пока интересует только два: DBT_DEVICEARRIVAL - подключение сменного накопителя и DBT_DEVICEREMOVECOMPLETE - извлечение накопителя. Основной обработчик событий приложения ничем не отличается от обычных обработчиков. Нам также понадобятся несколько констант, которые по умолчанию не определены в FASM:Code (Assembler) : Убрать нумерацию
- DBT_DEVICEARRIVAL = 0x8000
- DBT_DEVICEREMOVECOMPLETE = 0x8004
- DBT_DEVTYP_VOLUME = 0x00000002
Code (Assembler) : Убрать нумерацию
- proc DialogProc hwnddlg,msg,wparam,lparam
- push ebx esi edi
- ...
- ; Пришло сообщение об изменении состояния съемного накопителя
- cmp [msg],WM_DEVICECHANGE
- je update_usb
- ...
- update_usb:
- ; Устройство подключено?
- cmp [wparam],DBT_DEVICEARRIVAL
- je usb_connected
- ; Устройство извлечено?
- cmp [wparam],DBT_DEVICEREMOVECOMPLETE
- je usb_disconnected
- jmp processed
- usb_connected:
- ; Обработка подключения устройства
- ...
- jmp processed
- usb_disconnected:
- ; Обработка отключения устройства
- ...
- jmp processed
- ...
- processed:
- mov eax,1
- finish:
- pop edi esi ebx
- ret
- endp
Читать статью целиком »
Просмотров: 7116 | Комментариев: 19
Splash-окно при загрузке программы
31.03.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
При запуске некоторых приложений иногда требуется выполнить какие-нибудь ресурсоемкие или продолжительные по времени действия, например, загрузка дополнительных модулей, сбор информации о системе, распаковка файлов данных и т.п. Часто во время таких процессов открывается так называемое splash-окно (его также называют "сплэш-окно" или сокращенно "сплэш"), то есть модальное окно без заголовка, расположенное по центру экрана, обычно с логотипом и названием программы. Также в нем меняющейся строкой отображается текущее действие программы, и, иногда, полоса прогресса выполнения. Таким образом пользователя как бы уведомляют, что программа не зависла при запуске, а просто выполняет нужные ей действия и надо немного подождать. После появления главного окна программы сплэш закрывается. Попробуем сделать что-нибудь подобное на Ассемблере.Сперва нарисуем само окно. Оно должно быть без заголовка, модальное, можно разместить на нем картинку-логотип. Для большего эффекта добавим на это окно прогрессбар и текстовое поле для отображения состояния загрузки.
Code (Assembler) : Убрать нумерацию
- ; Стиль прогрессбара - непрерывный бегунок. В FASM значение не определено,
- ; сделаем это самостоятельно
- PBS_MARQUEE = 8
- dialog demonstration,' Splash Demo',0, 0, 150, 60,\
- WS_POPUP+DS_CENTER+DS_SYSMODAL+WS_BORDER, WS_EX_TOOLWINDOW,0,'Arial',10
- dialogitem 'STATIC',1, 1, 0, 0, 138, 38 ,WS_VISIBLE+SS_BITMAP
- dialogitem 'STATIC','Loading...',ID_TEXT, 0, 34, 150, 8 ,WS_VISIBLE+SS_CENTER
- dialogitem 'msctls_progress32', '', IDC_PROGRESS, 3, 47, 145, 10,\
- WS_VISIBLE+PBS_MARQUEE
- dialogitem 'BUTTON','',IDCANCEL, 0, 0, 0, 0, 0
- enddialog
Читать статью целиком »
Просмотров: 6926 | Комментариев: 10