Ir para conteúdo

Featured Replies

Postado

Bom, comecei a pouco a me aprofundar em engenharia reversa de programas/jogos, resolvi fazer esse post pra se alguém com objetivo em comum precisar de um ponto de partida já que existe pouco conteúdo sobre, e os fóruns antigos de reversão voltado para Tibia/OTserv estão mortos.

 

[STATUS]

GamePtr

-->LocalPlayer-->Inventario

-->Creatures

-->Protocolo

 

falta mapa e containers.

 

 

Obs: eu vou focar o tópico no PXG mas essas mesmas informações de estrutura são compatíveis com qualquer OTclient desde que você atualize os offsets.

 

Programas usados:

IDA PRO - conseguir ponteiros dissecar estruturas e funções

Cheat Engine - confirmar offsets

ReClass - criar uma classe para o ponteiro das criaturas na Battle List

 

Se alguém tiver alguma duvida sobre como conseguir os OFFSETS ou de como usar os programas citados acima pode perguntar no tópico que eu responderei assim que possível.

 

image.png.db63eaba5d2f696efccf095fc2c2dc60.png

 

PXG DIRECTX9 23/09/2019

OFFSETS/OFFSETS:

// Created with ReClass.NET by KN4CK3R

class CreaturePtr
{
public:
	char pad_0000[12]; //0x0000
	uint16_t m_pos_x; //0x000C
	char pad_000E[2]; //0x000E
	uint16_t m_pos_y; //0x0010
	char pad_0012[2]; //0x0012
	uint8_t m_pos_z; //0x0014
	char pad_0015[7]; //0x0015
	uint32_t m_id; //0x001C
	char pad_0020[4]; //0x0020
	uint8_t m_name_lenght; //0x0024
	char pad_0025[3]; //0x0025
	char m_name[16]; //0x0028
	uint8_t m_healthPercent; //0x0038
	char pad_0039[3]; //0x0039
	uint8_t m_direction; //0x003C
	char pad_003D[3]; //0x003D
	uint8_t m_outfit_visible; //0x0040
	char pad_0041[3]; //0x0041
	uint8_t m_outfit_looktype; //0x0044
	char pad_0045[7]; //0x0045
	uint8_t m_outfit_head; //0x004C
	char pad_004D[3]; //0x004D
	uint8_t m_outfit_body; //0x0050
	char pad_0051[3]; //0x0051
	uint8_t m_outfit_legs; //0x0054
	char pad_0055[3]; //0x0055
	uint8_t m_outfit_feet; //0x0058
	char pad_0059[3]; //0x0059
	uint8_t m_outfit_addon; //0x005C
	char pad_005D[83]; //0x005D
	uint16_t m_light; //0x00B0
	char pad_00B2[2]; //0x00B2
	int32_t m_speed; //0x00B4
	uint8_t m_skull; //0x00B8
	uint8_t m_shield; //0x00B9
	uint8_t m_emblem; //0x00BA
	uint8_t m_type; //0x00BB
	uint8_t m_icon; //0x00BC
	char pad_00BD[363]; //0x00BD
	bool m_walking; //0x0228
	char pad_0229[123]; //0x0229
	uint16_t m_autoWalkDestination_x; //0x02A4
	char pad_02A6[2]; //0x02A6
	uint16_t m_autoWalkDestination_y; //0x02A8
	char pad_02AA[2]; //0x02AA
	uint8_t m_autoWalkDestination_z; //0x02AC
}; //Size: 0x02AD

class ItemPtr
{
public:
	char pad_0000[16]; //0x0000
	uint8_t m_slotid; //0x0010
	char pad_0011[21]; //0x0011
	uint16_t m_clientId; //0x0026
	char pad_0028[2]; //0x0028
	uint16_t m_serverId; //0x002A
	char pad_002C[2]; //0x002C
	uint8_t m_countOrSubType; //0x002E
}; //Size: 0x002F

