2017-01-27 23 views
1

Я работаю над движком чит-видеоигры с использованием простой манипуляции с памятью для достижения своей цели. Я успешно смог написать фрагмент кода, который сбрасывает память процесса в байт [] и выполняет итерацию по этим массивам в поисках нужной строки. Кусок кода, который ищет таким образом:Как найти строки внутри массива с байтом памяти, преобразованного в кодированную строку UTF8?

public bool FindString(byte[] bytes, string pName, long offset) 
    { 
     string s = System.Text.Encoding.UTF8.GetString(bytes); 
     var match = Regex.Match(s, "test"); 
     if (match.Success) 
      return true; 
     return false; 
    } 

я затем открыть 32-разрядную версию блокнота с (так как это то, что мой демпинг метод обуславливается для) и введите слово «тест» в нем и запустить моя программа в режиме отладки, чтобы увидеть, когда состояние когда-либо попало. Это не.

При дальнейшем инспектировать я проверить содержимое струны Буквы «S» на одной из итераций, это таким образом:

\0\0\0\0\0\0\0\0���\f\0\u0001����\u0001\0\0\0 \u0001�\0\0\0\0\0   \u0001�\0\0\0\0\0\0\0�\0\0\0\0\0\0\0�\0\0\0\0\0\u0010\0\0\0\0\0\0\0 \a�\0\0\0\0\0\0\0�\0\0\0\0\0\u000f\0\0\0\u0001\0\0\0\0\0\0\0\0\0\0\0�\u000f�\0\0\0\0\0�\u000f�\0\0\0\0\0\0�\0\0\0\0\0\0\0\0\0\0\0\0\u0010\0\0\0\0\0\0\0\0\0����\f\0\0\0\0\0\0\0�\0\0����\0\0\0\0\0\0\u0010\0\0\0\0\0\0 \0\0\0\0\0\0\0\u0001\0\0\0\0\0\0\0\u0010\0\0\0\0\0\0�\0\0\0\0\0\0\0�����\u007f\0\0\u0002\0�\u0002\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0�\u000f�\0\0\0\0\0�\u000f�\0\0\0\0\0\u001f\0\0\0\0\0\0\0��������\u0010\u0001�\0\0\0\0\0\u0010\u0001�\0\0\0\0\0\u0018\0�\0\0\0\0\0\u0018\0�\0\0\0\0\0\0\0\0\0\0\0\0\0�\u0002�\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\00\a�\0\0\0\0\00\a�\0\0\0\0\0�\u0002�\0\0\0\0\0�M�^\u000e\u000e_\u007f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\u0001\0\0\0\0\0\0\u0010\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\u0001\0\0\0\u0001\0\0\0\0\0\0\0\0\0\0\0\b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\u0001\0\0\0\b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0`\a\0\0\0\0\0\0`\a\0\0\0\0\0\0\u0004\0\0\0\0\0\0\0\0�\u001f\0\0\0\0\0�\u001d\u0014)�\u007f\0\0����\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0�\a\0\u0002\0\0\0\0\0\0\0\0\0\0\0\0�\0\0\0\0\0\0\0\u0001\0\0\0\u0001\0\0\0\0\0\0\0\0\0\0\0P\u0001�\0\0\0\0\0\0\u0003�\0\0\0\0\0\u0010\u0003�\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0� 

Я продолжал проверять каждый Сквозной этот метод для переменной «S» и обнаружил, что я не вижу строк в этом формате.

Мой вопрос прост. Что я делаю неправильно, что не могу найти эту строку? Демпинг преуспевает, но что-то связанное с моим методом разбора вызывает у меня проблемы.

UPDATE (код для сброса памяти)

void ScanProcess(Process process) 
    { 
     // getting minimum & maximum address 
     var sys_info = new SYSTEM_INFO(); 
     GetSystemInfo(out sys_info); 
     var proc_min_address = sys_info.minimumApplicationAddress; 
     var proc_max_address = sys_info.maximumApplicationAddress; 
     var proc_min_address_l = (long)proc_min_address; 
     var proc_max_address_l = (long)proc_max_address; 

     //Opening the process with desired access level 
     var processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_WM_READ, false, process.Id); 
     var mem_basic_info = new MEMORY_BASIC_INFORMATION(); 
     var bytesRead = 0; // number of bytes read with ReadProcessMemory 

     while (proc_min_address_l < proc_max_address_l) 
     { 
      VirtualQueryEx(processHandle, proc_min_address, out mem_basic_info, 28); //28 = sizeof(MEMORY_BASIC_INFORMATION) 

      //If this memory chunk is accessible 
      if (mem_basic_info.Protect == PAGE_READWRITE && mem_basic_info.State == MEM_COMMIT) 
      { 
       //Read everything into a buffer 
       byte[] buffer = new byte[mem_basic_info.RegionSize]; 
       ReadProcessMemory((int)processHandle, mem_basic_info.BaseAddress, buffer, mem_basic_info.RegionSize, ref bytesRead); 

       var MemScanner = new MemScan(); 
       Memscanner.FindString(buffer, process.ProcessName, proc_max_address_l); 
      } 

      // move to the next memory chunk 
      proc_min_address_l += mem_basic_info.RegionSize; 
      proc_min_address = new IntPtr(proc_min_address_l); 

      if (mem_basic_info.RegionSize == 0) 
      { 
       break; 
       mem_basic_info.RegionSize = 4096; 
      } 
     } 
    } 
+1

Ну, может быть, проблема не в _searching_, а с _dumping и последующей загрузкой упомянутого dump_? – MickyD

+1

Обновлен с помощью кода дампа. Это довольно стандартный метод, плавающий вокруг. –

+1

Спасибо за обновление – MickyD

ответ

-1

Для начала вы не можете использовать NotePad (или любого недвоичного способный инструмент просмотра, чтобы посмотреть на ваши байтах).

Вы должны использовать API-интерфейсы BitConverter:

https://msdn.microsoft.com/en-us/library/system.bitconverter(v=vs.110).aspx

... ходить данные и создавать/поиск данных, чтобы найти то, что вы ищете (сохраняя то, что кодирование вы сбрасывали данные в виду).

BTW - Вот полезный двоичный редактор:

+1

_ «Для начала вы не можете использовать NotePad (или любой невариантный инструмент просмотра для просмотра ваших байтов).» _ - OP не пытается просматривать бинарный контент в NotePad_, а использует его как тестовый тест для запуска, когда в памяти появляется слово _ «test» _, например, при вводе слова 'test' в _NotePad_ – MickyD

0

Я не знаю, что MemScan.FindString() делает, но я думаю, проблема в том, что вы ищете строку на строку, а не для массива байт в байт массив.

При преобразовании содержимого памяти с использованием System.Text.Encoding.UTF8.GetString(bytes); вы предполагаете, что все, что хранится в памяти, можно интерпретировать как допустимую кодировку UTF8.

Ваши FindString() должны принимать параметры, как byte[], а не string, и вы должны выяснить, как имя процесса хранится в памяти (скорее всего, UTF-16).

+0

FindString определяется в этом столбце вверху и он принимает байтовые массивы. –

+0

О, я пропустил это. Тем не менее остается вопрос, как имя процесса закодировано в памяти, и вам нужно искать на байтовом уровне, а не на строках. См. Http://stackoverflow.com/questions/4859023 – devio