Гипервизор над нуль-API бот-процессом (Windows XP IA-32 / Wi
От: Vertecs Узбекистан  
Дата: 24.11.19 22:19
Оценка:
Здравствуйтe!

Общая концепция
(Идея появилась ещё в 90-е, когда я только ознакомился с возможностями защищённого уровня и виртуализации процессора i386, но работал под DOS. В общем, идея стара, но взяться за её практическую реализацию я решился лишь сейчас чисто ради исследовательского интереса…)
  1. Необходимо запустить несколько десятков/сотен «бот-процессов», которые никак не делят своё адресное пространство с системой и не имеют доступа к какому-либо API, так как в своё распоряжение должны получать все 4 Гб адресного пространства (не памяти)
  2. Фактически каждый процесс имеет изначально 64 Кб памяти, которая зеркалами размазывается и повторяется по всему периоду в 4 Гб через предустановку селекторов сегментных регистров «cs/ds/es/fs/gs/ss», чтобы эти 64 Кб повторились 65536 раз от 0x0000???? до 0xFFFF????, чем достигается предотвращение любых исключений, связанных с доступом к памяти
  3. Инструкции математического сопроцессора с ESCAPE-набором полностью должны быть исключены и генерировать исключение в любом случае, чтобы симулировать гипотетический периферийный сопроцессор для управления сетевым обменом, регионами памяти и портами ввода/вывода
  4. Так как инструкции процессора «in/out» / «ins/outs» / «lock/hlt» / «cli/sti» являются привилегированными и генерируют в прикладных задачах исключение, посредством финального обработчика исключений планируется переквалифицировать их назначение
  5. Инструкции «in/out» будут представлять каналы обмена между этими процессами, будто отдельный процесс сам по-себе — это порт ввода/вывода.
  6. Если процесс №38 пытается читать порт №67, текущий процесс приостанавливается на неопределённый промежуток времени, а вместо него загружается/запускается/возобновляется процесс №67, который должен сгенерировать некие данные и прерваться командой «hlt», после чего он приостанавливается и работа процесса №38 возобновляется со значением регистра EAX из процесса №67
  7. Инструкции «cli/sti» будут экранировать участки кода как «begin/end» для их внедрения в соседний процесс, чтобы фрагмент экранируемого кода инжектировался в целевой код и запускался при исключении через комбинацию «lock+hlt», что позволит соседним процессом не только обмениваться данными через фиктивную карту портов ввода/вывода, но и инжектировать любые фрагменты кода друг в друга
  8. Таблицу векторов программных прерываний «int 0…255» стоит организовать таким образом, чтобы абсолютно всегда генерировать исключение тоже

Условия
Говоря проще, все «in/out» / «cli/sti» / «int/hlt» / «rep+ins/outs» / «esc-набор» будут проходить через мой обработчик исключений и интерпретироваться в рамках поставленной задачи. Скорость мне не нужна (пока) и на тестах задержки достигали до 25 млн тиков на одной только «lock+ins» инструкции, причём с файлами и потоками я ещё не начинал работать. Что меня вполне устраивает, так как важна не производительность, а детальное построение графов взаимодействиях всех «ботов» с экспортом в SVG…

Практика
Я убедился, что попытка доступа к любому из 65536 портов гарантированно приводит к исключению. Но вот не все индексы «int»-прерываний выпадают в мою ловушку и с этим ещё нужно разбираться…
А так как API функция CreateProcess слишком комплексная и выполняет все 4 действия автоматически, пришлось воспользоваться ресурсами ядра через функции NtOpenFile/NtCreateSection/NtMapViewOfSection/NtCreateProcess.

Если Вы условную концепцию поставленной мной задачи могли воспринять без стереотипов, то смогли уже догадаться, что я хочу организовать некую сеть процессов на неких виртуальных псевдо-машинах, где не нужна аппаратная PC-периферия в портах ввода/вывода и не нужно никакого системного API. Получается некий условный «клеточный автомат», где в качестве «живых единиц» выступает x86-код из грубого генератора случайных чисел.
Случайным образом генерируется x86-код в количестве сотен/тысяч файлов и регистры EIP/ESP устанавливаются случайным образом перед запуском процесса. А так как все 4 Гб пространства — это повторяющиеся 64 Кб кода, то абсолютно не важно, где и как тот код будет читать/писать память.
Лишь только Escape-инструкции «FPU» нужно перехватывать и все остальные из набора «in/out» / «int/hlt» и т.д…
Никакого низкоуровневого доступа к реальным портам ввода/вывода процессора мне получать не нужно, так как роль портов ввода/вывода и периферии выполняют сами подгружаемые «бот-единицы»…
(Извиняюсь за повтор и излишнюю детализацию, но опыт из других форумов показывает, что конкретно эту мою задачу необходимо занудно повторениями детально прояснять!)

Опыт
На данный момент удалось продвинуться не так далеко.
    OBJECT_ATTRIBUTES ObjAttr;
    IO_STATUS_BLOCK StatusBlock;
    HANDLE    hSection;
    HANDLE    hProcess;
    PVOID    ImageBaseAddr;
    SIZE_T    ViewSize;
    HANDLE    hFile;
    OBJECT_ATTRIBUTES ofs;
    UNICODE_STRING dn;
    IO_STATUS_BLOCK State;
    DWORD    Error;
    //
    ZeroMemory(&State,sizeof(IO_STATUS_BLOCK));
    WCHAR    *ch1 = L"\\??\\C:\\the_bot.x86";        // В этом файле случайный мусор
    RtlInitUnicodeString(&dn, ch1);
    InitializeObjectAttributes(&ofs, &dn, 0, 0, 0);
    // Начинаю сложный (для меня) процесс работы с функциями ядра
    Error = NtCreateFile(&hFile,GENERIC_WRITE|GENERIC_READ,&ofs, &State,0,FILE_ATTRIBUTE_NORMAL,0,0/*FILE_SUPERSEDE*/,0,0,0);
    printf("%08X %08X:hFile\r\n", Error, hFile);        // Здесь EAX возвращает 0 и в hFile загружается дескриптор файла.
    Error = NtCreateSection(&hSection, SECTION_ALL_ACCESS, NULL, NULL, PAGE_EXECUTE_READWRITE, SEC_IMAGE, hFile);
    printf("%08X %08X:hSection\r\n", Error, hSection);    // Здесь уже возвращается код 0xC0000022 и я не понимаю, почему...
    // Соответственно, дальше происходит исключение, предупреждение и закрытие всей программы
    Error = NtMapViewOfSection(hSection, (void *)-1, &ImageBaseAddr, NULL, &ViewSize, 0, PAGE_EXECUTE_READWRITE, NULL, 0);
    printf("%08X %08X:ImageBaseAddr\r\n", Error, ImageBaseAddr);
    Error = NtCreateProcess(&hProcess, PROCESS_ALL_ACCESS, NULL, (void *)-1, PROCESS_CREATE_FLAGS_BREAKAWAY, hSection, NULL, NULL);
    printf("%08X %08X:hProcess\r\n", Error, hProcess);

Программу пишу в Visual Studio 6 на Windows'XP под VMware, сразу запуская на гостевой машине (Win'XP) и на хосте — Windows'8.1, но вижу абсолютно одинаковый результат.

