Перейти к содержанию

Рекомендуемые сообщения

Ребята помогите разобраться с ошибкой пожалуйста

Изучаю АПИ функции, а именно "VirtualQueryEx", с помощью него ищу байтов в процессе.

Код выдает ошибку "Переполнение в результате выполнение арифметической операции"

то есть переменная "blockAddress" выходит за рамки чегота. (предпологаю за рамки (IntPtr), потому что ошибку выдает после того как переменная "blockAddress" накапливает 3.956.862.976 цифр)

В чем ошибка?


public static void FinderReplacer(IntPtr pHandle,byte[] find, byte[] paste, long Pws64)
{
IntPtr handle = pHandle;
try
{
long blockAddress = 0;
while(blockAddress<(blockAddress+Pws64-find.Length))
{
MEMORY_BASIC_INFORMATION mbi;
VirtualQueryEx(handle,(IntPtr)blockAddress, out mbi,(uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION))); // Ощибка в этой строке.
if (mbi.AllocationProtect == (uint)AllocationProtect.PAGE_READWRITE || mbi.AllocationProtect == (uint)AllocationProtect.PAGE_EXECUTE_READWRITE)
{
byte[] region=new byte[mbi.RegionSize.ToInt32()];
IntPtr realReaded;
ReadProcessMemory(handle, (IntPtr)blockAddress, region,(uint) region.Length, out realReaded);
for (int i = 0; i <= region.Length-find.Length; i++)
{
...........
...........
...........
}
}
blockAddress += mbi.RegionSize.ToInt64(); // Продолжаем дальше искать, если не нашли нужный байт
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message+"\n\n"+ex.StackTrace);
}
}

Добавлено:

Если изменит условие "while"


while(blockAddress <= 0x7FFFFFFF)

то ошибку переполнение не выдает но, нужный байт не находит

Ссылка на комментарий
Поделиться на другие сайты

A pointer to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.

If lpAddress specifies an address above the highest memory address accessible to the process, the function fails with ERROR_INVALID_PARAMETER.

LPCVOID == A pointer to a constant of any type.

IntPtr имеет размер 4 или 8 байт, в зависимости от архитектуры и значения поля IntPtr.Size. Или попробуй 8-байтовый размер задать, или просто в описании функции поменяй тип на что-нибудь пошире.

Ссылка на комментарий
Поделиться на другие сайты

A pointer to the base address of the region of pages to be queried. This value is rounded down to the next page boundary. To determine the size of a page on the host computer, use the GetSystemInfo function.

If lpAddress specifies an address above the highest memory address accessible to the process, the function fails with ERROR_INVALID_PARAMETER.

LPCVOID == A pointer to a constant of any type.

IntPtr имеет размер 4 или 8 байт, в зависимости от архитектуры и значения поля IntPtr.Size. Или попробуй 8-байтовый размер задать, или просто в описании функции поменяй тип на что-нибудь пошире.

Ура заработала, Спасибо

Прицепил GetSystemInfo и убрал условие


if (mbi.AllocationProtect == (uint)AllocationProtect.PAGE_READWRITE || mbi.AllocationProtect == (uint)AllocationProtect.PAGE_EXECUTE_READWRITE)

а то нужном участке памяти дает false

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.