class LocalPlayerPtr
{
public:
	char pad_0000[12]; //0x0000
	uint16_t m_pos_x; //0x000C
	char pad_000E[2]; //0x000E
	uint16_t m_pos_y; //0x0010
	char pad_0012[2]; //0x0012
	uint8_t m_pos_z; //0x0014
	char pad_0015[7]; //0x0015
	uint32_t m_id; //0x001C
	char pad_0020[4]; //0x0020
	uint8_t m_name_lenght; //0x0024
	char pad_0025[3]; //0x0025
	char m_name[16]; //0x0028
	uint8_t m_healthPercent; //0x0038
	char pad_0039[3]; //0x0039
	uint8_t m_direction; //0x003C
	char pad_003D[3]; //0x003D
	uint8_t m_outfit_visible; //0x0040
	char pad_0041[3]; //0x0041
	uint8_t m_outfit_looktype; //0x0044
	char pad_0045[7]; //0x0045
	uint8_t m_outfit_head; //0x004C
	char pad_004D[3]; //0x004D
	uint8_t m_outfit_body; //0x0050
	char pad_0051[3]; //0x0051
	uint8_t m_outfit_legs; //0x0054
	char pad_0055[3]; //0x0055
	uint8_t m_outfit_feet; //0x0058
	char pad_0059[3]; //0x0059
	uint8_t m_outfit_addon; //0x005C
	char pad_005D[83]; //0x005D
	uint16_t m_light; //0x00B0
	char pad_00B2[2]; //0x00B2
	int32_t m_speed; //0x00B4
	uint8_t m_skull; //0x00B8
	uint8_t m_shield; //0x00B9
	uint8_t m_emblem; //0x00BA
	uint8_t m_type; //0x00BB
	uint8_t m_icon; //0x00BC
	char pad_00BD[363]; //0x00BD
	bool m_walking; //0x0228
	char pad_0229[52]; //0x0229
	bool m_premium; //0x025D
	char pad_025E[58]; //0x025E
	uint16_t m_lastPrewalkDestination_x; //0x0298
	char pad_029A[2]; //0x029A
	uint16_t m_lastPrewalkDestination_y; //0x029C
	char pad_029E[2]; //0x029E
	uint8_t m_lastPrewalkDestination_z; //0x02A0
	char pad_02A1[3]; //0x02A1
	uint16_t m_autoWalkDestination_x; //0x02A4
	char pad_02A6[2]; //0x02A6
	uint16_t m_autoWalkDestination_y; //0x02A8
	char pad_02AA[2]; //0x02AA
	uint8_t m_autoWalkDestination_z; //0x02AC
	char pad_02AD[3]; //0x02AD
	uint16_t m_lastAutoWalkPosition_x; //0x02B0
	char pad_02B2[2]; //0x02B2
	uint16_t m_lastAutoWalkPosition_y; //0x02B4
	char pad_02B6[2]; //0x02B6
	uint8_t m_lastAutoWalkPosition_z; //0x02B8
	char pad_02B9[29]; //0x02B9
	uint8_t m_Known; //0x02D6
	char pad_02D7[5]; //0x02D7
	class ItemPtr* m_inventoryItems[10]; //0x02DC
	char pad_0304[136]; //0x0304
	uint8_t m_vocation; //0x038C
	char pad_038D[3]; //0x038D
	double m_health; //0x0390
	double m_maxHealth; //0x0398
	double m_freeCapacity; //0x03A0
	double m_totalCapacity; //0x03A8
	double m_experience; //0x03B0
	double m_level; //0x03B8
	double m_levelPercent; //0x03C0
	double m_mana; //0x03C8
	double m_maxMana; //0x03D0
	double m_magicLevel; //0x03D8
	double m_magicLevelPercent; //0x03E0
	double m_baseMagicLevel; //0x03E8
	double m_soul; //0x03F0
	double m_stamina; //0x03F8
	double m_regenerationTime; //0x0400
	double m_offlineTrainingTime; //0x0408
}; //Size: 0x0410

class ProtocolGamePtr
{
public:
	char pad_0000[68]; //0x0000
}; //Size: 0x0044

class gGame
{
public:
	class LocalPlayerPtr* m_localPlayer; //0x0000
	class CreaturePtr* m_attackingCreature; //0x0004
	class CreaturePtr* m_followingCreature; //0x0008
	class ProtocolGamePtr* m_protocolGame; //0x000C
	char pad_0010[48]; //0x0010
	bool m_online; //0x0040
	char pad_0041[1]; //0x0041
	bool m_dead; //0x0042
	char pad_0043[57]; //0x0043
	uint8_t m_pvpMode; //0x007C
	char pad_007D[7]; //0x007D
	uint8_t m_lastWalkDir; //0x0084
	char pad_0085[23]; //0x0085
	uint8_t m_characterName_lenght; //0x009C
	char pad_009D[3]; //0x009D
	char m_characterName[16]; //0x00A0
	char pad_00B0[4]; //0x00B0
	uint8_t m_worldName_lenght; //0x00B4
	char pad_00B5[3]; //0x00B5
	char m_worldName[16]; //0x00B8
}; //Size: 0x00C8

 

Editado por vyctor17
Update 23/09 (veja o histórico de edições)

  • 3 years later...
  • 1 month later...
Postado
  • Administrador
  Em 19/09/2023 em 14:58, gilbertosan disse:

Mano tenho muita dúvida em como encontrar os offsets poderia nos ajudar com uns tutos?

Não é tão simples acho que você deveria começar por aqui.
Game Hacking Tutorials - Guided Hacking

Inicialmente você pode começar com cheat engine procurando offsets mais simples como textos ou inteiros, no entanto futuramente pode altera e começar usar o IDA para passar instruções diretamente via HEX.

Não é um processo muito facil, existem DLLS disponiveis que podem facilitar no entanto se você não tem nem um conhecimento sobre Engenharia reversa, dedveria procurar alguns tutorial com cheat engine bem faceis.

Enfim é um longo caminho espero que consiga algum recurso util no link acima.

  • 1 year later...

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo