Ventrilo 2.1, Skapa rum genom PHP

Permalänk
Medlem

Ventrilo 2.1, Skapa rum genom PHP

Hej alla!

Jag har suttit ett tag med att försöka klura ut hur man kan skapa ett PHP skript som kan skapa och ta bort rum på en Ventrilo 2.1 server.

Mina tankar går omkring att skriva till ventrilo_srv.chn där alla rum lagras. Men problemet ligger i att servern läser bara in den när den startas. Inte ens när man skapar ett rum manuellt genom programmet läser den ifrån denna filen, utan den skriver bara till den så jag antar att det ligger i någon slags temporär fil. Någon som har några förslag?

Permalänk

Följande är lösa funderingar....

Ja, genomför proceduren med att skapa/ta bort rum med en vanlig ventrilo-klient samtidigt som du avlyssnar trafiken med hjälp av exempelvis Wireshark så får du säkert lite hjälp.

Men jag gissar att detta redan är gjort av någon, så testa att söka lite. Jag skrev ett php-skript förut som bara listade rum och de personer som var inne på servern, men har tyvärr glömt allt hur det gick till. Vet dock att den biten var enkel.

Troligtvis skriver Ventrilo till konfigurationsfilen när servern stängs av, och läses bara in när den startar så jag tror inte du kommer så långt på din idé att skriva direkt till konfigurationsfilen...

Permalänk
Medlem

Ok, jag tog bort en kanal.

Men förstod inte riktigt hur jag skulle tolka det, verkar som att först kom paketet med all data till min dator, sen skickas något tillbaka.

Är helt ställd Vet inte hur jag ska komma vidare härifrån, min kunskapsnivå ligger inte så högt, har läst lite om OSI-modellen och paket och sådär och min PHP kunskap är inte heller jättehög. Tyvärr =/

Tacksam för svar

Permalänk

Ja, det kanske inte är världens lättaste grej om man inte vet vad man ska leta efter..

Om ingen annan ger dig ett vettigt svar innan helgen så kan jag ta en snabb titt och se hur lätt/svårt det skulle vara att åstadkomma det du vill.

Ventrilo har en uppsättning rcon-kommandon som kan utföra vissa enklare uppgifter, såsom att kicka personer på servern, men osäker på om man kan skapa rum med dessa. Dock om du är intresserad så kan du söka på "ventrilo rcon php" osv för att se vad andra har gjort och kanske få några idéer...

Permalänk
Medlem

Okej, har kollat lite i Wireshark och när jag skapar en kanal på min server får jag ett paket som ser ut exakt såhär i "Offset Hex"

"0000 00 1b 2f 0a da a0 00 13 8f c1 f8 55 08 00 45 00
0010 00 36 71 84 40 00 80 06 00 69 c0 a8 01 04 d5 43
0020 f1 e4 0b 8d 0e c8 67 3a 85 27 78 19 75 f4 50 18
0030 ff f1 88 fd 00 00 00 0c 71 56 57 4d 2e 71 cc bb
0040 55 39 4f 31"

Går det skicka denna informationen via PHP?

Paketet ovanför innehåller Header (IP, port osv? har jag rätt?).

Här är alla DATAN som finns i paketet:

"0000 00 0c 71 56 57 4d 2e 71 cc bb 55 39 4f 31"

Detta är paketet som skickas när jag vill skapa rummet, sen får jag några tillbaka men jag antar att det mesta av tyngden ligger i mitt första paket, om inte det är en "handskakning" som sker först.

Tacksam för all hjälp

Permalänk

Tjenare!

Så du har inte gett upp än? Hade helt glömt bort den här tråden.

Iaf så säger inte den där datan mig någonting, och jag fruktar att det blir svårare än jag trodde att göra det du vill. Ventrilo har en lista med kommandon som lätt kan skickas via php, men att skapa nya kanaler verkar inte gå på det sättet.

Permalänk
Medlem

Ventrilo-protokollet är krypterat, men som tur är finns det massor av info här.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Nej då! Här ges inte upp

Citat:

Ursprungligen inskrivet av Phod
Ventrilo-protokollet är krypterat, men som tur är finns det massor av info här.

Tokintressant sida du länkade! Ska ge mig in på det imorgon!

Men i princip, så ska jag kunna läsa ur all data som finns med i ett paket och se datan i klartext? Och sedan bör jag kunna formulera ett likadant paket och sedan kryptera det innan jag skickar det?

