Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2011, 21:20   #1
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
Вопрос Дамп памяти чужого процесса

Есть определенный процесс, как мне из своей программы сделать что-то типа его дампа? Необходимо это для того чтобы потом в этом дампе произвести поиск определенного флага и если флаг будет найден убить процесс.
Crystallon вне форума Ответить с цитированием
Старый 28.08.2011, 21:44   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Курить VirtualQueryEx.

Цитата:
VirtualQueryEx Function

Retrieves information about a range of pages within the virtual address space of a specified process.
mss вне форума Ответить с цитированием
Старый 29.08.2011, 01:26   #3
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Что-то не курится =\ понял что VirtualQueryEx юзается вместе с ReadProcessMemory, но никаких примеров найти не выходит, либо плохо ищу =(
Crystallon вне форума Ответить с цитированием
Старый 29.08.2011, 02:22   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

ну я тож захотел немного поковырятся в этой задачке вот что получилось...

{ОБНОВЛЕНО}

Переделал код, но опять же бага. Создаётся дамп в 4 байта. Мне кажется этого мало....

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  hOpen, hProcess, hVirtualQuerty: Cardinal;
  SysInfo: _SYSTEM_INFO;
  MemBInfo: _MEMORY_BASIC_INFORMATION;
  RecvBuff: array of Byte;
  FS: TFileStream;
  none:Cardinal;
begin
  GetSystemInfo(SysInfo);
  try
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessId);
    if hProcess <> 0 then
    begin
      hVirtualQuerty := VirtualQueryEx(hProcess, @SysInfo, MemBInfo, SizeOf(MemBInfo));
      if hVirtualQuerty <> 0 then
      begin
      SetLength(RecvBuff,SysInfo.dwPageSize);
        if ReadProcessMemory(hProcess, @MemBInfo.BaseAddress, @RecvBuff, SizeOf(RecvBuff),none) then
        begin
          fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'SelfDump.dmp', fmCreate or fmOpenReadWrite);
            try
            FS.WriteBuffer(RecvBuff,SizeOf(RecvBuff));
            finally
              FreeAndNil(fs);
            end;
        end
        else
        begin
          ShowMessage('#' + IntToStr(GetLastError)+' Message:'+SysErrorMessage(GetLastError));
          Exit;
        end;
      end
      else
      begin
        ShowMessage('#' + IntToStr(GetLastError)+' Message:'+SysErrorMessage(GetLastError));
        Exit;
      end;
    end
    else
    begin
      ShowMessage('#' + IntToStr(GetLastError)+' Message:'+SysErrorMessage(GetLastError));
      Exit;
    end;

  finally
    CloseHandle(hProcess);
  end;
end;

Последний раз редактировалось Человек_Борща; 29.08.2011 в 02:33.
Человек_Борща вне форума Ответить с цитированием
Старый 29.08.2011, 12:42   #5
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Да действительно выдает 4 байта, вопрос почему... Вроде как я понял ReadProcessMemory читает не все за раз а только определенную часть(как называется незнаю) и нужно запускать ее в цикле... но я в этом не уверен и к тому же незнаю с какими параметрами ее запускать 2,3 и последующие разы =\
Crystallon вне форума Ответить с цитированием
Старый 29.08.2011, 16:56   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

В цикле нужно запускать VirtuelQueryEx.

Начинаешь с нулевого адреса, получаешь MEMORY_BASIC_INFORMATION региона, там есть поля размера региона и атрибута состояния страниц в регионе.
Читать можно только регионы со страницами в состоянии MEM_COMMIT, при прочих состояниях чтение страниц бессмысленно.
Адрес начала региона у тебя есть, размер тоже. Читаешь содержимое страниц региона одним вызовом ReadProcessMemory (или несколькими в цикле - по барабану). Инкрементируешь базовый адрес региона на размер региона и если не вышел за пределы 4гб (для Win32) - повторяешь вышеописанные телодвижения.
mss вне форума Ответить с цитированием
Старый 30.08.2011, 14:18   #7
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Весь гугл перерыл но по прежнему не пойму как мне ваши слова в перевести в код который исправит выше написанный пример... Я так понимаю @MemBInfo.BaseAddress это нулевой адрес(0x00000000)? Если это нулевой тогда чтобы перейти к следующему мне нужно повторить все тоже самое только @MemBInfo.BaseAddress+1? Нифига не понимаю ><
Crystallon вне форума Ответить с цитированием
Старый 30.08.2011, 18:37   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

offtopic

Оу, Человек_Борща, у тебя появилась обработка ошибок! Растёшь

А бага-то тут: @RecvBuff, SizeOf(RecvBuff)

Чему равне @RecvBuff и SizeOf(RecvBuff) c учётом того, что RecvBuff - динамический массив?

Мат-часть.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.08.2011, 19:20   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

mss,
я правильно трактую ваш текст в код?
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  hProcess: Cardinal;
  SysInfo: TSystemInfo;
  MBI: TMemoryBasicInformation;
  FS: TFileStream;
  Buff: PByte;
  n: Cardinal;
begin
  Memo1.lines.Clear;
  GetSystemInfo(SysInfo);
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_READ, False, GetCurrentProcessId);
  try
    if hProcess <> 0 then
    begin
      fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'SelfDump.pmd', fmCreate or fmOpenWrite);
      try
        while VirtualQueryEx(hProcess, @SysInfo, MBI, SizeOf(MBI)) <> 0 do
        begin
          if (MBI.State = MEM_COMMIT) then
          begin
            try
              GetMem(Buff, MBI.RegionSize);
              if ReadProcessMemory(hProcess, @MBI.BaseAddress, @Buff, MBI.RegionSize, n) then
              begin
                FS.Write(Buff, MBI.RegionSize);
              end
              else
              begin
                Memo1.Lines.Add(Format('[%d] ReadProcMem: %s ', [GetLastError, SysErrorMessage(GetLastError)]));
                Exit;
              end;
            finally
              FreeMem(Buff);
            end;
          end;
        end;
      finally
        FreeAndNil(fs);
      end;
    end
    else
    begin
      Memo1.Lines.Add(Format('[%d] hProcess: %s ', [GetLastError, SysErrorMessage(GetLastError)]));
      Exit;
    end;
  finally
    CloseHandle(hProcess);
  end;
end;
Не совсем понял эту часть:
Цитата:
Инкрементируешь базовый адрес региона на размер региона и если не вышел за пределы 4гб (для Win32) - повторяешь вышеописанные телодвижения.



GunSmoker, почему же?
Код:
      SetLength(RecvBuff,SysInfo.dwPageSize);
        if ReadProcessMemory(hProcess, @MemBInfo.BaseAddress, @RecvBuff, SizeOf(RecvBuff),none) then
Ведь я сначало задаю длинну массива(SetLength) а затем SizeOf возвращает размер этого массива в памяти.

Последний раз редактировалось Человек_Борща; 30.08.2011 в 19:29.
Человек_Борща вне форума Ответить с цитированием
Старый 30.08.2011, 19:26   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Ведь я сначало задаю длинну массива(SetLength) а затем SizeOf возвращает размер этого массива в памяти.
Размер массива возвращает Length. SizeOf возвращает размер переменной. Это - разные вещи.

По ссылке почитай.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чистка памяти чужого процесса Virus25 Общие вопросы Delphi 1 30.05.2011 07:42
Считать значение из памяти чужого процесса EvgenyZ Win Api 2 27.11.2009 09:29
Выполнение адреса памяти чужого процесса XAOC-forever Общие вопросы Delphi 2 15.12.2008 09:03
Дамп процесса Takedown Общие вопросы C/C++ 1 01.08.2008 00:19