rPE Filter coding Thread

02/26/2009 20:14 cr@ckp0t#1
Ich bin ein Fan von rPE und versuche mich schon seit längerer Zeit mit dem Schreiben von eigenen Filtern. Nur bin ich der Programmiersprache Delphi nicht mächtig, und habe nicht die Zeit bei 0 anzufangen und mich bis auf das Niveau von Redox hochzuarbeiten. Deswegen ist mir die Idee für diesen Thread gekommen:

Jeder hat die Möglichkeit einen eigenen Filter für rPE hier zu posten und zu beschreiben welches Problem er damit hat, oder um anderen Usern dabei zu helfen. Das pure Fragen nach Filtern, ohne sich selber damit beschäftigt zu haben und das Ergebnis seiner Arbeit zu posten, ist nicht erlaubt.

__________________


Ich mache gleich mal den Anfang:

Ich will einen einfachen Filter schreiben mit der Option das er per Tastendruck (de)aktiviert werden kann. Der Filter ist für das Spiel Ragnarok Online und soll helfen, das Animationsdelay bei diversen Skills zu umgehen.

Ich habe meine Gedanken zu einzeln hinzugefügten Codeuzeilen farbig hervorgehoben. Auch wenn der Code auch ohne Kommentare zu verstehen wäre, soll es einfach meine Gedankengänge schildern und diese können dann gegebenfalls berichtigt werden, was zur meiner eigenen Verständnis erheblich beiträgt. Neue Erkenntnisse werden mit Grün hineineditiert.

Code:
library rPE_ex;

uses
  windows,
  Winsock2,
  winsock,
  rpefuncs;

var
enable: Boolean = false; [color=red]//definiert die Bedinung unter der der Spaming-Filter aktiviert werden soll[/color]
                  
procedure hot;
begin
 enable := true;  [color=red]//per hotkey wird diese Prozedur aufgerufen, welche diese Variable auf true gesetzt um den spaming Filter zu aktivieren[/color]
end;     
     
function Send_WS1(s: TSocket; var Buf : PChar; len, flags: Integer; pSendWs1, pRecvWs1, pSendWs2, pRecvWs2: Pointer; var IsWorking : Boolean):Integer; stdcall;

var
CurHex: string;
i : integer;

[color=green]begin[/color]
if enable then [color=red]//prüfe ob der Filter aktiviert sein soll[/color]
begin
 begin
   CurHex := GetBufferAsHex(buf, len);
   if (pos('7200',CurHex) <> 0) and (pos('005400',CurHex) <> 0) then [color=red]//suche in den gesendeten Packets nach den Hexwerten...[/color]
   begin
      @Send_Callback := pSendWs1;
      for i := 0 to 50 do  [color=red]//um ein zutreffendes Packet 50 mal[/color]
      begin
        sleep(5);  [color=red]//mit 5 ms Delay zu senden[/color]
        SendPacket(s,CurHex);
      end;
   end;
   result := 0;
 end;
end; 
[color=green]end;[/color]

begin
 Send_Callback := pSendWs1;
 aSock := s;
 result := 0;
end;

procedure DLL_Load;
begin
 IntLog('rpe_log.log');
end;

procedure DLL_UnLoad;
begin
 Running := false;
 sleep(60);
 EndLog;
end;

procedure DLLMain(dwR: integer);
begin
  case dwR of
    DLL_PROCESS_ATTACH:
      DLL_Load;
    DLL_PROCESS_DETACH:
      DLL_UnLoad;
  end;
end;

exports
 Send_WS1;
 
var a : THotKey; 
begin
  setlength(a,1);
  a[0] := VK_DOWN; [color=red]//setze den Hotkey auf "Pfeiltaste nach unten"[/color]
  SetHotKey(@Hot,a);
  Running := true;
  DLLProc := @DLLMain;
  DLLMain(DLL_PROCESS_ATTACH);
end.
Das Ganze sieht für mich relativ plausibel aus, nur kommen beim Compilen folgende Fehlermeldungen:

