Поиск массива байтов в памяти другого процесса в Delphi
Введение
В данной статье мы рассмотрим, как можно найти и прочитать массив байтов в памяти другого процесса, используя технологии, доступные в среде разработки Delphi. Это может быть полезно для различных задач, таких как анализ работы программ или разработка инструментов для автоматизации.
Проблема
Пользователь столкнулся с проблемой поиска определенного массива байтов внутри памяти другого процесса. Для этого использовались функции Windows API VirtualQueryEx и ReadProcessMemory, но код замораживал программу, и не было ясно, как правильно выполнить задачу.
Описание кода
Приведенный код содержит несколько ошибок, таких как неинициализированные переменные и неправильная логика цикла. Необходимо устранить эти ошибки для корректной работы программы.
Шаги к решению
Инициализация переменных: Все локальные переменные должны быть инициализированы перед использованием. В частности, необходимо инициализировать переменную Mbi и определить размер буфера BuffSize.
Начальный адрес: Не следует начинать чтение с нулевого адреса. Вместо этого, нужно инициализировать переменную Addr начальным адресом процесса, используя функцию GetModuleInfo.
Размер буфера: Размер буфера должен быть больше размера целиком ищаемого массива байтов, например, 4k+.
Проверка прочитанных байтов: Необходимо проверять параметр BytesRead и корректировать размер буфера в случае, если прочитано меньше данных.
Использование алгоритма поиска: Для ускорения поиска можно использовать алгоритм Бойера-Мура-Хорспул.
Пример кода
procedure TForm1.Button2Click(Sender: TObject);
const
Target: array[0..7] of byte = ($A0, $19, $40, $2B, $F6, $7F, $00, $00);
var
Mbi: TMemoryBasicInformation;
Handle: THandle;
Buff: array of byte;
hWin, ProcID, BuffSize: Cardinal;
Addr: DWORD_PTR;
BytesRead: NativeUInt;
mi: TModuleInfo;
begin
// Инициализация переменных
FillChar(Mbi, SizeOf(Mbi), #0);
BuffSize := DefaultBufSize; // Определено выше, например, DefaultBufSize = 1024*4;
FillChar(mi, SizeOf(mi), #0);
if GetModuleInfo(Handle, mi) then
Addr := mi.lpBaseOfDll;
// Поиск окна и получение идентификатора процесса
hWin := FindWindow(nil, 'Minesweeper');
if hWin > 0 then
GetWindowThreadProcessID(hWin, @ProcID);
// Открытие доступа к процессу
if ProcID > 0 then
begin
Handle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, ProcID);
// Поиск и чтение памяти
while (VirtualQueryEx(Handle, Ptr(Addr), Mbi, SizeOf(Mbi)) <> 0) do
begin
SetLength(Buff, BuffSize);
if ReadProcessMemory(Handle, Mbi.BaseAddress, Buff[0], Mbi.RegionSize, BytesRead) then
begin
// Поиск массива байтов в буфере
if FindMem(@Buff[0], Length(Buff), @Target[0], Length(Target)) >= 0 then
ShowMessage('Found');
end;
// Обновление адреса для следующего чтения
Addr := Addr + BuffSize;
end;
// Закрытие дескриптора доступа
CloseHandle(Handle);
end;
end;
function FindMem(P1: Pointer; Size1: Cardinal; P2: Pointer; Size2: Cardinal): Integer;
begin
// Реализация алгоритма Бойера-Мура-Хорспул
end;
Заключение
В данной статье были рассмотрены основные шаги и исправления, необходимые для корректного поиска массива байтов в памяти другого процесса. Приведенный пример кода демонстрирует, как можно использовать функции Windows API в среде Delphi для решения этой задачи.
Статья описывает процесс поиска определенного массива байтов в памяти другого процесса на языке программирования Delphi, используя функции Windows API, и содержит примеры кода с исправлениями для корректной работы программы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.