Я бы не был так уверен с выражением "инструкций у процессора не так много". Насчёт системных вызовов - syscall или int 0x2e (принято для x86), как и в любом другом ассемблере (компиляторе). Насчёт остального, нужно уточнять. Ибо неясно, что ты имеешь ввиду под "практической разработкой программ", и причём тут системные вызовы, когда можно использовать ring3
По сравнению с той тонной текста что я прочитал - немного. Тем более я явно не всё буду юзать https://en.wikipedia.org/wiki/X86_instruction_listings. Где мануал на этот syscall ? Где мануал на обращение к ring3/2? А что комп умеет? Выводить картинку, звук, память переписывать. На другие девайсы драверы писать пока не прошу.
Ты прчоитал только набор инструкций x86. А это далеко не все инструкции процессора. Есть ещё расширения SSE, x87, MMX Мануал на syscall? Копай в ядро. Находи номера системных функций, клади в EAX, аргументы в остальные регистры, в связи с соглашением о вызовах, и вызывай syscall. Мануал по обращениям к ring3? Это же банальщина. Хотя бы почитай про структуру PE. Функции GetProcAddress LoadLibraryA WinAPI. Структура импорт-таблицы выглядит так: section '.name' import readable dd 0, 0, 0, RVA kernel, RVA kernel_table dd 0, 0, 0, 0, 0 kernel_table: GetProcAddress dd RVA _GetProcAddress dd 0 _GetProcAddress: dw 0 db 'GetProcAddress', 0 kernel: db 'kernel32.dll', 0 Далее вызываешь по полученному от загрузчика из импорт-таблицы функции: call dword[GetProcAddress] Добавляешь туда ещё функции из ring3 библиотек (wininet.dll, ...) и используешь.
Если хочешь укоротить код, используй включение в FASM win32a.inc Он позволяет делать так: library kernel32, 'kernel32.dll' import kernel32,\ function, 'function_name',\ ...
А, посмотрел - там перечислены и расширения. Но это не все. Укороченный список, поверь. Инструкции пополняются каждый год\два
В какое ядро копать? Я понял шо в регистрах должны быть аргументы, не пойму где описано какие есть вызовы и что для них надо.
Это недокументированная часть. И тебе нужно уточнять, для какой именно сборки тебе нужны номера вызовов. Оно тебе надо? К тому же, много ты там не реализуешь. Они неудобные. Используй ring3. А номера системных вызовов для каждой сборки Windows можешь найти тут: https://j00ru.vexillium.org/syscalls/раздел/битность
Меня вполне устраивает код без дополнительных макросов, и так башка забита.
Упс, страницы нет
Ты чего дерзкий такой. Внимательнее сообщение перечитай. Раздел и битность подставь. Для начала вообще ознакомься, какие есть разделы системных вызовов в ядре
Ща, я не очень быстрый
Ну так с включением меньше голова будет забита. Код меньше, удобнее, читабельнее. Впрочем, твоё решение
Это если знаешь какие макро добавляет Win32, а у меня на него даже мануала нет. Я пытался его разобрать вручную, там какие-то трёхэтажные дефиниции. Системные вызовы все на j00ru?
https://j00ru.vexillium.org/syscalls/nt/32/ номера системных вызовов для NT32 https://j00ru.vexillium.org/syscalls/nt/64/ номера системных вызовов для NT64 https://j00ru.vexillium.org/syscalls/win32k/32/ номера системных вызовов для Win32k 32 (GDI, графика) https://j00ru.vexillium.org/syscalls/win32k/64/ номера системных вызовов для Win32k 64 К слову, всё равно система будет прибегать к использованию callback от ring3 для использование win32k включительно. Так что от ring3 не убежать))
Да. Ну на гитхабе можешь ещё найти, если поискать в гугле. Но, в основном, они нигде не отличаются. Просто на j00ru они в удобном списке построены
Это я к тому, что если не подгружена библиотека GDI в процесс, использовать системные вызовы win32k не получится. Да и если не подгружен ntdll (что маловероятно, но всё же) использовать и NT системные вызовы тоже не получится. И отсюда вопрос - оно тебе надо? Ну ладно, размер инструкции syscall маленький, конечно. Но всё равно тебя преследовать будет удобный ring3
Да я не пойму его удобности, мне надо на практике попробовать. Ты эту инфу где всю получал?
Сам ядро в своё время изучал. Тебе, кстати, этот сайтик ещё пригодится: https://www.vergiliusproject.com/kernels Там описаны структуры ядра Windows. В частности, я оттуда брал смещения для PEB, TEB и KUSER_SHARED_DATA. Ибо самому из WinDbg вытаскивать очень неудобно. Насчёт удобности - поймёшь. Ибо банальный MessageBox через системные вызовы сделать не получится
Обсуждают сегодня