Noticias:

SMF - Just Installed!

Menú principal

Main Season 17 Unpacked

Publicado por Dakosmu, Mar 12, 2025, 04:32 AM

Tema anterior - Siguiente tema
Keywords Unpacked

Dakosmu

Main Season 17 Unpacked



¡Hola a todos!

La información incluye el desempaquetado de la versión 1.19.75 (solo para desplazamientos de búsqueda) y la fuente para convertir los nuevos encabezados/subcódigos de paquetes de la Temporada 17+ a paquetes antiguos.





Descargar
https://github.com/phit666/TwistPackets

Mirror
https://mega.nz/folder/3V5yiBoK#8nrBZmvz7DUJE6AjaWQQoA


Creditos
phit666
Bon Dia

Dakosmu

Problemas con la fuente publicada



Después de investigar y pasar algunas horas, no he podido hacer que funcione con la fuente publicada... la añadí al cliente y tampoco funcionó del lado del servidor...

Paquete de inicio de sesión antiguo:
Header : 0xC1
Headcode: 0xF1
Subcode : 0x00

Nuevo paquete de inicio de sesión:
Header : 0xC1
Headcode: 0x3A
Subcode : 0x00
Bon Dia

Dakosmu

#2
Agregar en el lado del servidor


Código:
void ProtocolCoreEx(BYTE protoNum, unsigned char * aRecv, int aLen, short aIndex, DWORD Encrypt, int Serial)
{
    BYTE result = ConvertC2S(aRecv);
    protoNum = (result == 0xFF) ? protoNum : result;

    .......
}

int DataSend(int aIndex, LPBYTE pMsg, DWORD dwSize)
{
    BYTE lpMsg[12288] = { 0 };
    memcpy(lpMsg, pMsg, dwSize); // mejor hacer una copia del paquete original en stack/heap

    ConvertS2C(lpMsg);
    ....
}
Bon Dia

Dakosmu

Patrón de paquetes no encontrado


Comentario:
No he encontrado un patrón aún, así que sí, es manual. Además de recortar los nuevos paquetes, también necesitarás comparar los códigos de tu versión principal más cercana que funcione con la nueva versión. He comparado la versión principal de la Temporada 18 y la mayoría de los paquetes estaban nuevamente desordenados, así que parece que Webzen está alterando esto en cada lanzamiento. Si revisas los cambios en el protocolo principal, los headcodes y subcodes han sido literalmente intercambiados con otros. Parece que Webzen está parcheando esto durante el tiempo de compilación, el paquete no pasa por ninguna rutina para correcciones de head/subcodes. Mi lanzamiento aquí aún no está completo y hay algunos errores en él.

Aquí está desempaquetado (solo para investigación de offsets) la versión principal de la Temporada 18.


Descargar
https://drive.google.com/file/d/1nDuurHUJIOHKqp89FtCWW473WuMXPWZD/view

Mirror
https://mega.nz/file/SIYwjKRJ#5vBOdlAIAelk8Pp45TMZkUld-HX1X7JfwyHNrwe-SHM
Bon Dia

Dakosmu

Jewel of Harmony Renewal, estructuras de paquetes de respuesta

Código:
struct PMSG_ANS_JOH_REMOVE_INVENTORY
{
    PBMSG_HEAD2 h; // 0x3E 0x35
    BYTE btResult; // 0 - éxito
};

// cuando se hace clic en el botón de concesión, estas son las opciones aleatorias que se enviarán como respuesta
struct PMSG_JOHGRANTOPTRES
{
    PBMSG_HEAD h;    // 0x3E
    BYTE subcode;    // 0x33
    BYTE Result; // 0 - mezcla válida
    BYTE Opt1; // opción JOH 1
    WORD Val1; // valor de opción 1
    BYTE Opt2; // opción JOH 2
    WORD Val2; // valor de opción 2
    BYTE Opt3; // opción JOH 3
    WORD Val3; // valor de opción 3
};

// respuesta para confirmar el botón
struct PMSG_ANS_JOHCONFIRM_GRANT_INVENTORY
{
    PBMSG_HEAD2 h; // 0x3E 0x10
    BYTE btPos; // posición del objeto principal
    DWORD dwResult; // necesita ser verificado, pero 0 estará bien
};

