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

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

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

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

Как говорил Панков. Отрастил скилл, можешь нагибать
...
Рейтинг: 0 / 0
10.08.2020, 17:14
    #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
10.08.2020, 17:21
    #39988316
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск строки в памяти процесса
Для начала здесь
ZdenniZ
Код: pascal
1.
if ReadProcessMemory(Handle, Mbi.BaseAddress, @buff, Mbi.RegionSize,           BytesRead)

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

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

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

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


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