Строковый эквивалент Int32 в ReadProcessMemory

Это возвращает целое число из моей программы, которая вычисляет общее количество опыта в игре. Он рабочий, и он работает.

class Program
    {
        [DllImport("kernel32.dll")]
        public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
            [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);

        static void Main(string[] args)
        {
            int add_base;
            int add_player_exp = 0x3C1200;

            Process p = Process.GetProcessesByName("Game")[0];

            if (p != null)
            {
                add_base = p.MainModule.BaseAddress.ToInt32();
                add_player_exp += add_base;

                string output;
                int exp;

                exp = ReadInt32(p.Handle, add_player_exp);

                output = String.Concat("Exp: ", exp.ToString());

                Console.WriteLine(output);
                Console.ReadKey();

            }
        }

        private static int ReadInt32(IntPtr handle, long address)
        {
            return BitConverter.ToInt32(ReadBytes(handle, address, 4), 0);
        }

        private static byte[] ReadBytes(IntPtr handle, long address, uint bytesToRead)
        {
            IntPtr ptrBytesRead;
            byte[] buffer = new byte[bytesToRead];

            ReadProcessMemory(handle, new IntPtr(address), buffer, bytesToRead, out ptrBytesRead);

            return buffer;
        }
    }

Каков эквивалентный код для извлечения строки из ReadProcessMemory?


person sheepiiHD    schedule 25.02.2016    source источник
comment
Все, что вам не хватает, это преобразование байтового массива в строку, что-то вроде Encoding.ASCII.ToString(ReadBytes(...))   -  person Ben Voigt    schedule 25.02.2016
comment
Это зависит от того, какая это строка. Это простая строка ASCIIZ с одним байтом на символ и заканчивающаяся 0 байтом? Строка Юникода? Как насчет строки типа Pascal, в которой слово начального размера имеет такое же количество символов? Есть приблизительно gazillion и три различных типа последовательностей. Вы должны быть более конкретными в отношении того, какую строку вы ищете.   -  person Jim Mischel    schedule 25.02.2016


Ответы (1)


Чтобы прочитать обычную строку c с нулевым завершением (массив символов) из памяти:

public static string ReadNullTerminatedString(IntPtr handle, IntPtr addr, int maxlength)
{
    var bytearray = new byte[maxlength];

    IntPtr bytesread = IntPtr.Zero;

    ReadProcessMemory(handle, addr, bytearray, maxlength, out bytesread);

    int nullterm = 0;
    while (nullterm < bytesread.ToInt64() && bytearray[nullterm] != 0)
    {
        nullterm++;
    }

    string s = Encoding.ASCII.GetString(bytearray, 0, nullterm);

    return s;
}
person GuidedHacking    schedule 15.05.2020