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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2011, 19:27   #11
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> а затем SizeOf возвращает размер этого массива в памяти.

это делает Length(), а SizeOf возвращает размер переменной (в данном случае указателя = 4 байта).
Точнее, размер массива в памяти = Length(A) * SizeOf(A[0]);
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 30.08.2011 в 19:38.
veniside вне форума Ответить с цитированием
Старый 30.08.2011, 19:36   #12
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Так что-то я совсем затупил..
Мой код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
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, @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;
        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;
Возвращяет ошибку:
[998] ReadProcMem: Неверная попытка доступа к адресу памяти

Ткните носом, что не так?

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

Buff - уже и так указатель.

@Buff - указатель на указатель.

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

ага, переделал:
Код:
              if ReadProcessMemory(hProcess, @MBI.BaseAddress, Pointer(Buff), MBI.RegionSize, RecivedBytes) then
              begin
зафигачило файлик на 1 гб. В чем проблема?
Человек_Борща вне форума Ответить с цитированием
Старый 30.08.2011, 20:07   #15
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

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

Ну как это в чем?
"дамп памяти процесса" для меня значит, сброс данных на диск, которые занял процесс в ОЗУ.

аже с таким кодом:
Код:
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;
создаётся файл размером 1 гб.

процсс врятли занимает 1 гб ОЗУ, и я не думаю что это правда.
т.к. получается что алгоритм делает дамп всей занятой ОЗУ. А нужно делать дамп только той ОЗУ которая занята нужным мне процессом.
Человек_Борща вне форума Ответить с цитированием
Старый 30.08.2011, 20:16   #17
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

А у меня создал файлик в 10гб, и он еще столько же 100500 раз походу создал бы еслиб я процесс не завершил :D
Crystallon вне форума Ответить с цитированием
Старый 30.08.2011, 20:23   #18
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Я в тупике...
Пытаюсь найти в памяти процесса нужный мне флаг('http'), поиск идет(кстати крайне медленно...) некоторое время и потом обрывается с ошибкой, причем каждый раз адрес где обрывается поиск совершенно разный.
Код:
function SearchFlag(prc: string) : integer;
var
  hProcess, hVirtualQuerty,temp: Cardinal;
  hOpen: THandle;
  SysInfo: _SYSTEM_INFO;
  MemBInfo: _MEMORY_BASIC_INFORMATION;
  RecvBuff: array of Byte;
  RecvBuffResult: DWORD;
  RecvBuff2: array of Byte;
  FS: TFileStream;
  none:Cardinal;
  Data1: DWORD;
  bAddres1:DWORD;
  bAddresP1: Pointer;
  wBuff: byte;
begin
  GetSystemInfo(SysInfo);
  try
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, myPID);
    if hProcess <> 0 then
    begin
      hVirtualQuerty := VirtualQueryEx(hProcess, @SysInfo, MemBInfo, SizeOf(MemBInfo));
      if hVirtualQuerty <> 0 then
      begin
      SetLength(RecvBuff,SysInfo.dwPageSize);
      bAddres1:=DWORD(@MemBInfo.BaseAddress^);
      bAddresP1:=@bAddres1;
      StringToBytes(StringToHex(Form1.Edit1.Text));
      str_log:=str_log+'HEX: '+StringToHex(Form1.Edit1.Text)+#13#10;


      while (RecvBuff[1]<>a[1]) or (RecvBuff[2]<>a[2]) or (RecvBuff[3]<>a[3]) or (RecvBuff[4]<>a[4]) do begin
        if ReadProcessMemory(hProcess, bAddresP1, @RecvBuff, SizeOf(RecvBuff),none) then
        begin
          bAddres1:=bAddres1+1;
        end
        else
        begin
          ShowMessage('ERR#' + IntToStr(GetLastError)+' Message:'+SysErrorMessage(GetLastError));
          ShowMessage(IntToStr(bAddres1));
          Exit;
        end;
      end;
          ShowMessage('1');
          ShowMessage(IntToStr(bAddres1));
          fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'SelfDump'+IntToStr(p1)+'.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;

  finally
    CloseHandle(hProcess);
  end;
end;
Вот еще функции которыми перевожу текст в string hex а дальше в byte(на всякий случай, может нужны):
Код:
function StringToHex(Data: string): string;
var 
  i, i2: Integer;
  s: string;
begin
  i2 := 1;
  for i := 1 to Length(Data) do
  begin
    Inc(i2);
    if i2 = 2 then
    begin
      i2 := 1;
    end;
    s := s + IntToHex(Ord(Data[i]), 2);
  end;
  Result := s;
end;
Код:
function StringToBytes(StrTmp:string): integer;
var
  i,j: Integer;
begin
  SetLength(a, Length(StrTmp) div 2);
  j := 1;
  for i := 0 to High(a) do begin
    a[i] := StrToInt( '$' + Copy(StrTmp, j, 2) );
    j := j + 2;
  end;
end;
P.S. Прошу прощения за "творческий хаос" в коде :D

Последний раз редактировалось Crystallon; 30.08.2011 в 20:26.
Crystallon вне форума Ответить с цитированием
Старый 30.08.2011, 20:45   #19
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
я правильно трактую ваш текст в код?
Неправильно.

Цитата:
Не совсем понял эту часть:
Цитата:
Инкрементируешь
Ты первый раз слышишь про термин "инкремент" ?
Прискорбно.
mss вне форума Ответить с цитированием
Старый 30.08.2011, 20:48   #20
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Я в тупике
А вот не надо бездумно драть чей-то бездумный код.
Голова на плечах для чего растет ?)
mss вне форума Ответить с цитированием
Ответ


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