FlyFF Addons/Interface Mods ->Fragen<-

02/02/2010 17:57 Reeek#1
Hallo E*pvps,
bin vor 2h auf eine doofe Idee gekommen: Flyff-Addons (im WoW-Style). Dies scheitert aber leider an mangelndem Wissen bzw Infos über die Flyffstruktur.
!Ich will nicht hören "flyff is net wow du spacko spiel wow haha suchti hihihi" oder "SuFu", die habe ich benutzt <.<!

So... also, meine Fragen wären:

1. die Skillbar (unten mit F-Tasten) ist, soweit ich das sehe, in den .res daten. stimmt das? (eine Interface-Frage x.x) ->Erledigt, gefunden
2. die Tastenbelegung ist zu 100% CL. Wo steht sie?
3. weiß wer, welche Sprache dafür am besten geeignet wäre?
4. wo steht, was beim Skillaufruf gemacht wird? (und wenns nur ein Befehl an den server ist, ich will eben jenen mitlesen).

danke schonmal, hoffe, der Treat ist verständlich :)
02/03/2010 15:42 Sir_Killer#2
c++ d3d hook send/ recv hook und tastatur hook mehr brauchste net

in wow ist das ganze ienfacher -> man kann lua benutzen und so einfach coden^^
02/03/2010 17:02 Reeek#3
c++ is schonmal schön, kann ich x3
d3d würde ich als Direct 3D interpretieren, sicher, dass codes in einer solchen Datei stehen? ö.Ö
Punkt 4 war übrigens so gedacht:

eine Art RM-Addon: er bufft eine Person. Jetzt "erfasst" mein Addon zum einen den Buff, das Target und die Buffdauer. Jetzt werden in einem Addonfenster eben jene Daten angezeigt, um dem RM zu zeigen, wer wann buffs braucht... da ist ein tastaturhook dann relativ unnötig (und geht in FlyFF eh nicht, dirX game...)
02/03/2010 17:06 Sir_Killer#4
d3d ist direct 3D jop

du musst endscene hooken um auf flyff zu zeichen kann ich dir erklären wenn du wilst.
Man kann durch packete abfangen taget hp usw rausfinden deswegen send und recv funktionen hooken

Eigene Hp cordinaten mp fp exp usw kann man auch client side auslesen hier ma die offsets falls du das machen wilst brauchst du nicht alle suchen^^
#define XOFF 0x160
#define YOFF 0x164
#define ZOFF 0x168
#define DEXOFF 0x69C
#define HPOFF 0x6C8
#define MPOFF 0x6CC
#define FPOFF 0x6D0
#define LVLOFF 0x6A4
#define STROFF 0x6A0
#define STAOFF 0x698
#define INTOFF 0x694
#define EXPOFF 0x6B0
02/03/2010 17:44 Reeek#5
die ersten 3 sind die position, oder? und kann man auch den Name auslesen?
02/03/2010 18:11 Sir_Killer#6
das sind nur die für dein eigenes zeugs also deine mp deine exp usw dazu brauchst du nur noch ein pointer man kann auch namen auslesen aber wieder nur seinen^^ für den den du im taget hast musst du wie gesagt packete auslesen und auswerten
02/03/2010 18:22 Reeek#7
hast du ein prog/SC zum send/recv hooken?
02/03/2010 20:13 Sir_Killer#8
Nur meine etwas verkrüppelte :) da hab ich sachen rum getestet^^
hab kb das jetzt raus zu machen man sieht aber wie man abfängt und bearbeitet^^
Quote:
#include "stdio.h"
#include "winsock2.h"
#include "windows.h"
#include <iostream>
#include "Detours.h"
#include "log.h"
#include <string>
#include <time.h>
#include "resource.h"
using namespace std;

#pragma comment(lib, "ws2_32.lib")
bool brecv,bsend;
typedef int (WINAPI* t_WSARecv)(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,L PWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE) ;
typedef int (WINAPI* t_WSASend)(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,LPW SAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE );

t_WSASend o_WSASend;
t_WSARecv o_WSARecv;

char Byte[300];

void *DetourFunction(BYTE *src, const BYTE *dst, const int len) // credits to gamedeception
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD dwback;
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
memcpy(jmp, src, len); jmp += len;
jmp[0] = 0xE9;
*(DWORD*)(jmp+1) = (DWORD)(src+len - jmp) - 5;
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
VirtualProtect(src, len, dwback, &dwback);
return (jmp-len);
}

