Odczytywanie wartości z gierki, a duży syf w kodzie.

0

Witam. Piszę ten post, ponieważ mi brakuje doświadczenia, oraz elementarnej wiedzy i nie potrafię Sobie niestety poradzić z kodem, by wyglądał on tak jak bym tego chciał.

Na chwilę obecną wygląda on tak:

Procedure Whatever;
var
Value1, Value2, Value3, Value4, Value5, Value6: DWORD;

Name1, Name2, Name3 : DWORD;

Nick1, Nick2, Nick3 : String;


begin
Form1.Hook;

Form16.ListBox1.Clear;

ReadProcessMemory(IDProcess, Ptr(BLAddress), @Value1, SizeOf(Value1), BytesRead);
ReadProcessMemory(IDProcess, Ptr(Value1 + BLOffset1), @Value2, SizeOf(Value2), BytesRead);
ReadProcessMemory(IDProcess, Ptr(Value2 + BLOffset2), @Value3, SizeOf(Value3), BytesRead);
//do node trzeba dodac +4 zeby uzyskac nastepny wynik
//ReadProcessMemory(IDProcess, Ptr(Value3 + (BLNode)), @Value4, SizeOf(Value4), BytesRead);

//1
ReadProcessMemory(IDProcess, Ptr(Value3 + (BLNode)), @Value4, SizeOf(Value4), BytesRead);
ReadProcessMemory(IDProcess, Ptr(Value4 + BattleName1), @Name1, SizeOf(Name1), BytesRead);
//2
ReadProcessMemory(IDProcess, Ptr(Value3 + (BLNode+4)), @Value5, SizeOf(Value5), BytesRead);
ReadProcessMemory(IDProcess, Ptr(Value5 + BattleName1), @Name2, SizeOf(Name2), BytesRead);
//3
ReadProcessMemory(IDProcess, Ptr(Value3 + (BLNode+8)), @Value6, SizeOf(Value6), BytesRead);
ReadProcessMemory(IDProcess, Ptr(Value6 + BattleName1), @Name3, SizeOf(Name3), BytesRead);


Nick1 := (MemReadString(StrToInt64('$' + IntToHex(Name1 + BattleName2, 8))));
Nick2 := (MemReadString(StrToInt64('$' + IntToHex(Name2 + BattleName2, 8))));
Nick3 := (MemReadString(StrToInt64('$' + IntToHex(Name3 + BattleName2, 8))));


//1
Form16.ListBox1.Items.Add(&Nick1);
//2 chce uzyskac kolejny wynik
Form16.ListBox1.Items.Add(&Nick2);
//3 chce uzyskac kolejny wynik
Form16.ListBox1.Items.Add(&Nick3);


end;

Chciałbym dążyć do tego, bym nie musiał nick1, nick2, nick3 wpisywać manualnie robiąc sobie syf w kodzie. Rozwiązaniem tego było by to, by po dodaniu Form16.ListBox1.Items.Add(&Nick1); kod wrócił do ReadProcessMemory(IDProcess, Ptr(Value3 + (BLNode)), @Value4, SizeOf(Value4), BytesRead); i do "BL Node" dodał 4. Wiem że to może nie być łatwe, ale czy mógłby mi ktoś udzielić informacji jak to zrobić?

Jak ktoś ma zamiar pisać zdania typu "IDŹ POCZYTAJ, NAUCZ SIĘ ITP" to lepiej by tego nie robił, bo jakby każdy wszystko wiedział to by fora o tej tematyce nie były potrzebne.

Dziękuję.

0

Użyć pętli i tablicy/kontenera do przechowywania nicków?

0

Jak zastosować tablicę do takiego kodu? Próbuję, próbuję i mi nie wychodzi nic sensownego.
O to chodzi mniej więcej?

Procedure Whatever;
var
Value1, Value2, Value3, Value4, Value5, Value6: DWORD;
Name1, Name2, Name3 : DWORD;
Nick1, Nick2, Nick3 : String;
Buffer : array[0..5] of Int64;

begin
Form1.Hook;
Form16.ListBox1.Clear;

ReadProcessMemory(IDProcess, Ptr(BLAddress), @Value1, SizeOf(Value1), BytesRead);
ReadProcessMemory(IDProcess, Ptr(Value1 + BLOffset1), @Value2, SizeOf(Value2), BytesRead);
ReadProcessMemory(IDProcess, Ptr(Value2 + BLOffset2), @Value3, SizeOf(Value3), BytesRead);

Buffer[0] := $0;
Buffer[1] := $4;
Buffer[2] := $8;

ReadProcessMemory(IDProcess, Ptr(Value3 + (Buffer[1])), @Value4, SizeOf(Value4), BytesRead);

Nick1 := (MemReadString(StrToInt64('$' + IntToHex(Value1, 8))));
Nick2 := (MemReadString(StrToInt64('$' + IntToHex(Name2 + BattleName2, 8))));
Nick3 := (MemReadString(StrToInt64('$' + IntToHex(Name3 + BattleName2, 8))));


//Form16.ListBox1.Items.Add(MemReadString(StrToInt64('$' + IntToHex(Buffer[2], 8))));
 Form16.ListBox1.Items.Add(IntToHex(Value4));


end;
0

Stworz rekord ktory bedzie odpowiadał strukturze BattleListy, wtedy bedziesz mógł załadować jednym strzałem przez RPM całość.
Przykład z mojego starego bota:

procedure oneshotbl(); //Read adress:value
var
  Address, ProcId: cardinal;
  tProc: THandle;
  NBR: cardinal;

begin
  Address := battlelist_begin;
  GetWindowThreadProcessId(targetHWND, @ProcId);
  tProc := OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
  ReadProcessMemory(tProc, Pointer(Address + baza)
    @mBL, 156 * 256, NBR);

  FileClose(tProc);
  
end; 

gdzie mBL to TBattleList

Struktura:

  TBattleListEntry = record
    ID: cardinal;
    Name: array[0..31] of byte;

    posX, posY, posZ: cardinal; //32 + 12
    offsetX, offsetY: cardinal; //40
    unknown1: array[0..4] of cardinal; //52
    isWalking, direction: cardinal;//72?
    unknown2: array[0..3] of cardinal; //80
    outfit: array[0..4] of cardinal;       //5c
    //116
    lightRange, lightColor: cardinal;//70
    blackSquare: cardinal;
    HP, Speed, isVisible: cardinal; //8c
    Skull, Party, x: cardinal; //98
  end;

type
  TBattleList = packed record
    list: array[0..255] of TBattleListEntry;
  end;  

Jak widzisz, zajmuje to ulamek sekundy, a instancje masz ladnie zaladowane w tablicy i mozesz sie odwolac poprzez np. mBL[0].Name

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