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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2010, 23:06   #1
T_I_T_A_N
Пользователь
 
Регистрация: 01.06.2010
Сообщений: 23
По умолчанию память процесса

как найти в памяти определенного процесса адрес нужного значения
T_I_T_A_N вне форума Ответить с цитированием
Старый 26.06.2010, 07:45   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

ReadProcessMemory, OpenProcess

Читаем в цикле в буфер, там ищем свое значение и получаем таким образом адрес.

Как ?
1. Поиск по форуму и в сети по выше указанным функциям
2. На моей страничке есть сорсы патчера там как раз такой алгоритм реализован
BOBAH13 вне форума Ответить с цитированием
Старый 26.06.2010, 20:13   #3
T_I_T_A_N
Пользователь
 
Регистрация: 01.06.2010
Сообщений: 23
По умолчанию

а в цикле искать начиная с $000000 и до какова адреса? как прочитать всю память процесса от начала до конца?
T_I_T_A_N вне форума Ответить с цитированием
Старый 26.06.2010, 20:44   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

от 0x0 до 0xffffffff проверяйте тип памяти по адресу (опять таки см. исходники патчера)
BOBAH13 вне форума Ответить с цитированием
Старый 27.06.2010, 20:16   #5
T_I_T_A_N
Пользователь
 
Регистрация: 01.06.2010
Сообщений: 23
По умолчанию

Код:
hProc:=OpenProcess (PROCESS_VM_READ, FALSE, PID); // подключаемся к процессу зная его ID
i:=sizeof(IpBuf^);
numberRead:=nil;
for ipBase:= $0 to $00000ff do
begin
ReadProcessMemory(hProc, ptr(ipBase), IpBuf,i, numberRead^);
memo1.Lines.Add(IntToHex(ipBase,8)+' '+floattostr(IpBuf^));
end;
почему у меня всегда IpBuf равен одному значению и не изменяется в цикле.
T_I_T_A_N вне форума Ответить с цитированием
Старый 27.06.2010, 20:19   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Устал повторять
Цитата:
опять таки см. исходники патчера
Edit:
Странно, вы не читали ?
Цитата:
2. На моей страничке есть сорсы патчера там как раз такой алгоритм реализован

Последний раз редактировалось BOBAH13; 27.06.2010 в 20:56.
BOBAH13 вне форума Ответить с цитированием
Старый 27.06.2010, 20:23   #7
T_I_T_A_N
Пользователь
 
Регистрация: 01.06.2010
Сообщений: 23
По умолчанию

а где это поглядеть
T_I_T_A_N вне форума Ответить с цитированием
Старый 28.06.2010, 13:52   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Процедура дампа памяти процесса:
Код:
procedure DumpMemory(SavePath: string; ProcessID: Dword);
var
  hProcess: THandle;
  Mbi:      TMemoryBasicInformation;
  Buf:      PByte;
  adr, r:   dword;
  fs:       TFileStream;
begin
   adr := 0;
   r := 0;
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or
                          PROCESS_VM_OPERATION, false, ProcessID);
  if hProcess <> 0 then
  begin
    try
      fs := TFileStream.Create(SavePath, fmCreate);
    except
      fs := nil;
    end;
    while VirtualQueryEx(hProcess, pointer(Adr), Mbi, SizeOf(Mbi))<>0 do
    begin
      if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then
      begin
         GetMem(Buf, Mbi.RegionSize);
        try
         if ReadProcessMemory(hProcess, Mbi.BaseAddress, Buf, Mbi.RegionSize, r) then
          if fs<>nil then
           fs.Write(Buf^, r);
        finally
         FreeMem(Buf);
        end;
      end;
       adr := adr + Mbi.RegionSize;
    end;
     fs.Free; CloseHandle(hProcess);
  end;
end;
overload функции для получения PID процесса
Код:
function GetProcesID(cap, clas: PChar): DWORD;
var
   H :HWND;
   PID :DWORD;
begin // ID процесса по заголовку или классу
 PID := 0;
  try
 H := FindWindow(clas, cap);
 if H<>0 then
 begin
   GetWindowThreadProcessId(H, @PID);
 end;
  finally
 Result := PID;
  end;
end;

function GetProcesID(H: HWND): DWORD;
var
  PID :DWORD;
begin
 PID := 0;
  try
 if H<>0 then
 begin
   GetWindowThreadProcessId(H, @PID);
 end;
  finally
 Result := PID;
  end;
end;
Alter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оперативная память Warhead BOX Компьютерное железо 6 31.08.2009 10:45
Память Ghennadiy Общие вопросы Delphi 9 25.08.2009 09:23
динамическая память aka_faith Общие вопросы C/C++ 47 12.06.2009 12:35
Память процесса BlackOmen Общие вопросы Delphi 3 24.10.2008 20:16
Физическая, виртуальная память процесса!!!! metamfetamin Помощь студентам 2 07.11.2007 09:27