
Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта

Еще один генератор случайных чисел на Ассемблере
17.05.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
В закромах Родины нашлась реализация еще одного генератора случайных чисел. Он более громоздкий, чем минимальный генератор Парка-Миллера, использует операции с плавающей точкой и кольцевой буфер, но результаты выдает гораздо лучше. Кроме большого кода ему также требуется больше места и в сегменте данных:Code (Assembler) : Убрать нумерацию
- section '.data' data readable writeable
- ; Данные для генератора случайных чисел
- JJ = 10 ; lag 1
- KK = 17 ; lag 2, size of circular buffer
- R1 = 19 ; rotate count
- R2 = 27 ; rotate count
- randp1 dt 1.5 ; used for conversion to float
- dw 0 ; alignment
- p1 dd 0 ; pointer in circular buffer
- p2 dd 0 ; pointer in circular buffer
- randbuf dd (2*KK) dup(?) ; circular buffer
Code (Assembler) : Убрать нумерацию
- ; Инициализация генератора случайных чисел
- invoke GetTickCount
- stdcall WRandomInit,eax
- ...
Читать статью целиком »
Просмотров: 11068 | Комментариев: 10

Создание анимированной иконки приложения
24.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная милая рюшечка для украшения программ - анимированная иконка. Она может быть как в заголовке окна, так и в системном трее. Кроме чисто декоративной функции анимация часто используется и в полезных целях, например, почтовая программа TheBat! таким способом оповещает, что пришло новое письмо, качалка Download Master показывает свою активность при загрузке файлов, антивирусы обозначают процесс сканирования файлов, ICQ крутит "цветочек" при подключении, ну и так далее. Реальных примеров на самом деле много.Для всех вариантов анимации сперва надо подготовить исходный материал. Это должны быть иконки одинакового размера, представляющие собой отдельные кадры анимации. У меня это будет вращающийся смайлик. Художник из меня никудышный, поэтому я просто взял и повернул готовый смайлик нужное количество раз на 45 градусов по часовой стрелке.

Кадры для анимации
В ресурсах иконки лучше всего описывать номерными индексами. Обратите внимание, что индексы иконок идут по порядку, так будет гораздо легче работать с ними:
Code (Assembler) : Убрать нумерацию
- resource group_icons,\
- 1,LANG_NEUTRAL,animate1,\
- 2,LANG_NEUTRAL,animate2,\
- 3,LANG_NEUTRAL,animate3,\
- 4,LANG_NEUTRAL,animate4,\
- 5,LANG_NEUTRAL,animate5,\
- 6,LANG_NEUTRAL,animate6,\
- 7,LANG_NEUTRAL,animate7,\
- 8,LANG_NEUTRAL,animate8
- resource icons,\
- 1,LANG_NEUTRAL,icon_data1,\
- 2,LANG_NEUTRAL,icon_data2,\
- 3,LANG_NEUTRAL,icon_data3,\
- 4,LANG_NEUTRAL,icon_data4,\
- 5,LANG_NEUTRAL,icon_data5,\
- 6,LANG_NEUTRAL,icon_data6,\
- 7,LANG_NEUTRAL,icon_data7,\
- 8,LANG_NEUTRAL,icon_data8
- icon animate1,icon_data1,'icon1.ico'
- icon animate2,icon_data2,'icon2.ico'
- icon animate3,icon_data3,'icon3.ico'
- icon animate4,icon_data4,'icon4.ico'
- icon animate5,icon_data5,'icon5.ico'
- icon animate6,icon_data6,'icon6.ico'
- icon animate7,icon_data7,'icon7.ico'
- icon animate8,icon_data8,'icon8.ico'
Читать статью целиком »
Просмотров: 9971 | Комментариев: 14

