Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение участка памяти 
:(
    Опции темы
killernet
Дата 27.8.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.8.2008

Репутация: нет
Всего: нет



Здравствуйте. Возник вопрос: как прочитать участок памяти какой-либо программы ,если я знаю ProcecessID этой программы, Hex адрес и размер искомого участка памяти? Пытался разбраться на примерах из DRKB, но ниче у меня не получилось..
PM MAIL   Вверх
Virtuals
Дата 28.8.2008, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



killernet, а в чем проблема? в статье из дркб "Поиск в памяти процесса" все интуитивно понятно.
ну и где проблема? 
ProcessID есть? - есть.
перебор всех регионов есть? - есть.
размеры всех регионов есть? - есть.
так чего еще нужно?

Код

//
// Открываем процесс
//
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or
PROCESS_VM_OPERATION, false, ProcessID);
 
if ProcessHandle <> 0 then
try
Addr := 0;
 
//
// Перечисляем все регионы виртуальной памяти процесса
//
while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do
begin
  // Uncomment чтобы увидеть список регионов, найденых в адресном пространстве
  // WriteLn('region: ' + IntToHex(Integer(Mbi.BaseAddress), 8) +
  //   ' size: ' + IntToStr(Mbi.RegionSize));
  //
  // Если региону выделена память, и регион не является "сторожевым" (как вершина стека),
  // то читаем этот регион
  //
  if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
  begin
   //
   // Это демонстрационная программа, поэтому здесь выделяется буфер под весь регион.
   // Регион может быть достаточно большим, поэтому лучше читать его блоками для экономии
   // памяти. Но здесь для простоты алгоритма вся оптимизация похерена.
   //
   GetMem(Buf, Mbi.RegionSize);
   try
    //
    // Читаем весь регион в выделенный буфер
    //
    if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf,
      Mbi.RegionSize, BytesRead) then
    begin
     //
     // Ищем значение типа DWORD в буфере
     //
     for I := 0 to BytesRead - SizeOf(Value) do
     begin
      if PDWord(@Buf[I])^ = Value then
       // Найдено, выводим
       WriteLn('Value ' + IntToStr(Value) + ' found at ' +
        IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8));
     end;
    end
    else
     WriteLn('Failed to read process memory ' + IntToStr(GetLastError));
 
   finally
    FreeMem(Buf);
   end;
  end;
 
  // Вычисляем адрес следуюшего региона
  Addr := Addr + Mbi.RegionSize;
end;



PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0633 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.