Не ожидайте, что сможете получить доступ к вещам в куче из кода без CLR без обширного переноса. Существуют способы сделать IPC между процессами, управляемыми CLR, но вам придется записывать прокси доступа во «внешний мир», если вы хотите, чтобы процесс без CLR попадал в вашу память.

ужно знать все адресное пространство памяти, используемое процессом. Позже пространство памяти будет сканироваться, чтобы найти значения в процессе и определить их местоположение / адреса. Мой текущий процесс для этого состоит в том, чтобы взять базовый адрес каждого модуля через его (базовый адрес + объем памяти).

Я тестирую это в процессе с известным значением по известному адресу. Когда я ищу этот конкретный адрес, я получаю ожидаемое значение. Однако, когда я сканирую (что я считаю) все адресное пространство, используемое процессом, я нигде не могу найти значение.

Я знаю, что числовое значение "4143000" существует в0x0CF8DC38 а также0x0CF8DDDC, Когда я звонюReadMemoryBytes (модуль, module.BaseAddress, 4, (IntPtr) (0x0CF8DC38)) Я получаю обратно байты (152, 55, 63, 0). Когда я вызываю BitConverter.GetBytes (4143000), я получаю тот же набор байтов. Когда я использую другой сканер памяти в этом процессе, я нахожу это значение по этим адресам.

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

Таким образом, мой вопрос имеет два аспекта:

Как я могу найти эти адреса в этом процессе?Я обеспокоен тем, что могу иметь дело с абсолютными адресами в системной памяти по сравнению с относительными адресами в процессе. Я делаю это правильно?

.

// (in the calling method)
foreach (ProcessModule module in process.Modules) {
    ParameterizedThreadStart pst = new ParameterizedThreadStart(p => SearchModule(module, value));
    Thread t = new Thread(pst);
    t.Start(); }

private unsafe void SearchModule(ProcessModule module, string value)
{
Process process = getProcess;
int iVal;
double dVal;
int.TryParse(value, out iVal);
double.TryParse(value, out dVal);
for (Int64 addr = (Int64)module.BaseAddress; addr + value.Length < (Int64)module.BaseAddress + module.ModuleMemorySize; addr++)
{
    // Compare ints
    if (iVal > 0)
    {
        byte[] ExpectedBytes = BitConverter.GetBytes(iVal);
        byte[] ActualBytes = ReadMemoryBytes(module, (IntPtr)addr, (uint)ExpectedBytes.Length, (IntPtr)addr);

        bool isMatch = true;
        for (int i = 0; i < ExpectedBytes.Length; i++)
            if (ExpectedBytes[i] != ActualBytes[i])
                isMatch = false;
        if (isMatch)
            PossibleAddresses.Add((IntPtr)addr);
    }
}

private byte[] ReadMemoryBytes(ProcessModule mod, IntPtr memAddress, uint size, IntPtr BaseAddress)
{
    byte[] buffer = new byte[size];
    IntPtr bytesRead;
    unsafe
    {
        ReadProcessMemory(processPointer, BaseAddress, buffer, size, out bytesRead);
        return buffer;
    }
}

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);
[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(IntPtr hObject);
[DllImport("kernel32.dll")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);

Ответы на вопрос(1)

Ваш ответ на вопрос