Построение карты памяти процесса
02.04.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Умение работать с памятью сторонних процессов - полезный навык адепта Темной стороны Силы. Таким способом можно найти нужные данные, хранящиеся в памяти, например, расшифрованные файлы, изображения, пароли, и еще много чего вкусного. Также этот навык пригодится при создании распаковщиков, лоадеров для программ и трейнеров для различных игр. Я привел лишь несколько примеров, на практике их можно найти гораздо больше.Для построения карты памяти процесса используется функция VirtualQueryEx и специальная структура MEMORY_BASIC_INFORMATION. В FASM она как обычно не определена, придется сделать это самостоятельно в сегменте данных:
Code (Assembler) : Убрать нумерацию
- ; Структура для чтения памяти процесса
- struct MEMORY_BASIC_INFORMATION
- BaseAddress dd ?
- AllocationBase dd ?
- AllocationProtect dd ?
- RegionSize dd ?
- State dd ?
- Protect dd ?
- Type dd ?
- ends
- ; Структура для чтения памяти процесса
- mbi MEMORY_BASIC_INFORMATION
Читать статью целиком »
Просмотров: 8505 | Комментариев: 8

Создание и обработка улучшенного MessageBox
19.03.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
В одной из прошлых статей мы уже научились обрабатывать и облагораживать окно выбора каталога, а теперь сделаем что-нибудь необычное и противоестественное с окном сообщения MessageBox. Первое, что приходит на ум - это описать аналог MessageBox в ресурсах или создавать его динамически по мере надобности, но это получается как-то слишком просто. Попробуем перехватить стандартное окно MessageBox в момент создания. Для этого поставим хук на текущий тред нашего процесса, хук должен иметь тип WH_CBT:Code (Assembler) : Убрать нумерацию
- ...
- ; Получить хэндл текущего потока
- invoke GetCurrentThreadId
- ; Установить перехватчик событий
- invoke SetWindowsHookEx,WH_CBT,MBHookProc,NULL,eax
- ; Сохранить хэндл хука
- mov [hMBHook],eax
- ...
Code (Assembler) : Убрать нумерацию
- section '.date' data readable writeable
- ; Заголовок и текст окна
- szTitle db 'Hello!',0
- szMess db 'This is a Customized MessageBox with long text!',13,10
- db 'FASM is the BEST Assembler!',0
- ; Новый текст на кнопках
- szButt1 db 'Of Course ;)',0
- szButt2 db 'No-no-no!!!',0
- ; Название класса окна
- cname db 'EDIT',0
- hMBHook dd ? ; Хэндл хука
- pOldProc dd ? ; Адрес старого обработчика окна
- hInstance dd ? ; Хэндл модуля
- hHeap dd ? ; Хэндл кучи
- hMemory dd ? ; Указатель на память
- coord RECT ; Размеры текста
Читать статью целиком »
Просмотров: 6722 | Комментариев: 6

Восстановление иконки в трее после сбоя системы
02.03.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Если ваше приложение создает и использует свою иконку в трее, то в обязательном порядке надо обрабатывать ситуацию, когда по какой-либо причине произошел сбой и перезапуск Explorer'а. В этом случае перерисовывается панель задач, рабочий стол, системный трей со значками и т.д., и если вы не вернете свою иконку в трей, то она "потеряется". При аварийном перезапуске Explorer'а всем окнам (HWND_BROADCAST) системой отсылается сообщение TaskbarCreated. Особенность этого сообщения в том, что оно не имеет постоянного значения идентификатора, и его значение должно быть получено функцией RegisterWindowMessage. В описаниях этой функции сказано, что она используется для регистрации уникального системного сообщения, но почему-то нигде не указано, что если такое сообщение уже зарегистрировано в системе, то функцией возвращается его существующий идентификатор. Это полезное свойство мы и будем использовать.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- ...
- szTBC db 'TaskbarCreated',0 ; Имя сообщения
- restore_msg dd ? ; Идентификатор сообщения TaskbarCreated
- ...
Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- ...
- ; Зарегистрировать сообщение TaskbarCreated
- invoke RegisterWindowMessage,szTBC
- mov [restore_msg],eax
- ...
Code (Assembler) : Убрать нумерацию
- ...
- ; Сообщение TaskbarCreated?
- mov eax,[msg]
- cmp eax,[restore_msg]
- je .wmrestore
- ...
- .wmrestore:
- ; Восстановить иконку в трее
- invoke Shell_NotifyIcon, NIM_ADD, node
- jmp .processed
- ...
Читать статью целиком »
Просмотров: 7194 | Комментариев: 4
