Wysyłanie pakietów do programu, zapisanych w komponencie Edit

0

Witam.

Próbowałem w Delphi zrobić programik, który by wysyłał pakiety takie jakie chce do pewnego programu. Wygląda to tak że jestem w sttanie wysłać pakiet taki, jaki zapiszę w kodzie programu. Jednak nie potrafię zrobić tak, by pakiet został wysłany taki jaki zapiszę załóżmy w edit1.text. Byłby ktoś w stanie pomóc? Nie do końca to rozumiem.

GetWindowThreadProcessId(FindWindow('XClient',Nil), @ProcessID);

PacketBuffer[0] := $0A;
PacketBuffer[1] := $00;
PacketBuffer[2] := $85;
PacketBuffer[3] := $FF;
PacketBuffer[4] := $F6;
PacketBuffer[5] := $41;
PacketBuffer[6] := $00;
PacketBuffer[7] := $00;
PacketBuffer[8] := $0F;
PacketBuffer[9] := $0E;
PacketBuffer[10] := $00;
PacketBuffer[11] := $01;
SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
end;

To działa elegancko. Jednak na wszystkie sposoby próbowałem to ogarnąć w ten sposób, żeby 0A 00 85 FF F6 41 00 00 0F 0E 00 01 zostało wysłane po wpisaniu go do edit1.text i nie działa. Potrafi to ktoś ogarnąć? Prawdopodobnie musiało by to być coś na zasadzie

PacketBuffer[1] := Byte(Length(text));

Dzięki.

0

To są dane binarne, więc raczej nie zapiszesz ich w Edit.Text (użyte są znaki kontrolne); No chyba że w jakiejś zastępczej reprezentacji, np. jako pary znaków heksadecymalnych:

$0A$00$85$FF$F6$41$00$00$0F$0E$00$01

Taki ciąg można w pętli łatwo przekonwertować na liczby, za pomocą procedury Val (która obsługuje prefiks $ dla heksów); Wyniki konwersji należy wpakować do dowolnego bufora (np. zwykłej tablicy, ale nie podałeś deklaracji PacketBuffer, więc nie wiem czym jest), a na koniec przekopiować w odpowiednie miejsce;

Choć skoro wielkość bufora jest stała to można by użyć dwunastu kontrolek typu TSpinEdit, z ustawionymi wartościami Min na 0 i Max na 255; Dzięki temu konwersja danych użytkownika nie była by konieczna;

Prawdopodobnie musiało by to być coś na zasadzie

PacketBuffer[1] := Byte(Length(text));

Może najpierw naucz się choćby podstaw programowania, zanim zabierzesz się za sensowniejszy projekt.

0

Zrobiłem tak, że zapisałem Sobie te pakiety w notatniku.
W taki sposób:

$85;
$FF;
$F6;
$41;
$00;
$00;
$0F;
$0E;
$00;
$01;  

Procedura wygląda tak:

procedure sendp(text:string);
var
  PacketBuffer: array [0..200] of byte;
  ProcessID: Cardinal;
begin
    GetWindowThreadProcessId(FindWindow('XClient',Nil), @ProcessID);  //pobranie id procesu Tibii
    PacketBuffer[0] := $0A;
    PacketBuffer[1] := $00;
    PacketBuffer[2] := Length(text);

    SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
end; 

Sam Button natomiast wygląda tak:

 sendp(listbox1.Items.text);
memo1.Text := listbox1.items.text;

Oczywiście jest jeszcze jeden button, który jakby z notatnika wgrywa to do listboxa.

Czyli idzie to tak: Notatnik -> Listbox -> XClient

Niestety, lecz gdy sprawdziłem jaki pakiet jest wysyłany to wygląda to tak:
XClient> 0A 00 3C 07 00 89 01 00 00 09 00 00]

To znaczy że pierwsze dwa packiety - te, ktore mam zapisane w packet bufferze (0A, 00) są poprawne, a reszta już nie.

Wiem że namieszałem strasznie, ale sądzę że da radę to zrobić i właśnie do tego dążę.

0

Nie rozumiem - te pakiety mają z góry określony (stały) rozmiar, czy nie? Bo raz używasz bufora z dwunastoma elementami, a teraz widzę deklarację macierzy na 201 bajtów; Samo SendPacket nie przyjmuje rozmiaru bufora w którymś z parametrów, więc określ w końcu, czym ma być ten bufor, bo to jest ważne;

Jak chcesz mieć dane w pliku tekstowym to zapisz je w taki sposób, aby z ich konwersją na dane natywne było jak najmniej roboty; Dlatego też albo zapisz te liczby w postaci decymalnej, albo w heksadecymalnej (z prefiksem $), ale bez średników, bo do niczego nie są potrzebne:

