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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2011, 20:51   #21
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Ну да я содрал код, но переписываю под свою задачу...
Еслиб знал как написать правильный код с нуля не сдирал бы)
Crystallon вне форума Ответить с цитированием
Старый 30.08.2011, 21:01   #22
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Ты первый раз слышишь про термин "инкремент" ?
Прискорбно.
сложно вспоминать значение какого-либо термина если его не так часто слышишь или видишь где-либо.


Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  GB4 = 1073741824; //азмер в байтах
var
  hProcess: Cardinal;
  MBI: TMemoryBasicInformation;
  FS: TFileStream;
  Buff: PByte; //Приёмник
  BaseAddr,
  RecivedBytes: Cardinal;
begin
  Memo1.lines.Clear;
  //Открываю процесс
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_READ, False, GetCurrentProcessId);
  try
    //Читаю с 0 адреса
   BaseAddr:=0;
   RecivedBytes:=0;
   //Если процесс открыт
    if hProcess <> 0 then
    begin
      //Создаём класс записи нашего дампа
      fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'SelfDump.pmd', fmCreate or fmOpenWrite);
      try
        //Читаем страницы памяти
        while VirtualQueryEx(hProcess, @(BaseAddr), MBI, SizeOf(MBI)) <> 0 do
        begin
          //Если страница достукпна и не защищена
          if (MBI.State = MEM_COMMIT) then
          begin
            try
              //выделяем память для буфера равный размеру региона
              GetMem(Buff, MBI.RegionSize);
              //Читаем
              if ReadProcessMemory(hProcess, @MBI.BaseAddress, Pointer(Buff), MBI.RegionSize, RecivedBytes) then
              begin
                //Записываем буфера размером прочитанных байт
                FS.Write(Buff, RecivedBytes);
              end
              else
              begin
                Memo1.Lines.Add(Format('[%d] ReadProcMem: %s ', [GetLastError, SysErrorMessage(GetLastError)]));
                Exit;
              end;
            finally
              FreeMem(Buff);
            end;
          end;
          //Увеличиваем базовый адрес на размер региона
          BaseAddr:=BaseAddr+MBI.RegionSize; ;Разве это не есть инкрементирование? 
          If BaseAddr = GB4 then
          begin
            Exit;
          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;
Я думаю, что правильно перевёл ваш текст в код.
Цитата:
Сообщение от mss Посмотреть сообщение
В цикле нужно запускать VirtuelQueryEx.

Начинаешь с нулевого адреса, получаешь MEMORY_BASIC_INFORMATION региона, там есть поля размера региона и атрибута состояния страниц в регионе.
Читать можно только регионы со страницами в состоянии MEM_COMMIT, при прочих состояниях чтение страниц бессмысленно.
Адрес начала региона у тебя есть, размер тоже. Читаешь содержимое страниц региона одним вызовом ReadProcessMemory (или несколькими в цикле - по барабану). Инкрементируешь базовый адрес региона на размер региона и если не вышел за пределы 4гб (для Win32) - повторяешь вышеописанные телодвижения.
Однако файл создаётся > 500 mb и неумолимо растёт. В чем причина такого роста?

P.S.
Цитата:
Сообщение от Crystallon Посмотреть сообщение
Ну да я содрал код, но переписываю под свою задачу...
Еслиб знал как написать правильный код с нуля не сдирал бы)
Хоть бы спасибо сказал или плюс поставил :-[ xD

Последний раз редактировалось Человек_Борща; 30.08.2011 в 21:06.
Человек_Борща вне форума Ответить с цитированием
Старый 30.08.2011, 21:15   #23
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Хоть бы спасибо сказал или плюс поставил :-[ xD
Сделано(тут прост спасибо кнопки нету а про репу я и забыл ваще) :D
Crystallon вне форума Ответить с цитированием
Старый 30.08.2011, 21:22   #24
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Еслиб знал
Знания не придут сами собой.
Код, даже если он неправильный, дается для анализа, а не для хныканья "хотел вставить, а он не лезет")
Открываешь справку и msdn и внимательно, строчка за строчкой, буква за буквой изучаешь то что ты передрал.
Вот только тогда можно ожидать положительную динамику в знаниях.

Цитата:
сложно вспоминать значение какого-либо термина
А не надо ничего помнить.
Глупо держать в памяти то что всегда перед носом)
Для этого существует справка.
Жмешь F1, вводишь модель поиска "inc" - и освежаешь в памяти то чего возможно там никогда и не было)
mss вне форума Ответить с цитированием
Старый 30.08.2011, 21:24   #25
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
думаю, что правильно перевёл ваш текст в код
Неправильно.
mss вне форума Ответить с цитированием
Старый 30.08.2011, 21:32   #26
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Неправильно.
И что я сделал не правильно?
Человек_Борща вне форума Ответить с цитированием
Старый 30.08.2011, 21:38   #27
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
что я сделал не правильно?
Код:
while VirtualQueryEx(hProcess, @(BaseAddr), MBI, SizeOf(MBI)) <> 0 do
Баран откуда взялся ?)

Последний раз редактировалось mss; 30.08.2011 в 21:40.
mss вне форума Ответить с цитированием
Старый 30.08.2011, 21:43   #28
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

offtopic

У Человека_борща интоксикация указателями :D
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.08.2011, 21:59   #29
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
интоксикация указателями
Лечится простой инъекцией - осознанием того что "баран" имеет отношение к текущему, т.е. к своему (а не чужому) адресному пространству.
mss вне форума Ответить с цитированием
Старый 30.08.2011, 22:04   #30
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Смех

GunSmoker, даёшь детоксикацию! :D

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  GB4 = 1073741824; //азмер в байтах
var
  hProcess: Cardinal;
  MBI: TMemoryBasicInformation;
  FS: TFileStream;
  Buff: PByte; //Приёмник
  BaseAddr,
  RecivedBytes: Cardinal;
begin
  Memo1.lines.Clear;
  //Открываю процесс
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_READ, False, GetCurrentProcessId);
  try
    //Читаю с 0 адреса
   BaseAddr:=0;
   RecivedBytes:=0;
   //Если процесс открыт
    if hProcess <> 0 then
    begin
      //Создаём класс записи нашего дампа
      fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'SelfDump.pmd', fmCreate or fmOpenWrite);
      try
        //Читаем страницы памяти
        while VirtualQueryEx(hProcess, Pointer(BaseAddr), 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, RecivedBytes) then
              begin
                //Записываем буфера размером прочитанных байт
                FS.Write(Buff^, RecivedBytes);
              end
              else
              begin
                Memo1.Lines.Add(Format('[%d] ReadProcMem: %s ', [GetLastError, SysErrorMessage(GetLastError)]));
                Exit;
              end;
            finally
              FreeMem(Buff);
            end;
          end;
          //Увеличиваем базовый адрес на размер региона
          BaseAddr:=BaseAddr+MBI.RegionSize;
          If BaseAddr = GB4 then
          begin
            Exit;
          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;
Еррор:
[299] ReadProcMem: Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично

Где я налажал?


P.S. по хоже мне надо понять различие между @, Pointer и ^
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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