Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Как узнать локальный IP-адрес компьютера

17.01.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередной небольшой сниппет, который может пригодиться в работе. Получение IP-адреса компьютера, на котором запущено приложение. Обратите внимание, что это будет локальный адрес, например, который прописан на роутере.

Для удобства дальнейшей работы надо определить структуру, в которой содержится информация о хосте. Остальное вроде бы все штатное.
  1. ; Маска для IP
  2. mask    db '%u.%u.%u.%u',0
  3.  
  4. struct HOSTENT
  5.         h_name      dd ?
  6.         h_aliases   dd ?
  7.         h_addrtype  dw ?
  8.         h_length    dw ?
  9.         h_addr_list dd ?
  10. ends
Остальной код достаточно простой. Получаем имя компьютера, по этому имени получаем информацию о хосте, затем из структуры HOSTENT извлекаем данные о IP-адресе.
  1.         invoke  WSAStartup,0101h,wsadata
  2.         or      eax,eax
  3.         jnz     loc_ret
  4.  
  5.         ; Получить имя хоста
  6.         invoke  gethostname,szHostName,MAX_PATH
  7.         or      eax,eax
  8.         jnz     loc_clean
  9.  
  10.         ; Получить адрес хоста по имени
  11.         invoke  gethostbyname,szHostName
  12.         or      eax,eax
  13.         jz      loc_clean
  14.  
  15.         ; Указатель на массив указателей на IP
  16.         mov     eax,[eax+HOSTENT.h_addr_list]
  17.         or      eax,eax
  18.         jz      loc_clean
  19.  
  20.         ; Первый указатель
  21.         mov     eax,[eax]
  22.         or      eax,eax
  23.         jz      loc_clean
  24.  
  25.         ; Преобразовать IP из формата TCP/IP в обычный
  26.         invoke  ntohl,[eax]
  27.  
  28.         ; Преобразовать байты в символы
  29.         mov     ecx,4
  30. loc_loop:
  31.         movzx   ebx,al
  32.         push    ebx
  33.         shr     eax,8
  34.         loop    loc_loop
  35.  
  36.         invoke  wsprintf,szIP,mask
  37.         add     esp,24
  38.  
  39.         ; szIP -> строка с IP хоста
  40.  
  41. loc_clean:
  42.         ; Прибраться за собой
  43.         invoke  WSACleanup
В принципе, адресов может быть больше одного, так что в случае необходимости потребуется сканировать весь массив указателей. В приведенном примере берется первый адрес.

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

Распаковка данных в формате LZRW1 на Ассемблере

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

Распаковка данных в формате LZRW1 на Ассемблере

Алгоритм компрессии LZRW1 был создан в далеких 90-х годах Ross N. Williams на базе оригинальных алгоритмов серии LZ77. Основной упор при разработке был сделан на максимальную скорость обработки данных, но при этом пришлось пожертвовать степенью сжатия. И действительно, по качеству сжатия LZRW1 недалеко ушел от LZ77, зато даже большие файлы упаковывает буквально за доли секунды.

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

Windows Error Codes Helper 1.1

18.12.2023 | Категория: Мои программы | Автор: ManHunter

Сериншот программы Windows Error Codes Helper

Программа-справочник кодов и описаний ошибок Windows. Всего в базе содержится около 30.000 кодов ошибок, собранных из различных источников: ошибки обновления, коды возврата системных API, коды завершения операций, числовые коды статусов событий и т.п. Большинство ошибок имеют текстовое описание, но даже если описания нет, по названию константы с кодом ошибки можно достаточно точно определить ее источник. Кроме готовой базы программа дополнительно пытается запрашивать описание ошибки через системные функции или из выбранной динамической библиотеки.

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

Распаковка данных в формате LZF на Ассемблере

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

Распаковка данных в формате LZF на Ассемблере

Первоначально алгоритм компрессии LZF был разработан Marc Lehmann, но в последующем был немного оптимизирован и облегчен Ильей Муравьевым. По степени сжатия находится в одном ряду с LZE и LZ4, а по скорости упаковки и распаковки показывает просто отличные результаты. При этом основная оптимизация сжатия достигается при упаковке текстовых данных.

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

Как узнать, какие привилегии есть у процесса

11.12.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я уже писал, как устанавливать нужные привилегии для процесса. Сегодня будет пример, как можно получать список доступных привилегий. Но сперва немного констант и структур, которые необходимы для работы с привилегиями.
  1. TOKEN_QUERY     = 8h
  2. TokenPrivileges = 3
  3.  
  4. struct LUID
  5.   LowPart  dd ?
  6.   HighPart dd ?
  7. ends
  8.  
  9. struct LUID_AND_ATTRIBUTES
  10.   pLuid       LUID
  11.   Attributes  dd ?
  12. ends
  13.  
  14. struct TOKEN_PRIVILEGES
  15.   PrivilegeCount   dd ?
  16.   Privileges       LUID_AND_ATTRIBUTES
  17. ends
Теперь теория. Каждому процессу соответствует свой дескриптор маркера доступа (токен), через который выполняется большинство операций, касающихся безопасности, прав доступа и подобного. Для получения информации о привилегиях надо запросить информацию о токене с помощью функции GetTokenInformation, указав в качестве класса сведений TokenPrivileges, то есть данные о привилегиях. Токен должен быть предварительно открыт с помощью функции OpenProcessToken или OpenThreadToken. На выходе будет получен массив структур TOKEN_PRIVILEGES. Поочередно перебирая эти структуры, можно определить все привилегии, которыми обладает процесс.

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 3 (0.0156 сек.) / Память: 4.5 Mb
Наверх