Jag antar också att jag måste på något sätt göra en "handskakning" när skriptet körs igång. Vad jag förstått görs detta varje gång jag kopplar upp till servern med min klient, stämmer det?

Så att ifall det är så, behöver jag först skicka ett paket med användarnamn/lösenord för administrativa rättigheter och sedan skicka paketen med data för kanalen som ska skapas och till slut stänga uppkopplingen?

(Paketen som skickas när man autentiseras: http://ventriloganget.org/ventriloconnect.txt Denna informationen är alltså dekrypterad.)

Hur gör jag för att skicka ett paket till min Ventriloserver genom PHP? Finns det något kommando för det?

För övrigt så är jag väldigt dålig på sånt här, så det finns mycket jag inte förstår

Tacksam för all hjälp

/Robin

Permalänk
Medlem

Du borde kunna använda sockets i PHP...
Jag vet dock inte hur detta går till :S
Hoppas det löser sig för dig!

Visa signatur

Hejsan jag hatar datorbutiken.com

Permalänk
Medlem

function ping($host) { $package = "\x08\x00\x19\x2f\x00\x00\x00\x00\x70\x69\x6e\x67"; /* create the socket, the last '1' denotes ICMP */ $socket = socket_create(AF_INET, SOCK_RAW, 1); /* set socket receive timeout to 1 second */ socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0)); /* connect to socket */ socket_connect($socket, $host, null); /* record start time */ list($start_usec, $start_sec) = explode(" ", microtime()); $start_time = ((float) $start_usec + (float) $start_sec); socket_send($socket, $package, strlen($package), 0); if(@socket_read($socket, 255)) { list($end_usec, $end_sec) = explode(" ", microtime()); $end_time = ((float) $end_usec + (float) $end_sec); $total_time = $end_time - $start_time; return $total_time; } else { return false; } socket_close($socket); }

Detta är en enkel PING funktion som jag hittade som tycks fungera bra, och jag antar att jag kan byta ut $package variabeln till datan som ska skapa rummet? Fast jag måste kanske ange porten också någonstans (3784)?

Det som jag sitter fast vid mest just nu känner jag är att jag sen ska kryptera datan som ska skickas till Ventrilo, för jag antar att det måste göras? Här är algoritmen för att dekryptera paketen som skickas, någon kunnig som skulle kunna på något sätt skapa ett PHP skript som inverterar algoritmen, dvs att den krypterar In-data istället för att dekryptera den?

Vore väldigt tacksam!

Tack

/Robin

Permalänk
Medlem

function ping($host) { $package = "\x08\x00\x19\x2f\x00\x00\x00\x00\x70\x69\x6e\x67"; /* create the socket, the last '1' denotes ICMP */ $socket = socket_create(AF_INET, SOCK_RAW, 1); /* set socket receive timeout to 1 second */ socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0)); /* connect to socket */ socket_connect($socket, $host, null); /* record start time */ list($start_usec, $start_sec) = explode(" ", microtime()); $start_time = ((float) $start_usec + (float) $start_sec); socket_send($socket, $package, strlen($package), 0); if(@socket_read($socket, 255)) { list($end_usec, $end_sec) = explode(" ", microtime()); $end_time = ((float) $end_usec + (float) $end_sec); $total_time = $end_time - $start_time; return $total_time; } else { return false; } socket_close($socket); }

Detta är en enkel PING funktion som jag hittade som tycks fungera bra, och jag antar att jag kan byta ut $package variabeln till datan som ska skapa rummet? Fast jag måste kanske ange porten också någonstans (3784)?

