2011-06-05 3 views
0

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

  • Я попытался запустить VS в качестве администратора и удалить небезопасный блок.
  • processPointer имеет правильное значение для дескриптора процесса.
  • BaseAddress правильно выполняет итерацию по одному, и появляется, чтобы быть местом памяти, которую я ищу.
  • Несмотря на то, что, очевидно, не найти совпадений, он работает довольно быстро. Несколько секунд для процесса 72 МБ.

.

// (other stuff in method...) 
IntPtr baseAddress = process.MainModule.BaseAddress; 
IntPtr lastAddress = baseAddress + process.MainModule.ModuleMemorySize; 
processPointer = OpenProcess((uint)(0x0020), 1, (uint)PID); 
for (int addr = (int)baseAddress; addr + value.Length < (int)lastAddress; addr++) 
{ 
    string ActualValue = ReadMemory((IntPtr)addr, (uint)value.Length, (IntPtr)addr); 
    if (string.IsNullOrEmpty(ActualValue)) continue; 
    if (ActualValue.Trim().ToLower() == value.Trim().ToLower()) 
     PossibleAddresses.Add((IntPtr)addr); 
} 
// (other stuff in method...) 

CloseHandle(processPointer); 

private string ReadMemory(IntPtr memAddress, uint size, IntPtr BaseAddress) 
{ 
    byte[] buffer = new byte[size]; 
    IntPtr bytesRead; 
    unsafe 
    { 
     ReadProcessMemory(processPointer, BaseAddress, buffer, size, out bytesRead); 
     return BitConverter.ToString(buffer); // always "00-00-00-00....." 
    } 
    return Encoding.Default.GetString(buffer); // Another way I tried to read the data 
} 


[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); 
+0

Вы не проверять возвращаемое значение 'ReadProcessMemory'. Если произошла ошибка, она вернет 'FALSE', и вам нужно будет проверить' GetLastError'. –

ответ

0

Я открыл ручку с неправильным типом доступа. 0x0010 - читать; 0x0020 - это написать. Я надеялся получить чтение/запись с одним открытым, но похоже, что мне придется обрабатывать это отдельно.

источник: http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=15680

+1

Его легко можно прочитать и написать на одном дескрипторе процесса, я обычно использую для этого флаг 'PROCESS_ALL_ACCESS', но с использованием 0x30 должен делать трюк (' PROCESS_VM_READ | PROCESS_VM_WRITE'), OFC вам нужны достаточные привилегии для этого, но может быть выполнено с помощью 'SeSetDebugPrivilages' – Necrolis

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