Наверное, следует переписать этот код несколько иначе.

Что я делаю не так на данном этапе?

P.S.: Спасибо!
Отредактировано 24.11.2019 22:34 Alikberov . Предыдущая версия .
winapi escape exception port kernel x86 x86-32 visual studio fpu ia32 windows xp windows 8
Re: Гипервизор над нуль-API бот-процессом (Windows XP IA-32 / Wi
От: EreTIk EreTIk's Box
Дата: 25.11.19 10:09
Оценка:
Здравствуйте, Vertecs, Вы писали:

V>
V>    Error = NtCreateFile(&hFile,GENERIC_WRITE|GENERIC_READ,&ofs, &State,0,FILE_ATTRIBUTE_NORMAL,0,0/*FILE_SUPERSEDE*/,0,0,0);
V>    printf("%08X %08X:hFile\r\n", Error, hFile);        // Здесь EAX возвращает 0 и в hFile загружается дескриптор файла.
V>    Error = NtCreateSection(&hSection, SECTION_ALL_ACCESS, NULL, NULL, PAGE_EXECUTE_READWRITE, SEC_IMAGE, hFile);
V>    printf("%08X %08X:hSection\r\n", Error, hSection);    // Здесь уже возвращается код 0xC0000022 и я не понимаю, почему...



Если при создании секции запрашивается исполнение (PAGE_EXECUTE_READWRITE), то и при открытии надо его запрашивать (GENERIC_EXECUTE, или хотя бы FILE_EXECUTE) для описателя файла.
Re[2]: Гипервизор над нуль-API бот-процессом (Windows XP IA-32 / Wi
От: Vertecs Узбекистан  
Дата: 25.11.19 14:07
Оценка:
Здравствуйте, EreTIk, Вы писали:
ETI>Если при создании секции запрашивается исполнение (PAGE_EXECUTE_READWRITE), то и при открытии надо его запрашивать (GENERIC_EXECUTE, или хотя бы FILE_EXECUTE) для описателя файла.

Мeтодом перебора пытался подставлять те или иные флажки — код ошибки сменился на 0xC00000F4.

Если за основу брать эмулятор KolibriOS под Windows и его исходники klbrinwin на ассемблере, то там ничего подобного и близко нет.
Изучая весь текст, я так и не понял, как в нём под сегмент gs подставляется графический буфер экрана. Там есть блиттинг операции, но мне не ясно, как именно сегмент gs под это настроен.

В документации Intel по i386 сказано, что можно построить таблицу из миллиона описателей, где 4 Гб — это 1024 ссылки на 1024 дескриптора на регионы памяти по 4 Кб. Но как под Windows добраться до этих механизмов легально и демократично, чтобы не опускаться на уровень написания драйвера?
С этим вопросом никак не могу справиться с NtSetLdtEntries, чтобы перенастроить селекторы памяти, так как она для этого и предназначена.
Выше я писал, что мне, для начала, необходимо все 4 Гб памяти зеркалами свернуть и сослать на один дефолтный регион в 64 Кб, чтобы, как в калейдоскопе, по всей протяжённости 4 Гб повторялись одни и те же дефолтный 64 Кб ровно 65536 раз.
(Но позднее будет управляться через Escape-инструкции вместо команд FPU, чтобы любой из 65536 отражений дефолтных 64 Кб можно было переназначить под какой-либо другой ресурс: Мэппинг-фрагмент файла, текстовый терминал консоли, буфер обмена и т.п…)

Главная проблема в том, что я никогда не выходил за рамки написания прикладных задач.
А здесь — уже системный уровень и существенно не хватает ни опыта, ни знаний.
Мне советуют изучить исходники Bochs или QEmu. Но это — совсем не то, так как 12 лет назад я писал эмулятор i386 именно с целью запуска «бот-кода как демонстрацию…
Но, так как у современных процессоров есть встроенные аппаратные механизмы виртуализации, хочу выйти за рамки эмулятора байт-кода и перейти на уровень гипервизора, чтобы сосредоточиться лишь на основных моментах управления памятью и портами.

Если в самом тексте программы аккуратно вставлять инлайн-блоки на ассемблере, то всё работает, как и задумано.
Но мне теперь надо динамически подгружать процессы из файлов, но оформлять их не как Windows-приложения, а как в случае с KolibriOS — как «бот-ферму» моего клеточного автомата…

Вы понимаете, что основные условия задачи крайне просты, так как не требуется эмулировать никакого API и портов ввода/вывода.
Просто «бот» помещается в абсолютную инкапсуляцию, где он может делать абсолютно всё…

Только два момента мне нужно преодолеть:
  1. Подготовить адресное пространство из 4 Гб как 65536 блоков по 64 Кб без намёков на API
  2. Загрузить туда файл и объявить его как отлаживаемый процесс
Всё остальное, точечно и локально, я уже как бы сделал.

Спасибо!
Re[3]: Гипервизор над нуль-API бот-процессом (Windows XP IA-32 / Wi
От: ononim  
Дата: 30.11.19 12:24
Оценка:
V>Здравствуйте, EreTIk, Вы писали:
ETI>>Если при создании секции запрашивается исполнение (PAGE_EXECUTE_READWRITE), то и при открытии надо его запрашивать (GENERIC_EXECUTE, или хотя бы FILE_EXECUTE) для описателя файла.
PAGE_EXECUTE надо
Как много веселых ребят, и все делают велосипед...
Супервизор над нуль-API бот-процессом (Windows XP IA-32)
От: Vertecs Узбекистан  
Дата: 30.11.19 14:16
Оценка:
Здравствуйте, ononim, Вы писали:

O>PAGE_EXECUTE надо

Всё равнo NtCreateSection возвращает 0xC00000F4.

Думаю, я просто не туда копаю.

Напомню-ка, в чём задача у меня…

Если CreateProcess сама выделяет 4 Гб пространства, делит его пополам и верхние 2 Гб отдаёт Windows + DLL/API, а затем уже выделяет необходимый объём ОЗУ и загружает программу…

Мне нужно просто…
  1. Запросить у Системы дополнительное адресное пространство в 4 Гб
  2. Развернуть там страничку ОЗУ в 64 Кб
  3. Повторить эти 64 Кб по всему пространству 65536 раз
  4. Загрузить в эти 64 Кб содержимое некоего файла
  5. Назначить мою оболочку Супервизором над всем этим делом для обработки любых исключений
  6. Объявить это пространство новым процессом и запустить

А я начинаю сразу с NtCreateFile и NtCreateSection…
Надо же как-то Пространство новое сотворить в 4 Гб!
Отредактировано 30.11.2019 14:52 Alikberov . Предыдущая версия . Еще …
Отредактировано 30.11.2019 14:37 Alikberov . Предыдущая версия .
Re: Супервизор над нуль-API бот-процессом (Windows XP IA-32)
От: ononim  
Дата: 30.11.19 15:11
Оценка:
O>>PAGE_EXECUTE надо
V>Всё равнo NtCreateSection возвращает 0xC00000F4.
#define STATUS_INVALID_PARAMETER_6 ((NTSTATUS)0xC00000F4L)
А это точно NtCreateSection выдает, а не NtMapViewOfSection?

V>А я начинаю сразу с NtCreateFile и NtCreateSection…

V>Надо же как-то Пространство новое сотворить в 4 Гб!
Адресное пространство? Адреснные пространства в винде принадлежат процессам. Надо просто создать новый процесс.
Если просто хочется выделить 4ГБ то выделяйте ее NtVirtualAlloc'ом. Зачем NtCreateSection(..SEC_IMAGE..) то? Вы ею хотябы исполняемый файл в PE формате пытаетесь замапить?
Как много веселых ребят, и все делают велосипед...
Отредактировано 30.11.2019 15:28 ononim . Предыдущая версия . Еще …
Отредактировано 30.11.2019 15:13 ononim . Предыдущая версия .
Re[2]: Супервизор над нуль-API бот-процессом (Windows XP IA-32)
От: Vertecs Узбекистан  
Дата: 30.11.19 15:49
Оценка:
Здравствуйте, ononim, Вы писали:

O>>>PAGE_EXECUTE надо

V>>Всё равнo NtCreateSection возвращает 0xC00000F4.
O>#define STATUS_INVALID_PARAMETER_6 ((NTSTATUS)0xC00000F4L)
O>А это точно NtCreateSection выдает, а не NtMapViewOfSection?

V>>А я начинаю сразу с NtCreateFile и NtCreateSection…

V>>Надо же как-то Пространство новое сотворить в 4 Гб!
O>Адресное пространство? Адреснные пространства в винде принадлежат процессам. Надо просто создать новый процесс.
O>Если просто хочется выделить 4ГБ то выделяйте ее NtVirtualAlloc'ом. Зачем NtCreateSection(..SEC_IMAGE..) то? Вы ею хотябы исполняемый файл в PE формате пытаетесь замапить?

Вышe я сделал акцент на этом

Общая концепция

  1. Необходимо запустить несколько десятков/сотен «бот-процессов», которые никак не делят своё адресное пространство с системой и не имеют доступа к какому-либо API, так как в своё распоряжение должны получать все 4 Гб адресного пространства (не памяти)
  2. Фактически каждый процесс имеет изначально 64 Кб памяти, которая зеркалами размазывается и повторяется по всему периоду в 4 Гб через предустановку селекторов сегментных регистров «cs/ds/es/fs/gs/ss», чтобы эти 64 Кб повторились 65536 раз от 0x0000???? до 0xFFFF????, чем достигается предотвращение любых исключений, связанных с доступом к памяти
  3. Инструкции математического сопроцессора с ESCAPE-набором полностью должны быть исключены и генерировать исключение в любом случае, чтобы симулировать гипотетический периферийный сопроцессор для управления сетевым обменом, регионами памяти и портами ввода/вывода

Исполняемый файл будет в «сыром формате» без заголовков…
То есть, например, нужно тупо jpeg-файл загрузить в память и запустить его, чтобы посмотреть на «картину исключений» моим Супервизором со «сборщиком исключений»…
Сам «сборщик исключений» будет собирать статистику, вида «n-раз обнаружен in/out», «n-раз FPU-команды» и т.д…

Дело в том, что здесь нельзя использовать программную эмуляцию.
Нужно на разных компьютерах запускать и статистически оценивать сами процессоры.

P.S.: Спасибо!
Re[3]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: ononim  
Дата: 30.11.19 16:05
Оценка:
Очень много букв. SEC_IMAGE не умеет ничего кроме PE формата (32хбитная винда умеет еще NE). Соответственно создать процесс без PE файла невозможно. Если хочется исполнять "сырые" данные — VirtualAlloc(...PAGE_EXECUTE...) пишите туда данные и прыгайте на нужный адрес.
Но это будет лишь простой процесс в системе. Судя по всему вы пытаетесь сделать какой то свой гипервизор совершенно не понимая даже как работает современная ОС.
Все таки расскажу немного — в современной оси юзермодные процессы работают в непривелигированном режиме процессора. В этом режиме нельзя инициализировать свои селекторы. LLDT просто вызовет аппаратную ошибку защиты. И неважно как вы создавали процесс, даже еслиб SEC_IMAGE схавал ваш не-PE файл — ему бы это совершенно не помогло выбраться в нулевое кольцо защиты.
Как много веселых ребят, и все делают велосипед...
Отредактировано 30.11.2019 16:57 ononim . Предыдущая версия . Еще …
Отредактировано 30.11.2019 16:54 ononim . Предыдущая версия .
Re[4]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: Vertecs Узбекистан  
Дата: 30.11.19 16:50
Оценка:
Здравствуйте, ononim, Вы писали:

O>Очень много букв. SEC_IMAGE не умеет ничего кроме PE формата (32хбитная винда умеет еще NE). Соответственно создать процесс без PE файла невозможно. Если хочется исполнять "сырые" данные — VirtualAlloc(...PAGE_EXECUTE...) пишите туда данные и прыгайте на нужный адрес.

O>Но это будет лишь простой процесс в системе. Судя по всему вы пытаетесь сделать какой то свой гипервизор совершенно не понимая даже как работает современная ОС.
Дa, мне не нужно загружать/запускать экзешник.
Нужно, чтобы 64 Кб окно VirtualAlloc развернулось отдельным пространством, где эти 64 Кб повторяются 65536 и складываются в 4 Гб.
И чтобы это было отдельным процессом, а не потоком.

Да, я не понимаю детально, как работает ОС.
Просто мне нужно «на коленке» соорудить виртуальный PC без периферии, портов ввода/вывода и FPU.
Тупо — Процессор+Память…
(Память — 64 Кб, то есть старшие 16 бит адреса «висят в воздухе»…
Тот же «Загрузчик» разрешает A20 аппаратно при загрузке любой системы.
А мне нужно виртуально замаскировать все 16 бит 32-битного адреса…)

P.S.: Спасибо!
Отредактировано 30.11.2019 16:54 Alikberov . Предыдущая версия .
Re[5]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: ononim  
Дата: 30.11.19 16:55
Оценка:
V>P.S.: Спасибо!
Я там дополнил свое предыдущее сообщение
Автор: ononim
Дата: 30.11.19
еще одним абзацем.
Как много веселых ребят, и все делают велосипед...
Re[5]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: ononim  
Дата: 30.11.19 17:09
Оценка:
V>Дa, мне не нужно загружать/запускать экзешник.
V>Нужно, чтобы 64 Кб окно VirtualAlloc развернулось отдельным пространством, где эти 64 Кб повторяются 65536 и складываются в 4 Гб.
V>И чтобы это было отдельным процессом, а не потоком.
Абстрагируясь от прочих ваших пожеланий, заполнить пространство процесса повторящимся фрагментом теоретически возможно, но практически скорее всего современные винды пошлют в пешее путешествие. Но можете поэксперементировать:
1) Создать процесс с помощью обычного CreateProcess(..), на свой исполняемый файл, который в WinMain откроект пару приготовленных именованных ивентов и вызовет на них SignalObjectAndWait.
2) Предок этого процесса, получив сигнал, должен будет очистить адресное пространство дочернего процесса, для чего:
2.1) Перечислить все регионы АП дочернего процесса с помощью функции VirtualQueryEx или ZwQueryVirtualMemory
2.2) Пройтись по всем MEM_RESERVE/MEM_COMMIT и для каждого вызвать NtUnmapViewOfSection (если типа региона MEM_MAPPED или MEM_IMAGE) или NtFreeVirtualMemory (если это MEM_PRIVATE)
3) Если внезапно все в пункте 2 произошло успешно, то создаете обычную секцмю (не IMAGE!) с помощью NtCreateSection размером 64кб и мапите ее при помощи NtMapViewOfSection на все адреса, кратные 64к.