$85
$FF
$F6
$41
$00
$00
$0F
$0E
$00
$01

Mając taki zapisane dane, wystarczy przygotować sobie bufor (wyzerować wszystkie jego komórki), następnie otworzyć plik i w pętli wczytywać liczby, konwertować je na natywne liczby i pakować do buforu; na koniec zamknąć plik i wywołać SendPacket; Przykładowy kod (pisany z głowy) poniżej:

type
  TPacketBuffer = array [0 .. 199] of Byte;

  procedure LoadPacketFromFile(const AFileName: String; out APacket: TPacketBuffer);
  var
    LInputFile: TextFile;
    LLine: String;
    LByteVal: Byte;
    LByteIdx: Integer;
  begin
    AssignFile(LInputFile, AFileName);
    Reset(LInputFile);
    try
      LByteIdx := 0;

      while not EoF(LInputFile) do
      begin
        ReadLn(LInputFile, LLine);
        LByteVal := StrToInt(LLine);

        APacket[LByteIdx] := LByteVal;
        Inc(LByteIdx);
      end;
    finally
      CloseFile(LInputFile);
    end;
  end;

var
  LPacket: TPacketBuffer;
begin
  LoadPacketFromFile('C:\Packet.txt', LPacket);
0

Tylko jak powiązać teraz funkcję SendPacket z funkcją LoadPacketFromFile?

0

No normalnie, podać jej w parametrze PacketBuffer i ścieżkę pliku źródłowego;

A tak w ogóle to nie powinienem Ci pomagać, widząc co hipotetycznie zamierzasz zrobić; Jak nie potraficie grać uczciwie to nie grajcie w ogóle, a jak chcecie się bawić w hakowanie to nauczcie się najpierw porządnie programować.

0

Co za różnica czy używam programu ogólno dostępnego, czy bawię się w Delphi próbując zrobić coś innego tylko dla mnie? Poza tym na tym serwerze administratorzy sami dodali na account makerze linki do botów.
Gdy robię tak jak piszesz wówczas wysyła mi po prostu pakiet 00 00.
Pustka.

0

Co za różnica czy używam programu ogólno dostępnego, czy bawię się w Delphi próbując zrobić coś innego tylko dla mnie?

Różnica jest taka, że do jednego i drugiego potrzebna jest solidna znajomość danego języka programowania, a tego Ci brakuje; Tutaj na forum z reguły jest tak, że jak pojawia się wątek dotyczący Tibii, to aż bije po oczach brak wiedzy pytającego z zakresu choćby podstaw programowania; I najczęściej okazuje się, że pytacz to zwykły script kiddie, stąd moje wyczulenie w tej sprawie;

Nie zrozum mnie źle - po prostu bez fundamentalnej wiedzy, porywasz się z motyką na Słońce;

Poza tym na tym serwerze administratorzy sami dodali na account makerze linki do botów.

Zapewne dali taką możliwość, aby przyszli banici pomogli w ulepszaniu mechanizmów anty-botowych; A nieświadome niczego dzieciaki są idealnym materiałem do manipulacji; Dzięki temu i użytkownicy pobawią się w crackerów, i firma ulepszy swój produkt - wilk syty i owca cała;

Gdy robię tak jak piszesz wówczas wysyła mi po prostu pakiet 00 00.

Pokaż kod, bo nie będę przecież zgadywać; Nadmienię jednak, że procedurkę którą podałem wcześniej, najpierw lokalnie przetestowałem, więc jestem pewien, że przy prawidłowych danych w pliku tekstowym, również prawidłowe dane znajdą się w buforze;

Poza tym w dalszym ciągu nie wiem czym konkretnie ma być bufor (głównie chodzi o jego rozmiar) i czym konkretnie jest procedura SendPacket (podaj deklarację nagłówku), więc trudno udzielić poprawnej odpowiedzi.

0

Już postaram się wytłumaczyć.
"Programik" wygląda tak:
user image
Jest pisany teraz na szybko. Posiadam też bardziej rozbudowany z wieloma funkcjami i on z kolei wygląda tak:
user image

Rozumiem jednak że ze zdjęć nie da się nick wysnioskować ze skryptu, jednak idzie zauważyć że staram się zrobić coś takiego jak wysyłanie własnych pakietów. Np. tak jak ten z notatnika. Działało by to w ten sposób że jest Sobie folder w folderze z botem o nazwie "Scripts", a w nim były by skrypty, a konkretnie pakiety. Rozbudowałbym to rzecz jasna bez żadnego problemu już kiedy te pakiety mają zostać wysłane (np. gdzie pasek zdrowia spadnie poniżej 50 % to wtedy użyje czaru uleczającego). W każdym razie musi mi współgrać jakoś ten notatnik, a raczej pakiety z notatnika wraz z programem, którego "tworzę".

