• Welcome to Valhalla Legends Archive.
 

[Solved]D2 Game Server Packets

Started by Ringo, May 05, 2005, 02:20 PM

Previous topic - Next topic

Tazo

do a google search for free c++ compiler

OnlyMeat

Quote from: laurion on May 06, 2005, 09:56 PM
do a google search for free c++ compiler

Actually there is nothing in that code that is c++. You could compile it in pure c.

shout

I wonder what

assert(0)

did. The tool tip is as follows:

#define assert((void)0)


???

Ringo

Quote from: UserLoser on May 06, 2005, 01:58 PM

Just use D2Client.dll

I looked everywhere for it and all i could find was  this: http://forum.valhallalegends.com/phpbbs/index.php?topic=3357.0

Also thanks Shout / laurion for helping!

Tazo

#34
yea that was a bad .dll so i fixed it, here
d2.zip
should work fine now.

source:
d2source.zip
source is C; was made using Dev-C++

Ringo

#35
Quote from: laurion on May 07, 2005, 07:05 AM
yea that was a bad .dll so i fixed it, here
d2.zip
should work fine now.

source:
d2source.zip
source is C; was made using Dev-C++

Thanks!
Im still getting the same problem, Entry point in the dll not found.
I found dev c++ on the web and downloaded it but have no clue how to use it.
Also im not sure how to open the source files correctly. (cant get it to compile)
I was wundering if it was how i was trying to call the functions or if it was the functions not letting me call them.
How would i open the 2 files together and change the functions from:

unsigned char*GamePacketSize(unsigned char *data, unsigned int *size,
                             unsigned int *offset)

int GamePacketDecode(unsigned char *indata, unsigned int insize,
                    unsigned char *outdata, unsigned int outmax,
                    unsigned int *outsize)


to:

unsigned char __stdcall *GamePacketSize(unsigned char *data, unsigned int *size,
                             unsigned int *offset)

int __stdcall  GamePacketDecode(unsigned char *indata, unsigned int insize,
                    unsigned char *outdata, unsigned int outmax,
                    unsigned int *outsize)


And would there be anything else that would need to be changed to call the functions like this?

Again thank you very much for helping!

Blaze

Quote
Mitosis: Haha, Im great arent I!
hismajesty[yL]: No

QwertyMonster


Warrior

Are you exporting the functions (using a .def file) correctly?
Quote from: effect on March 09, 2006, 11:52 PM
Islam is a steaming pile of fucking dog shit. Everything about it is flawed, anybody who believes in it is a terrorist, if you disagree with me, then im sorry your wrong.

Quote from: Rule on May 07, 2006, 01:30 PM
Why don't you stop being American and start acting like a decent human?

Ringo

#39
Hmm iv tryed following tha tutorial as a referance, but it seems somwhat differnt to how it shows to do it, aslo i had the source  laurion posted as a dev referance, thanks!

Iv created new project in dev c++ with a c and a h file, iv got this atm (it does return some strange shit)

the c file:

/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

unsigned int CharIndex[] = {
   0x0247, 0x0236, 0x0225, 0x0214, 0x0203, 0x01F2, 0x01E1, 0x01D0,
   0x01BF, 0x01AE, 0x019D, 0x018C, 0x017B, 0x016A, 0x0161, 0x0158,
   0x014F, 0x0146, 0x013D, 0x0134, 0x012B, 0x0122, 0x0119, 0x0110,
   0x0107, 0x00FE, 0x00F5, 0x00EC, 0x00E3, 0x00DA, 0x00D1, 0x00C8,
   0x00BF, 0x00B6, 0x00AD, 0x00A8, 0x00A3, 0x009E, 0x0099, 0x0094,
   0x008F, 0x008A, 0x0085, 0x0080, 0x007B, 0x0076, 0x0071, 0x006C,
   0x0069, 0x0066, 0x0063, 0x0060, 0x005D, 0x005A, 0x0057, 0x0054,
   0x0051, 0x004E, 0x004B, 0x0048, 0x0045, 0x0042, 0x003F, 0x003F,
   0x003C, 0x003C, 0x0039, 0x0039, 0x0036, 0x0036, 0x0033, 0x0033,
   0x0030, 0x0030, 0x002D, 0x002D, 0x002A, 0x002A, 0x0027, 0x0027,
   0x0024, 0x0024, 0x0021, 0x0021, 0x001E, 0x001E, 0x001B, 0x001B,
   0x0018, 0x0018, 0x0015, 0x0015, 0x0012, 0x0012, 0x0012, 0x0012,
   0x000F, 0x000F, 0x000F, 0x000F, 0x000C, 0x000C, 0x000C, 0x000C,
   0x0009, 0x0009, 0x0009, 0x0009, 0x0006, 0x0006, 0x0006, 0x0006,
   0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
   0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
   0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
};
unsigned char CharTable[] = {
   0x00,0x00,0x01,0x00,0x01,0x04,0x00,0xFF,0x06,0x00,0x14,0x06,
   0x00,0x13,0x06,0x00,0x05,0x06,0x00,0x02,0x06,0x00,0x80,0x07,
   0x00,0x6D,0x07,0x00,0x69,0x07,0x00,0x68,0x07,0x00,0x67,0x07,
   0x00,0x1E,0x07,0x00,0x15,0x07,0x00,0x12,0x07,0x00,0x0D,0x07,
   0x00,0x0A,0x07,0x00,0x08,0x07,0x00,0x07,0x07,0x00,0x06,0x07,
   0x00,0x04,0x07,0x00,0x03,0x07,0x00,0x6C,0x08,0x00,0x51,0x08,
   0x00,0x20,0x08,0x00,0x1F,0x08,0x00,0x1D,0x08,0x00,0x18,0x08,
   0x00,0x17,0x08,0x00,0x16,0x08,0x00,0x11,0x08,0x00,0x10,0x08,
   0x00,0x0F,0x08,0x00,0x0C,0x08,0x00,0x0B,0x08,0x00,0x09,0x08,
   0x01,0x96,0x09,0x97,0x09,0x01,0x90,0x09,0x95,0x09,0x01,0x64,
   0x09,0x6B,0x09,0x01,0x62,0x09,0x63,0x09,0x01,0x56,0x09,0x58,
   0x09,0x01,0x52,0x09,0x55,0x09,0x01,0x4D,0x09,0x50,0x09,0x01,
   0x45,0x09,0x4C,0x09,0x01,0x40,0x09,0x43,0x09,0x01,0x31,0x09,
   0x3B,0x09,0x01,0x28,0x09,0x30,0x09,0x01,0x1A,0x09,0x25,0x09,
   0x01,0x0E,0x09,0x19,0x09,0x02,0xE2,0x0A,0xE8,0x0A,0xF0,0x0A,
   0xF8,0x0A,0x02,0xC0,0x0A,0xC2,0x0A,0xCE,0x0A,0xE0,0x0A,0x02,
   0xA0,0x0A,0xA2,0x0A,0xB0,0x0A,0xB8,0x0A,0x02,0x8A,0x0A,0x8F,
   0x0A,0x93,0x0A,0x98,0x0A,0x02,0x81,0x0A,0x82,0x0A,0x83,0x0A,
   0x89,0x0A,0x02,0x7C,0x0A,0x7D,0x0A,0x7E,0x0A,0x7F,0x0A,0x02,
   0x77,0x0A,0x78,0x0A,0x79,0x0A,0x7A,0x0A,0x02,0x73,0x0A,0x74,
   0x0A,0x75,0x0A,0x76,0x0A,0x02,0x6E,0x0A,0x6F,0x0A,0x70,0x0A,
   0x72,0x0A,0x02,0x61,0x0A,0x65,0x0A,0x66,0x0A,0x6A,0x0A,0x02,
   0x5D,0x0A,0x5E,0x0A,0x5F,0x0A,0x60,0x0A,0x02,0x57,0x0A,0x59,
   0x0A,0x5A,0x0A,0x5B,0x0A,0x02,0x4A,0x0A,0x4B,0x0A,0x4E,0x0A,
   0x53,0x0A,0x02,0x46,0x0A,0x47,0x0A,0x48,0x0A,0x49,0x0A,0x02,
   0x3F,0x0A,0x41,0x0A,0x42,0x0A,0x44,0x0A,0x02,0x3A,0x0A,0x3C,
   0x0A,0x3D,0x0A,0x3E,0x0A,0x02,0x36,0x0A,0x37,0x0A,0x38,0x0A,
   0x39,0x0A,0x02,0x32,0x0A,0x33,0x0A,0x34,0x0A,0x35,0x0A,0x02,
   0x2B,0x0A,0x2C,0x0A,0x2D,0x0A,0x2E,0x0A,0x02,0x26,0x0A,0x27,
   0x0A,0x29,0x0A,0x2A,0x0A,0x02,0x21,0x0A,0x22,0x0A,0x23,0x0A,
   0x24,0x0A,0x03,0xFB,0x0B,0xFC,0x0B,0xFD,0x0B,0xFE,0x0B,0x1B,
   0x0A,0x1B,0x0A,0x1C,0x0A,0x1C,0x0A,0x03,0xF2,0x0B,0xF3,0x0B,
   0xF4,0x0B,0xF5,0x0B,0xF6,0x0B,0xF7,0x0B,0xF9,0x0B,0xFA,0x0B,
   0x03,0xE9,0x0B,0xEA,0x0B,0xEB,0x0B,0xEC,0x0B,0xED,0x0B,0xEE,
   0x0B,0xEF,0x0B,0xF1,0x0B,0x03,0xDE,0x0B,0xDF,0x0B,0xE1,0x0B,
   0xE3,0x0B,0xE4,0x0B,0xE5,0x0B,0xE6,0x0B,0xE7,0x0B,0x03,0xD6,
   0x0B,0xD7,0x0B,0xD8,0x0B,0xD9,0x0B,0xDA,0x0B,0xDB,0x0B,0xDC,
   0x0B,0xDD,0x0B,0x03,0xCD,0x0B,0xCF,0x0B,0xD0,0x0B,0xD1,0x0B,
   0xD2,0x0B,0xD3,0x0B,0xD4,0x0B,0xD5,0x0B,0x03,0xC5,0x0B,0xC6,
   0x0B,0xC7,0x0B,0xC8,0x0B,0xC9,0x0B,0xCA,0x0B,0xCB,0x0B,0xCC,
   0x0B,0x03,0xBB,0x0B,0xBC,0x0B,0xBD,0x0B,0xBE,0x0B,0xBF,0x0B,
   0xC1,0x0B,0xC3,0x0B,0xC4,0x0B,0x03,0xB2,0x0B,0xB3,0x0B,0xB4,
   0x0B,0xB5,0x0B,0xB6,0x0B,0xB7,0x0B,0xB9,0x0B,0xBA,0x0B,0x03,
   0xA9,0x0B,0xAA,0x0B,0xAB,0x0B,0xAC,0x0B,0xAD,0x0B,0xAE,0x0B,
   0xAF,0x0B,0xB1,0x0B,0x03,0x9F,0x0B,0xA1,0x0B,0xA3,0x0B,0xA4,
   0x0B,0xA5,0x0B,0xA6,0x0B,0xA7,0x0B,0xA8,0x0B,0x03,0x92,0x0B,
   0x94,0x0B,0x99,0x0B,0x9A,0x0B,0x9B,0x0B,0x9C,0x0B,0x9D,0x0B,
   0x9E,0x0B,0x03,0x86,0x0B,0x87,0x0B,0x88,0x0B,0x8B,0x0B,0x8C,
   0x0B,0x8D,0x0B,0x8E,0x0B,0x91,0x0B,0x03,0x2F,0x0B,0x4F,0x0B,
   0x54,0x0B,0x5C,0x0B,0x71,0x0B,0x7B,0x0B,0x84,0x0B,0x85,0x0B
};
unsigned int BitMasks[] = {
   0x0000,0x0001,0x0003,0x0007,0x000F,0x001F,0x003F,0x007F,
   0x00FF,0x01FF,0x03FF,0x07FF,0x0FFF,0x1FFF,0x3FFF,0x7FFF
};

