Blog. Just Blog

Образ мышления: Assembler

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

Получение списка DLL, загруженных в текущий процесс

12.06.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня я покажу вам небольшой трюк, с помощью которого вы сможете получить список всех DLL (динамических библиотек), загруженных в ваше приложение. Хитрость заключается в том, что для этого мы вообще не будем использовать никакие API.

Сперва немного теории. Каждому процессу в системе соответствует особая структура PEB (Process Enviroment Block), в ней содержится большое количество полезной информации о процессе. Адрес PEB можно узнать из другой структуры - TIB (Thread Information Block), адрес которой, в свою очередь, всегда можно получить по фиксированному адресу [FS:0]. Так вот, одно из полей PEB указывает на массив структур, в которых содержится информация о всех динамических библиотеках, загруженных в адресное пространство процесса. Этот массив называется PEB_LDR_DATA. Перебирая по очереди записи из этого массива, можно получить интересующий нас список DLL, а также адреса загрузки в память и Virtual Address точки входа этих библиотек.

Переходим к программированию. Flat Assembler "из коробки" не знает структур для работы с PEB_LDR_DATA, поэтому придется ему в этом помочь:
  1. struct UNICODE_STRING
  2.   Length        dw ?
  3.   MaximumLength dw ?
  4.   Buffer        dd ?
  5. ends
  6.  
  7. struct LIST_ENTRY
  8.   Flink         dd ?
  9.   Blink         dd ?
  10. ends
  11.  
  12. struct LDR_DATA_ENTRY
  13.   InMemoryOrderModuleList LIST_ENTRY
  14.   BaseAddress   dd ?
  15.   EntryPoint    dd ?
  16.   SizeOfImage   dd ?
  17.   FullDllName   UNICODE_STRING
  18.   BaseDllName   UNICODE_STRING
  19.   Flags         dd ?
  20.   LoadCount     dw ?
  21.   TlsIndex      dw ?
  22.   HashTableEntry LIST_ENTRY
  23.   TimeDateStamp dd ?
  24. ends
Записи перелинкованы между собой посредством поля InMemoryOrderModuleList.Flink, в котором прописана информация об адресе следующей записи. Важно учитывать, что массив "закольцован", то есть последняя запись ссылается на первую. При переборе надо проверять, например, поле BaseAddress текущей записи, если оно нулевое, то обработку следует остановить. Записи в массиве располагаются в порядке их загрузки в память.

Читать статью целиком »
Просмотров: 1611 | Комментариев: 12

Как определить состояние SUSPENDED процесса

26.04.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как определить состояние SUSPENDED процесса

Сегодня разберем интересный вопрос. Как программно узнать, заморожен процесс (SUSPENDED) или выполняется? Подобную информацию показывает, например, утилита Process Explorer. Строго говоря, у процесса не может быть состояния SUSPENDED, так что сама постановка вопроса и заголовок статьи не вполне корректные. Процесс может считаться замороженным, когда все без исключения его потоки находятся в состоянии SUSPENDED. Если хоть один поток активен, процесс также считается активным.

Читать статью целиком »
Просмотров: 1444 | Комментариев: 3

Как узнать заряд батареи ноутбука

15.03.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как узнать заряд батареи ноутбука

Если вы разрабатываете программы, предназначенные для ноутбуков, в них надо учитывать один важный момент - состояние питания и статус батареи. Например, при низком уровне заряда батареи лучше предупредить пользователя о несохраненных данных, или попробовать приостановить какие-нибудь ресурсоемкие операции до подключения ноутбука к сети. Как обычно, я буду использовать мой любимый Ассемблер.

Читать статью целиком »
Просмотров: 1667 | Комментариев: 3

Работа с Desktop Window Manager на Ассемблере

02.03.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter

Работа с Desktop Window Manager на Ассемблере

Начиная с Windows Vista, в составе системы появился Desktop Window Manager, он же Диспетчер рабочего стола. Этот компонент обеспечивает визуальные эффекты и возможности интерфейса Windows Aero, например, такие как полупрозрачные заголовки окон, Aero Peek, Flip3D и живые миниатюры окон на таскбаре при наведении на него мышкой. Для взаимодействия с Desktop Window Manager разработчикам программ предоставляется целый набор функций API, с некоторыми из этих функций мы сегодня научимся работать.

Читать статью целиком »
Просмотров: 2052 | Комментариев: 6

Расчет Fletcher's Checksum на Ассемблере

15.02.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм Fletcher's Checksum был назван в честь его автора - Джона Флетчера (John Fletcher), который разрабатывал проекты для систем дальней связи, тяжелой промышленности, спутниковой навигации и даже NASA. Ему потребовался максимально быстрый и компактный алгоритм для контроля целостности передаваемых данных. Для обработки больших объемов данных Fletcher's Checksum не подходит, так как велика вероятность коллизий (количество возможных значений контрольной суммы всего 65535). Этот алгоритм наиболее эффективен для обнаружения погрешности в несколько бит, например, искажение пакета данных в случае помех при передаче по линии связи. Дальнейшее развитие алгоритма Fletcher's Checksum привело к появлению алгоритма Adler-32, о котором я писал раньше.
  1. ;-----------------------------------------------------------------------
  2. ; Функция вычисления контрольной суммы Флетчера
  3. ; by ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;-----------------------------------------------------------------------
  6. ; Параметры:
  7. ;       lpData - указатель на строку
  8. ;       dSize  - длина строки
  9. ; На выходе:
  10. ;       AX = полученный хеш
  11. ;-----------------------------------------------------------------------
  12. proc    fletcher lpData:DWORD, dSize:DWORD
  13.         push    ebx ecx esi
  14.  
  15.         ; Инициализация
  16.         xor     ebx,ebx
  17.  
  18.         ; Длина строки
  19.         mov     ecx,[dSize]
  20.         or      ecx,ecx
  21.         jz      .loc_ret
  22.  
  23.         ; Указатель на начало строки
  24.         mov     esi,[lpData]
  25.  
  26.         ; Хеширование
  27. .loc_checksum:
  28.         lodsb
  29.         add     bl,al
  30.         add     bh,bl
  31.         loop    .loc_checksum
  32.  
  33. .loc_ret:
  34.         movzx   eax,bx
  35.  
  36.         pop     esi ecx ebx
  37.         ret
  38. endp
Параметры вызова: lpData - указатель на данные, для которых надо подсчитать контрольную сумму, dSize - размер данных. 16-битное значение контрольной суммы возвращается в регистре EAX. Алгоритм легко преобразуется в вариант Fletcher-32 и Fletcher-64, разница только в используемых регистрах и размере блоков, используемых для цикла хеширования.

Читать статью целиком »
Просмотров: 1230 | Комментариев: 0

prev 01 ... 06 07 08 09 10 11 12 ... 36 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.002 сек.) / Память: 4.75 Mb
Наверх