Visual Studio - по определению доступна всем, только есть одна проблема - отсутствие реального прогресса. Можно не заморачиваться, никто не заставляет. Я в любом случае пойду по этому пути. Мне это всегда было интересно. Интереснее чем нейросети и написание мини игр. При выборе хидеров я отталкиваюсь от своих проектов которые были реализованы на другом языке. Я примерно представляю что должно получиться в итоге. Я буквально пару дней назад не знал что такое макросы. Когда удалось собрать минимальный хелл-ворд стало ясно что до этого происходило с масмом. (Задал правильные вопросы ллм). Что убрали из 64 по сравнению с 32. Политика фундаментального огораживания. И откуда появилась temphls.inc. И как потом все остановилось. (Нет единого стандарта).
Это называется - изучение архитектуры компьютера через разработку ide (решение практической задачи). Вам может быть непонятно зачем это нужно, и какой в этом смысл. Если вы никогда ничего своего не написали
насколько я помню,что бы скачать старые версии Visual Studio нужно регистрироваться и номер мобилы нужно указывать,а вот что бы скачать WinDDK регистрироваться не надо
Надо будет вернуться к чистому компилю/хидерам. Компилятор с, компилятор масма. И все необходимые файлы. Вместо того чтобы юзать MinGW выдернуть все из vs. На васме есть статьи по подключению ide
Можно и цикл статей по поводу редактора к IDE MASM64 Где-то попадался цикл статей о редакторе на основе Scintilla, но пока не могу найти. Может быть кто-нибудь подскажет?
Мне кажется, что более важнее раскрыть тему MASM64/UASM64 c унификацией важных директив и макросов с примерами кода (касается только MASM, в UASM всё это есть), затем MASM32/UASM32 c унификацией важных директив и макросов, с примерами кода (касаемо MASM), и закрыть всё компилятором C/C++ на базе VS. Но сначала - на базе батников. А потом не спеша подумать про редактор для MASM/можно и для UASM. Может в такой последовательности? Но, опять же, оговорюсь, что советовать всегда проще, а там смотрите сами... Почему добавил UASM? Потому, что это способ выйти за пределы Windows. Да и, вроде как, UASM - это улучшенный MASM...
GRAFik, нас не очень много, но всё же с созданием пакета MASM64 один человек вряд ли справится. Здесь пока идет обсуждение. Я создал отдельную тему "Пакет MASM64. Готовые наработки" куда будем выкладывать батники, примеры и т.д.
Обзор направлений, от батона до индия: Фундаментальный уровень: архитектура x86/x64 │ ├── 1. Система команд и процессор │ ├── 1.1. Наборы инструкций │ │ ├── Базовые инструкции (mov, add, jmp…) │ │ ├── Расширения (MMX, SSE, AVX) → поддержка в компиляторах/ассемблерах │ │ └── Специфические инструкции (rdtsc, sysenter, int3) → антиотладка/трассировка │ │ │ ├── 1.2. Режимы работы процессора │ │ ├── Реальный режим (16-бит) – legacy, DOS │ │ ├── Защищённый режим (32-бит) – основа Windows NT │ │ └── Длинный режим (64-бит) – x64, особенности (выравнивание стека, соглашения вызова) │ │ │ └── 1.3. Прерывания и исключения │ ├── IDT (Interrupt Descriptor Table) – обработка прерываний (int 1, int 3, int 2e) │ └── SEH (Structured Exception Handling) – перехват исключений в коде │ ├── 2. Операционная система Windows NT │ ├── 2.1. Ядро и режимы │ │ ├── Kernel-mode (ring0) – драйверы, системные службы │ │ ├── User-mode (ring3) – приложения, API │ │ └── IRQL (Interrupt Request Level) – иерархия приоритетов, ограничения на вызовы API │ │ │ ├── 2.2. Структуры ядра │ │ ├── EPROCESS, ETHREAD – управление процессами/потоками │ │ ├── PEB (Process Environment Block) – информация о процессе (user-mode) │ │ ├── SSDT (System Service Descriptor Table) – таблица системных вызовов │ │ └── Объекты ядра (объекты синхронизации, файловые объекты) │ │ │ ├── 2.3. Системные вызовы и API │ │ ├── Native API (ntdll.dll) – интерфейс к ядру │ │ ├── Win32 API (kernel32, user32, gdi32) – высокоуровневые обёртки │ │ └── COM (Component Object Model) – межпроцессное взаимодействие, автоматизация │ │ │ └── 2.4. Менеджер памяти и ввод-вывод │ ├── Виртуальная память (VirtualAlloc, MDL, страничный файл) │ ├── Работа с дисками (CreateFile, ReadFile, IRP) │ └── Файловые системы (NTFS, FAT) – атрибуты, права доступа │ ├── 3. Инструменты разработки и анализа │ ├── 3.1. Ассемблеры │ │ ├── MASM (Microsoft Macro Assembler) – коммерческий, стандарт для Windows │ │ ├── FASM (Flat Assembler) – портативный, мощный макроязык, популярен в сообществе │ │ ├── NASM / YASM – кроссплатформенные, синтаксис Intel/AT&T │ │ ├── TASM (Turbo Assembler) – устаревший, режим совместимости с MASM │ │ └── UASM – форк MASM, продолжение разработки │ │ │ ├── 3.2. Отладчики и дизассемблеры │ │ ├── IDA Pro – статический анализ, декомпиляция, поддержка множества архитектур │ │ ├── Ghidra – открытый фреймворк от NSA, конкурент IDA │ │ ├── OllyDbg / x64dbg – user-mode отладчики, динамический анализ │ │ ├── WinDbg – отладка ядра, анализ дампов │ │ └── Radare2 / Cutter – консольный/графический фреймворк │ │ │ ├── 3.3. Компиляторы и среды │ │ ├── Visual C++ (MSVC) – стандарт для Windows │ │ ├── GCC / MinGW – open source, кроссплатформенность │ │ ├── Delphi / Free Pascal – объектно-ориентированный Паскаль, VCL │ │ └── Python – скриптование, автоматизация (IDC-скрипты, IDAPython, Ghidra) │ │ │ └── 3.4. Вспомогательные утилиты │ ├── PE-редакторы (CFF Explorer, Hiew, LordPE) │ ├── Мониторинг (Process Monitor, API Monitor, Wireshark) │ └── Виртуальные машины (VMware, VirtualBox) – изоляция, тестирование │ ├── 4. Техники реверсинга и модификации кода │ ├── 4.1. Статический анализ │ │ ├── Дизассемблирование – преобразование машинного кода в мнемоники │ │ ├── Декомпиляция – восстановление псевдокода (Hex-Rays, Ghidra) │ │ ├── Анализ сигнатур – поиск библиотечных функций (FLIRT, sigmake) │ │ └── Работа с PE-заголовками – секции, импорт, экспорт, ресурсы │ │ │ ├── 4.2. Динамический анализ │ │ ├── Отладка (User-mode, Kernel-mode) – брейкпоинты, трассировка │ │ ├── Эмуляция (Unicorn, QEMU, эмуляторы) – исполнение кода в изолированной среде │ │ ├── Инструментирование (Pin, DynamoRIO) – трассировка, модификация на лету │ │ └── Мониторинг системных вызовов (API Hooking, SSDT Hooking) │ │ │ ├── 4.3. Модификация исполняемых файлов │ │ ├── Патчинг (HEX-редактирование, вставка кода) │ │ ├── Инжекция кода (DLL Injection, Process Hollowing) │ │ ├── Пакеры и крипторы (UPX, ASProtect, собственные) – сжатие/шифрование │ │ └── Редактирование ресурсов – замена иконок, строк │ │ │ └── 4.4. Обход защит │ ├── Снятие протекторов (анпакеры, отладка до OEP) │ ├── Антиотладочные приёмы (проверка PEB, IsDebuggerPresent, NtGlobalFlag) │ ├── Детект эмуляторов (VMware, VirtualPC) – по инструкциям, таймингам │ └── Кейгенинг – восстановление алгоритмов лицензирования │ ├── 5. Защита ПО │ ├── 5.1. Программные протекторы │ │ ├── Упаковщики (UPX, ASPack) – сжатие │ │ ├── Крипторы (Enigma Protector, Themida) – шифрование секций │ │ └── Виртуализация (VMProtect, StarForce) – преобразование кода в байткод VM │ │ │ ├── 5.2. Аппаратные средства защиты │ │ ├── USB-ключи (Guardant, HASP, Sentinel) – хранение алгоритмов │ │ └── Смарт-карты – криптографические операции │ │ │ └── 5.3. Антиреверс-техники │ ├── Обфускация кода (мусорные инструкции, запутанный поток управления) │ ├── Полиморфизм – изменение сигнатур │ ├── Антиотладка (проверка наличия отладчика, искажение работы) │ └── Самомодифицирующийся код (SMC) – расшифровка в runtime │ ├── 6. Экосистема и сообщество │ ├── 6.1. Форум WASM.ru – площадка для обсуждения низкоуровневого программирования │ ├── 6.2. Холивары │ │ ├── Ассемблеры: FASM vs MASM – синтаксис, макросы, удобство │ │ ├── Языки: C vs C++ vs Pascal – производительность, сложность │ │ ├── ОС: Windows vs Linux – удобство, экосистема, безопасность │ │ └── Идеологии: open source vs проприетарное ПО │ │ │ └── 6.3. Образование и карьера │ ├── Изучение ассемблера (с чего начать, литература) │ ├── Реверс-инжиниринг как профессия (спрос, заработок) │ └── Применение в индустрии (антивирусы, безопасность, игры) │ └── 7. Офтоп и личные интересы ├── Философия, наука, религия (теория эволюции, симуляция реальности) ├── Музыка, кино, хобби (электрогитара, аудиотехника) ├── Социальные наблюдения (политика, фрики, деанонимизация) └── Мемы и юмор (внутренние шутки форума, анекдоты) [Фундаментальные принципы] +-- Аппаратная архитектура IA-32/x86 | +-- Реальный режим (Real Mode) | | +-- Сегментная адресация (сегмент: смещение) | | +-- Прерывания BIOS/DOS (INT 13h, INT 10h, INT 21h) | | +-- TSR (Terminate and Stay Resident) | +-- Защищённый режим (Protected Mode) | | +-- Сегментная модель (GDT/LDT) | | | +-- Дескрипторы сегментов (код, данные, TSS) | | | +-- Уровни привилегий (Ring 0, 1, 2, 3) | | +-- Страничная трансляция (Paging) | | | +-- Каталог страниц (Page Directory) → PDE | | | +-- Таблицы страниц (Page Table) → PTE | | | +-- Физический адрес (PFN) | | | +-- TLB (Translation Lookaside Buffer) | | +-- Прерывания и исключения | | | +-- IDT (Interrupt Descriptor Table) | | | +-- Обработчики прерываний (ISR) | | | +-- Двойная ошибка (Double Fault) → тройная ошибка (Triple Fault) | | +-- Управление задачами | | | +-- TSS (Task State Segment) | | | +-- Аппаратное переключение задач (редко используется) | +-- 64-разрядное расширение (x64 / AMD64) | +-- Long Mode | +-- SYSCALL/SYSRET (вместо SYSENTER/SYSEXIT) | +-- Дополнительные регистры (R8-R15) +-- Ядро Windows (NTOSKRNL.EXE, HAL.DLL) | +-- Менеджер объектов (Object Manager) | | +-- Структура объекта (OBJECT_HEADER, OBJECT_TYPE) | | +-- Типы объектов ядра | | | +-- EPROCESS (процесс) | | | | +-- KPROCESS (базовая структура ядра) | | | | +-- PEB (Process Environment Block) – пользовательский режим | | | | +-- Список активных процессов (PsActiveProcessHead) | | | +-- ETHREAD (поток) | | | | +-- KTHREAD (базовая структура ядра) | | | | +-- TEB (Thread Environment Block) – пользовательский режим | | | | +-- Состояния потока (Running, Ready, Waiting, Terminated) | | | +-- FILE_OBJECT (открытый файл) | | | +-- DEVICE_OBJECT (устройство) | | | +-- DRIVER_OBJECT (драйвер) | | | +-- Объекты синхронизации (KEVENT, KMUTEX, KSPIN_LOCK, KFAST_MUTEX) | | +-- Таблица дескрипторов процесса (Handle Table) | | | +-- Хендл (HANDLE) как индекс в таблице | | | +-- Дескриптор объекта (OBJECT_HANDLE_INFORMATION) | | +-- Дублирование хендлов (ZwDuplicateObject) | +-- Менеджер ввода-вывода (I/O Manager) | | +-- IRP (I/O Request Packet) | | | +-- Стек IRP (IO_STACK_LOCATION) | | | +-- Функции завершения (IoCompletionRoutine) | | | +-- Типы IRP (MJ_CREATE, MJ_CLOSE, MJ_READ, MJ_WRITE, MJ_DEVICE_CONTROL, ...) | | +-- Драйверы устройств | | | +-- Legacy-драйверы | | | +-- PnP-драйверы | | | +-- Фильтры (файловые системы, сетевые, клавиатуры, дисков) | | | +-- Драйверы файловых систем (NTFS, FAT32) | | | +-- NDIS (Network Driver Interface Specification) | | | +-- TDI (Transport Driver Interface) | | | +-- Драйверы минипорта (видео, USB) | | +-- Символьные ссылки (Symbolic Links) – \DosDevices\C: | | +-- Объекты "устройство" (\Device\HarddiskVolume1, \Device\Tcp, \Device\KeyboardClass0) | +-- Менеджер памяти (Memory Manager) | | +-- Виртуальная память (Virtual Address Space) | | | +-- Резервирование (VirtualAlloc, MEM_RESERVE) | | | +-- Фиксация (VirtualAlloc, MEM_COMMIT) | | | +-- Атрибуты страниц (PAGE_READONLY, PAGE_READWRITE, PAGE_EXECUTE, PAGE_GUARD, PAGE_NOACCESS) | | +-- Рабочий набор (Working Set) | | +-- Файл подкачки (Pagefile.sys) | | +-- Отображение файлов (Memory-Mapped Files, секции) | | | +-- ZwCreateSection, ZwMapViewOfSection | | | +-- Прототипные PTE (Prototype PTE) | | | +-- VAD (Virtual Address Descriptor) | | +-- Физическая память | | | +-- MmMapIoSpace (отображение физической памяти в ядро) | | | +-- MDL (Memory Descriptor List) | | | +-- PFN (Page Frame Number) | | | +-- Невыгружаемый пул (NonPagedPool) | | | +-- Выгружаемый пул (PagedPool) | +-- Менеджер процессов и потоков (Process/Thread Manager) | | +-- Планировщик потоков (Thread Scheduler) | | | +-- Приоритеты потоков | | | +-- Кванты времени | | | +-- Переключение контекста (SwapContext) | | | +-- DPC (Deferred Procedure Call), APC (Asynchronous Procedure Call) | | +-- Создание процесса (NtCreateProcess, NtCreateProcessEx) | | | +-- PE-загрузчик | | | | +-- Структура PE-файла (DOS-заголовок, NT-заголовки, секции, импорт, экспорт, релоки) | | | | +-- Отображение секций в виртуальное пространство | | | | +-- Обработка импорта (IAT) | | | | +-- Вызов точки входа (AddressOfEntryPoint) | | | +-- Родительский процесс, наследование хендлов | | +-- Нотификации о создании/завершении (PsSetCreateProcessNotifyRoutine) | +-- Диспетчер системных сервисов (System Service Dispatcher) | | +-- Таблица системных сервисов (SSDT / KeServiceDescriptorTable) | | | +-- NTOSKRNL сервисы (Nt*) | | | +-- Win32k сервисы (Shadow SSDT / KeServiceDescriptorTableShadow) | | +-- Механизм вызова системных сервисов | | | +-- SYSENTER / SYSEXIT (быстрый вызов) | | | +-- INT 2E (для совместимости) | | | +-- KiFastCallEntry / KiSystemService | | | +-- KiFastSystemCall (ntdll!KiFastSystemCall) | | | +-- KiIntSystemCall (ntdll!KiIntSystemCall) | | | +-- KiFastSystemCallRet (точка возврата) | | +-- Различия между Nt* и Zw* (PreviousMode, проверка параметров) | +-- Управление питанием (Power Manager) | | +-- Глубокий сон (S3), гибернация | | +-- Управление питанием устройств | +-- Плагин-менеджер (Plug and Play) | +-- Динамическое обнаружение устройств | +-- IRP_MN_QUERY_DEVICE_RELATIONS и др. +-- Драйверы режима ядра | +-- Структура драйвера (DRIVER_OBJECT) | | +-- Точка входа (DriverEntry) | | +-- Функция выгрузки (DriverUnload) | | +-- Массив функций MajorFunction[] (обработчики IRP) | +-- Объекты устройств (DEVICE_OBJECT) | | +-- Стек устройств (AttachedDevice) | | +-- Аттач (IoAttachDeviceToDeviceStack) | +-- Типы драйверов | | +-- Драйверы устройств (например, драйвер клавиатуры i8042prt) | | +-- Драйверы-фильтры | | | +-- Фильтры файловых систем (File System Filters) | | | +-- Фильтры TDI (TDI Filters) | | | +-- Фильтры NDIS (NDIS Intermediate Drivers) | | | +-- Фильтры клавиатуры/мыши | | +-- Драйверы минипорта (видео, USB) | +-- Методы ввода-вывода (BUFFERED, DIRECT, NEITHER) | +-- IRP-хуки и подмена обработчиков | +-- Выгрузка драйвера (синхронизация с ожиданием завершения IRP) +-- Подсистемы и интерфейсы | +-- Native API (NTDLL.DLL) | | +-- Экспортируемые функции (Nt*, Zw*) | | +-- Врапперы для системных вызовов (sysenter/int2e) | | +-- Неэкспортируемые функции (поиск по сигнатурам) | +-- Win32 API (KERNEL32.DLL, USER32.DLL, GDI32.DLL, ADVAPI32.DLL) | | +-- Подсистема Win32 (CSRSS.EXE, WINSRV.DLL) | | | +-- LPC (Local Procedure Call) для связи с CSRSS | | | +-- CsrClientCallServer | | +-- Пользовательский режим GUI (Win32k.sys) | | | +-- Shadow SSDT | | | +-- Оконные сообщения, хуки (SetWindowsHookEx) | | | +-- GDI+ / DirectX | +-- CRT (C Runtime Library) – MSVCRT.DLL, LIBC.LIB | +-- Другие подсистемы (POSIX, OS/2 – устаревшие) | +-- Сетевые подсистемы | | +-- Winsock (WS2_32.DLL) | | +-- TDI (Transport Driver Interface) | | +-- NDIS (Network Driver Interface Specification) | | +-- Фильтры TDI/NDIS для перехвата сетевого трафика | +-- Управление реестром (Registry) | | +-- Ключи реестра, значения | | +-- Cm* функции (CmRegisterCallback) +-- Техники и инструменты | +-- Перехват (Hooking) | | +-- Пользовательский режим (User-mode) | | | +-- Подмена импорта (IAT Hooking) | | | +-- Сплайсинг (Inline Hooking, jmp 0xE9) | | | +-- Внедрение DLL (CreateRemoteThread, SetWindowsHookEx) | | +-- Режим ядра (Kernel-mode) | | | +-- SSDT-хуки (подмена адресов в KeServiceDescriptorTable) | | | +-- Shadow SSDT-хуки (для GUI-сервисов) | | | +-- IRP-хуки (подмена MajorFunction[]) | | | +-- Сплайсинг в ядре (запись jmp в начало функции) | | | +-- IDT-хуки (перехват прерываний, например, INT3, INT1, INT2E) | | | +-- Callgate, шлюзы задач | | | +-- Подмена обработчиков DPC/APC | | | +-- Отладочные регистры (DR0-DR7) для точек доступа | | +-- Снятие хуков, восстановление оригинальных адресов | +-- Отладка (Debugging) | | +-- Пользовательский режим | | | +-- OllyDbg (интерактивный отладчик) | | | +-- WinDbg (с отладочными символами) | | | +-- ntsd / cdg | | | +-- SEH (Structured Exception Handling), VEH (Vectored Exception Handling) | | | +-- Отладочные строки (OutputDebugString, DbgPrint) | | +-- Режим ядра | | | +-- WinDbg / kd (ядерная отладка через COM, USB, Ethernet) | | | +-- SoftICE (устаревший, но обсуждаемый) | | | +-- Syser Debugger | | | +-- DbgPrint / KdPrint | | | +-- Брейкпоинты (bp, ba, int3) | | | +-- KiDebugRoutine (перехват исключений ядра) | | | +-- Символы отладки (PDB) – symchk, pdbdump | | | +-- Анализ крешдампа (minidump, kernel dump, full dump) через WinDbg | +-- Внедрение (Injection) в чужие процессы | | +-- Классическое: CreateRemoteThread + LoadLibrary (или код-шелл) | | +-- APC-инжект (QueueUserAPC) | | +-- LPC-инжект | | +-- Инжект из ядра (KeStackAttachProcess, APC, NtCreateThread) | | +-- Перенос кода через отображение секций (ZwMapViewOfSection) | | +-- Релокация кода (Fixups) при переносе | +-- Программирование на ассемблере | | +-- Синтаксис Intel (MASM, FASM, NASM) | | +-- Встроенный ассемблер в C/C++ (__asm, __emit) | | +-- Опкоды и дизассемблирование | | +-- Дизассемблеры длин инструкций (LDE, ldasm) | +-- Программирование на C/C++ под Windows | | +-- Вызовы WinAPI, CRT | | +-- Соглашения о вызовах (__stdcall, __cdecl, __fastcall) | | +-- Манглинг имён (name mangling) | | +-- Статическая и динамическая линковка | +-- Работа с PE-файлами (просмотр, модификация, пакование) | +-- Парсинг заголовков, секций, импорта, экспорта | +-- Релокации (IMAGE_BASE_RELOCATION) | +-- Загрузка PE из памяти (ручной загрузчик) +-- Прикладные программы и сценарии | +-- Системные утилиты (Process Explorer, WinObj, Dependency Walker) | +-- Антивирусы, проактивная защита | +-- Руткиты (скрытие процессов, файлов, реестра, драйверов) | +-- Эксплойты, повышение привилегий | +-- Обработка сетевых соединений (сокеты, прокси) | +-- Мониторинг системы (перехват системных вызовов, логирование) | +-- Загрузчики (bootsector, MBR, ntldr, bootmgr)
Призадумался тут на досуге и немного впал в ступор. Интересно, сколько нужно прожить жизней, чтобы знать всё это хотя бы на каком-то заурядном, среднем уровне? И нужно заметить, что список еще и, в индивидуальном смысле, далеко не полный...
Нет, я имею в виду, что у каждого свой круг интересов и эти интересы тоже необходимо изучать. Ну, как пример: меня, скажем, интересует программирование VST-инструментов, эффектов. А это свой стандарт, который требует изучения. А кого-то VST, вообще, не интересует... И ещё заметил, что в списке нет упоминания про DLL (создание, внутреннее устройство и т.д. и т.п...). Может и ещё чего нет, если проанализировать. Но и той информации, которая есть - "выше крыши".
Прилагается. Возможен затык при конвертации очень больших файлов, связанный с недостатком ОЗУ (мне хватает). Можно устранить - привинтить fileMapping. Если нужно - пишите ( со временем прикручу).
Сделать бы минимальную сборку компилятора Си с цифровыми подписями и базовыми файлами такими как <windows.h>, <stdio.h>. Чтобы все было кристально прозрачно. При этом не надо заморачиваться макросами как в masm'e и сконцентрироваться на погромировании простых примеров (на все случаи жизни). Как эксперимент, посмотреть что из этого получится. Можно потом прикрутить свою ide. Взять идеи например отсюда.