2022-9-2 01:27:03

This commit is contained in:
小疯
2022-09-02 01:27:05 +08:00
parent c5a2595302
commit b3ddde5254
19 changed files with 313 additions and 2266 deletions

View File

@@ -6,9 +6,10 @@
// Copyright (c) 2022. Vance All rights reserved
//************************************
#include "controller.hpp"
#include "controller.h"
Controller::Controller() :
old_IPacketDispatcher_ParamBase_dispatch_template((IPacketDispatcher_ParamBase_dispatch_template_Type*)base::IPacketDispatcher::ParamBase::dispatch_template),
old_UseJewel_dispatch_sig((UseJewel_dispatch_sig_Type*)base::Dispatcher_UseJewel::dispatch_sig),
old_PacketDispatcher_doDispatch((PacketDispatcher_doDispatch_Type*)base::PacketDispatcher::doDispatch)
{
@@ -33,6 +34,8 @@ void Controller::init()
//mhook_IPacketDispatcher_ParamBase_dispatch_template.Hook((void**)&old_IPacketDispatcher_ParamBase_dispatch_template, (void*)hook_IPacketDispatcher_ParamBase_dispatch_template);
mhook_PacketDispatcher_doDispatch.Hook((void**)&old_PacketDispatcher_doDispatch, (void*)hook_PacketDispatcher_doDispatch);
mhook_UseJewel_dispatch_sig.Hook((void**)&old_UseJewel_dispatch_sig, (void*)hook_UseJewel_dispatch_sig);
@@ -41,6 +44,33 @@ void Controller::init()
}
int Controller::hook_IPacketDispatcher_ParamBase_dispatch_template(int a1, int a2, int a3)
{
//[root@nimzgryilkxubzo game] # [DNF_PROJECT] Recv() class :1 id : 84 len : 21 callback : 0x81258b6 (nil)0x81258b6 0x8125a06 (nil)(nil)
// [DNF_PROJECT] + 12 0x8bd8d54 : Dispatcher_ModItemAttr::dispatch_sig(CUser *,PacketBuf &)
// [DNF_PROJECT] + 16 0x8bd8d58 : IPacketDispatcher<MSG_BASE,ParamBase,(ch_state)0>::check_state(CUser *,PacketBuf &)
// [DNF_PROJECT] + 20 0x8bd8d5c : Dispatcher_ModItemAttr::read(PacketBuf &,MSG_BASE &)
// [DNF_PROJECT] + 24 0x8bd8d60 : Dispatcher_ModItemAttr::process(CUser *,MSG_BASE &,ParamBase &)
// [DNF_PROJECT] + 28 0x8bd8d64 : IPacketDispatcher<MSG_BASE,ParamBase,(ch_state)0>::send(CUser *,ParamBase&)
//
//
// [DNF_PROJECT] + 12 0x8bd7dd4 : Dispatcher_Antibot::dispatch_sig
// [DNF_PROJECT] + 16 0x8bd7dd8 : IPacketDispatcher<MSG_BASE,ParamBase,(ch_state)0>::check_state(CUser *,PacketBuf &)
// [DNF_PROJECT] + 20 0x8bd7ddc : Dispatcher_Antibot::read(PacketBuf &,MSG_BASE &)
// [DNF_PROJECT] + 24 0x8bd7de0 : Dispatcher_Antibot::process(CUser *,MSG_BASE &,ParamBase &)
// [DNF_PROJECT] + 28 0x8bd7de4 : IPacketDispatcher<MSG_BASE,ParamBase,(ch_state)0>::send(CUser *,ParamBase&)
//LOG("ParamBase_dispatch_template[ +12 :%p +16 :%p +20 :%p +24 :%p +28 :%p ]"
// , *(int*)a1 + 12
// , *(int*)a1 + 16
// , *(int*)a1 + 20
// , *(int*)a1 + 24
// , *(int*)a1 + 28
//);
Controller::Get()->old_IPacketDispatcher_ParamBase_dispatch_template(a1, a2, a3);
}
int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pUser, PacketBuf* pBuf)
{
printf("getCurCharacName :%s \n", pUser->getCurCharacName().c_str());
@@ -50,7 +80,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
// printf("pBuf :%s \n", Util::ToHexString((const unsigned char*)pBuf->get_buf_ptr(0),40).c_str());
int state = pUser->get_state();
printf("state :%d \n", state);
LOG("state :%d \n", state);
//校验角色状态是否允许镶嵌
if (state != 3)
return 0;
@@ -62,13 +92,13 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
//时装所在的背包槽
int avartar_inven_slot = pBuf->get_short();
printf("avartar_inven_slot :%d \n", avartar_inven_slot);
LOG("avartar_inven_slot :%d \n", avartar_inven_slot);
//时装item_id
int avartar_item_id = pBuf->get_int();
printf("avartar_item_id :%d \n", avartar_item_id);
LOG("avartar_item_id :%d \n", avartar_item_id);
//本次镶嵌徽章数量
int emblem_cnt = pBuf->get_byte();
printf("emblem_cnt :%d \n", emblem_cnt);
LOG("emblem_cnt :%d \n", emblem_cnt);
if (pUser->CheckItemLock(2, avartar_inven_slot))
{
@@ -80,20 +110,20 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
CInventory* inven = pUser->getCurCharacInvenW();
if (!inven)
{
printf("pUser->getCurCharacInvenW : error \n");
LOG("pUser->getCurCharacInvenW : error \n");
return 0;
}
Inven_Item* avartar = inven->GetInvenRef(CInventory::INVENTORY_TYPE_AVARTAR, avartar_inven_slot);
if (!avartar)
{
printf("inven->GetInvenRef : error \n");
LOG("inven->GetInvenRef : error \n");
return 0;
}
//校验时装 数据是否合法
if (avartar->isEmpty() || (avartar->getKey() != avartar_item_id) || pUser->CheckItemLock(2, avartar_inven_slot))
{
printf("avartar->isEmpty() || avartar->getKey() || pUser->CheckItemLock() : error \n");
LOG("avartar->isEmpty() || avartar->getKey() || pUser->CheckItemLock() : error \n");
return 0;
}
//获取时装插槽数据
@@ -102,11 +132,11 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
int jewel_socket_data = inven_avartar_mgr->getJewelSocketData(avartar_add_info);
if (!jewel_socket_data)
{
printf("jewel_socket_data : error \n");
LOG("jewel_socket_data : error \n");
return 0;
}
printf("jewel_socket_data :%s \n", Util::ToHexString((const unsigned char*)jewel_socket_data, 40).c_str());
LOG("jewel_socket_data :%s \n", Util::ToHexString((const unsigned char*)jewel_socket_data, 40).c_str());
if (emblem_cnt <= 3)
{
std::map<int, std::pair<int, int>> emblems;
@@ -124,7 +154,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
//校验徽章及插槽数据是否合法
if (emblem->isEmpty() || (emblem->getKey() != emblem_item_id) || (avartar_socket_slot >= 3))
{
printf("emblem->isEmpty() || (emblem->getKey() : error \n");
LOG("emblem->isEmpty() || (emblem->getKey() : error \n");
pUser->SendCmdErrorPacket(205, 209);
return 0;
}
@@ -135,14 +165,14 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
CDataManager* DataManager = CDataManager::G_CDataManager();
if (!DataManager)
{
printf("CDataManager::G_CDataManager() : error \n");
LOG("CDataManager::G_CDataManager() : error \n");
pUser->SendCmdErrorPacket(205, 209);
return 0;
}
CItem* citem = DataManager->find_item(emblem_item_id);
if (!citem)
{
printf("DataManager->find_item() : error \n");
LOG("DataManager->find_item() : error \n");
pUser->SendCmdErrorPacket(205, 209);
return 0;
}
@@ -150,7 +180,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
//校验徽章类型
if (!citem->is_stackable() || (citem->GetItemType() != 20))
{
printf("citem->is_stackable() || (citem->GetItemType() : error \n");
LOG("citem->is_stackable() || (citem->GetItemType() : error \n");
pUser->SendCmdErrorPacket(205, 209);
return 0;
}
@@ -163,14 +193,14 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
if (!(emblem_socket_type & avartar_socket_type))
{
//插槽类型不匹配
printf("emblem_socket_type & avartar_socket_type\n");
LOG("emblem_socket_type & avartar_socket_type\n");
pUser->SendCmdErrorPacket(205, 209);
return 0;
}
printf("avartar_socket_slot:%d emblem_inven_slot:%d emblem_item_id:%d\n", avartar_socket_slot, emblem_inven_slot, emblem_item_id);
LOG("avartar_socket_slot:%d emblem_inven_slot:%d emblem_item_id:%d\n", avartar_socket_slot, emblem_inven_slot, emblem_item_id);
emblems[avartar_socket_slot] = std::make_pair(emblem_inven_slot, emblem_item_id);
}
printf("数据已读取!!!\n");
LOG("数据已读取!!!\n");
for (auto& avartar_socket_slot : emblems)
{
@@ -181,7 +211,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
//设置时装插槽数据
int emblem_item_id = avartar_socket_slot.second.second;
*(int*)(jewel_socket_data + avartar_socket_slot.first * 6 + 2) = emblem_item_id;
printf("徽章item_id=%d 已成功镶嵌进avartar_socket_slot=%d 的槽内!\n", emblem_item_id, avartar_socket_slot);
LOG("徽章item_id=%d 已成功镶嵌进avartar_socket_slot=%d 的槽内!\n", emblem_item_id, avartar_socket_slot);
}
//时装插槽数据存档
@@ -189,7 +219,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
//通知客户端时装数据已更新
pUser->SendUpdateItemList(1, 1, avartar_inven_slot);
printf("徽章镶嵌完毕!!!\n");
LOG("徽章镶嵌完毕!!!");
//回包给客户端
InterfacePacketBuf* packet_guard = (InterfacePacketBuf*)PacketGuard::NewPacketGuard();
@@ -204,40 +234,51 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
return 0;
}
int Controller::hook_PacketDispatcher_doDispatch(PacketDispatcher* a1, CUser* user, int packet_class, int packet_id, void* packet_src, int pecakt_len, int a7, int a8)
int Controller::hook_PacketDispatcher_doDispatch(PacketDispatcher* a1, CUser* user, int packet_class, int packet_id, char* packet_src, int packet_len, int a7, int a8)
{
void* pAction = *a1->get_dispatcher(packet_id);
if (pAction)
int(***dispatcher)(int, CUser*, char*) = (int(***)(int, CUser*, char*))a1->get_dispatcher(packet_id);
if (dispatcher)
{
LOG("Recv() class:%d id:%d len:%d data:%s callback:%p %p %p %p %p %p "
//v32 = (**dispatcher)(dispatcher, user, v25);
LOG("Recv() class:%d id:%d len:%d %p [ +00 :%p +12 :%p +16 :%p +20 :%p +24 :%p +28 :%p ]"
, packet_class
, packet_id
, pecakt_len
, Util::ToHexString((const unsigned char*)packet_src, pecakt_len).c_str()
, *((void**)pAction)
, (void*)*((unsigned int*)pAction + 12)
, (void*)*((unsigned int*)pAction + 16)
, (void*)*((unsigned int*)pAction + 20)
, (void*)*((unsigned int*)pAction + 24)
, (void*)*((unsigned int*)pAction + 28)
);
}
else
{
LOG("Recv() class:%d id:%d len:%d data:%s "
, packet_class
, packet_id
, pecakt_len
, Util::ToHexString((const unsigned char*)packet_src, pecakt_len).c_str()
, packet_len
, (**dispatcher)
, *(int*)dispatcher
, *(int*)dispatcher + 12
, *(int*)dispatcher + 16
, *(int*)dispatcher + 20
, *(int*)dispatcher + 24
, *(int*)dispatcher + 28
);
}
if (packet_id == Packet_UseItem)
if (packet_id == Packet_UseEquipmentMoveItem)
{
LOG("hook_PacketDispatcher_doDispatch packet_data :%s ", Util::ToHexString((const unsigned char*)packet_src, pecakt_len).c_str());
PacketBuf* v25 = PacketBuf::NewPacketBuf();
user->setLastPacketID(packet_id);
v25->bind_packet(packet_src, packet_len);
LOG("Recv() class:%d id:%d len:%d packet_data :%s "
, packet_class
, packet_id
, packet_len
, Util::ToHexString((const unsigned char*)packet_src, packet_len).c_str()
);
int result = CDispatch::Get()->UseEquipmentMoveItem(user, v25);
PacketBuf::DelPacketBuf(v25);
return result;
}
return Controller::Get()->old_PacketDispatcher_doDispatch(a1, user, packet_class, packet_id, packet_src, pecakt_len, a7, a8);
return Controller::Get()->old_PacketDispatcher_doDispatch(a1, user, packet_class, packet_id, packet_src, packet_len, a7, a8);
}