Code:
C:\DOKUME~1\admin\LOKALE~1\Temp\rPE\rPE_ex.dpr(23) Error: Declaration expected but 'IF' found [color=green]  //beseitigt durch einfügen von begin und end;[/color]

[color=green]C:\DOKUME~1\schueler\LOKALE~1\Temp\rPE\rPE_ex.dpr(39) Warning: Return value of function 'Send_WS1' might be undefined  //neuer Fehler dazugekommen[/color]

C:\DOKUME~1\admin\LOKALE~1\Temp\rPE\rPE_ex.dpr(41) Error: Undeclared identifier: 'pSendWs1'

C:\DOKUME~1\adminr\LOKALE~1\Temp\rPE\rPE_ex.dpr(42) Error: Undeclared identifier: 's'
Weiß ungefär was die Bedeutung der Meldung ist, weiß aber nich wie ich dabei weiter vorgehen soll. Kann mir jemand weiterhelfen?


MFG

The cr@ckp0t
03/02/2009 14:44 rEdoX#2
Ungetestet und hier im Editor getippt:

Code:
library rPE_ex;

uses
  windows,
  Winsock2,
  winsock,
  rpefuncs;

var
  enable: Boolean = false;

procedure hot;
begin
  enable := not enable;
end;

function Send_WS1(s: TSocket; var Buf: PChar; len, flags: Integer; pSendWs1, pRecvWs1, pSendWs2, pRecvWs2: Pointer; var IsWorking: Boolean): Integer; stdcall;
var
  CurHex: string;
  i: integer;
begin
  if enable then
  begin
    CurHex := GetBufferAsHex(buf, len);
    if ((pos('7200', CurHex) <> 0) and (pos('005400', CurHex) <> 0)) then
    begin
      @Send_Callback := pSendWs1;
      for i := 0 to 50 do
      begin
        sleep(5);
        SendPacket(s, CurHex);
      end;
    end;
  end;
  result := 0;
end;

procedure DLL_Load;
var
  a: THotKey;
begin
  Running := true;
  setlength(a, 1);
  a[0] := VK_DOWN;
  SetHotKey(@Hot, a);
end;

procedure DLL_UnLoad;
begin
  Running := false;
end;

procedure DLLMain(dwR: integer);
begin
  case dwR of
    DLL_PROCESS_ATTACH:
      DLL_Load;
    DLL_PROCESS_DETACH:
      DLL_UnLoad;
  end;
end;

exports
  Send_WS1;

begin
  DLLProc := @DLLMain;
  DLLMain(DLL_PROCESS_ATTACH);
end.
03/02/2009 18:08 cr@ckp0t#3
Danke redox, dein Code hat mir weitergeholfen. Bei der Prozedur HOT hatte ich selber

Code:
procedure hot;
begin
 case enable of
  false: enable := true;
  true: enable := false;
 end;
end;
hinzugefügt, aber deine Lösung ist doch wesendlich einfacher. :)

Langsam entdecke ich Spaß an Delphi und es wäre schön, wenn sich hier noch andere anschließen würden.

Mein nächstes Projekt ist etwas Komplexer; Ich versuche mich daran, den WPE Filter zum Aufdecken von Spielern im Cloaking, Chasewalk oder Hiding nach rPE zu portieren. RPE hat zwar unter dem Beispielfilter "ro_funcs" eine Prozedur zum Aufdecken mit dabei, jedoch erkennt man keinen Unterschied zwischen Spielern mit einem der aktiven Skills und denen ohne. Als Anlage habe ich mal den rPE Filter der die Funktion beinhaltet und den "unhide_perfect" Filter von WPE. Mein erstes Ziel wäre es, den Filtercode zu strippen und nur alle Elemente zu behalten die für die "view-all" Funktion relevant sind.