DLLIMPORT unsigned char __stdcall *GamePacketSize(unsigned char *data, unsigned int *size,
                             unsigned int *offset)
{
   unsigned int a;
   if (data[0] < 0xF0) {
       *size = data[0] - 1;
       *offset = 1;
       return &data[1];
   }
   a = (data[0] & 0xF) << 8;
   *size = a + data[1] - 2;
   *offset = 2;
   return &data[2];
}

DLLIMPORT int __stdcall GamePacketDecode(unsigned char *indata, unsigned int insize,
                    unsigned char *outdata, unsigned int outmax,
                    unsigned int *outsize)
{
   unsigned int a, b, c, d;
   unsigned int maxcnt, index, cnt;
   unsigned char *outptr, *inptr;
   int size;
   b = 0;
   size = insize;
   inptr = indata;
   maxcnt = outmax;
   outptr = outdata;
   cnt = 0x20;
   
   while (1) {
       if (cnt >= 0x8) {
           while (size > 0 && cnt >= 8) {
               cnt -= 0x8;
               size--;
               a = *inptr++ << cnt;
               b |= a;
           };
       }
       index = CharIndex[b >> 0x18];
       a = CharTable[index];
       d = (b >> (0x18 - a)) & BitMasks[a];
       c = CharTable[index + 2*d + 2];
       cnt += c;
       if (cnt > 0x20) {
           *outsize = outmax - maxcnt;
           return 1;
       }
       if (maxcnt-- == 0)
           return 0;
       a = CharTable[index + 2*d + 1];
       *outptr++ = (unsigned char)a;
       b <<= (c & 0xFF);
   }
   assert(0);
   return 0;
}



BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}


the h file:

#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */


//DLLIMPORT unsigned char *GamePacketSize (unsigned char);
//DLLIMPORT int GamePacketDecode (int);


#endif /* _DLL_H_ */



Ringo

In:

3F 1F 1C 30 02 10 52 1D 29 0A 85 D5 22 AB 8D 66 65 96 9E 88 59 B0 B0 07 97 C0 B8 9C 36 99 81 76 96 A9 0C 00 84 14 87 4E 04 4C C0 23 4F 44 2C D8 52 1C 80 01 38 02 B8 25 33 1B 9A 7A 21 66 C0


out:

03 00 8A 01 F2 AA B3 23 67 E4 95 67 47 01 72 0F 63 14 01 00 07 4B 00 05 6D 91 97 9E 3D 74 0F 9E 14 80 67 F2 AA B3 23 01 94 0F 71 14 01 00 07 4B 00 05 67 22 2F 3D 7B 01 AE 0F 75 14 01 00


That looks a good sign!
I'v only tested it with that packet and havent tryed running incoming data through it yet. looks like theres a few null terminated string in there tho!


Thanks to everyone who helped!
Mostly to laurion, thank you ;)
Thanks to Brand.X for posting the code back in oct 2003.
Also thanks to MyndFyre, i will carry on trying to port it to VB in the not so distant future as i have your post to help me through it and can now 'see' the packets, so it should give me a bigger picture over time of how the decompression is fully working (and my head a rest)

I think there are a few others looking for d2 packet decompression as well, so i will put there dll here for them.
Iv also included a txt in the zip showing how to use the exports in VB6 to save people some trubble.

D2GS.dll

Ringo

Seems to crash when i try run large packets through it (like when on connecting to the game server)
Im thinking it might be a memery leek or somthing but im unsure.
Iv currently got it working by puting any packet over 15 bytes or under 100 through it and it seems to just about beable to hold out.

More of a warning to anyone that wants to use it.

The dll code is the same as the code posted 2 posts up and my calls to the dll in VB6 look somthing like this:

On Error Resume Next
Dim offset As Long
Dim Size As Long
Dim H1 As String
Dim H2 As Integer
Dim outdata As String
Dim maxsize As Long
Dim outsize As Long

H1 = GamePacketSize(data, Size, offset)
outdata = String(Size, vbNullChar)
H2 = GamePacketDecode(Mid(data, offset), Size, outdata, Len(outdata), outsize)


