C#: Ищите байт [] массив в памяти другого процесса

вы не можете изменить константные переменные,

const courses = [...this.state.courses];
    courses[index].courseGrade = courseGrade;
    this.setState({courses});

, если у вас есть значение и индекс ваших данных в массиве, просто сделайте это

let state = {...this.state}

state.courses[INDEX].courseGrade = courseGrade;

this.setState({...state})

я надеюсь, что это полезно

5
задан Ivan Prodanov 23 April 2009 в 13:38
поделиться

3 ответа

Возможно ли это сделать в C #?

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

Соображения:

  • Вам потребуется разрешение, чтобы открыть процесс, чтобы получить дескриптор.
  • Хотя размер виртуальной памяти 32-битного процесса составляет от двух до четырех ГБ (в зависимости от операционной системы хоста и параметра / 3 ГБ), большая часть этого диапазона адресов не будет выделена, и чтение этого файла приведет к сбою страницы. Вам действительно нужно выяснить, какие страницы выделены и для чего нужно избегать множества недопустимых обращений к страницам.

Предложения:

  • Вам действительно нужно это сделать? Серьезно, это будет сложно.
  • Рассмотрите возможность создания нативного приложения, это позволит избежать работы через нативный / управляемый забор (это может включать нативную библиотеку с приложением управляемого драйвера).
  • Вам действительно нужно это делать?
  • Рассмотрите возможность выполнения работы внутри целевого процесса. Это потребует некоторой хитрости (задокументировано) для внедрения потока, но затем должно быть намного быстрее.
  • Начните с чтения в Windows того, как работает память процесса (начните с Windows Internals и (не могу вспомнить его имя в последней редакции) Книга Джеффри Рихтера о разработке приложений для Win32.
  • Вам действительно нужно это сделать? Должно быть что-то попроще ... Вы могли бы автоматизировать отладчик?
-1
ответ дан 12 December 2019 в 12:51
поделиться

Полагаю, вы могли бы использовать ReadProcessMemory Windows API call. Для этого есть даже предварительно созданная подпись P / Invoke , так что вам не нужно беспокоиться о ее ручной обработке. Вы просматриваете память процесса, ищите в ней свой шаблон, и все готово.

6
ответ дан 12 December 2019 в 12:51
поделиться

Это может помочь вам найти правильный путь:

private static int GetMemoryAddressOfString(byte[] searchedBytes, Process p)
{
    //List<int> addrList = new List<int>();
    int addr = 0;
    int speed = 1024*64;
    for (int j = 0x400000; j < 0x7FFFFFFF; j+= speed)
    {
        ManagedWinapi.ProcessMemoryChunk mem = new ProcessMemoryChunk(p, (IntPtr)j, speed + searchedBytes.Length);

        byte[] bigMem = mem.Read();

        for (int k = 0; k < bigMem.Length - searchedBytes.Length; k++)
        {
            bool found = true;
            for (int l = 0; l < searchedBytes.Length; l++)
            {
                if(bigMem[k+l] != searchedBytes[l])
                {
                    found = false;
                    break;
                }
            }
            if(found)
            {
                addr = k+j;
                break;
            }
        }
        if (addr != 0)
        {
            //addrList.Add(addr);
            //addr = 0;
            break;
        }
    }
    //return addrList;
    return addr;
}
1
ответ дан 12 December 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: