Подтвердить что ты не робот

Как вы читаете непосредственно из физической памяти?

В C или С++ (windows), как вы читаете ОЗУ, предоставляя физический (а не виртуальный) адрес? Это означает, что без перехода через систему виртуальной памяти (таблицы mmu) и быть конкретным для одного процесса.

Я уже знаю API ReadProcessMemory, который читается из ram (используется большинством тренеров), но он предназначен только для определенного процесса.

Я искал в MSDN и обнаружил, что Device\PhysicalMemory, похоже, дает такую ​​возможность, но я не нашел практического примера, и эта функция, похоже, были отключены с помощью пакетов обновления Windows (чтобы устранить некоторую уязвимость).

Я знаю, что это возможно, потому что WinHex делает это (если вы выберете "tools" > "open ram" > "физическая память" ). Затем он отобразит содержимое ОЗУ с 0x00000000 в ваш_ram_size, как при открытии традиционного файла. Для этого требуются права администратора, но нет драйвера для установки (что означает, что WinHex делает это из пользовательского режима).

EDIT: добавлена ​​информация о os.

4b9b3361

Ответ 1

Ни язык C, ни С++ не определяет термин "память". Вещи определены в абстрактных терминах, таких как "хранилище" и "классификаторы хранения". Указатели - абстрактные вещи - их значения могут быть любыми, абсолютно не связанными с физическими или виртуальными адресами.

Только в контексте системы и ее реализации используются такие понятия, как память и адресное пространство. И поскольку эти функции относятся к конкретной системе, один должен использовать методы, предоставляемые ОС для доступа к ним.

Даже при реализации ядра ОС вы должны делать доступ к материалам самого низкого уровня не через C (потому что это просто невозможно), а через методы, специфичные для реализации и архитектуры. Обычно это осуществляется через набор низкоуровневых функций, запрограммированных в сборке, которые написаны так, что они соответствуют типу машинного кода, который генерирует компилятор. Это позволяет вызывать функции, записанные в сборке, из C, как если бы они были скомпилированы компилятором.

Ответ 2

Вам нужно будет написать драйвер режима ядра и использовать функции диспетчера памяти для сопоставления диапазона физической памяти в системном пространстве драйвера ядра, а затем экспортировать функциональность в пользовательский API или драйвер.

После Windows 98 в большинстве случаев невозможно получить доступ к физической памяти из пользовательского режима. Как выразились другие, это значит, что любая старая программа не может просто уничтожить компьютеры людей. Вам нужно будет написать драйвер ядра, который может быть установлен только в том случае, если он подписан и сначала загружен в хранилище окон. Это само по себе не простой процесс, как связывание DLL.

В заключение MmAllocateContiguousMemory() - это функция режима ядра Windows, которая отображает непрерывную физическую память в системную память и является частью ntoskrnl.exe.

Также вы не можете вызывать этот API из приложений пользовательского режима. Только драйвер может их использовать. Приложения пользовательского режима НЕ МОЖЕТЕ получить доступ к физической памяти с помощью драйвера. Драйвер может обрабатывать запрос от пользовательского API или использовать IOCTL и сопоставлять его ресурсы с виртуальной памятью API. В любом случае вам понадобится помощь драйвера, который должен быть установлен менеджером play n. PnP должен выбрать установку драйвера самостоятельно либо с помощью аппаратной активации, то есть с помощью горячего подключения или какого-либо другого метода, такого как драйвер шины, который всегда включен.

Дополнительные окна случайным образом назначают виртуальный адрес, так что нелегко распознать любой шаблон или определить его физическое местоположение.

Ответ 4

Я бы подумал, что драйвер устройства должен обеспечивать доступ к физической памяти, так как к таким устройствам, как PCI-карты, нужно обращаться. Если вы можете сделать это из драйвера, напишите специальный распределитель для вашей программы "пользователь" (более похожий на администратора), чтобы легко связать его с С++.

Ответ 5

В Windows вы должны использовать NativeAPI-вызовы NtOpenSection и NtMapViewOfSection

Пример от Марка Руссиновича