could anyone take a few min to scroll through the dll source (above) and check that im not missing anything, and that my calls in VB match those in the dll? i kinda tolk a guess int was refering to an integer and char was refering to a String, im hoping i havent got somthing silly like that mixed up but still unsure.



Tazo

Quote from: Ringo on May 08, 2005, 01:21 AM
Seems to crash when i try run large packets through it (like when on connecting to the game server)
Im thinking it might be a memery leek or somthing but im unsure.
Iv currently got it working by puting any packet over 15 bytes or under 100 through it and it seems to just about beable to hold out.

More of a warning to anyone that wants to use it.

The dll code is the same as the code posted 2 posts up and my calls to the dll in VB6 look somthing like this:

On Error Resume Next
Dim offset As Long
Dim Size As Long
Dim H1 As String
Dim H2 As Integer
Dim outdata As String
Dim maxsize As Long
Dim outsize As Long

H1 = GamePacketSize(data, Size, offset)
outdata = String(Size, vbNullChar)
H2 = GamePacketDecode(Mid(data, offset), Size, outdata, Len(outdata), outsize)


could anyone take a few min to scroll through the dll source (above) and check that im not missing anything, and that my calls in VB match those in the dll? i kinda tolk a guess int was refering to an integer and char was refering to a String, im hoping i havent got somthing silly like that mixed up but still unsure.



I think what Brand.X posted might be outdated, obsolete..?

Ringo

Quote from: laurion on May 08, 2005, 10:23 AM
I think what Brand.X posted might be outdated, obsolete..?

Thats what i 1st thought, seems as mid 1.10 they introduced alot of new rune word items.
After some testing this after noon i found that it seems to be decompressing the packets ok:
Sent from D2 >
15 01 00 54 45 53 54 20 54 45 53 54 20 54 45 53    ...TEST TEST TES
54 20 54 45 53 54 20 54 45 53 54 20 54 45 53 54    T TEST TEST TEST
20 67 6F 74 20 49 74 3F 20 3B 29 00 00 00           got It? ;)...




Recv from my bot >
42 0F 1E BF C5 F2 8A B5 2A 86 D1 90 6C 14 C6 41    B.......*...l..A
CA 00 8A 02 D8 02 3B 00 45 01 6C 01 1D 80 22 80    ......;.E.l...".
B6 00 8E C0 11 40 5B 00 47 60 08 A0 2D 80 23 B0    .....@[.G`..-.#.
04 50 16 C0 11 DA 91 A4 6D 3B 15 C6 D1 40 EC 9A    .P......m;...@..
1F 40                                              .@

After decomression:
06 C9 01 00 02 00 00 00 00 00 5B 4C 69 67 68 74    ..........[Light
61 73 44 61 79 00 54 45 53 54 20 54 45 53 54 20    asDay.TEST TEST
54 45 53 54 20 54 45 53 54 20 54 45 53 54 20 54    TEST TEST TEST T
45 53 54 20 67 6F 74 20 49 74 3F 20 3B 00 00 00    EST got It? ;...
00                                                 .


The problem seems to be when its in the middle of decompressing a packet and another 1 gets put into the function, it causes VB6 to generate a error report.

After linking data to a command click sub and holding down the enter key, i did notice my cpu useage go up a fair bit but VB6 didnt crash for some reassion.

Im pritty sure its a memery leek somwhere in the dll thats causeing the slow decompression to take place but im not sure where i should be looking in the dll to try fix it, if thats where the problem is.

Also if i dont use 'On Erorr Resume Next' when calling the functions in VB6, i get a run time error '7' out of memery.

Im right out of ideas on this one :(

Tazo

Quote from: Ringo on May 08, 2005, 05:53 PM
...The problem seems to be when its in the middle of decompressing a packet and another 1 gets put into the function, it causes VB6 to generate a error report.
Create a queue type of thing. Add a listview to your form, or create an array. Everytime new data is received, add it to the array or listview. Create a timer that fires every second, or whatever, and decompress the first item, and remove it. That would solve that problem (if that is your problem, what you said in the quote).

|