Мне нужно знать все адресное пространство памяти, используемое процессом.Позже пространство памяти будет сканироваться, чтобы найти значения в процессе и определить их местоположение / адреса.Мой текущий процесс для этого состоит в том, чтобы взять базовый адрес каждого модуля через его (базовый адрес + объем памяти).
Я проверяю это на процессе с известным значением по известному адресу.Когда я ищу этот конкретный адрес, я получаю ожидаемое значение.Однако, когда я сканирую (что я считаю) все адресное пространство, используемое процессом, я нигде не могу найти значение.
Я знаю, что числовое значение "4143000" существует в 0x0CF8DC38 и 0x0CF8DDDC .Когда я вызываю ReadMemoryBytes (module, 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);