- Регистрация
- 1 Мар 2015
- Сообщения
- 2,110
- Баллы
- 155
Пример кода (поиск монстров с помощью Cheat Engine):
Код:
uses
Windows, SysUtils, TlHelp32;
// ... (Функции GetHealthPointer, ReadHealth, WriteHealth из предыдущих примеров)
function FindMonsters(ProcessID: DWORD): TList;
var
hProcess: THandle;
mbi: MEMORY_BASIC_INFORMATION;
BaseAddress, EndAddress: Pointer;
Buffer: array of Byte;
BytesRead: SIZE_T;
i: Integer;
Monsters: TList;
begin
Result := TList.Create;
hProcess := OpenProcess(PROCESS_VM_READ, False, ProcessID);
if hProcess <> 0 then
begin
BaseAddress := nil;
EndAddress := Pointer($7FFFFFFF);
while Cardinal(BaseAddress) < Cardinal(EndAddress) do
begin
if VirtualQueryEx(hProcess, BaseAddress, mbi, SizeOf(mbi)) = SizeOf(mbi) then
begin
if (mbi.State = MEM_COMMIT) and (mbi.Protect = PAGE_READWRITE) then
begin
SetLength(Buffer, mbi.RegionSize);
if ReadProcessMemory(hProcess, mbi.BaseAddress, @Buffer[0], mbi.RegionSize, BytesRead) then
begin
for i := 0 to mbi.RegionSize - SizeOf(TMonster) do
begin
// Проверка, является ли текущая область памяти структурой монстра
if (Buffer[i] = $8B) and (Buffer[i + 1] = $08) then
begin
// Создание экземпляра структуры монстра
var Monster: TMonster = TMonster.Create;
// Заполнение структуры данными из памяти
Move(Buffer[i], Monster, SizeOf(TMonster));
// Добавление монстра в список
Result.Add(Monster);
end;
end;
end;
end;
BaseAddress := Pointer(Cardinal(mbi.BaseAddress) + mbi.RegionSize);
end;
end;
CloseHandle(hProcess);
end
else
RaiseLastOSError;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Monsters: TList;
Monster: TMonster;
begin
Monsters := FindMonsters(GetCurrentProcessId);
// Выбираем подходящего монстра
for Monster in Monsters do
begin
// ... (логика выбора монстра)
// ... (управление персонажем для атаки)
end;
end;