First of all let's take a look how the strings are stored. I used lotrounpacker to take a look at the clients data. The site provides two binaries, the dat-unpacker and the localedata-extractor. The first one can be used to unpack client_local_English.dat, the later one will generate a large text file with all the strings. So how do we achieve that?
First of all copy DAT_UNPACKER.exe and datexport.dll to the root folder of LOTRO (it's a .NET 4 binary). After this simply call the binary from a commandline:
DAT_UNPACKER.exe client_local_English.datThis command will run for some time (something like 10 mins), depending on your hardware and fragmentation of your hard disk. It will also eat about 600MB of disk. Once the command is finished you should have folder: data\client_local_English\2XXXXXXX\25XXXXXX\250XXXXX
Extract the LOCALDATAEXTRACTOR.exe into that directory and execute it (again a .NET 4 binary). It will generate the 30MB text file LocalData.txt containing all the strings. You can now browse this file in something capable dealing with larger text files (i.e. not notepad).
Now that we have the strings, how do we find out what the server is telling us? Basically the most simple way is to search for "25" in packtes. If we take the first 0x01000006 packet from the server and search for "25", we will find one occurence. If you now read 5 bytes backwards starting from the byte we found, we will read 250001FE0A. So we take a look at the LocaleData.txt to find "Authentifizierung wird überprüft ..." (in case of the client_local_DE, somehow the strings are wrong when using client_local_English). This is exactly the string the client is displaying during startup.
I also used a disassembler (ILSpy) on both binaries. The result does not provide us anything so far, but we might need to parse the files at a later point when the server is maturing. So far there still is a compile error due to an issue in the disassembling, but so far the code looks usable.
Thank you so much for doing all of this.
AntwortenLöschenHosting a local server for playing LOTRO alone has been a dream of mine for a few years.
I will keep an eye on your progress.
Arggzzz... 500 server error. i wanted to add some basics to your packets. you can't let it hm? write your master thesis about this mmorpg ;-)
AntwortenLöschen(~0x99D9CF8) client_general.dat/ 1st. server packet
61 CF 82 DA 12 37 85 45 9C 4E 1C 6D 01 F1 62 BB
DA 82 CF 61 37 12 45 85 9C 4E 1C 6D 01 F1 62 BB
-------------------|--------|--------|--------------------------------------
reversed | rev. | rev. | equal
Yeah, the code is far from perfect :) Looks like you've hit a bug and also ran into the quota limit :( I'll try to improve this over the next couple of days so we get to a more reliable state.
LöschenAlso AB 64 25 39 FD 54 17 88 from 2nd client packt is found in client_general.dat
AntwortenLöschenMy thoughts are, that these values identify the "correct" game you are playing, e.g. lotro, ddo or some other turbine game...
sorry, once again the whole 16 bytes 1F 6A 20 1F 2B C7 82 47 AB 64 25 39 FD 54 17 88 are found in client_general.dat
AntwortenLöschenhttp://www.qfpost.com/file/d?g=TeaEc03Pl
AntwortenLöschenHow about that? Can we use it to translate raw packets into human readable content? like whatsapp does it, dictionary lookup (eg. replace bytes FE 01 00 25 with (String)Anmeldung...bla bla) So that we can be more precise what's going on into certain packets. Tried to find more out, but til now no success.
This is actually what I'm trying to do :) So far I've been using the raw LocalData.txt which is ... lengthy and slows down startup (if put into memory) or access time (if read only if a string is found). I haven't yet put it into the lotro-analyzer webapp, because such a large file will likely hit another quota :( I'm really starting to thing appengine was a bad decision for this analyzer.
LöschenAgain, trying to find something usefull in the disassembly, how the correct way of parsing the 01 02 02 04 ... 06 XX happens and how we could generate them with better understanding what the XX means. ATM i'm sending each instruction inside a single packet, i know this is overhead, but helps to analyse single instructions better, than merged ones. Also the reaction of the client can be inspected better.
AntwortenLöschenFirst client reaction after successful session setup is afterwards ...06 80 DD... from server. That's the next packet after the one with server world name inside it.
There are some other look up tables with item names or ui elements in, but at this stage, til chara selection i don't think it will be helpful.
Yesterday i just managed to port my existing code to plain C99 and got it working on a 400MHz ARM based embedded linux machine using uClibc quite fine (char selection works, ingame walkaround works with fake position packets [no datfile handler for linux so far]). My packet handler allows for raw/cooked packet receive/send/generation/decoding/decryption/encryption, contains an autodispatcher (for correct heartbeat/corrupt packet handling and all the stuff working in the background) as well as highlevel root- and subcommand detection/creation. As soon as i will have sorted out some leftover quirks i may release it for your enjoyment :-).
AntwortenLöschenI'm just trying to list characters from a server, but unable for the moment
LöschenHello. Can you wrote a program that will be send some packets using Winsock on behalf of the game client to the server (like WPE Pro), which equal pressing of some skill in the game?
AntwortenLöschenI hope this is still being worked on. Lotro appears to be entering maintance mode with the recent round of layoffs. Hopefully this will allow the game to be preserved for years to come
AntwortenLöschenId just like to remind bwgy that this blog is very famous ingame and people are indeed anticipating your work, even if you are taking a break.
AntwortenLöschenWe didn't forget you.
-the people of Brandywine who are fed up with Turbine's greed.
I don't think that this project is going further anymore.
Löschen