[UPD] Прочитал топик. Windows XP. Тогда шансы на успех вышеописанного мероприятия многократно повышаются. Но если откатиться до NT4 то думаю они приблизятся к 100%
[UPD2] 4гб не получится. Верхние 2 или 1 ГБ заняты ядром. Впрочем, на 64хбитной винде под wow64 — есть шанс.
Как много веселых ребят, и все делают велосипед...
Отредактировано 30.11.2019 20:04 ononim . Предыдущая версия . Еще …
Отредактировано 30.11.2019 17:24 ononim . Предыдущая версия .
Re[6]: Супервизор над нуль-ботом (Windows XP IA-32 / Windows 8 x64)
От: Vertecs Узбекистан  
Дата: 01.12.19 04:25
Оценка:
Здравствуйте, ononim, Вы писали:

O>Абстрагируясь от прочих ваших пожеланий, заполнить пространство процесса повторящимся фрагментом теоретически возможно, но практически скорее всего современные винды пошлют в пешее путешествие. Но можете поэксперементировать:

O>1) Создать процесс с помощью обычного CreateProcess(..), на свой исполняемый файл, который в WinMain откроект пару приготовленных именованных ивентов и вызовет на них SignalObjectAndWait.
O>2) Предок этого процесса, получив сигнал, должен будет очистить адресное пространство дочернего процесса, для чего:
O>2.1) Перечислить все регионы АП дочернего процесса с помощью функции VirtualQueryEx или ZwQueryVirtualMemory
O>2.2) Пройтись по всем MEM_RESERVE/MEM_COMMIT и для каждого вызвать NtUnmapViewOfSection (если типа региона MEM_MAPPED или MEM_IMAGE) или NtFreeVirtualMemory (если это MEM_PRIVATE)
O>3) Если внезапно все в пункте 2 произошло успешно, то создаете обычную секцмю (не IMAGE!) с помощью NtCreateSection размером 64кб и мапите ее при помощи NtMapViewOfSection на все адреса, кратные 64к.
Тo есть, запускаю стандартный процесс-заглушку, а потом перекраиваю всё его адресное пространство на свой лад — я правильно понял?
Об этом я как-то думал. Но это очень запутанный и не очень эстетичный способ.
Сейчас обнаружил статью про исследование внутренних механизмов CreateProcess — заглушек много и не до конца всё понял.
O>[UPD] Прочитал топик. Windows XP. Тогда шансы на успех вышеописанного мероприятия многократно повышаются. Но если откатиться до NT4 то думаю они приблизятся к 100%
Топик я назвал «Гипервизор над нуль-API бот-процессом (Windows XP IA-32 / Windows 8.1 x64)», но движок форума строку обрезал…
O>[UPD2] 4гб не получится. Верхние 2 или 1 ГБ заняты ядром. Впрочем, на 64хбитной винде под wow64 — есть шанс.
Вот этот момент я не понимаю.
Если верхние 2 Гб заняты ядром и активируются только в свой квант времени, для приложения верхние 2 Гб получаются мёртвыми. Для чего?

