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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2014, 13:10   #1
xRamzeSx
Форумчанин
 
Регистрация: 24.01.2010
Сообщений: 151
По умолчанию Чтение памяти процесса (поиск адресов)

Доброго времени суток, уважаемые программеры.

Есть функция поиска адресов в процессе:
Код:
procedure TForm1.N1Click(Sender: TObject);
var
  mbi: MEMORY_BASIC_INFORMATION;
  Max, write: Cardinal;
  Address: cardinal;
  wer, rew: integer;
  a: integer;
  ii, i: integer;
  tp, ad, rm, pm: string;
begin
ListBox1.Clear;
ListBox1.Items.Add('Процесс: '+ComboBox1.Text);
stp:= 0;
for i:= kol-1 downto 1 do ValueListEditor1.DeleteRow(i);
kol:= 1;
  Address:= $00010000;
  Max:= $BFFFFFFF;
  hwnd:= FindWindow(nil,PChar(ComboBox1.Text));
  TId:= GetWindowThreadProcessId(hwnd,@pid);
  hpr:= OpenProcess(PROCESS_ALL_ACCESS, False, PID);
  if  HPR= 0 then messagedlg('Error...',mtWarning,[mbOk],0);
  while (VirtualQueryex(hpr, ptr(Address), mbi, SizeOf(MEMORY_BASIC_INFORMATION)) > 0) and
    ( mbi.RegionSize+integer(MBI.BaseAddress) < max) do
  begin
  ad:= sh(integer(mbi.BaseAddress));
  rm:= sh(mbi.RegionSize);
  rm:= copy(rm, 2, 7);
  case mbi.Type_9 of
    MEM_PRIVATE: tp:= 'PRIVATE';
    MEM_MAPPED: tp:= 'MAPPED';
    MEM_IMAGE: tp:= 'IMAGE';
    end;
 case mbi.State of
    MEM_COMMIT: pm:= 'COMMIT';
    MEM_FREE: pm:= 'FREE';
    MEM_RESERVE: pm:= 'RESERVE';
    end;
  if (mbi.Protect = PAGE_READWRITE) and (mbi.State=MEM_COMMIT) then
    begin
    if stp = 1 then break;
    Address:= integer(mbi.BaseAddress) + (mbi.RegionSize);
    StatusBar1.Panels[3].Text:= sh(cardinal(mbi.BaseAddress))+'  X  '+sh(address);
    wer:= StrToInt(sh(integer(mbi.BaseAddress)));
    rew:= StrToInt(sh(address));
    for i:= wer to rew do begin
        if stp = 1 then break;
        ReadProcessMemory(HPR, ptr(strtoint(sh(i))), @a, 4, write);
        Application.ProcessMessages;
        if a = StrToInt(Edit1.Text) then begin
          if kol = 1 then ValueListEditor1.Cells[1,1]:= inttostr(a)
          else ValueListEditor1.Strings.Add(inttostr(a));
          ValueListEditor1.Cells[0,kol]:= sh(i);
          kol:= kol+1;
          StatusBar1.Panels[1].Text:= inttostr(kol-1);
        end;
        II:= I-wer;
        Gauge1.Progress:= round(ii*(100/(rew-wer+1)));
      end;
      end;
      Address:= integer(mbi.BaseAddress);
    Inc(Address, mbi.RegionSize);
    end;
end;
Данный код работает и находит адреса по указанному мной значению.

Проблема в том, что если сравнить результаты поиска этой функции с, например, Cheat Engine или ArtMoney, в этой, нет статических адресов.

В чем может быть проблема?
xRamzeSx вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение виртуальной памяти процесса Tambel Win Api 9 25.11.2013 12:58
Поиск в памяти процесса Mr_ViK Общие вопросы Delphi 5 27.08.2012 21:38
Чтение памяти процесса Maincore Win Api 12 14.08.2012 22:34
Чтение значения из памяти запущенного процесса padsyukin Помощь студентам 2 09.03.2012 15:39
Чтение данных из памяти процесса (need help) lexastik Win Api 10 26.02.2009 20:50