Быстрый поиск
Введите фрагмент названия статьи для поиска
Запись мини-дампа процесса на Ассемблере
07.02.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Дампы или мини-дампы создаются обычно в случае аварийного падения процесса или системы. С помощью специальных программ по дампам можно восстановить примерное окружение, на котором произошел сбой, проанализировать его и установить процесс или код, который привел к критическому сбою.Для создания дампов памяти есть официально документированная функция MiniDumpWriteDump из динамической библиотеки dbghelp.dll. C ее помощью можно точно настроить, какие данные должны попасть в создаваемый дамп. Вызывается она примерно так (вариант для текущего процесса):
Code (Assembler) : Убрать нумерацию
- ; Создать файл для записи дампа
- invoke CreateFile,fname,GENERIC_WRITE,\
- FILE_SHARE_WRITE,0,CREATE_NEW,\
- FILE_ATTRIBUTE_ARCHIVE,0
- mov [desc],eax
- ; Получить ID текущего процесса
- invoke GetCurrentProcessId
- mov ebx,eax
- invoke GetCurrentProcess
- MiniDumpNormal = 0x00000000
- ; Сделать дамп
- invoke MiniDumpWriteDump,eax,ebx,[desc],MiniDumpNormal,0,0,0
- ; Закрыть файл
- invoke CloseHandle,[desc]
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, ранее мы его уже применяли, но немного для других задач.Структуры, константы, интерфейсы и все остальное уже расписано в статье по ссылке выше, дублировать не буду. Как пройтись по иерархии окон Проводника и получить хэндл трея с иконками тут тоже было немало примеров. Переходим к основной части.
Code (Assembler) : Убрать нумерацию
- ; Получить информацию о выбранном элементе
- ; [hTray] - хэндл окна трея с иконками
- invoke AccessibleObjectFromWindow,[hTray],OBJID_CLIENT,\
- CLSID_IAccessible,pAcc
- ; Количество элементов в окне
- mov eax,[pAcc]
- mov eax,[eax]
- stdcall dword [eax+IAccessible.get_accChildCount],[pAcc],tmp
- invoke wsprintf,buff,mask1,[tmp]
- add esp,12
- stdcall AddLog,[hwmain],ID_LOG,buff
- ; Начинаем перебирать с 1 элемента
- mov ebx,1
- loc_loop:
- ; Выделить память под строку
- invoke SysAllocString,szNull
- mov [bstrName],eax
- ; Получить название выбранного элемента
- push [bstrName]
- mov [varChild.vt],VT_I4
- mov [varChild.lVal],ebx
- mov eax,varChild
- push dword [eax+0Ch]
- push dword [eax+08h]
- push dword [eax+04h]
- push dword [eax]
- mov eax,[pAcc]
- mov eax,[eax]
- stdcall dword [eax+IAccessible.get_accName],[pAcc]
- ; Строка подсказки
- mov eax,[bstrName]
- mov eax,[eax]
- ; EAX -> строка подсказки
- ; Прибраться за собой
- invoke SysFreeString,[bstrName]
- ; Следующий элемент
- inc ebx
- cmp ebx,[tmp]
- jbe loc_loop
- ; Прибраться за собой
- mov eax,[pAcc]
- mov eax,[eax]
- stdcall dword [eax+IAccessible.Release],[pAcc]
Читать статью целиком »
Просмотров: 418 | Комментариев: 4
Как узнать локальный IP-адрес компьютера
17.01.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередной небольшой сниппет, который может пригодиться в работе. Получение IP-адреса компьютера, на котором запущено приложение. Обратите внимание, что это будет локальный адрес, например, который прописан на роутере.Для удобства дальнейшей работы надо определить структуру, в которой содержится информация о хосте. Остальное вроде бы все штатное.
Code (Assembler) : Убрать нумерацию
- ; Маска для IP
- mask db '%u.%u.%u.%u',0
- struct HOSTENT
- h_name dd ?
- h_aliases dd ?
- h_addrtype dw ?
- h_length dw ?
- h_addr_list dd ?
- ends
Code (Assembler) : Убрать нумерацию
- invoke WSAStartup,0101h,wsadata
- or eax,eax
- jnz loc_ret
- ; Получить имя хоста
- invoke gethostname,szHostName,MAX_PATH
- or eax,eax
- jnz loc_clean
- ; Получить адрес хоста по имени
- invoke gethostbyname,szHostName
- or eax,eax
- jz loc_clean
- ; Указатель на массив указателей на IP
- mov eax,[eax+HOSTENT.h_addr_list]
- or eax,eax
- jz loc_clean
- ; Первый указатель
- mov eax,[eax]
- or eax,eax
- jz loc_clean
- ; Преобразовать IP из формата TCP/IP в обычный
- invoke ntohl,[eax]
- ; Преобразовать байты в символы
- mov ecx,4
- loc_loop:
- movzx ebx,al
- push ebx
- shr eax,8
- loop loc_loop
- invoke wsprintf,szIP,mask
- add esp,24
- ; szIP -> строка с IP хоста
- loc_clean:
- ; Прибраться за собой
- invoke WSACleanup
Читать статью целиком »
Просмотров: 430 | Комментариев: 0