Общая концепция
(Идея появилась ещё в 90-е, когда я только ознакомился с возможностями защищённого уровня и виртуализации процессора i386, но работал под DOS. В общем, идея стара, но взяться за её практическую реализацию я решился лишь сейчас чисто ради исследовательского интереса…) Необходимо запустить несколько десятков/сотен «бот-процессов», которые никак не делят своё адресное пространство с системой и не имеют доступа к какому-либо API, так как в своё распоряжение должны получать все 4 Гб адресного пространства (не памяти)
Фактически каждый процесс имеет изначально 64 Кб памяти, которая зеркалами размазывается и повторяется по всему периоду в 4 Гб через предустановку селекторов сегментных регистров «cs/ds/es/fs/gs/ss», чтобы эти 64 Кб повторились 65536 раз от 0x0000???? до 0xFFFF????, чем достигается предотвращение любых исключений, связанных с доступом к памяти
Инструкции математического сопроцессора с ESCAPE-набором полностью должны быть исключены и генерировать исключение в любом случае, чтобы симулировать гипотетический периферийный сопроцессор для управления сетевым обменом, регионами памяти и портами ввода/вывода
Так как инструкции процессора «in/out» / «ins/outs» / «lock/hlt» / «cli/sti» являются привилегированными и генерируют в прикладных задачах исключение, посредством финального обработчика исключений планируется переквалифицировать их назначение
Инструкции «in/out» будут представлять каналы обмена между этими процессами, будто отдельный процесс сам по-себе — это порт ввода/вывода.
Если процесс №38 пытается читать порт №67, текущий процесс приостанавливается на неопределённый промежуток времени, а вместо него загружается/запускается/возобновляется процесс №67, который должен сгенерировать некие данные и прерваться командой «hlt», после чего он приостанавливается и работа процесса №38 возобновляется со значением регистра EAX из процесса №67
Инструкции «cli/sti» будут экранировать участки кода как «begin/end» для их внедрения в соседний процесс, чтобы фрагмент экранируемого кода инжектировался в целевой код и запускался при исключении через комбинацию «lock+hlt», что позволит соседним процессом не только обмениваться данными через фиктивную карту портов ввода/вывода, но и инжектировать любые фрагменты кода друг в друга
Таблицу векторов программных прерываний «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, но вижу абсолютно одинаковый результат.
Наверное, следует переписать этот код несколько иначе.
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
Здравствуйте, 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 и портов ввода/вывода.
Просто «бот» помещается в абсолютную инкапсуляцию, где он может делать абсолютно всё…
Только два момента мне нужно преодолеть: Подготовить адресное пространство из 4 Гб как 65536 блоков по 64 Кб без намёков на API
Загрузить туда файл и объявить его как отлаживаемый процесс
Всё остальное, точечно и локально, я уже как бы сделал.
Спасибо!
Re[3]: Гипервизор над нуль-API бот-процессом (Windows XP IA-32 / Wi
V>Здравствуйте, EreTIk, Вы писали: ETI>>Если при создании секции запрашивается исполнение (PAGE_EXECUTE_READWRITE), то и при открытии надо его запрашивать (GENERIC_EXECUTE, или хотя бы FILE_EXECUTE) для описателя файла.
PAGE_EXECUTE надо
Как много веселых ребят, и все делают велосипед...
Супервизор над нуль-API бот-процессом (Windows XP IA-32)
Здравствуйте, ononim, Вы писали:
O>PAGE_EXECUTE надо
Всё равнo NtCreateSection возвращает 0xC00000F4.
Думаю, я просто не туда копаю.
Напомню-ка, в чём задача у меня…
Если CreateProcess сама выделяет 4 Гб пространства, делит его пополам и верхние 2 Гб отдаёт Windows + DLL/API, а затем уже выделяет необходимый объём ОЗУ и загружает программу…
Мне нужно просто… Запросить у Системы дополнительное адресное пространство в 4 Гб
Развернуть там страничку ОЗУ в 64 Кб
Повторить эти 64 Кб по всему пространству 65536 раз
Загрузить в эти 64 Кб содержимое некоего файла
Назначить мою оболочку Супервизором над всем этим делом для обработки любых исключений
Объявить это пространство новым процессом и запустить
А я начинаю сразу с NtCreateFile и NtCreateSection…
Надо же как-то Пространство новое сотворить в 4 Гб!
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 формате пытаетесь замапить?
Как много веселых ребят, и все делают велосипед...
Здравствуйте, 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 я сделал акцент на этом
Общая концепция
Необходимо запустить несколько десятков/сотен «бот-процессов», которые никак не делят своё адресное пространство с системой и не имеют доступа к какому-либо API, так как в своё распоряжение должны получать все 4 Гб адресного пространства (не памяти)
Фактически каждый процесс имеет изначально 64 Кб памяти, которая зеркалами размазывается и повторяется по всему периоду в 4 Гб через предустановку селекторов сегментных регистров «cs/ds/es/fs/gs/ss», чтобы эти 64 Кб повторились 65536 раз от 0x0000???? до 0xFFFF????, чем достигается предотвращение любых исключений, связанных с доступом к памяти
Инструкции математического сопроцессора с ESCAPE-набором полностью должны быть исключены и генерировать исключение в любом случае, чтобы симулировать гипотетический периферийный сопроцессор для управления сетевым обменом, регионами памяти и портами ввода/вывода
Исполняемый файл будет в «сыром формате» без заголовков…
То есть, например, нужно тупо jpeg-файл загрузить в память и запустить его, чтобы посмотреть на «картину исключений» моим Супервизором со «сборщиком исключений»…
Сам «сборщик исключений» будет собирать статистику, вида «n-раз обнаружен in/out», «n-раз FPU-команды» и т.д…
Дело в том, что здесь нельзя использовать программную эмуляцию.
Нужно на разных компьютерах запускать и статистически оценивать сами процессоры.
P.S.: Спасибо!
Re[3]: Супервизор над нуль-API бот-процессом (Windows XP IA-
Очень много букв. SEC_IMAGE не умеет ничего кроме PE формата (32хбитная винда умеет еще NE). Соответственно создать процесс без PE файла невозможно. Если хочется исполнять "сырые" данные — VirtualAlloc(...PAGE_EXECUTE...) пишите туда данные и прыгайте на нужный адрес.
Но это будет лишь простой процесс в системе. Судя по всему вы пытаетесь сделать какой то свой гипервизор совершенно не понимая даже как работает современная ОС.
Все таки расскажу немного — в современной оси юзермодные процессы работают в непривелигированном режиме процессора. В этом режиме нельзя инициализировать свои селекторы. LLDT просто вызовет аппаратную ошибку защиты. И неважно как вы создавали процесс, даже еслиб SEC_IMAGE схавал ваш не-PE файл — ему бы это совершенно не помогло выбраться в нулевое кольцо защиты.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, 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-битного адреса…)
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 — есть шанс.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, 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)
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-
Здравствуйте, Vertecs, Вы писали:
V>Да, я не понимаю детально, как работает ОС. V>Просто мне нужно «на коленке» соорудить виртуальный PC без периферии, портов ввода/вывода и FPU. V>Тупо — Процессор+Память…
Бред какой полный... Но если хочется чего-то странного, то берём KVM под Линуксом и вперёд с песней: https://lwn.net/Articles/658511/ — в статье описано как сделать простейшую виртуальную машину.
Sapienti sat!
Re[6]: Супервизор над нуль-API бот-процессом (Windows XP IA-
Здравствуйте, Cyberax, Вы писали:
C>Бред какой полный... Но если хочется чего-то странного, то берём KVM под Линуксом и вперёд с песней: https://lwn.net/Articles/658511/ — в статье описано как сделать простейшую виртуальную машину.
Этo всё хорошо под Linux.
Под Linux'ом многое чего делают. Вон и Android слепили, заполонив весь рынок.
А нужно именно под Windows…
Re[7]: Супервизор над нуль-API бот-процессом (Windows XP IA-
Здравствуйте, Vertecs, Вы писали:
C>>Бред какой полный... Но если хочется чего-то странного, то берём KVM под Линуксом и вперёд с песней: https://lwn.net/Articles/658511/ — в статье описано как сделать простейшую виртуальную машину. V>Этo всё хорошо под Linux. V>Под Linux'ом многое чего делают. Вон и Android слепили, заполонив весь рынок. V>А нужно именно под Windows…
Зачем? Я понял бы, если бы это был какой-то курсовик или диплом.
Здравствуйте, 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-
V>Черновой вариант работает, но там сам x86-код прямо инлайном вставлен в «_asm{…}» прямо в тело моего процесса. Тогда как нужно открыть новый процесс в абсолютной инкапсуляции…
Но зачем процесс? Выделяй executable память, клади в нее код да выполняй.
Как много веселых ребят, и все делают велосипед...
Re[9]: Супервизор над нуль-API бот-процессом (Windows XP IA-
Здравствуйте, Vertecs, Вы писали:
V>Диплoм здесь не причём. Это нужно, прежде всего, для себя и моих внутренних опытов. И с расчётом на распространение.
Ну то есть, чистый бред.
V>И мне, если не совсем поняли, ПК (с его периферией и т.п.) виртуализовывать не нужно. V>Мне нужна виртуализация CPU+RAM без железа (DMA и т.п.) и FPU, так как порты и Esc-инструкции я должен обрабатывать сам (не на уровне диспетчера арифметики/железа, а чисто сам разбирать проблемный участок с x86-кодом).
Ещё раз, если стоит задача разобрать код, то берём один из 100500 эмуляторов X86 и запускаем. Примерно так работают современные антивирусы — они фактически запускают код в "песочнице" и смотрят на его взаимодействие с внешним миром.
Здравствуйте, 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 лет назад я уже писал подобный эмулятор.
Но мне нужно именно аппаратно это сделать самим процессором.
(Запустить «бешеных ботов» каждый в своём пространстве…) Это не вирусы, а просто исследовательский проект мечты моей юности.