Blog. Just Blog

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

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

Запись мини-дампа процесса на Ассемблере

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

Для создания дампов памяти есть официально документированная функция MiniDumpWriteDump из динамической библиотеки dbghelp.dll. C ее помощью можно точно настроить, какие данные должны попасть в создаваемый дамп. Вызывается она примерно так (вариант для текущего процесса):
  1.         ; Создать файл для записи дампа
  2.         invoke  CreateFile,fname,GENERIC_WRITE,\
  3.                 FILE_SHARE_WRITE,0,CREATE_NEW,\
  4.                 FILE_ATTRIBUTE_ARCHIVE,0
  5.         mov     [desc],eax
  6.  
  7.         ; Получить ID текущего процесса
  8.         invoke  GetCurrentProcessId
  9.         mov     ebx,eax
  10.  
  11.         invoke  GetCurrentProcess
  12.  
  13.         MiniDumpNormal = 0x00000000
  14.  
  15.         ; Сделать дамп
  16.         invoke  MiniDumpWriteDump,eax,ebx,[desc],MiniDumpNormal,0,0,0
  17.  
  18.         ; Закрыть файл
  19.         invoke  CloseHandle,[desc]
Некоторое время назад исследователи безопасности обнаружили, что над этой функцией имеется обертка - недокументированная функция MiniDumpW из динамической библиотеки comsvcs.dll. Вся прелесть заключается в том, что ее элементарно использовать даже из командной строки с использованием только штатных утилит. Что-то типа

rundll32.exe C:\windows\System32\comsvcs.dll, MiniDump <PID> dump.dmp full
До некоторых пор таким способом можно было сохранить дамп процесса lsass.exe и затем при помощи какого-нибудь инструмента типа Mimikatz вытащить из него пароли учетных записей пользователей компьютера.

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

Упаковка и распаковка данных с помощью функций D3D

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

Упаковка и распаковка данных с помощью функций D3D

Функции Microsoft High Level Shader Language (HLSL) изначально предназначены для работы с шейдерами в различных графических приложениях. Но, как выяснилось, с помощью некоторых из этих функций можно весьма эффективно сжимать данные, а потом распаковывать их.

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

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

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

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

Алгоритм компрессии LZSS - очередная модификация алгоритма LZ77 за авторством James Storer и Thomas Szymanski. По первым буквам их фамилий алгоритм и получил свое название. Впервые авторы опубликовали свою работу в 1982 году, с тех пор на базе LZSS появилось несколько компрессоров от разных авторов. Скорость упаковки не самая высокая, коэффициент сжатия тоже оставляет желать лучшего, зато хорошая скорость распаковки.

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

Как получить список подсказок у иконок в трее

23.01.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня снова будем издеваться над треем. На этот раз для доступа к данным в трее будем использовать средства интерфейса IAccessible, ранее мы его уже применяли, но немного для других задач.

Структуры, константы, интерфейсы и все остальное уже расписано в статье по ссылке выше, дублировать не буду. Как пройтись по иерархии окон Проводника и получить хэндл трея с иконками тут тоже было немало примеров. Переходим к основной части.
  1.         ; Получить информацию о выбранном элементе
  2.         ; [hTray] - хэндл окна трея с иконками
  3.         invoke  AccessibleObjectFromWindow,[hTray],OBJID_CLIENT,\
  4.                 CLSID_IAccessible,pAcc
  5.  
  6.         ; Количество элементов в окне
  7.         mov     eax,[pAcc]
  8.         mov     eax,[eax]
  9.         stdcall dword [eax+IAccessible.get_accChildCount],[pAcc],tmp
  10.  
  11.         invoke  wsprintf,buff,mask1,[tmp]
  12.         add     esp,12
  13.         stdcall AddLog,[hwmain],ID_LOG,buff
  14.  
  15.         ; Начинаем перебирать с 1 элемента
  16.         mov     ebx,1
  17. loc_loop:
  18.         ; Выделить память под строку
  19.         invoke  SysAllocString,szNull
  20.         mov     [bstrName],eax
  21.  
  22.         ; Получить название выбранного элемента
  23.         push    [bstrName]
  24.         mov     [varChild.vt],VT_I4
  25.         mov     [varChild.lVal],ebx
  26.         mov     eax,varChild
  27.         push    dword [eax+0Ch]
  28.         push    dword [eax+08h]
  29.         push    dword [eax+04h]
  30.         push    dword [eax]
  31.         mov     eax,[pAcc]
  32.         mov     eax,[eax]
  33.         stdcall dword [eax+IAccessible.get_accName],[pAcc]
  34.  
  35.         ; Строка подсказки
  36.         mov     eax,[bstrName]
  37.         mov     eax,[eax]
  38.         ; EAX -> строка подсказки
  39.  
  40.         ; Прибраться за собой
  41.         invoke  SysFreeString,[bstrName]
  42.  
  43.         ; Следующий элемент
  44.         inc     ebx
  45.         cmp     ebx,[tmp]
  46.         jbe     loc_loop
  47.  
  48.         ; Прибраться за собой
  49.         mov     eax,[pAcc]
  50.         mov     eax,[eax]
  51.         stdcall dword [eax+IAccessible.Release],[pAcc]
С помощью функции AccessibleObjectFromWindow получаем интерфейс IAccessible для окна трея. С помощью метода get_accChildCount определяем количество дочерних элементов окна, они же иконки в трее, в том числе и скрытые. С помощью метода get_accName получаем текстовые строки с подсказками для каждого элемента, начиная с 1-го. Нулевому элементу соответствует само окно трея.

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

Как узнать локальный 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
В принципе, адресов может быть больше одного, так что в случае необходимости потребуется сканировать весь массив указателей. В приведенном примере берется первый адрес.

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

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