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

Влияние расположения инициации переменной на работу программы


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

Здравствуйте. При написании сканера памяти столкнулся с проблемой, которую не могу решить. Суть проблемы в том, что при объявлении переменной {1} (массив байтов) до цикла do while все работает, то есть в listBox1 добавляется около 2000 элементов. Но когда я комменчу {1} и раскомменчиваю {2}, то программа начинает работать не корректно, то есть в listBox1 добавляется около 50 элементов. А если {2} заменить на {3}, то значений в listBox1 будет всего 3. Но, если закомментить функцию ReadProcessMemory, то программа работает корректно. То есть скорее всего проблема именно с функцией ReadProcessMemory, вот только как она влияет на количество итераций в цикле мне совершенно не понятно, так как за это отвечает переменная address, которая функцией ReadProcessMemory, явно, никак не меняется. Помогите разобраться пожалуйста.

Информация о среде разработки:

Microsoft Visual Studio Express 2012 для Windows Desktop

Версия 11.0.51106.01 Update 1

Microsoft .NET Framework

Версия 4.5.50709

Ниже приведен код программы из которого я убрал все лишнее, для отображения сути проблемы. Полная программа выполняет сканирование страниц памяти программы в поисках строки, из которой потом, при помощи регулярных выражений, вынимается нужные мне данные. Работоспособность программы сверял с Cheat Engine`ом - все значения находит правильно, при условии, что я инициализирую массив pageBuffer перед циклом do while {1}.


public void miniF()
{
IntPtr nobr;
long MaxAddress = 0x7fffffff;
long address = 0x0;

//{1}
//инициализирую массив байтов размером в 100мб, чтоб наверняка хватило для страницы памяти
//переменная используется только как аргумент функции ReadProcessMemory
byte[] pageBuffer = new byte[100000000];

do
{
MEMORY_BASIC_INFORMATION MBI;
int VQEReturn = VirtualQueryEx(pHandle, (IntPtr)address, out MBI, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));
listBox1.Items.Add(MBI.BaseAddress.ToString() + "-" + ((uint)MBI.BaseAddress + (uint)MBI.RegionSize - 1) + " : " + MBI.RegionSize);

//{2}
//инициализирую массив байтов размером в страницу памяти,
//в который записывается страница памяти функцией ReadProcessMemory,
//в Debug режиме видно, что переменная создается с нужным размером
//byte[] pageBuffer = new byte[MBI.RegionSize.ToInt32()];

//{3}
//byte[] pageBuffer = new byte[100000000];

//считываю в pageBuffer данные размером в страницу памяти начиная с базового адреса страницы
ReadProcessMemory(pHandle, MBI.BaseAddress, pageBuffer, (int)MBI.RegionSize, out nobr);

if(address == (long)MBI.BaseAddress + (long)MBI.RegionSize)
break;
address = (long)MBI.BaseAddress + (long)MBI.RegionSize;

} while (address <= MaxAddress);
}

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

В таком случае, возможно, это связано с текущей реализацией фреймворка. Впрочем, не могу утверждать наверняка, на решетках кодил очень мало.

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

В таком случае, возможно, это связано с текущей реализацией фреймворка. Впрочем, не могу утверждать наверняка, на решетках кодил очень мало.

Я тоже так думаю. Только не текущей а всей версией фреймворка.

С этой проблемой сталкивался где то два месяца назад и перепробовал все возможные варианты, даже менял версию фреймворка. решение так и не нашел.

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

  • 2 недели спустя...
  • 2 недели спустя...

Сканер сигнатур и поиск значении на C#. Внешний вид похож на CE, так что думаю будет понятен.

Ккому интересно вот http://yadi.sk/d/3oj8xpgN4F2Ar

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

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

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

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