struct PMSG_ANS_HRS_REFINE_INVENTORY
{
    PBMSG_HEAD2 h; // 0x3E 0x3A
    BYTE btResult; // 0 - mezcla válida
    BYTE btPos[4]; // [0] conteo de Piedra de Refinamiento Superior exitosa [1] conteo de ingredientes exc. [2] conteo de Piedra de Refinamiento Inferior exitosa [3] conteo de ingredientes no exc.
};

struct PMSG_ANS_JOH_REFINE_INVENTORY
{
    PBMSG_HEAD2 h; // 0x3E 0x34
    BYTE btResult; // 0 - éxito, 1 - mezcla fallida
};

#pragma pack(1)
// lista de elementos en el inventario o bóveda con opciones JOH
struct PMSG_JOHATTRLISTCOUNT
{
    PWMSG_HEAD h;    // 0x3E
    BYTE subcode;    // 0x3B
    BYTE Type; // 0 - listar elemento en el inventario, 2 - listar elemento en la bóveda
    WORD Count;    // conteo de elementos con opciones JOH
};

struct PMSG_JOHATTRLIST
{
    BYTE Pos;    // posición del elemento en el inventario/bóveda
    BYTE Opt1; // opción JOH 1
    WORD Val1; // valor de opción 1
    BYTE Opt2; // opción JOH 2
    WORD Val2; // valor de opción 2
    BYTE Opt3; // opción JOH 3
    WORD Val3; // valor de opción 3
};
#pragma pack()
Bon Dia

Dakosmu

Método rápido para obtener los nuevos códigos de cabeza/subcódigo


Comentario:
Aquí está la forma más rápida de obtener los nuevos códigos de cabeza/subcódigo, usando IDA para descompilar ambos interruptores de protocolo. En la imagen a continuación, verás cómo Webzen cambia las posiciones de los interruptores, pero ten en cuenta que solo se ha cambiado el valor del interruptor, no las rutinas. Así que en la imagen a continuación, el subcódigo 0 de S16 es igual al subcódigo 1 de S17, el subcódigo 1 de S16 es igual al subcódigo 7 de S17, y así sucesivamente...

Debes usar S16 como referencia, ya que es la última versión principal con códigos de cabeza/subcódigo intactos.



Bon Dia

Dakosmu

Códigos de cabeza incompletos de la versión principal 1.19.75


Comentario:
Códigos de cabeza incompletos de la versión principal 1.19.75 que investigué hace años.

Enlace a la documentación: Hoja de cálculo de Google


Mirror
https://mega.nz/file/TBwTgSAY#kV-mQrmlEulp44mjOsykrqi8J_9225Ttv-O2LDmBzXQ
Bon Dia

Dakosmu

Estructuras de ViewPortList con tamaños correctos

Código C++:
#pragma pack(1)
struct PMSG_VIEWPORTCREATE
{
    BYTE NumberH; // 0
    BYTE NumberL; // 1
    BYTE X; // 2
    BYTE Y; // 3
    BYTE CharSet[20]; // 23
    char Id[10]; // 33
    BYTE TX; // 34
    BYTE TY; // 35
    BYTE DirAndPkLevel; // 36
    BYTE PentagramMainAttribute; // 37
    BYTE MuunItemH; // 38
    BYTE MuunItemL; // 39
    BYTE MuunItemLevel; // 40
    BYTE MuunSubItemH; // 41
    BYTE MuunSubItemL; // 42
    BYTE MuunSubItemLevel; // 43
    BYTE MuunRideItemH; // 44
    BYTE MuunRideItemL; // 45
    BYTE MuunRideItemLevel; // 46
    BYTE DisplayMuun; // 47
    BYTE MountH; // 48
    BYTE MountL; // 49
    BYTE InvenPetItem; // 50
    BYTE LevelH; // 51
    BYTE LevelL; // 52
    BYTE MAXHP_HIGHH; // 53
    BYTE MAXHP_LOWH; // 54
    BYTE MAXHP_HIGHL; // 55
    BYTE MAXHP_LOWL; // 56
    BYTE HP_HIGHH; // 57
    BYTE HP_LOWH; // 58
    BYTE HP_HIGHL; // 59
    BYTE HP_LOWL; // 60
    BYTE unk61; // 61
    WORD nServerCodeOfHomeWorld; // 63
    BYTE unk64; // 64
    BYTE EffectCount; // 65
    __int64 EffectList[MAX_EFFECT_INFO]; // 66
    BYTE unk66;
    BYTE unk67; // 67
};

struct PMSG_VIEWPORTCREATE_CHANGE
{
    BYTE NumberH;
    BYTE NumberL;
    BYTE X;
    BYTE Y;
    BYTE SkinH;
    BYTE SkinL;
    char Id[10];
    BYTE TX;
    BYTE TY;
    BYTE DirAndPkLevel;
    BYTE CharSet[20];
    BYTE PentagramMainAttribute;
    BYTE MuunItemH;
    BYTE MuunItemL;
    BYTE MuunItemLevel;
    BYTE MuunSubItemH;
    BYTE MuunSubItemL;
    BYTE MuunSubItemLevel;
    BYTE MuunRideItemH;
    BYTE MuunRideItemL;
    BYTE MuunRideItemLevel;
    BYTE DisplayMuun; // 47
    BYTE MountH;
    BYTE MountL;
    BYTE InvenPetItem;
    BYTE LevelH;
    BYTE LevelL;
    BYTE MAXHP_HIGHH;
    BYTE MAXHP_LOWH;
    BYTE MAXHP_HIGHL;
    BYTE MAXHP_LOWL;
    BYTE HP_HIGHH;
    BYTE HP_LOWH;
    BYTE HP_HIGHL;
    BYTE HP_LOWL;
    BYTE unk63; // 63
    WORD nServerCodeOfHomeWorld;
    BYTE unk66; // 66
    BYTE EffectCount;
    __int64 EffectList[MAX_EFFECT_INFO];
};

struct PMSG_MONSTER_VIEWPORTCREATE
{
    BYTE NumberH; // 0
    BYTE NumberL; // 1
    BYTE Type_HI; // 2
    BYTE Type_LO; // 3
    BYTE X; // 4
    BYTE Y; // 5
    BYTE TX; // 6
    BYTE TY; // 7
    BYTE Path; // 8
    BYTE PentagramMainAttribute; // 9
    BYTE critical_damage_resistance; // 10
    BYTE excellent_damage_resistance; // 11
    BYTE DebuffResistanceH; // 12
    BYTE DebuffResistanceL; // 13
    BYTE damage_absorb; // 14
    BYTE elite; // 15
    BYTE LevelH; // 16
    BYTE LevelL; // 17
    BYTE MAXHP_HIGHH; // 18
    BYTE MAXHP_LOWH; // 19
    BYTE MAXHP_HIGHL; // 20
    BYTE MAXHP_LOWL; // 21
    BYTE HP_HIGHH; // 22
    BYTE HP_LOWH; // 23
    BYTE HP_HIGHL; // 24
    BYTE HP_LOWL; // 25
    BYTE EffectCount; // 26
    BYTE unk27;
    __int64 EffectList[32]; // 27
};

struct PMSG_CALLMONSTER_VIEWPORTCREATE {
    BYTE NumberH;
    BYTE NumberL;
    BYTE Type_HI;
    BYTE Type_LO;
    BYTE X;
    BYTE Y;
    BYTE TX;
    BYTE TY;
    BYTE Path;
    BYTE Id[10];
    BYTE PentagramMainAttribute;
    BYTE LevelH;
    BYTE LevelL;
    BYTE MAXHP_HIGHH;
    BYTE MAXHP_LOWH;
    BYTE MAXHP_HIGHL;
    BYTE MAXHP_LOWL;
    BYTE HP_HIGHH;
    BYTE HP_LOWH;
    BYTE HP_HIGHL;
    BYTE HP_LOWL;
    BYTE CharSet[20];
    BYTE MonsterType;
    BYTE EffectCount;
    __int64 EffectList[32];
};
#pragma pack()
Bon Dia

Dakosmu

Parche para el bug visual de Max SD

Descripción:
Este parche soluciona el bug visual que ocurre al exceder el tamaño máximo de WORD.

Código del parche:
SetNop(0x011EE345, 5);
SetNop(0x011EE8E5, 5);

Instrucciones:
1. Aplica el código en el lugar adecuado dentro de tu proyecto.
2. Compila y prueba para asegurarte de que el bug se ha corregido.
Bon Dia

🡱 🡳