DWORD dwPtr[12];
int WINAPI hook_WSARecv(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesRecvd,LPDWORD lpFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{


dwPtr[0] = lpBuffers->buf[0];
dwPtr[1] = lpBuffers->buf[1];
dwPtr[2] = lpBuffers->buf[2];
dwPtr[3] = lpBuffers->buf[3];
dwPtr[4] = lpBuffers->buf[4];
dwPtr[5] = lpBuffers->buf[5];
dwPtr[6] = lpBuffers->buf[6];
dwPtr[7] = lpBuffers->buf[7];
dwPtr[8] = lpBuffers->buf[8];
dwPtr[9] = lpBuffers->buf[9];
dwPtr[10] = lpBuffers->buf[10];
dwPtr[11] = lpBuffers->buf[11];
dwPtr[12] = lpBuffers->buf[12];

if(dwPtr[0] == 0x5e && dwPtr[1] == 0x08 && dwPtr[2] == 0x00 && dwPtr[3] == 0x00 &&dwPtr[4] == 0x00 &&dwPtr[5] == 0x00 &&dwPtr[6] == 0x00 &&dwPtr[7] == 0x00)
{
cout<<"Session ID gefunden!!!"<<endl;
cout<<hex<<dwPtr[9]<<dwPtr[10]<<dwPtr[11]<<dwPtr[12]<<endl;
}


return o_WSARecv(s,lpBuffers,dwBufferCount,lpNumberOfByte sRecvd,lpFlags,lpOverlapped,lpCompletionRoutine);
}

int WINAPI hook_WSASend(SOCKET s,LPWSABUF lpBuffers,DWORD dwBufferCount,LPDWORD lpNumberOfBytesSent,DWORD dwFlags,LPWSAOVERLAPPED lpOverlapped,LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
{


for(size_t x = 0; x < lpBuffers->len;++x)
{
if(lpBuffers->buf[x]!=NULL)
{
sprintf(Byte,"%x",lpBuffers->buf[x]);
cout<<Byte<<" ";
}}
cout<<endl;

return o_WSASend(s,lpBuffers,dwBufferCount,lpNumberOfByte sSent,dwFlags,lpOverlapped,lpCompletionRoutine);
}


BOOL APIENTRY DllMain(HMODULE hModule, DWORD Ergebnis, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
switch(Ergebnis)
{
case DLL_PROCESS_ATTACH:
MessageBox(0,"Injection erfolgreich","bla",MB_OK);

AllocConsole();
freopen("conin$", "r", stdin);
freopen("conout$", "w", stdout);
freopen("conout$", "w", stderr);

//o_WSASend = (t_WSASend)DetourFunction((PBYTE)GetProcAddress(Ge tModuleHandle("ws2_32.dll"), "WSASend"), (PBYTE)hook_WSASend,5);
o_WSARecv = (t_WSARecv)DetourFunction((PBYTE)GetProcAddress(Ge tModuleHandle("ws2_32.dll"), "WSARecv"), (PBYTE)hook_WSARecv,5);

break;
}
return true;
}
Ein programm dazu wäre dazu wireshark gibts bei google umsonst
02/04/2010 15:17 Reeek#9
uiuiui, ich sehe schon, mein c++ können ist offentsichtlich stark begrenzt... hab' mich bisher nur in vb mit apis beschäftigt. Ich testes mal, danke schonmal :D

EDIT: sooo, wireshark funktioniert klasse... bekomme ca 100 Pakete pro Sekunde.. xD
habe bisher als Filter nur die IP vom Pserver eingestellt. Kannst du mir noch paar Tipps geben? :)
02/04/2010 16:18 Sir_Killer#10
(tcp.port == 23000 || tcp.port == 28000 || tcp.port == 15400)

was für tipps?^^
02/04/2010 16:35 Reeek#11
(tcp.port == 23000 || tcp.port == 28000 || tcp.port == 15400) , verstehe ich net xD
also, ich bin bei wireshark jetzt so weit: ich hab' die IP von flyff, hab only diese ip sniffen. jetzt logg' ich mich ein: ca 500 pakete gesnifft... caste den Skill... weitere 50... also ich will die Zahl begrenzen...
02/04/2010 17:35 Sir_Killer#12
trag das in die filter ein :) bzw trag nur tcp.port==15400 ein
02/04/2010 18:06 Reeek#13
so... wenn ich tcp == 15400 eingebe, findest es zuviele, wenn ich tcp.port==15400 eingebe garkeine mehr q.q
02/04/2010 19:57 Sir_Killer#14
Es sind viele :P es werden mindestens 10 pro sekunde sein^^
02/05/2010 14:51 Reeek#15
argh... okay, das erklärt einiges xD
wenn ich es jetzt schaffe, die Adresse des Skills beim senden an den Server zu sniffen, wie kann ich das in ein Script einbauen?