Аналогично, в «ZX-Spectrum» нижние 16 Кб отведены под ПЗУ с Basic/TR-DOS, у «Орион-128» — верхние 4 Кб…
Но там через call-вызовы все эти API вызываются.

В моём же случае, бот не может и не должен вызывать никаких функций Win-API. Тем самым, верхние 2 Гб под ядро системы должны отображаться при работе кода самого ядра. А под бот необходимо выделить все 4 Гб.
(В рамках моего проекта.)

P.S.: Спасибо!
Re[7]: Супервизор над нуль-ботом (Windows XP IA-32 / Windows 8 x64)
От: ononim  
Дата: 01.12.19 08:33
Оценка:
V>Топик я назвал «Гипервизор над нуль-API бот-процессом (Windows XP IA-32 / Windows 8.1 x64)», но движок форума строку обрезал…
O>>[UPD2] 4гб не получится. Верхние 2 или 1 ГБ заняты ядром. Впрочем, на 64хбитной винде под wow64 — есть шанс.
V>Вот этот момент я не понимаю.
V>Если верхние 2 Гб заняты ядром и активируются только в свой квант времени, для приложения верхние 2 Гб получаются мёртвыми. Для чего?
При переключении юзер-кернел не происходит ни смены "кванта времени" ни переключения адресного пространства. Это все было бы слишком дорого для перфоманса.

