Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для Alikberov
131 / 116 / 25
Регистрация: 03.05.2017
Сообщений: 337
Записей в блоге: 1

Создание холостого процесса

18.11.2019, 14:53. Показов 1608. Ответов 4

Студворк — интернет-сервис помощи студентам
Дaнный вопрос вытекает из темы выше, где мне необходимо организовать сеть «бот-процессов» без возможности с их стороны (и безопасно для моей стороны) обратиться к API.

После долгих опытов с SEH-обработчиком исключений мне удалось путём простого парсинга байт-кода взять обработку in/out-инструкций процессора на себя с затрачиванием до 10 млн тиков, что хоть и много, но в рамках общей задачи вполне нормально.
А так как подопытный код находится в памяти моей контролирующей программы, но мне нужно создать несколько независимых процессов и организовать между ними обмен через in/out-инструкции в бесконечном цикле.

B разделе «Запуск исполняемых файлов и динамически связываемых библиотек» кратко описываются четыре действия функции CreateFile:
  1. Создать адресное пространство процесса (размером 4Gb)
  2. Резервировать в адресном пространстве процесса регион размером, достаточным для размещения исполняемого файла. Начальный адрес региона определяется в заголовке EXE-модуля. Обычно он равен 0x00400000, но может быть изменен при построении файла параметром /BASE компоновщика
  3. Отобразить исполняемый файл на зарезервированное адресное пространство. Тем самым VMM распределяет физические страницы не из файла подкачки, а непосредственно из EXE-модуля
  4. Таким же образом отобразить на адресное пространство процесса необходимые ему динамически связываемые библиотеки. Информация о необходимых библиотеках находится в заголовке EXE-модуля. Желательное расположение региона адресов описано внутри библиотеки. Visual C++, например, устанавливает по умолчанию адрес 0x10000000. Этот адрес может так же изменяться параметром /BASE компоновщика. Если при загрузке выясняется, что данный регион занят, то система попытается переместить библиотеку в другой регион адресов, на основе настроечной информации, содержащейся в DLL-модуле. Однако эта операция снижает эффективность системы и, кроме того, если настроечная информация удалена при компоновке библиотеки параметром /FIXED, то загрузка становится вообще невозможной
Очевидно, действие №1 выполняется функциями ядра и для моей поставленной цели - то, что надо!
Каким образом можно создать пустой процесс не только с флажками CREATE_SUSPENDED и DEBUG_PROCESS, но без резервирования всяких регионов (без верхних 2 Gb и нижних 64 Кб), чтобы в этих 4 Gb пространства основной процесс мог сам выбрать область под проекции файлов и виртуальную память? Говоря проще, как взять все полномочия создания процесса на себя и по запросу из сети создавать самому «песочницу» под каждый «бот»?

Сами по-себе «боты» будут «жить» краткий период времени - до нескольких минут. А часть из них будут генерироваться случайными числами. Поэтому, исключений ожидается просто громадное количество и лишь по инструкциям in/out будет строиться сеть графов взаимодействия «ботов» (порты - не для доступа к реальным периферийным устройствам, а для символической бот-связи)…

Потому мне нужно под каждый процесс выделить все 4 Гб адресного пространства, а не 4 Гб памяти. Так как само «окно» памяти будет «ползти» вслед за регистром EIP, динамически подгружая/генерируя байт-код…

P.S.: Qemu/Bochs не годятся, так как всё должно выполняться реальным процессором…
Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2019, 14:53
Ответы с готовыми решениями:

Напряжение холостого хода
Господа, может кто нибудь пожалуйста помочь с расчетом напряжения холостого хода на зажимах AB? заранее благодарен.

