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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2016, 22:25   #1
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
Вопрос Поиск строки в памяти процесса

Ищу строку в программе, с заголовком окна Form1. В результате, ничего не находит, хотя программа с таким окном открыта, и в ней есть переменная AnsiString = 'test'.

Код:
Код:
procedure FindMemInProc;
var
ProcessID, Addr, BytesRead: DWord;
ProcessHandle: THandle;
Mbi: TMemoryBasicInformation;
Buf: PChar;
begin
//
ProcessHandle := FindWindow(nil, PChar('Form1'));

//
GetWindowThreadProcessId(ProcessHandle, @ProcessID);

//
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_ALL_ACCESS or PROCESS_VM_OPERATION, false, ProcessID);

//
if ProcessHandle <> 0 then
try
Addr := 0;

//
while VirtualQueryEx(ProcessHandle, Pointer(Addr), 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(ProcessHandle, Mbi.BaseAddress, Buf, Mbi.RegionSize, BytesRead) then
begin
//
if Pos('test', Buf) > 0 then
//
ShowMessage('$' + IntToHex(Integer(Cardinal(Mbi.BaseAddress)), 8));
end;

finally
FreeMem(Buf);
end;

end;
Addr := Addr + Mbi.RegionSize;
end;

finally
CloseHandle(ProcessHandle);
end;

end;
Подскажите, с чем это может быть связано?
Alexan-Dwer вне форума Ответить с цитированием
Старый 26.08.2016, 22:56   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы отладкой не проходили?

поищее у вас первая же итерация выйдет из цикла и никакого сканирования не будет.
память процесса не занята целиком, посмотрите в том же ArtMoney или CheatEngine карту процесса.
вам надо получать список областей памяти и уже их сканировать.

+ у вас ошибка работы с памятью. память не является строкой, и Pos к ней не подойдет.

PS: перенес вашу тему, тут явно уже не паскаль
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.08.2016, 11:56   #3
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Цитата:
у вас первая же итерация выйдет из цикла и никакого сканирования не будет.
память процесса не занята целиком, посмотрите в том же ArtMoney или CheatEngine карту процесса.
вам надо получать список областей памяти и уже их сканировать.
Поэтому я использую VirtualQueryEx с проверками.

Цитата:
вас ошибка работы с памятью. память не является строкой, и Pos к ней не подойдет.
Да, не правильно посмотрел что возвращается в буфер. Там адреса находятся, а я посчитал что данные. Поэтому, нужно использовать преобразование к PChar передав @Buf с проверяемым индексом: PChar(@Buf[i])^. А дальше, сравнивать получаемые символы с искомой строкой.
Alexan-Dwer вне форума Ответить с цитированием
Старый 27.08.2016, 12:09   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Да, не правильно посмотрел что возвращается в буфер. Там адреса находятся, а я посчитал что данные. Поэтому, нужно использовать преобразование к PChar передав @Buf с проверяемым индексом: PChar(@Buf[i])^. А дальше, сравнивать получаемые символы с искомой строкой.
с буфером все нормально.
просто вы трактуете буфер как одну большую строку, а он ей не является.
если страница окажется забита вся(не будет иметь нулевые символы в себе), ваш Pos вылетит в AV, ибо терминал это #0 для таких строк.
если в буфере будет несколько строк, он опять же дойдет лишь до первого #0, и все.

ну кстати, странно работать с PChar, ища AnsiString
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.08.2016, 16:53   #5
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Цитата:
странно работать с PChar, ища AnsiString
Чем? PChar или PAnsiChar разницы нет.

Если вопрос в разбиении строки на символы, то мне так проще. Есть возможность отлаживать, просматривая, какие строки поиск подцепляет ещё.

Про, PChar(@Buf[i])^ да, оставил сейчас просто Buf[i], для получения символа по индексу работает...
Alexan-Dwer вне форума Ответить с цитированием
Старый 27.08.2016, 18:04   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

размер у них разный.
Цитата:
Про, PChar(@Buf[i])^ да, оставил сейчас просто Buf[i], для получения символа по индексу работает...
индекс работать будет.

но повторю третий раз, память не является строкой.
кусок памяти да, но не произвольный.
покажу наглядно
00 00 00 00 8F 7F 01 00 00 00 00 00 80 7B 01 00.
допустим вы выцепили такой кусок памяти.(это хекс если что)
и допустим вы ищете этот самый(8F 7F 01).
из-за того что вы трактуете памяти как PChar/PAnsiChar строка считается до первого нуля, то есть 00 00/00.
итого никакого поиска нет.

если так хотите поучится посмотрите исходники CheatEngine.

или на край, если хотите работать со строками, то работайте с ними полноценно, а не с указателем на символ PChar/PAnsiChar, у которых признак конца это символ #0.
хотя тут конечно есть нюанс реализации Pos(для полноценных строк я ее не помню, тормозит оно на длине или на нуле все же)
а прочитать все внутрь AnsiString проблем нет
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 27.08.2016 в 18:16.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.08.2016, 22:45   #7
Alexan-Dwer
Форумчанин
 
Аватар для Alexan-Dwer
 
Регистрация: 20.04.2009
Сообщений: 136
По умолчанию

Пепел Феникса, я может Вас не правильно понимаю, или не правильно объяснил, как я выполняю действия.

Есть кусок в памяти:
Buf = 00 00 00 00 54 65 73 74 00 00 00 00 00 80 7B 01 00.

Я ищу строку S = 'Test'.

Делаю примерно так:

Код:
...

FindResult:=True;

...

// k = (количество байт памяти в текущем буфере) - 1
for i:=0 to k do
//
if Buf[i] = 'T' then
// l = Length(S) - 1;
j:=1 to l do
//
if Buf[i + j] <> S[j + 1] then FindResult:=False;
Первый цикл у меня repeat, а не for, чтобы можно было i изменить, и перескочить проверенные символы...

Разве такой способ является некорректным? Возможно я на самом деле что-то не понимаю, так как с памятью и указателями обычно редко приходится сталкиваться...

Последний раз редактировалось Alexan-Dwer; 27.08.2016 в 22:48.
Alexan-Dwer вне форума Ответить с цитированием
Старый 28.08.2016, 15:09   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в вашем первом коде есть только стандартная Pos.

так, в принципе и нужно, искать первый символ, следующий за ним должен быть второй и тп.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оперативная память и WinAPI (поиск строки в памяти процесса) Кирилл Романов Win Api 5 12.05.2015 22:44
Чтение памяти процесса (поиск адресов) xRamzeSx Общие вопросы Delphi 0 12.01.2014 13:10
Поиск в памяти процесса Mr_ViK Общие вопросы Delphi 5 27.08.2012 21:38
Поиск сигнатуры в памяти процесса Crystallon Общие вопросы Delphi 8 26.09.2011 23:01
Защита памяти процесса. worldhero Фриланс 2 25.07.2010 11:15