Det som jag sitter fast vid mest just nu känner jag är att jag sen ska kryptera datan som ska skickas till Ventrilo, för jag antar att det måste göras? Här är algoritmen (http://aluigi.altervista.org/papers/ventrilo_udp.h) för att dekryptera paketen som skickas, någon kunnig som skulle kunna på något sätt skapa ett PHP skript som inverterar algoritmen, dvs att den krypterar In-data istället för att dekryptera den?

Vore väldigt tacksam!

Tack

/Robin

Permalänk
Medlem

Kan man inte skapa en kanal via ett vanliga kommando?

Annars tror jag att mumble skulle vara ett bättre alternativ men färdiga lösningar för detta(men vet inte). http://mumble.sourceforge.net/

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Meto
Kan man inte skapa en kanal via ett vanliga kommando?

Annars tror jag att mumble skulle vara ett bättre alternativ men färdiga lösningar för detta(men vet inte). http://mumble.sourceforge.net/

Tyvärr så kan man inte skapa en kanal via ett kommando på det sättet. Det enda sättet du kan skapa en kanal på är att du som klient är inne på servern, inloggad om administratör och sedan skapa ett rum som administratör.

Angående Mumble så har jag provat det och ser inga fel på det, dock behöver jag använda Ventrilo p.g.a. alla mina klienter på mina servrar vill nog helst inte byta till Mumble över en dag =/ Dock så hoppas jag att det blir det "Nya" Ventrilo Open Source FTW

Så att nu sitter jag här i klistret...

Jag har provat skicka några paket via en socket i PHP, men i Wireshark säger den att mina paket är "Malformed" och när man kollar specsen på paketet så finns det ingen Data, någon som vet varför det blir så? Hur skickar jag specifik data till en IP och en Port?

Tack

Permalänk
Medlem

Är det en ventrilo på en linuxserver du har åtkomst till? Jag antar att webbservern och ventrilon ligger på samma fysiska server.

Jag skulle göra såhär:

1: Via PHP-scriptet skapar du ett rum som heter "hej".
2: "hej" sparas i en textfil som heter addroom.txt
3: På servern körs ett cronscript varje minut, som kontrollerar om filen addroom.txt finns.
4: Om filen finns - skriv ut filens innehåll "hej" >> ventrilo.chn.
5: Starta om ventrilo-demonen. Alternativt stäng av, skriv ut i fil, starta.
6: Ta bort addroom.txt så inte proceduren upprepas.

Du skulle kunna göra samma sak för att ta bort en kanal. Om filen delroom.txt finns, grep -v "hej" ventrilo.chn >> ventrilo.chn.

Nackdelen med att göra såhär är att servern startas om när du lägger till eller tar bort rum, men det går ju på bråkdelen av en sekund. Du skulle annars kunna köra cron-scriptet varje natt kl 04.00.

Har du flera olika ventriloservrar på samma dator kan du helt enkelt skicka med porten eller namnet på servern som en parameter. Exempelvis "3784 hej" eller "vent1 hej". Då får du i ditt bashscript förklara vilken port/namn som går till vilken sökväg.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av sme
Är det en ventrilo på en linuxserver du har åtkomst till? Jag antar att webbservern och ventrilon ligger på samma fysiska server.

Jag skulle göra såhär:

1: Via PHP-scriptet skapar du ett rum som heter "hej".
2: "hej" sparas i en textfil som heter addroom.txt
3: På servern körs ett cronscript varje minut, som kontrollerar om filen addroom.txt finns.
4: Om filen finns - skriv ut filens innehåll "hej" >> ventrilo.chn.
5: Starta om ventrilo-demonen. Alternativt stäng av, skriv ut i fil, starta.
6: Ta bort filen så inte proceduren upprepas.

Du skulle kunna göra samma sak för att ta bort en kanal. Om filen delroom.txt finns, grep -v "hej" ventrilo.chn >> ventrilo.chn.

Nackdelen med att göra såhär är att servern startas om när du lägger till eller tar bort rum, men det går ju på bråkdelen av en sekund. Du skulle annars kunna köra cron-scriptet varje natt kl 04.00.

Tyvärr så har jag kört med den principen men jag vill utveckla det mer, så att rum skall kunna skapas direkt, håller nämligen på med en Community som kretsar kring Ventrilo om man ska uttrycka sig så... Har lyckats koppla upp mig till servern hittils...

$server = 'ventriloganget.mine.nu'; $port = '3784'; $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $connect = socket_connect($sock, $server, $port);

När jag kör detta kommer detta upp på min serverkonsol (Windows):

MSG_CONN: ID 35, IP XXX.XXX.XXX.XXX Accepted. (8192,131072) (8192,131072) MSG_ABORT: ID 35, XXX.XXX.XXX.XXX aborted.

När en klient kopplar upp till servern får jag:

MSG_CONN: ID 36, IP XXX.XXX.XXX.XXX Accepted. (8192,131072) (8192,131072) LOGON: ID 36, IP XXX.XXX.XXX.XXX, KLIENTENS NAMN

Så jag antar att direkt efter uppkopplingen så måste en autentisering ske genom att man skickar paket genom PHP?

Alltså:

1. Skapa en uppkoppling
2. Autentisera användare
3. Logga in som administratör
4. Skapa rum
5. Koppla ned

Det jag vill veta just nu är nog vad jag ska använda för funktion för att skicka paketen i PHP...

Tack

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Hoshibo
Det jag vill veta just nu är nog vad jag ska använda för funktion för att skicka paketen i PHP...

Jag är rädd att det finns nog inte många som vill hålla dig i handen genom det här projektet, så det bästa för dig är nog att kolla in PHP-dokumentationen. Att skicka och ta emot paket gör man med socket_send() och socket_read(), och i koden du postade tidigare finns ett exempel på hur det kan gå till.

Visa signatur

Bra, snabbt, billigt; välj två.

Ljud
PC → ODAC/O2 → Sennheiser HD650/Ultrasone PRO 900/...
PC → S.M.S.L SA300 → Bowers & Wilkins 607

Permalänk
Medlem

Jag vill hålla dig i handen!
Som medlem i världens genom tiderna bästa förening Ventrilogänget ser jag fram emot den stora och mycket omtalade uppdateringen du jobbar hårt med!
Jag hoppas att du löser det här tack vare de svar du hittils fått och att du får all den hjälp du behöver i fortsättningen!

Med vänlig hälsning Mindgame.

Visa signatur

Hejsan jag hatar datorbutiken.com

Permalänk
Medlem

Jag förstår inte hur jag skall få iväg datan på rätt sätt...

Här är en kod från ett c++ program

char boom0[] = { 0x00, 0x54, 0xaa, 0x56, 0x24, 0xcf, 0x9f, 0xaf, 0x6f, 0xc6, 0xc2, 0xfe, 0xeb, 0xb5, 0x61, 0x2f, 0xda, 0x78, 0x8c, 0x49, 0xa3, 0x9b, 0x09, 0xf6, 0xc0, 0x6c, 0x3a, 0xe5, 0x83, 0x7c, 0x39, 0x93, 0x8b, 0xf9, 0xe6, 0xb0, 0x5c, 0x2a, 0xd5, 0x73, 0x87, 0x44, 0x9e, 0x96, 0x04, 0xf1, 0xbb, 0x67, 0x35, 0xe0, 0x7e, 0x92, 0x4f, 0xa9, 0xa1, 0x0f, 0xe1, 0xab, 0x57, 0x25, 0xd0, 0x6e, 0x82, 0x3f, 0x99, 0x91, 0xff, 0xec, 0xb6, 0x62, 0x30, 0xdb, 0x79, 0x8d, 0x4a, 0xa4, 0x9c, 0x0a, 0xf7, 0xc1, 0x6d, 0x3b, 0xe6, 0x69, 0x7d, 0x3a }; char boom1[] = { 0x00, 0x01, 0x00 }; WSADATA wsadata; WSAStartup(MAKEWORD(2,2), &wsadata); SOCKADDR_IN host; host.sin_family = AF_INET; host.sin_port = htons(port); host.sin_addr.s_addr = inet_addr(ip); SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(connect(sock, (SOCKADDR *)&host,sizeof(host)) == SOCKET_ERROR) { cout << "Could not connect to " << ip << ":" << port << endl; return 1; } send(sock,boom0,sizeof(boom0),0); send(sock,boom1,sizeof(boom1),0);

Jag förstår ju det mesta av koden väldigt lätt, men just den här delen:

char boom0[] och char boom1[] innehåller paketen om jag har fattat rätt, men hur ska jag få dem i rätt "format" så att de går att skicka genom PHP?

Har försökt på alla sätt jag kan men jag lyckas verkligen inte =(

EDIT: NVM, har hittat en bra lösning...

http://aluigi.altervista.org/papers/ventrcon.zip

Kör programmet genom PHP med parametrar:
exec("ventrcon.exe -n $nick -a $adminpassword -c \"/chan create $channame $chanphonetic $chanpassword\" -p $serverport $serverip")

Vet dock ej hur det kommer att fungera i Linux då det är en .exe fil, finns flera filer i mappen som kanske kan köras i Linux på något sätt men har inte möjlighet att testa just nu =/