V>Аналогично, в «ZX-Spectrum» нижние 16 Кб отведены под ПЗУ с Basic/TR-DOS, у «Орион-128» — верхние 4 Кб…

Вообще не аналогично. У вас матчасть отсутствует по защищенному режиму.
Как много веселых ребят, и все делают велосипед...
Re[5]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: Cyberax Марс  
Дата: 01.12.19 20:26
Оценка:
Здравствуйте, Vertecs, Вы писали:

V>Да, я не понимаю детально, как работает ОС.

V>Просто мне нужно «на коленке» соорудить виртуальный PC без периферии, портов ввода/вывода и FPU.
V>Тупо — Процессор+Память…
Бред какой полный... Но если хочется чего-то странного, то берём KVM под Линуксом и вперёд с песней: https://lwn.net/Articles/658511/ — в статье описано как сделать простейшую виртуальную машину.
Sapienti sat!
Re[6]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: Vertecs Узбекистан  
Дата: 01.12.19 20:53
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Бред какой полный... Но если хочется чего-то странного, то берём KVM под Линуксом и вперёд с песней: https://lwn.net/Articles/658511/ — в статье описано как сделать простейшую виртуальную машину.

Этo всё хорошо под Linux.
Под Linux'ом многое чего делают. Вон и Android слепили, заполонив весь рынок.
А нужно именно под Windows…
Re[7]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: Cyberax Марс  
Дата: 02.12.19 10:22
Оценка:
Здравствуйте, Vertecs, Вы писали:

C>>Бред какой полный... Но если хочется чего-то странного, то берём KVM под Линуксом и вперёд с песней: https://lwn.net/Articles/658511/ — в статье описано как сделать простейшую виртуальную машину.

V>Этo всё хорошо под Linux.
V>Под Linux'ом многое чего делают. Вон и Android слепили, заполонив весь рынок.
V>А нужно именно под Windows…
Зачем? Я понял бы, если бы это был какой-то курсовик или диплом.

В современной Винде есть Hypervisor API ( https://docs.microsoft.com/en-us/virtualization/api/ ), который умеет примерно то же самое, что и KVM. Тот пример с lwn.net практически один-в-один переносится.
Sapienti sat!
Re[8]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: Vertecs Узбекистан  
Дата: 02.12.19 11:45
Оценка:
Здравствуйте, Cyberax, Вы писали:
C>Зачем? Я понял бы, если бы это был какой-то курсовик или диплом.
C>В современной Винде есть Hypervisor API ( https://docs.microsoft.com/en-us/virtualization/api/ ), который умеет примерно то же самое, что и KVM. Тот пример с lwn.net практически один-в-один переносится.
Диплoм здесь не причём. Это нужно, прежде всего, для себя и моих внутренних опытов. И с расчётом на распространение.
Если брать Linux, то нужно будет акцент брать уже сразу на Android, чтобы у каждого запустилось.
А если под Windows писать, то в сторону владельцев бородатых ПК и ноутбуков с предустановленной системой смотреть.

И мне, если не совсем поняли, ПК (с его периферией и т.п.) виртуализовывать не нужно.
Мне нужна виртуализация CPU+RAM без железа (DMA и т.п.) и FPU, так как порты и Esc-инструкции я должен обрабатывать сам (не на уровне диспетчера арифметики/железа, а чисто сам разбирать проблемный участок с x86-кодом).

Черновой вариант работает, но там сам x86-код прямо инлайном вставлен в «_asm{…}» прямо в тело моего процесса. Тогда как нужно открыть новый процесс в абсолютной инкапсуляции…

Спасибо!
Re[9]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: ononim  
Дата: 02.12.19 19:43
Оценка:
V>Черновой вариант работает, но там сам x86-код прямо инлайном вставлен в «_asm{…}» прямо в тело моего процесса. Тогда как нужно открыть новый процесс в абсолютной инкапсуляции…
Но зачем процесс? Выделяй executable память, клади в нее код да выполняй.
Как много веселых ребят, и все делают велосипед...
Re[9]: Супервизор над нуль-API бот-процессом (Windows XP IA-
От: Cyberax Марс  
Дата: 02.12.19 20:40
Оценка:
Здравствуйте, Vertecs, Вы писали:

V>Диплoм здесь не причём. Это нужно, прежде всего, для себя и моих внутренних опытов. И с расчётом на распространение.

Ну то есть, чистый бред.

V>И мне, если не совсем поняли, ПК (с его периферией и т.п.) виртуализовывать не нужно.

V>Мне нужна виртуализация CPU+RAM без железа (DMA и т.п.) и FPU, так как порты и Esc-инструкции я должен обрабатывать сам (не на уровне диспетчера арифметики/железа, а чисто сам разбирать проблемный участок с x86-кодом).
Ещё раз, если стоит задача разобрать код, то берём один из 100500 эмуляторов X86 и запускаем. Примерно так работают современные антивирусы — они фактически запускают код в "песочнице" и смотрят на его взаимодействие с внешним миром.

Если нужна скорость, недостижимая на чистом эмуляторе, то используем один из многих JIT-ов для x86. Например, https://wiki.qemu.org/Documentation/KQemu
Sapienti sat!
Re[10]: Супервизор над x86-ботом (Windows XP IA-32 / Windows
От: Alikberov Узбекистан  
Дата: 03.12.19 00:14
Оценка:
Здравствуйте, ononim, Вы писали:
O>Но зачем процесс? Выделяй executable память, клади в нее код да выполняй.
Спецификa задачи такова, что лучше сразу «потанцевать с бубном» и добиться от Windows концептуального решения, чем саму концепцию превращать в нагромождение костылей…
И нет никаких гарантий, что «загруженный бот» не залезет на мой…
Нужна тотальная инкапсуляция от Win-API, INT'ов, FPU и прочих «благ Windows-цивилизации»…
(Код должен быть дикарём в океане 4 Гб и ютиться на островке в 64 Кб…)

Здравствуйте, Cyberax, Вы писали:
C>Ну то есть, чистый бред.
C>Ещё раз, если стоит задача разобрать код, то берём один из 100500 эмуляторов X86 и запускаем. Примерно так работают современные антивирусы — они фактически запускают код в "песочнице" и смотрят на его взаимодействие с внешним миром.
Да, иногда этот «памперс песочницы» прорывается и вредоносный код получает все привилегии. Как-то читал об этом…

Тут ещё мне напомнили про Критерии виртуализации Попека и Голдберга, что вовсе огорчает.
Так как же тогда VMware работает?
Я понимаю, что там ну очень серьёзный код используется с максимальной интеграцией в Windows.

Вот мне, грубо говоря, нужно как бы саму VMware ободрать от всех её модулей симуляции/эмуляции железа PC, чтобы даже DOS не смогла запуститься. Ой, не DOS, а BIOS не мог даже запуститься.
(В самом хорошем смысле!)
В смысле: Все «железо» должно быть от меня — никакого исконно-нативного PC-железа…
(Ничего обдирать я не собираюсь. Просто, были мысли с вопросом о такой возможности)

Да, можно «ободрать» тот же Bochs и добиться желаемого…
Но необходимо именно аппаратно всё провернуть…

Здесь про очень нехорошие вещи пишут
(Ссылка из видео)
Вкратце: Многие популярные отладчики дизассемблируют код совсем не так, как аппаратно его обрабатывает сам процессор некой модели.

C>Если нужна скорость, недостижимая на чистом эмуляторе, то используем один из многих JIT-ов для x86. Например, https://wiki.qemu.org/Documentation/KQemu

А они удовлетворяют требованиям?
Или могут иметь сюрпризы в неожиданных местах?

P.S.: Выше я уже подчеркнул, что задумка сама — из 90-х. То есть, ей практически 20 лет…
А 10 лет назад я уже писал подобный эмулятор.
Но мне нужно именно аппаратно это сделать самим процессором.
(Запустить «бешеных ботов» каждый в своём пространстве…)
Это не вирусы, а просто исследовательский проект мечты моей юности.
Отредактировано 03.12.2019 0:25 Alikberov . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.