MiniBot do gry

0

Witam.

Jakiś czas temu zainteresowałem się botami. Gdzieś w necie znalazłem poradnik jak napisać bota do gry online jednak nie potrafię przenieść tego do żadnej innej gry :|

Powiedzmy że zamierzam napisać bocika do 3D Pinball (Windowsa), który zmienia wartość punktów na podaną w SpinEdit po kliknięciu Button1. Odpalam np. Cheat Engine, szukam heksa odpowiedzialnego za punkty (B7AEBA) i co dalej?

Wiem, że muszę napisać funkcje czytające i zapisujące ale nie wiem jak złożyć to do kupy :/

0

Naucz się programować, napisz własną grę, zrób do niej takiego bota.
PIK!

0

szukam heksa odpowiedzialnego za punkty (B7AEBA) i co dalej?

No i potem to łatwa sprawa. Poczytaj sobie o
ReadProcessMemory, GetWindowThreadProcessID
Ale gorzej będzie jak te adresy bedą dynamiczne :) tzn. jak będą się zmieniać za każdym razem gdy odpalisz gierkę:) dobrze znasz się na CE ? pointery umiesz stawiać ? Ostatnio robiłem Bota do Fear Combat on jest Multiplayer:)

0

Hmm

Na razie chciałbym zrobić tylko taką prostą rzecz. Mianowicie zależy mi na odczytywaniu danych wartości z gry (w tym przypadku posłużę się Pinballem).

Znamy już heks odpowiedzialny za punkty (B7AEBA - jest stały).

Stworzyłem nowy projekt i dodałem 1 label, 1 timer, 1 button. Timer ustawiłem na enabled false. Po włączeniu go buttonem ten co 1000ms odświeża wartość punktów, które pokazuje label1.

Tak wygląda mój source:


unit Pinball_Bot;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  const


//adresy wartosci
Pinball_Punkty = $B7AEBA;
//koniec - adresy wartosci postaci



implementation


{$R *.dfm}



// Funkcje czytające

function ReadMemInteger(Address: Cardinal): Cardinal;       //Read adress:value
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value:integer;
begin
    GetWindowThreadProcessId(FindWindow('PinballClient',Nil),@ProcId);
    tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
    ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
    CloseHandle(tProc);
    Result:=value;
end;


function MemReadString(Address: Integer): String;
var
NB : LongWord;
Temp : ARRAY [1..255] OF Byte;
I : Byte;
IDProcess, proc_ID : Cardinal;
begin
GetWindowThreadProcessID(FindWindow('PinballClient', nil), @proc_ID);
IDProcess := OpenProcess(PROCESS_ALL_ACCESS, false, proc_ID);
Result := '';
ReadProcessMemory(IDProcess, Ptr(Address), @Temp[1], 255, NB);
for I := 1 to 255 do
begin
if ((Temp[i] = 0) or (Temp[i] = $0F)) then
Break;
Result := Result + Chr(Temp[i]);
end;
end;
// Koniec - Funkcje czytające




procedure TForm1.Timer1Timer(Sender: TObject);
begin
label1.Caption:=inttostr(ReadMeminteger(Pinball_Punkty));

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;





procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.

Problem jest w tym, że chociaż nie wyskakuje żaden błąd to wartość z label1 wariuje :/

Bardzo proszę o pomoc.

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