2012-05-12 4 views
3

Я пытаюсь сканировать всю память процесса, но не успеваю ... Что я делаю: для тестов я использую блокнот, поэтому я пишу там % B и этот значения в HEX: 25 (%) и 42 (B). Таким образом, код:Сканирование всей памяти процесса с помощью ReadProcessMemory

while (VirtualQueryEx(PIDHandle, Pointer(MemStart), MemInfo, SizeOf(MemInfo)) <> 0) do 
    begin 
     if ((MemInfo.State = MEM_COMMIT) and (not (MemInfo.Protect = PAGE_GUARD) 
     or (MemInfo.Protect = PAGE_NOACCESS)) and (MemInfo.Protect = PAGE_READWRITE)) then 
      begin 
      SetLength(Buff, MemInfo.RegionSize); 
       if (ReadProcessMemory(PIDHandle, MemInfo.BaseAddress, Buff, 
             MemInfo.RegionSize, ReceivedBytes)) then 
       begin 
       for I := 0 to SizeOf(Buff) do 
       begin 
    if (IntToHex(Buff[i], 1) = '25') and (IntToHex(Buff[i+2], 1) = '42') then 
        Form1.Memo1.Lines.Append(IntToHex(Buff[i], 1)); 
       end; 

       end; 
      end; 
     MemStart:= MemStart + MemInfo.RegionSize; 
    end; 
    CloseHandle(PIDHandle); 
    end; 

Значение переменной «Буфф» является TBytes (я читал о терабайт и думаю, что это так же, как массив байт). Поэтому я конвертирую байты в Hex и ищу значения: 25 и 42 соответственно. Код выглядит так:

if (IntToHex(Buff[i], 1) = '25') and (IntToHex(Buff[i+2], 1) = '42') then 

Потому что они имеют 00 между шестнадцатеричными значениями. Поэтому мне нужно добавить «+2». Как я могу сканировать всю память для этих значений?

ответ

8

Блокнот использует Юникод, поэтому вам нужно будет искать кодированные данные UTF-16, $0025 и $0042.

Я не понимаю, почему вы чувствуете необходимость конвертировать в шестнадцатеричные строки перед сравнением. Нет ничего особенного в hex, который требует использования строк. Шестнадцатеричный - это всего лишь система чисел с базой-16. Таким образом, десятичное число 32 совпадает с шестнадцатеричным 20, то есть 32=$20. Сделайте ваше сравнение непосредственно с целыми значениями:

if (Buff[i]=$25) and (Buff[i+2]=$42) then 

Тем не менее, принимая во внимание $00 байт ваш тест должен быть действительно что-то вроде этого:

var 
    Target: string; 
.... 
Target := '%B'; 
if CompareMem(@Buff[i], @Target[1], Length(Target)*SizeOf(Char)) then 
    .... 

Я не хочу слишком глубоко в остальная часть вашего кода, но эта строка

for I := 0 to SizeOf(Buff) do 

не так на разных уровнях.

  1. SizeOf(Buff) возвращает размер указателя, поскольку динамическая переменная массива по существу является указателем. Полезно помнить, что SizeOf оценивается во время компиляции.
  2. Если вы использовали Length вместо SizeOf, тогда вы будете итерировать в конце списка. Для циклического перехода по динамическому массиву, цикл от 0 до Length(...)-1.
  3. Но в этом случае вы обращаетесь к индексу i+2 внутри цикла, поэтому вы должны делать цикл от 0 до Length(...)-3.

Но на самом деле вам нужно сравнить с 4 последовательными байтами, чтобы найти совпадение. Возможно, вот так:

TargetByteLength = Length(Target)*SizeOf(Char); 
for i := 0 to Length(Buff)-TargetByteLength do 
    if CompareMem(@Buff[i], @Target[1], TargetByteLength) then 
    .... 
+0

Благодарим за внимание и внимание. Но для меня все еще проблема, почему программа не может найти значения внутри памяти блокнота. Если я использую ReadProcessMemory как: ReadProcessMemory (PIDHandle, Pointer ($ 00367ED0), Buff, MemInfo.RegionSize, ReceivedBytes), с нужным указателем адреса, он находит. Но, сканируя всю память, ничего не находите. Извините за неудобство ... – HwTrap

+0

Помогло ли мое последнее обновление? –

+0

Да ... Спасибо !!! – HwTrap

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