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

Odpowiedz Nowy wątek
2019-06-25 21:48
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ę.

Fajny tytuł wątku. ;) - furious programming 2019-06-25 21:56

Pozostało 580 znaków

2019-06-25 22:53
0

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

Pozostało 580 znaków

2019-06-26 11:44
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;
edytowany 2x, ostatnio: ArekBrowarek, 2019-06-26 11:55

Pozostało 580 znaków

2019-07-24 13:48
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

edytowany 1x, ostatnio: furious programming, 2019-07-24 14:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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