[problem] Grzebanie w pamięci

0

Witam. Mam pewien problem. Otóż chciałbym sobie napisać pewną aplikacje (konkretnie trainer). Chciałbym, żeby owa aplikacja zmieniła mi pewną wartość w pamięci. Chodzi mi konkretnie o to, żeby zmienić ilość punktów w windowsowym pinballu, ale niestety nie mam zielonego pojęcia jak to zrobić za pomocą delphi. Dodam tyle, że znam adres wartości, którą chcę zmienić (konkretnie 00A82BDC), ale nie wiem, czy będzie to potrzebne. Proszę o pomoc.

0

Będziesz potrzebował:
FindWindow
GetWindowThreadProcessId
OpenProcess
ReadProcessMemory
WriteProcessMemory

Przykłady jak to zrobić znajdziesz na forum, wystarczy poszukać.

0

A mógłbym dostać jakiegoś linka, gdzie jest pokazane jak to zrobić? Szukam i szukam, ale nic nie znajduje... </ort>

0
IgiKoval napisał(a)

A mógłbym dostać jakiegoś linka, gdzie jest pokazane jak to zrobić? Szukam i szukam, ale nic nie znajduje... </ort>

Kiedyś na google znalazłem gotowy kod i mam go w zakładkach, także CI podaje adres:
http://www.team-x.ru/info.php?article=trainermaking/3 - Natomiast mój poniższy kod
jest napisany, jako głowny moduł w aplikacji konsolowej (czyli dajesz menu File -> New ->
Other -> Console Application -> Ok). I możesz wkleić poniższy kod. Dodałem do niego
obsługę uchwytu aplikacji konsolowo - gui. Czytli zmienna WndHandle, która powoduje że
wyświetlenie MessageBoxa nie pokazuje belki programu na pasku zadań. Natomiast adres w pamięci
oraz wartość, są podane jako stałe. Jedyne co w tym kodzie musisz zmienić poza adresem (Address)
i nową wartością (PokeValue) to sposób wyszukania okna. Moj kod, działa dla amigowego emulatora
online Kaillera i gry "SWOS @ SensibleSoccer.de v1.02", no i wyszukuje okno po jego nazwie
klasy ('PCsuxRox'), ale można torównież zrobic wyszukując okno po jego tytule (funkcja
FindWindow(nil, 'Tytul okna';).Kod bez formatowania (wiem to mój zły nawyk :P), ale mam nadziję,
że wsyzstko jest jasne. W razie czego - zobacz powyższy link, który podałem i wszystko będzie jasne.

program trainer;

{$APPTYPE GUI}

uses
Windows, SysUtils;

var
AppTitle : string;
WindowName : integer;
ProcessId : integer;
ThreadId : integer;
Buf : PChar;
HandleWindow : Integer;
Write : cardinal;
WndClass : array[0..50] of Char;
WndHandle : THandle;
const
WindowClass = 'PCsuxRox';
Address = $040F4A02;
PokeValue = $C03B4703;
NumberOfBytes = 4;

begin
Apptitle := 'Amiga SWOS trainer by: olesio';
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
WindowName := FindWindow(WindowClass, nil);
If WindowName = 0 then
begin
MessageBox(WndHandle, 'The game must be running in the background.'+#13#10+
'Run it now, and then try again.', PChar(AppTitle), MB_ICONWARNING + MB_OK);
Exit;
end;

ThreadId := GetWindowThreadProcessId(WindowName, @ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
GetMem(Buf, 1);
Buf^ := Chr(PokeValue);
WriteProcessMemory(HandleWindow, Ptr(Address), Buf, NumberOfBytes, Write);
FreeMem(Buf);
Closehandle(HandleWindow);
MessageBox(WndHandle, 'Now you have lots of money! :)', PChar(AppTitle), MB_ICONINFORMATION + MB_OK);
end.
0

Szukam i szukam, ale nic nie znajduje...

Twoim problemem jest to, że nie potrafisz korzystać z wyszukiwarki. Ten temat był wałkowany na naszym forum już setki razy, właśnie przy okazji "poprawiania" wyników w grach.

0

Przeczytaj sobie na MSDNie opisy funkcji podanych przez Adam(PL)a.

0

A czy coś takiego będzie działało w grze, która jest otwarta na pełny ekran?

1 użytkowników online, w tym zalogowanych: 0, gości: 1