вот собственно и вся лирика. с вас результаты. :lol:
у него работа такая =) их по-моему отрезать как-то можно, но вообще, лучше сделай дамп, загрузи его куда-то и дай ссылку. под виндой можно через wireshark посмотреть.
Ну ладно при помощи RPM прикрутил tcpdump.Вот запрос / ответ на GetRoleBase для персонажа с id 0xABCD, может хоть кто то поймет что где.Запрос:02:41:42.191907 IP (tos 0x0, ttl 64, id 43070, offset 0, flags [DF], proto: TCP (6), length: 63) aumanager.48593 > aumanager.29400: P, cksum 0x184f (incorrect (-> 0x060f), 114637507:114637518(11) ack 119188052 win 3898 <nop,nop,timestamp 181516 181360> 0x0000: 4500 003f a83e 4000 4006 7a5d 0a00 020f E..?.>@[email protected]].... 0x0010: 0a00 020f bdd1 72d8 06d5 3ac3 071a aa54 ......r...:....T 0x0020: 8018 0f3a 184f 0000 0101 080a 0002 c50c ...:.O.......... 0x0030: 0002 c470 8bc5 0880 0020 3a00 00ab cd ...p......:....Ответ:02:41:42.191907 IP (tos 0x0, ttl 64, id 59413, offset 0, flags [DF], proto: TCP (6), length: 111) aumanager.29400 > aumanager.48593: P, cksum 0x187f (incorrect (-> 0x729c), 1:60(59) ack 11 win 1024 <nop,nop,timestamp 181516 181516> 0x0000: 4500 006f e815 4000 4006 3a56 0a00 020f E..o..@.@.:V.... 0x0010: 0a00 020f 72d8 bdd1 071a aa54 06d5 3ace ....r......T..:. 0x0020: 8018 0400 187f 0000 0101 080a 0002 c50c ................ 0x0030: 0002 c50c 8bc5 3800 0020 3a00 0000 3c01 ......8...:...<. 0x0040: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x0050: 0000 0000 0000 0000 0000 0000 0000 0000 ................ 0x0060: 0000 0000 0000 0000 0000 0000 0000 00 ............... вот! вот это то что нужно. правда в твоем отрывке еще шапище огромная, непонятно зачем. 8bc5 0880 0020 3a00 00ab cd вот важная часть. соответственно, понять можно как-то так: 8 bc50 8 8000 203a 0000 abcd
во-первых, 0.0.0.0 — айпишник означающий все доступные интерфейсы. к нему, кажется, нельзя коннектиться, но на нем можно висеть. во-вторых, вот это #bind-address = 127.0.0.1 как бы очень глупо, т.к. по-моему по дефолту так и есть 127.0.0.1 — смысл закоментирования? имеет как раз-таки смысл указать bind-address = 0.0.0.0 или если знаешь айпишку прям ее. ну и, наконец, Создал нового пользователя в MySQL с правами такими же, как и у root. — верх глупости.
gcc не нужно компилить, это есть всегда в портах/репозитарих/yum
хоть бы под цитату засунул, а то ваще не комильфо, как будто сам написал :lol:)
колинь, это не какой-то дистрибутив, это лишь среда для запуска линукса. какой линукс на борту — такие и пакеты доступны.
извращенцы. tcpdump для этого существует.
нет, лучше через jio.jar. потому что этот-то для jd.
http://iwebphp.com/ скачай, сделано для jade dynasty. упаковано с помощью Monas (http://ombudi.com/s-download/). чтобы понять как оно работает, варианта два 1) поднять сервер JD и посниферить обмен пакетами, очень просто реализуемо 2) попытаться распаковать байт код и потом его преобразовать в php. сложнореализуемо.
чтобы что-то отправить, нужно знать как это сделать :lol: ты должен оотправлять на сервер byte[]. в нашем случае бинарный поток байт. опкод типа compacked_int, оттого я его так и отправляю. и компакт_инт может быть больше 536870912. говорю же, исправь jio.jar. пусть он у тебя логгирует отправленные данные.
ссылку на дев тоже надо было указать, там же отписано. :lol: комьюнити доплясалось куда до большего, чем до публикации патчера, моих негативных взглядов на это все в целом и прочего. самое главное, что эмулятор теперь не паблик, а закрытый проект. у нас уже достаточно хорошо все продвинулось. сниферы, боты (всяческие, ага, начиная от фарма, чат-бота, кончая грабингом содержимого котов на продажу), вход в мир, с кое-какими другими действиями.
бог мой, а почему ты считаешь, что там http-сервер и ему надо слать заголовки? и опять же, логин-пароль не нужны. даже если бы и было что-то, то ключ для RC4, но его нет, просто открывай поток и начинай отправлять. length — длина отправляемых данных в байтах. почти наверняка нужна. по крайней мере в эмуле у нас нужна. <?php function cuint($data) { if($data < 64) return pack("C", $data); else if($data < 16384) return pack("S", ($data | 0x8000)); else if($data < 536870912) return pack("I", ($data | 0xC0000000)); return pack("c", -32) . pack("I", $data); } $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // http://ru.php.net/manual/en/function.socket-create.php if(!$sock) die(socket_strerror(socket_last_error())); // 127.0.0.1:29100 - Deliveryd // 127.0.0.1:29400 - GameDbd // 127.0.0.1:29401 - UniqueNamed // 127.0.0.1:29500 - Factiond if(socket_connect($sock, "127.0.0.1", "29400")) // думаю через него, http://ru.php.net/manual/en/function.socket-connect.php { socket_set_block($sock); // блокируем скрипт, пока данные не будут отправлены-получены. echo 'rpc debug="0" name="GetUser" type="3002" argument="UserID" result="UserRes" table="user" attr="get" retcode="retcode" value="value" maxsize="4096" prior="1" timeout="30"<br>'; $data = cuint(3002) . pack("V*", 4, 32); // пакет отправляемый серверу. хз как его слать досканально, но полагаю, что не так. // вероятнее всего, опкод (3002), длина пакета (4 или 8), int userId if (false !== ($sbytes = socket_send($sock, $data, 8192, 0))) { echo "Send $sbytes bytes from socket_send(). <br>"; } else { echo "socket_send() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n"; } if (false !== ($rbytes = socket_recv($sock, $buf, 8192, 0))) { echo "Read $rbytes bytes from socket_recv(). Closing socket..."; } else { echo "socket_recv() failed; reason: " . socket_strerror(socket_last_error($socket)) . "\n"; } socket_set_nonblock($sock); socket_close($sock); } else { die(socket_strerror(socket_last_error())); } на это gamedbd ругнулся мне, что у меня «неверный протокол» и отписал, что получил. ну, видимо процесс идет в примерно таком образе. осталось только понять как правильно кидать данные. я бы немного изменил jio.jar и сделал бы там принт отправляемых данных в файл. <rpcdata name="UserID"> <variable name="id" type="int" default="0"/> </rpcdata> <rpcdata name="StockLog" attr="vector"> <variable name="tid" type="int" default="0"/> <variable name="time" type="int" default="0"/> <variable name="result" type="short" default="0"/> <variable name="volume" type="short" default="0"/> <variable name="cost" type="int" default="0"/> </rpcdata> <rpcdata name="User"> <variable name="userid" type="int" default="0"/> <variable name="rolelist" type="int" default="0"/> <variable name="cash" type="int" default="0"/> <variable name="money" type="int" default="0"/> <variable name="cash_add" type="int" default="0"/> <variable name="cash_buy" type="int" default="0"/> <variable name="cash_sell" type="int" default="0"/> <variable name="cash_used" type="int" default="0"/> <variable name="add_serial" type="int" default="0"/> <variable name="use_serial" type="int" default="0"/> <variable name="exg_log" type="StockLogVector" default="StockLogVector()"/> <variable name="addiction" type="Octets" attr="ref"/> <variable name="reserved0" type="byte" default="0"/> <variable name="reserved1" type="short" default="0"/> <variable name="reserved2" type="int" default="0"/> <variable name="reserved3" type="int" default="0"/> <variable name="reserved4" type="int" default="0"/> </rpcdata> <rpcdata name="UserRes"> <variable name="retcode" type="int" default="-1"/> <variable name="value" type="User"/> </rpcdata> <rpcdata name="UserPair"> <variable name="key" type="UserID"/> <variable name="value" type="User"/> </rpcdata> <rpc debug="0" name="PutUser" type="3001" argument="UserPair" result="RpcRetcode" table="user" attr="put" key="key" value="value" maxsize="4096" prior="1" timeout="20"/> <rpc debug="0" name="GetUser" type="3002" argument="UserID" result="UserRes" table="user" attr="get" retcode="retcode" value="value" maxsize="4096" prior="1" timeout="30"/>
Просто смотрел в iweb и увидел там координаты! а делать буду по аналогии с pomm wow http://wow.lanexpress.ru/useful/maps/pomm.php вот как пример, это отличная вещь) Кстати если просто без авторизации сласть всякую хрень на порт 29400, база падает. хз почему И всётаки недокуриваю про обмен ключами и авторизацию, в моём понимании авторизация через сокет на php это бэсик авторизация, но в этом процессе никогда не было никаких ключей)) Буду смотреть iweb, gouranga, не подскажешь в каком файле в iweb непосредственно обмен ключами идёт? Просто то что лежит в config.xml это данные для отправки, правильно? Но перед отправкой сначало надо как ты сам сказал авторизироваться(обменяться ключами) дело в том, что информация о персонажах хранится не в sql базе. тебе придется проявить значительные усилия, для кеширования и управления базой Ну в gamedbd как я понял, не там чтоли? Какие ещё усилия по кэширования? Опять же, я же написал, что ошибся. авторизации по-умолчанию требует только uniquenamed. Для остальных рекомендую, кстати, поставить. Поэтому просто соединяешься и начинаешь слать данные. например, начни с <rpc debug="0" name="GetUser" type="3002" argument="UserID" result="UserRes" table="user" attr="get" retcode="retcode" value="value" maxsize="4096" prior="1" timeout="30"/> отправляешь type|length|userid, где length в данном случае 4. 2) запросить для каждой учетки список персов и взять только тех что онлайн. Помойму нельзя с одного акаунта за двух чаров играть(ну во всяком случаи так в вове) поэтому просто берём id онлайн аккаунтов из базы point отправляем их куда и как надо) и получаем координаты чаров нельзя, суть моего алгоритма ты видимо не понял, перечитай еще раз, это вкопирку что ты написал) Так это те ключи? isec = 2 iseckey = hgzmbmeyrQaivu2pTikcp1svqcueef osec = 2 oseckey = 7mlyiidbm0kntvhRgjhjzdczDtbhnh Да, только видимо gamedbd они не нужны.
Botchal, юзербары более-менее реалистично. карты — сложнореализуемо. дело в том, что информация о персонажах хранится не в sql базе. тебе придется проявить значительные усилия, для кеширования и управления базой. но в целом, алгоритм и для карты и для списка персов онлайн на поверхности: 1) взять userid из базы authd, которые онлайн (таблица point, кажется) 2) запросить для каждой учетки список персов и взять только тех что онлайн. 3) нарисовать) alexdnepro, да не нужно все переписывать. Только маршалинг и все. Остальное по мере надобности.
о чём я и говорил, нафиг этот гемор) Проще состыковать php с явой, яву повесить на локалхост, написать там несколько скриптов, вызывать их с php и парсить полученные данные. а смысл стоить такую городину, если тебе, например, нужен топ игроков или персонажи онлайн? гемора на самом деле не так-то и много, хуже того, весь протокол между айвебом и геймбд — описан в config.xml айвеба.
Botchal, зачем читать файлы чаров? Там старый-старый Berkley Db (версии 4.2 кажется, когда только появилась поддержка java), заморишься переделывать новые коннекторы. Iweb не работает с данными таким образом. Он соединяется с сервером Gamedbd и прочими серверами, и обменивается с ними данными. Данные шифруются с помощью RC4, и я подозреваю, что еще есть авторизация используя isec/iseckey (input) и osec/oseckey (output), как у клиента с сервером, посредством HMAC_MD5. Т.е. шифрование происходит в обе стороны: от iweb к gamedbd через isec*, от gamedbd к iweb через osec*. Я в этом не уверен, но это было бы логично, и лично я бы так и сделал. alexdnepro, там не так много, главное, правильно маршалить все. самое сложное — обработать compact_int. На шарпе примерно такой Extension: public uint ReadCUInt(this System.IO.BinaryReader reader) { if (reader.BaseStream.Position == reader.BaseStream.Length) throw new IOException(); long bytesLeft = reader.BaseStream.Length - reader.BaseStream.Position; byte firstByte = reader.ReadByte(); if (firstByte < 0x80) { return (uint)firstByte & 0x7F; } else if (firstByte < 0xC0) { if (bytesLeft < 2) throw new IOException(); reader.BaseStream.Position--; return (uint)reader.ReadUInt16() & 0x3FFF; } else if (firstByte < 0xE0) { if (bytesLeft < 4) throw new IOException(); reader.BaseStream.Position--; return reader.ReadUInt32() & 0x1FFFFFFF; } else { if (bytesLeft < 5) throw new IOException(); return reader.ReadUInt32(); } } P.S. это, кстати, потенциальная дырка, если какие-то нубы держат сокеты серверов не на 127.0.0.1 — их можно запросто уложить флудом, а они увидят только BUFFER_OVERFLOW. P.P.S. чтобы понять как и что: открываем(google.ru < jd-gui) iweb, и смотрим как происходит обмен всем этим. =) upd. конкретно я наврал. =) Итак, важные параметры: ibuffermax — размер входного буфера obuffermax — размер выходного буфера isec — номер входного алгоритма шифрования iseckey — параметр входного алгоритма osec — номер выходного алгоритма шифрования oseckey — параметр выходного алгоритма По-умолчанию, isec и osec равны 0. Доступные алгоритмы шифрования (isec/osec должен быть равным или параметру type или name): <security> <entity class="com.goldhuman.Common.Security.NullSecurity" name="NullSecurity" type="0"/> <entity class="com.goldhuman.Common.Security.Random" name="Random" type="1"/> <entity class="com.goldhuman.Common.Security.ARCFourSecurity" name="ARCFourSecurity" type="2"/> <entity class="com.goldhuman.Common.Security.MD5Hash" name="MD5Hash" type="3"/> <entity class="com.goldhuman.Common.Security.HMAC_MD5Hash" name="HMAC_MD5Hash" type="4"/> </security> Из всех вышеперечисленных серверов // 127.0.0.1:29100 - Deliveryd // 127.0.0.1:29400 - GameDbd // 127.0.0.1:29500 - Factiond // 127.0.0.1:29401 - UniqueNamed стоит выделить только UniqueNamed — у него есть шифрование по алгоритму RC4 (isec и osec = 2). Остальные должны отдавать данные просто так, главное правильно реализовать протокол. Чтобы таки что-то сделать, смотрим конфиг айвеба и реализовываем нужные классы и поток байт (октетов), функция которую я написал вверху нужна все-равно. =) P.P.P.S. таки получается, что задать шифрование можно любому под-серверу ПВ.
Имена участников (разделяйте запятой).