//************************************ // FileName: D:\VisualStudioSource\dnf_project\src\controller.cpp // FullName: D:\VisualStudioSource\dnf_project\src // Date: 2022/09/01 // By: Vance // Copyright (c) 2022. Vance All rights reserved //************************************ #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_Dispatcher_ModItemAttr_dispatch_sig((Dispatcher_ModItemAttr_dispatch_sig_Type*)base::Dispatcher_ModItemAttr::dispatch_sig), old_PacketDispatcher_doDispatch((PacketDispatcher_doDispatch_Type*)base::PacketDispatcher::doDispatch) { } Controller::~Controller() { } void Controller::init() { Mem::WriteUChar((void*)(base::GlobalData::Init_fix_1 - 0x1), 0); //.text:085BDE9D 83 F8 0A cmp eax, 10 Mem::WriteUChar((void*)(base::CParty::addDungeonClear_fix_1 + 2), 0x7E); //普通被击 //.text:085BDF30 83 F8 1E cmp eax, 30 Mem::WriteUChar((void*)(base::CParty::addDungeonClear_fix_2 + 2), 0x7E); //远古被击 //.text:085BDFC3 83 F8 32 cmp eax, 50 Mem::WriteUChar((void*)(base::CParty::addDungeonClear_fix_3 + 2), 0x7E); //异界被击 /* 修正使用代币增加积分 地址 长度 原始字节 已修补字节 08179043 0x1 97 B8 0817904E 0x1 8C AD */ Mem::WriteUChar((void*)(0x08179043), 0xB8); Mem::WriteUChar((void*)(0x0817904E), 0xAD); //mhook_IPacketDispatcher_ParamBase_dispatch_template.Hook((void**)&old_IPacketDispatcher_ParamBase_dispatch_template, (void*)hook_IPacketDispatcher_ParamBase_dispatch_template); mhook_UseJewel_dispatch_sig.Hook((void**)&old_UseJewel_dispatch_sig, (void*)hook_UseJewel_dispatch_sig); mhook_Dispatcher_ModItemAttr_dispatch_sig.Hook((void**)&old_Dispatcher_ModItemAttr_dispatch_sig, (void*)hook_Dispatcher_ModItemAttr_dispatch_sig); mhook_PacketDispatcher_doDispatch.Hook((void**)&old_PacketDispatcher_doDispatch, (void*)hook_PacketDispatcher_doDispatch); LOG("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::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::send(CUser *,ParamBase&) // // // [DNF_PROJECT] + 12 0x8bd7dd4 : Dispatcher_Antibot::dispatch_sig // [DNF_PROJECT] + 16 0x8bd7dd8 : IPacketDispatcher::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::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* user, PacketBuf* pBuf) { ENUM_PACK_RET_TYPE ret = CDispatch::Get()->UseJewel_dispatch_sig(pDispatcher_UseJewel, user, pBuf); int result = (ret == PAK_ERROR) ? 1 : 0; // 08217C06 分解 return result; } int Controller::hook_Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_ModItemAttr* dis_mod, CUser* user, PacketBuf* pBuf) { PacketBuf new_buf; memcpy(&new_buf, pBuf, sizeof(PacketBuf)); short equipment_pos = 0; int equipment_id = 0; short item_pos = 0; if ((unsigned __int8)new_buf.get_short(&equipment_pos) != 1 || (unsigned __int8)new_buf.get_int(&equipment_id) != 1 || (unsigned __int8)new_buf.get_short(&item_pos) != 1) { user->SendCmdErrorPacket(84, -1); return 0; } CInventory* CurCharacInvenW = user->getCurCharacInvenR(); auto item_inven = CurCharacInvenW->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, item_pos); if (!item_inven->isEmpty() && item_inven->getKey() == ITEM_ID_YIJIRUHUN) { ENUM_PACK_RET_TYPE ret = CDispatch::Get()->Dispatcher_ModItemAttr_dispatch_sig(dis_mod, user, pBuf); int result = (ret == PAK_ERROR) ? 1 : 0; return result; } return Controller::Get()->old_Dispatcher_ModItemAttr_dispatch_sig(dis_mod, user, pBuf); } 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) { int(***dispatcher)(int, CUser*, char*) = (int(***)(int, CUser*, char*))a1->get_dispatcher(packet_id); if (dispatcher) { //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 , packet_len , (**dispatcher) , *(int*)dispatcher , *(int*)dispatcher + 12 , *(int*)dispatcher + 16 , *(int*)dispatcher + 20 , *(int*)dispatcher + 24 , *(int*)dispatcher + 28 ); } if (packet_id == PACKET_ID_ITEM_USE_EQUIPMENT_MOVEITEM) { int result = 0; 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 , Utils::ToHexString((const unsigned char*)packet_src, packet_len).c_str() ); if (v25) { ENUM_PACK_RET_TYPE ret = CDispatch::Get()->UseEquipmentMoveItem(user, v25); result = (ret == PAK_ERROR) ? 1 : 0; PacketBuf::DelPacketBuf(v25); } return result; } return Controller::Get()->old_PacketDispatcher_doDispatch(a1, user, packet_class, packet_id, packet_src, packet_len, a7, a8); }