powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск строки в памяти процесса
8 сообщений из 8, страница 1 из 1
Поиск строки в памяти процесса
    #39987752
ZdenniZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стоит задача написать (или найти) работающую функцию поиска строки в памяти запущенного процесса, возвращающую пойнтер на адрес первого символа такой строки. Писать в память при условии известного адреса я умею, а вот как найти его, если он неизвестен - никак не могу допетрить... Если прямо кинете работающую функцию - буду несказанно благодарен )). Ну а если нет, тогда подскажите пожалуйста в какую сторону копать )).
...
Рейтинг: 0 / 0
Поиск строки в памяти процесса
    #39987760
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZdenniZ,

Анализируешь адресное пространство процесса
Находишь в нём строку
...
Рейтинг: 0 / 0
Поиск строки в памяти процесса
    #39987772
https://github.com/cheat-engine/cheat-engine

Хороший пример, что бы понять вообще как работать с памятью процесса
...
Рейтинг: 0 / 0
Поиск строки в памяти процесса
    #39987865
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZdenniZ
работающую функцию поиска строки в памяти запущенного процесса
будешь чем-то плохим заниматься, да?
...
Рейтинг: 0 / 0
Поиск строки в памяти процесса
    #39987866
Bred eFeM,

У меня всегда только свои читы на Танки стоят))) Люблю там, преимущества за счёт ума получать (Вижу когда враг стрельнул, отлавливая местоположения спавна снаряда, и прочие плюшки)

Как говорил Панков. Отрастил скилл, можешь нагибать
...
Рейтинг: 0 / 0
Поиск строки в памяти процесса
    #39988311
ZdenniZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за советы! Теперь нужен еще один. Из собранных по крупицам знаний из интернета, получилось такое:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
const
  //Target: array [0 .. 7] of Byte = ($59, $6F, $75, $72, $20, $49, $44, $3A);
  DefaultBufSize = 4 * 1024;

begin
  A := 'Your ID: %s';
  B := BytesOf(A);
  FillChar(Mbi, SizeOf(Mbi), #0);
  FillChar(Addr, SizeOf(Addr), #0);
  AppSize := 0;

  BuffSize := 1024 * 4 + SizeOf(B);
  ProcID := GetProcessIDExt('App.exe');
  Handle := OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcID);
  if ProcID > 0 then
  begin
    Addr := Cardinal(GetModuleBaseAddress(ProcID, 'App.exe'));
    AppSize := GetModuleSize(ProcID, 'App.exe');
    Memo1.Lines.Add(inttostr(AppSize));
    MaxAddr := Addr + AppSize;
    Memo1.Lines.Add(format('%p', [ptr(Addr)]));
    Memo1.Lines.Add(format('%p', [ptr(MaxAddr)]));

    while Addr < MaxAddr do
    begin
      if VirtualQueryEx(Handle, ptr(Addr), Mbi, SizeOf(Mbi)) <> 0 then
      begin
        SetLength(buff, BuffSize);
        if ReadProcessMemory(Handle, Mbi.BaseAddress, @buff, Mbi.RegionSize,
          BytesRead) then
        begin
          if BytePos(B, @buff, SizeOf(buff)) <> nil then
          begin
            ShowMessage('Found');
            Memo1.Lines.Add(inttohex(Addr));
          end;
        end;
        if Addr + BuffSize < Addr then
          break;

        Addr := Addr + DefaultBufSize;
        Memo1.Lines.Add(format('%p', [ptr(Addr)]));
      end;
      SetLength(buff, 0);
    end;
  end;



Функция поиска:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function BytePos(const Pattern: TBytes; const Buffer: PByte;
  const BufLen: Cardinal): PByte;
var
  PatternLength: Cardinal;
  i: Cardinal;
  j: Cardinal;
  OK: boolean;
begin
  Result := nil;
  PatternLength := Length(Pattern);
  if PatternLength > BufLen then
    Exit;
  if PatternLength = 0 then
    Exit(Buffer);
  for i := 0 to BufLen - PatternLength do
    if PByte(Buffer + i)^ = Pattern[0] then
    begin
      OK := true;
      for j := 1 to PatternLength - 1 do
        if PByte(Buffer + i + j)^ <> Pattern[j] then
        begin
          OK := FALSE;
          break
        end;
      if OK then
        Exit(Buffer + i);
    end;
end;



И ничерта не работает. Адреса перебирает, но на нужном останавливаться не хочет... Не ругайте за говнокод, лучше помогите интеллектуально ))).
...
Рейтинг: 0 / 0
Поиск строки в памяти процесса
    #39988316
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала здесь
ZdenniZ
Код: pascal
1.
if ReadProcessMemory(Handle, Mbi.BaseAddress, @buff, Mbi.RegionSize,           BytesRead)

последний параметр - количество реально прочитанных байт. Его игнорирование вызывает у меня удивление.

Ну и подумайте, что будет если часть искомой строки окажется в одном блоке, а часть в соседнем?
...
Рейтинг: 0 / 0
Поиск строки в памяти процесса
    #39988415
_Vasilisk_,

Я до сих пор не вникаю, почему бы не взять готовое

https://github.com/cheat-engine/cheat-engine/blob/acc6cefd0f18d9dd97040e6cc0a5339e9f056e2e/Cheat%20Engine/VirtualMemory.pas
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Поиск строки в памяти процесса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]