MFG
03/03/2009 07:34 arnie17#4
..pls help me how to configure this one, i dont know if this is right or what, this is for the skill of Zen+Fury+Zen to spamm Asura..but everytime i try to run it i always get the error -> Runtime error 5 at 1295690A and Runtime error 103 at 1295693b.. this is what i did, but im not so sure if its correct, pls help me :(


library rPE_ex;

uses12956
windows,
Winsock2,
winsock,
rpefuncs;

function Send_WS1(s: TSocket; var Buf : PChar; len, flags: Integer; pSendWs1, pRecvWs1, pSendWs2, pRecvWs2: Pointer; var IsWorking : Boolean):Integer; stdcall;
var
CurHex: string;
i : integer;
begin
CurHex := GetBufferAsHex(buf, len);
if (pos('7200',CurHex) <> 0) and ((pos('009101',CurHex)<> 0) or (pos('000E01',CurHex)<> 0) or (pos('009101',CurHex)<> 0)) then //here you can add much more skills
begin
@Send_Callback := pSendWs1;
for i := 0 to 50 do // the number how often this packet should be send
begin
sleep(10); // delay you can chhose however you like (time in ms)
SendPacket(s,CurHex);
end;
end;
result := 0;
end;

procedure DLL_Load;
begin
IntLog('c:\rpe_log.log');
end;

procedure DLL_UnLoad;
begin
Running := false;
EndLog;
end;

procedure DLLMain(dwR: integer);
begin
case dwR of
DLL_PROCESS_ATTACH:
DLL_Load;
DLL_PROCESS_DETACH:
DLL_UnLoad;
end;
end;

exports
Send_WS1;
begin
Running := true;
DLLProc := @DLLMain;
DLLMain(DLL_PROCESS_ATTACH);
end



..please help me i really wanna try it, and i had been researching on how to do this correctly but cant understand it with just simply reading of tutorials.. please sir help me..
03/03/2009 18:28 rEdoX#5
Code:
library rPE_ex;

uses
	windows,
	Winsock2,
	winsock,
	rpefuncs;

function Send_WS1(s: TSocket; var Buf : PChar; len, flags: Integer; pSendWs1, pRecvWs1, pSendWs2, pRecvWs2: Pointer; var IsWorking : Boolean):Integer; stdcall;
var
	CurHex: string;
	i : integer;
begin
	CurHex := GetBufferAsHex(buf, len);
	if (pos('7200',CurHex) <> 0) and ((pos('009101',CurHex)<> 0) or (pos('000E01',CurHex)<> 0) or (pos('009101',CurHex)<> 0)) then
	begin
		@Send_Callback := pSendWs1;
		for i := 0 to 50 do
		begin
			sleep(10); 
			SendPacket(s,CurHex);
		end;
	end;
	result := 0;
end;

procedure DLL_Load;
begin
	Running := true;
end;

procedure DLL_UnLoad;
begin
	Running := false;
end;

procedure DLLMain(dwR: integer);
begin
	case dwR of
	DLL_PROCESS_ATTACH:
		DLL_Load;
	DLL_PROCESS_DETACH:
		DLL_UnLoad;
end;
end;

exports
	Send_WS1;

begin
	DLLProc := @DLLMain;
	DLLMain(DLL_PROCESS_ATTACH);
end
03/03/2009 20:13 cr@ckp0t#6
Hi arnie, your filter won't work as you expected, because it would do the following:

If you cast Zen, rPE will send the Zen packet 50 times with 10 ms delay at once. Same thing happens if you cast Fury but after you cast the skill once it will fail because you don't have any Spheres.

If i understand this right, you want automatically send the "Zen, Fury, Zen", after you have cast Asura Strike. In this case you must add Asura Strike to the Packet which rPE looking for and if the send packets met the condition, it must send the "Zen, Fury, Zen" packets with a delay between then. To do this, capture the packets which send by the client if you cast Zen and Fury. (lil hint: skill packets normally begin with "7200") Then write a send function that send the packets with a delay.

I don't want to give you a complete filter because that is not the aim of this thread to request a filter without doing anything yourself.

My english is not the best but it's good enough to understand what i mean.


MFG
03/10/2009 03:19 champion123#7
dear cr@ckpot you can share ur filter asura>?
03/10/2009 12:15 neji#8
ich pin das erstmal. Viel Spaß
03/11/2009 10:25 champion123#9
neji can u share the filter of asura? anyone please
03/11/2009 10:39 champion123#10
anyone can share ur filter asura?