2013-08-07 2 views
2

Я чтение данных из памяти с использованием базового адреса и некоторые сдвигов:Чтение INT из памяти процесса

public static int ReadInt(long address) 
{ 
    byte[] buffer = new byte[sizeof(int)]; 
    ReadProcessMemory(pHandle, (UIntPtr)address, buffer, (UIntPtr)4, 
         IntPtr.Zero); 
    return BitConverter.ToInt32(buffer, 0); 
} 

добавить смещения, как это:

var one = MemoryHandler.ReadInt((long)MemoryHandler.base_adress + 
           (long)0x0945BB0C); 
var two = MemoryHandler.ReadInt(one + (long)0x28); 
var three = MemoryHandler.ReadInt(two + (long)0x214); 
var four = MemoryHandler.ReadInt(three + (long)0x38); 
var five = MemoryHandler.ReadInt(four + (long)0x7EC); 
var six = MemoryHandler.ReadInt(five + (long)0x230); 

Где six содержит значение, Мне нужно.

Я попытался сделать перегрузку, которая делает то же самое. Моя проблема в том, что это не дает мне то же значение. Я хотел бы знать, почему:

public static int ReadInt(long address, int[] offsets) 
{ 
    long prev = 0; 
    for (int i = 0; i < offsets.Length; i++) 
    { 
     address = prev > 0 ? ReadInt(prev + (long)offsets[i]) : ReadInt(address); 
     prev = address + offsets[i]; 
    } 

    return (int)address;  
} 

var offsets = new int[] { 0x28, 0x214, 0x38, 0x7EC, 0x230 }; 
var result = MemoryHandler.ReadInt((long)MemoryHandler.base_adress + 
           (long)0x0945BB0C, offsets); 

Просто для уточнения: Я хочу result иметь такое же значение, как six выше.

ответ

2

Обратите внимание, что это будет работать только на 32bits

public static int ReadInt(long address, int[] offsets) 
{ 
    address = ReadInt(address); 

    for (int i = 0; i < offsets.Length; i++) 
    { 
     address = ReadInt(address + (long)offsets[i]); 
    } 

    return (int)address;  
} 

Вы offsets.Length + 1ReadInt (s), чтобы сделать, один без смещения и со смещением offsets.Length. Каждый возвращает адрес для следующего. Последний возвращает значение.

Учитывая, что это будет работать только на 32 бита (потому что вы читаете 32 бита и используете их как ptr), использование long бесполезно. int достаточно.

+0

Спасибо за объяснение, работает как шарм – Johan

Смежные вопросы