Funkcja SendPacket działa tylko i wyłącznie dzięki dllce (packet.dll), który był udostępniony przez administratora servera.
Jak już pisałem całego skryptu do programu tu nie będę wrzucać bo troszkę tego jest, ale wrzucę do tego "programiku" który ma właśnie mieć takową funkcję wysyłania pakietów z notatnika np. klikając na button.

 unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Edit3: TEdit;
    ListBox1: TListBox;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  result: string;



implementation
procedure SendPacket(ProcessID: Cardinal; Packet: Pointer; Encrypt: Boolean; SafeArray: Boolean); stdcall; external 'packet.dll';


//wysylanie tekstu   dziala.
procedure say(text:string);
var
  PacketBuffer: array [0..200] of byte;
  ProcessID: Cardinal;

begin
    GetWindowThreadProcessId(FindWindow('TibiaClient',Nil), @ProcessID);  //pobranie id procesu Tibii

    PacketBuffer[0] := Byte(Length(text) + 4); //tu okreslana jest dlugosc pakietu bez 0 i 1
    PacketBuffer[1] := $00;
    PacketBuffer[2] := $96;
    PacketBuffer[3] := $01;
    PacketBuffer[4] := Byte(Length(text));
    PacketBuffer[5] := $00;
    CopyMemory(@PacketBuffer[6], @text[1], Length(text));
    SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE); // tu program wysyla pakiet do programu z proces id = ProcessID
end;


/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
 type
  TPacketBuffer = array [0 .. 199] of Byte;

  procedure LoadPacketFromFile(const AFileName: String; out APacket: TPacketBuffer);
  var
    LInputFile: TextFile;
    LLine: String;
    LByteVal: Byte;
    LByteIdx: Integer;
  begin
    AssignFile(LInputFile, AFileName);
    Reset(LInputFile);
    try
      LByteIdx := 0;
 
      while not EoF(LInputFile) do
      begin
        ReadLn(LInputFile, LLine);
        LByteVal := StrToInt(LLine);
 
        APacket[LByteIdx] := LByteVal;
        Inc(LByteIdx);
      end;
    finally
      CloseFile(LInputFile);
    end;
  end;
 
var
  LPacket: TPacketBuffer;



/////////////////////////////////////////////////////
/////////////////////////////////////////////////////
/////////////////////////////////////////////////////







//sendp      niedaradypokico xd
procedure sendp(text:string);
var
  PacketBuffer: array [0..199] of byte;
  ProcessID: Cardinal;

begin
GetWindowThreadProcessId(FindWindow('TibiaClient',Nil), @ProcessID);



SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
end;


//leczmane     //dziala
procedure leczmane();
var
  PacketBuffer: array [0..200] of byte;
  ProcessID: Cardinal;

begin
GetWindowThreadProcessId(FindWindow('TibiaClient',Nil), @ProcessID);

PacketBuffer[0] := $0A;
PacketBuffer[1] := $00;
PacketBuffer[2] := $82;
PacketBuffer[3] := $FF;
PacketBuffer[4] := $FF;
PacketBuffer[5] := $41;
PacketBuffer[6] := $00;
PacketBuffer[7] := $00;
PacketBuffer[8] := $D5;
PacketBuffer[9] := $07;
PacketBuffer[10] := $00;
PacketBuffer[11] := $01;
SendPacket(ProcessID, @PacketBuffer, TRUE, FALSE);
end;



{$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('TibiaClient',Nil), @ProcId);
    tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
    ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
    CloseHandle(tProc);
    Result:=value;
end;
//funkcje czytajace koniec




procedure TForm1.Button1Click(Sender: TObject);
begin
say(edit1.Text);
end;


procedure TForm1.Button4Click(Sender: TObject);
begin
Listbox1.Items.SaveToFile(ExtractFilePath(ParamStr(0))+'Scripts\'+Edit3.Text);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Listbox1.Items.LoadFromFile('Scripts\'+Edit3.Text);
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
LoadPacketFromFile('Scripts\'+edit3.text, LPacket);
end;




procedure TForm1.Button5Click(Sender: TObject);
begin
leczmane;
end;

end.

Próbowałem zrobić to co pisałeś wcześniej w tym moim głównym programie, a tutaj po prostu wstawiłem kod jak to wygląda mniej wiecej.

0

Tak jak pisałem. Mi to nie wychodzi :<

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