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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2011, 22:20   #31
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Где я налажал?
Код:
GB4 = 1073741824; //азмер в байтах
С какой луны к тебе свалилась эта цифирь "1073741824" ?)

Цитата:
по хоже мне надо понять различие между @, Pointer и ^
Эт точно - "по хоже")
mss вне форума Ответить с цитированием
Старый 30.08.2011, 22:27   #32
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Код:
GB4 = 1073741824; //азмер в байтах
С какой луны к тебе свалилась эта цифирь "1073741824" ?)
Ну как с какой?
Цитата:
Сообщение от mss Посмотреть сообщение
....... Инкрементируешь базовый адрес региона на размер региона и если не вышел за пределы 4гб (для Win32) - повторяешь вышеописанные телодвижения.
или 1 гб уже не равен 1073741824 байтам? ; там мой фэил=) нужно ведь 4294967296 байт.
Человек_Борща вне форума Ответить с цитированием
Старый 30.08.2011, 22:40   #33
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Удивись - никакие хитромудрые расчеты "сколько байт в 4-х гигабайтах" вовсе и не нужны)

Более того, код, где не фигурирует "скока байт в стольки-то гигабайтах", без допила будет работать и в Win64

Код:
BaseAddr := 0;
repeat
  try
    Win[32|64]Check(VirtualQueryEx(...., Pointer(BaseAddr), ...); 
    ...

    Inc(BaseAddr, MBO.RegionSize);
  except
    Break;
  end;  
until BaseAddr = 0;

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

Цитата:
Еррор:
[299] ReadProcMem: Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично

Где я налажал?
Навскидку две вещи:
1. Нет проверки на доступ к памяти. Read access может не быть.
2. Память в программе может активно выделяться/освобождаться, что значит, что между проверкой и чтением память у тебя могут выдернуть.

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

Цитата:
2. Память в программе может активно выделяться/освобождаться, что значит, что между проверкой и чтением память у тебя могут выдернуть.
Код:
  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;
в смысле так? :D
Человек_Борща вне форума Ответить с цитированием
Старый 31.08.2011, 01:36   #36
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Как же замечательно когда велосипед кто-то изобрел до тебя а тебе остается только сесть на него и поехать xD
http://www.programmersforum.ru/showp...61&postcount=8
Ф-я(ну или процедуру, без разницы) работает идеально и оч быстро) всем советую ^_^

Последний раз редактировалось Crystallon; 31.08.2011 в 01:41.
Crystallon вне форума Ответить с цитированием
Старый 31.08.2011, 01:42   #37
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Прекрасный пример этого.

Функция по ссылке неверно проверяет доступ к памяти. Отсутствие атрибута GUARD - это не гарантия наличия доступа.

Не говоря уже про ЧУДОВИЩНО кривую обработку ошибок.

Цитата:
в смысле так? :D
Нет. В смысле, если ReadProcessMemory провалился, то проверяем GetLastError на ту ошибку ("запрос выполнен частично") - какой, кстати, у неё код?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 31.08.2011 в 01:45.
GunSmoker вне форума Ответить с цитированием
Старый 31.08.2011, 01:53   #38
Crystallon
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 273
По умолчанию

Цитата:
Прекрасный пример этого.
В моем случае это не так важно :D ну и в любом случае незнаю как вам а мне гораздо легче улучшить чужой велосипед который на ходу, чем с нуля делать свой.
Crystallon вне форума Ответить с цитированием
Старый 31.08.2011, 01:57   #39
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Crystallon,
Цитата:
Как же замечательно когда велосипед кто-то изобрел до тебя а тебе остается только сесть на него и поехать xD
http://www.programmersforum.ru/showp...61&postcount=8
Ф-я(ну или процедуру, без разницы) работает идеально и оч быстро) всем советую ^_^
самое оригинально, что я этот метод нашёл, ещё до того как начал писать свой собственный.

GunSmoker,
Цитата:
[299] ReadProcMem: Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично
Человек_Борща вне форума Ответить с цитированием
Старый 31.08.2011, 02:05   #40
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Сообщение от Crystallon Посмотреть сообщение
В моем случае это не так важно :D ну и в любом случае незнаю как вам а мне гораздо легче улучшить чужой велосипед который на ходу, чем с нуля делать свой.
Сразу видно что серьёзных программ вы ещё не неписали.

Улучшать чей-то велосипед намного сложнее, особенно тогда, когда не знаешь как он работает

А создавать свой собственный куда проще
Человек_Борща вне форума Ответить с цитированием
Ответ


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