static BOOLEAN MapPhysicalMemory( HANDLE PhysicalMemory,
                            PDWORD Address, PDWORD Length,
                            PDWORD VirtualAddress )
{
    NTSTATUS            ntStatus;
    PHYSICAL_ADDRESS    viewBase;
    char                error[256];

    *VirtualAddress = 0;
    viewBase.QuadPart = (ULONGLONG) (*Address);
    ntStatus = NtMapViewOfSection (PhysicalMemory,
                               (HANDLE) -1,
                               (PVOID) VirtualAddress,
                               0L,
                               *Length,
                               &viewBase,
                               Length,
                               ViewShare,
                               0,
                               PAGE_READONLY );

    if( !NT_SUCCESS( ntStatus )) {

        sprintf_s( error, "Could not map view of %X length %X",
                *Address, *Length );
        PrintError( error, ntStatus );
        return FALSE;                   
    }

    *Address = viewBase.LowPart;
    return TRUE;
}

static HANDLE OpenPhysicalMemory()
{
    NTSTATUS        status;
    HANDLE          physmem;
    UNICODE_STRING  physmemString;
    OBJECT_ATTRIBUTES attributes;
    WCHAR           physmemName[] = L"\\device\\physicalmemory";

    RtlInitUnicodeString( &physmemString, physmemName );    

    InitializeObjectAttributes( &attributes, &physmemString,
                                OBJ_CASE_INSENSITIVE, NULL, NULL );         
    status = NtOpenSection( &physmem, SECTION_MAP_READ, &attributes );

    if( !NT_SUCCESS( status )) {

        PrintError( "Could not open \\device\\physicalmemory", status );
        return NULL;
    }

    return physmem;
}

\device\physicalmemory является аналогом /dev/mem под Linux, где у вас также есть возможность напрямую обращаться к физической памяти. Кстати, не уверен в Windows, но в Linux доступно только 1 Мб физического адресного пространства, поскольку оно может содержать некоторые низкоуровневые данные службы, такие как таблицы BIOS. Доступ к другой физической памяти может привести к повреждению виртуальной памяти, управляемой ОС, и почему она не разрешена

UPDATE: Предоставленный код не работает в режиме пользователя, начиная с Windows Vista. Вместо этого вы можете вызвать GetSystemFirmwareTable(), чтобы получить полезную информацию из 1-го MB необработанной памяти, не ища ее.

Бонус: чтение физической памяти под Linux (Debian 9) с использованием файла Boost IO с отображением памяти, часть класса:

NativePhysicalMemory::NativePhysicalMemory(size_t base, size_t length)
    : physical_memory_map_(std::make_unique<boost::iostreams::mapped_file_source>())
{
    map_physical_memory(base, length);
}

// ...

void NativePhysicalMemory::map_physical_memory(size_t base, size_t length)
{
#ifdef _SC_PAGESIZE
    size_t mempry_page_offset = base % sysconf(_SC_PAGESIZE);
#else
    size_t mempry_page_offset = base % getpagesize();
#endif /* _SC_PAGESIZE */

    boost_io::mapped_file_params params = {};
    params.path = "/dev/mem";
    params.flags = boost_io::mapped_file::mapmode::readonly;
    params.length = length + mempry_page_offset;
    params.offset = base - mempry_page_offset;
    params.hint = nullptr;
    physical_memory_map_->open(params);
}

Ответ 6

Я думаю, что его невозможно напрямую получить к физическому адресу. Даже с административной привилегией.

Каждый адрес, к которому обращается приложение, представляет собой виртуальный адрес, который переводится на физический адрес с помощью аппаратного MMU.

Один из способов - настроить MMU для одного к одному, сопоставляя виртуальный адрес с физическим адресом. Обычно это делается во встроенных системах без ОС или до загрузки ОС.

С загруженными окнами. Я считаю, что ваше требование невозможно.

Ответ 7

Короткий ответ: Нет

Длительный ответ:

Стандарт C/С++ определяет машину в очень простых терминах. Нет понятия виртуальной памяти (просто памяти). Эти концепции скорее являются областью аппаратного обеспечения и могут быть потенциально доступны через ОС (если это известно ОС таких вещей).

Я хотел бы задать вопрос с точки зрения возможностей, предоставляемых вашей ОС/оборудованием.