Напряжение холостого хода
Здравствуйте. Нужно найти ток в ветви методом эквивалентного генератора. Общее сопротивление я нашел. Теперь надо найти Uxx (напряжение...

Напряжение холостого хода
снова я со свей схемой... теперь мне нужно рассчитать ток в ветви с сопротивлением R3 методом эквивалентного генератора. Я нашла: ...

4
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
18.11.2019, 16:41
Цитата Сообщение от Alikberov Посмотреть сообщение
Каким образом можно создать пустой процесс не только с флажками CREATE_SUSPENDED и DEBUG_PROCESS, но без резервирования всяких регионов (без верхних 2 Gb и нижних 64 Кб), чтобы в этих 4 Gb пространства основной процесс мог сам выбрать область под проекции файлов и виртуальную память? Говоря проще, как взять все полномочия создания процесса на себя и по запросу из сети создавать самому «песочницу» под каждый «бот»?
создать процесс в нативе, когда он будет нужен уведомить csrss и его существовании в ядре
C++
1
2
3
4
5
6
NtOpenFile(&hFile, FILE_GENERIC_ALL_ACCESS, &ObjAttr, &StatusBlock, FILE_SHARE_ALL_ACCESS, FILE_SEQUENTIAL_ONLY);
NtCreateSectionEx(&hSection, SECTION_ALL_ACCESS, NULL, NULL, PAGE_EXECUTE_READWRITE, SEC_IMAGE, hFile, NULL, 0);
NtMapViewOfSectionEx(hSection, NtCurrentProcess(), &ImageBaseAddr, NULL, &ViewSize, 0, PAGE_EXECUTE_READWRITE, NULL, 0);
NtCreateProcessEx(&hProcess, PROCESS_ALL_ACCESS, NULL, NtCurrentProcess(), PROCESS_CREATE_FLAGS_BREAKAWAY, hSection, NULL, NULL, 0);
// NtCreateThread(&hThread, THREAD_ALL_ACCESS, NULL, hProcess, &ClientId, &ThreadContext, &InitialTeb, TRUE);
// NtCreateThreadEx(&hThread, THREAD_ALL_ACCESS, NULL, hProcess, (PUSER_THREAD_START_ROUTINE)Foo, (PVOID)Param1(), THREAD_CREATE_FLAGS_CREATE_SUSPENDED, 0, 0, 0, NULL);
1
 Аватар для Alikberov
131 / 116 / 25
Регистрация: 03.05.2017
Сообщений: 337
Записей в блоге: 1
20.11.2019, 21:37  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
создать процесс в нативе, когда он будет нужен уведомить csrss и его существовании в ядре
Спасибо!
Но ничего не получается.

Вот этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    HMODULE hNtDll = LoadLibrary("ntdll.dll");
    NtOpenFile = (fpNtOpenFile)GetProcAddress(hNtDll, "NtOpenFile");
    printf("%08X:NtOpenFile\r\n", NtOpenFile);
    NtCreateSectionEx = (fpNtCreateSectionEx)GetProcAddress(hNtDll, "NtCreateSectionEx");
    printf("%08X:NtCreateSectionEx\r\n", NtCreateSectionEx);
    NtMapViewOfSectionEx = (fpNtMapViewOfSectionEx)GetProcAddress(hNtDll, "NtMapViewOfSectionEx");
    printf("%08X:NtMapViewOfSectionEx\r\n", NtMapViewOfSectionEx);
    NtCreateProcessEx = (fpNtCreateProcessEx)GetProcAddress(hNtDll, "NtCreateProcessEx");
    printf("%08X:NtCreateProcessEx\r\n", NtCreateProcessEx);
    NtCurrentProcess = (fpNtCurrentProcess)GetProcAddress(hNtDll, "NtCurrentProcess");
    printf("%08X:NtCurrentProcess\r\n", NtCurrentProcess);
    system("pause");
выдаёт следующее:
Code
1
2
3
4
5
77ADBF20:NtOpenFile
00000000:NtCreateSectionEx
00000000:NtMapViewOfSectionEx
77ADC0C0:NtCreateProcessEx
00000000:NtCurrentProcess
Сначала подумал, что с библиотеками промахнулся и запустил Total Commander для поиска файлов по ключевым словам «NtCreateSectionEx», «NtMapViewOfSectionEx» и «NtCurrentProcess», но ничего не нашёл.
Сеть советует установить «Driver Development Kit» в таком случае.
Но тогда моя утилита будет у пользователей ожидать предустановленного DDK…

Что-то я совсем ничего не понимаю.
Если сейчас само ядро своими функциями внутренними выполняет те операции, почему они никак не представлены в экспорт?
Почему вообще никак не обнаруживаются нигде при поиске?
То есть, я никак сейчас ничего этого выполнить не смогу без установки DDK?

Сколько дней потратил и не сдвинулся совсем никуда.
Видно, задача слишком специфична для моего уровня.

P.S.: Код пишу на MS-VC-6 под Windows'XP на VMware, так как он должен работать и на старых ноутбуках тоже.
(Да и VisualStudio-6 интерфейсом куда приятнее, чем та же Visual Studio 2008 на Windows'8.1)
Однако, и в Windows'XP, и в Windows'8.1 консоль выдаёт одинаковые нулевые векторы.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
21.11.2019, 09:19
Цитата Сообщение от Alikberov Посмотреть сообщение
я никак сейчас ничего этого выполнить не смогу без установки DDK?
под XP нужно использовать старые функции - Rtl... а также Nt функции без префикса Ex (extended, расширенные функции появились только в новых ОС).

Цитата Сообщение от Alikberov Посмотреть сообщение
тогда моя утилита будет у пользователей ожидать предустановленного DDK…
DDK это всего лишь пакет с набором хидеров и либ, после компиляция которых используются не они, а уже системные библиотеки.
так что таскать с собой и устанавливать SDK/WDK не нужно.

Цитата Сообщение от Alikberov Посмотреть сообщение
сколько дней потратил и не сдвинулся совсем никуда.
для меня не совсем понятна цель вашей задачи.
зачем опускаться до I/O?
если вы хотите процесс без API, то он должен быть системным.
кодить из-под юзермода (даже на XP с учётом повышения привилегий) в любом случае это использование API.
1
 Аватар для Alikberov
131 / 116 / 25
Регистрация: 03.05.2017
Сообщений: 337
Записей в блоге: 1
21.11.2019, 11:35  [ТС]
Под Windows команды «cli»/«sti»/«hlt»/«lock»/«in»/«out» на прикладном уровне просто запрещены к использованию.
В моём же случае эти команды «ботами», не по прямому назначению, но используются. Типа как «call»/«int»/«syscall».

Говоря проще, например, «sti» и «cli» из команд превращаются в байт-код, управляющий не флагами прерывания, а типа как «glBegin» и «glEnd» в OpenGL.
То есть, «sti» - как «Start The Inject», «cli» - как «Close The Inject». Для «инжекции» фрагментов кода из «бота» в мою оболочку. Нечто напоминающее некий «шейдер», но не только для графики…
Например, «sti + bswap eax + cli» может служить преобразователем из ABGR в RGBA, если он инжектится в процесс отрисовки графики.
Грубо говоря, вместо вызова системой пользовательских CallBack-функций, «sti … … cli»-скобками обрамляется составной фрагмент кода из группы инструкций, который внедрится в функции системы…
Говоря ещё проще, «sti … … cli»-инжекции - аналогично как CSS в HTML, когда не используется явный JS-функционал по событиям, а просто описывается некий стиль и браузер в фоновом режиме всё сам делает.
Цитата Сообщение от _lunar_ Посмотреть сообщение
зачем опускаться до I/O?
А до уровня драйверов и реального железа я и не опускаюсь.
Если «sti … … cli» обрамляют CallBack-инжекции, то «in»/«out» служат как «SendMessage»/«PostMessage» (почти) для обмена данными между «ботами».
То есть, по «out» данные заносятся в очередь (стек событий) из одного «бота» другому. А по «in» просто проверяется очередь и считывается сообщение от любого другого «бота», если оно было.
Почему именно «in/out»? По-факту, эти самые «боты» формально и являются друг для друга (виртуальными) периферийными железками, потому команды «in/out» использовать чисто по логике уже корректно.
Цитата Сообщение от _lunar_ Посмотреть сообщение
если вы хотите процесс без API, то он должен быть системным.
Системный процесс мне и не нужен, так как с портами ввода/вывода в их классическом понимании я работать и не думаю.
На примере языка «LOGO»: Через некий порт указывается угол поворота, через другой порт - количество шагов, а в третий порт заносится скорость. И «бот», соответственно, повернётся, разгонится и пробежит заданное число шагов. Только вместо команд «Left/Right» или «Forward» используется формальная группа портов. Формальная, потому что, например, порты реального DMA для бота не нужны и могут использоваться ботами для смены цвета пера, его толщины и наклона.
Я просто перехватываю исключения от доступа к портам и не думаю ничего эмулировать, а лишь передаю информацию другим «ботам»: «бот смены пера», «бот смены колёс», «бот смены краски» и т.д…
Цитата Сообщение от _lunar_ Посмотреть сообщение
кодить из-под юзермода (даже на XP с учётом повышения привилегий) в любом случае это использование API.
API должен использовать только мой гипервизор, так как он должен и рисовать GDI-функционалом, и открывать сокеты для управления ботами через TelNet.
Цитата Сообщение от _lunar_ Посмотреть сообщение
для меня не совсем понятна цель вашей задачи.
Построить некую виртуальную среду, виртуальное окружение, подобное LEGO-кубикам.
Только вместо реального железа и языков высокого уровня должен быть сам x86-код.
А пользователь через те же «in/out»-инструкции все «боты» связывает как проводами…

То есть, моя Среда не должна пахнуть банальным набором библиотек функций и процедур.
Должно обеспечиться максимальное ощущение, будто пользователь работает на голом процессоре и программирует через порты ввода/вывода «боты», которые могут находиться и на других компьютерах других стран, где запущена эта Среда…
Потому, любые громадные задержки, связанные с перехватом и обработкой всех исключений из-за лабиринта «cli»/«sti»/«in»/«out»-команд, в моём случае и не страшны. Так как межсетевой обмен, сам по-себе, довольно медленный и блокирующими сокетами в любом случае заставит «боты» тормозить

А на первых парах будет использоваться грубый генератор случайных чисел для генерации хаотического x86-кода.
И самые удачные варианты кода, которые имеют инструкции обмена с портами, будут включаться в граф «ботов»…

P.S.: В двух словах не объяснишь.
Самой задумке - более 20 лет.
Но только сейчас я решил попробовать её реализовать как своеобразную нейросеть сугубо по своей концепции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2019, 11:35
Помогаю со студенческими работами здесь

Напряжение холостого хода
Доброго времени суток всем! В данной схеме мне необходимо для дальнейших расчетов найти Uxx. R1=R2=R3=R4=200 Ом. На местах зажимов...

Режим ХХ(Холостого Хода)
Люди добрые, пожалуйста, объясните глупому человеку про напряжение холостого хода. Вот я оборвал ту ветвь, в которой хочу найти ток....

Напряжение холостого хода
Доброго дня суток. Нужна помощь в решении этой задачи: Получается 40 вольт или - 40 вольт?

Создание процесса
Доброго времени суток! Пытаюсь создать процесс. В книге Рихтера - Создание эффективных Win32-приложений нашел такой код: STARTUPINFO...

Создание процесса
Меня интересует вопрос: процесс можно создавать - открывае .exe файл. Можно ли создать процесс из самого кода, всмысле - под некую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru