From e1502a5d6bc9b542b9450bc4f1b669de7612713c Mon Sep 17 00:00:00 2001 From: atom0s Date: Wed, 18 Jan 2017 21:57:53 -0800 Subject: [PATCH] Added exception handling to catch bind errors to prevent crashes. --- Release/Plugins/Servo.dll | Bin 67584 -> 67072 bytes Source/Servo.vcxproj | 1 + Source/main.cpp | 42 ++++++++++++++++++++++++-------------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/Release/Plugins/Servo.dll b/Release/Plugins/Servo.dll index fcd98a2fd7f8f2edfa3225a59e30f62aaf3ad596..ae095281cb8fa092cd6d65bc1cd7c821f075ea42 100644 GIT binary patch delta 22397 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 diff --git a/Source/Servo.vcxproj b/Source/Servo.vcxproj index 095f427..7051cac 100644 --- a/Source/Servo.vcxproj +++ b/Source/Servo.vcxproj @@ -68,6 +68,7 @@ Windows MachineX86 libci.lib + C:\Ashita\plugins\$(TargetName)$(TargetExt) diff --git a/Source/main.cpp b/Source/main.cpp index 45a47c9..61e84bb 100644 --- a/Source/main.cpp +++ b/Source/main.cpp @@ -45,8 +45,6 @@ static inline std::string trimmed(std::string s) { return s; } - - std::string Servo::StringSub(std::string instring, std::string subin, std::string subout) { if (instring.find(subin) != std::string::npos) @@ -140,7 +138,7 @@ void Servo::SetState(ServoMode::Mode mode) void Servo::Sync(std::string host) { me = m_AshitaCore->GetDataManager()->GetParty()->GetMemberName(0); - log << Chat::Format::RoyalBlue << "Servo started in client mode, connected to: "; + log << Chat::Format::RoyalBlue << "[Servo] Servo started in client mode, connected to: "; while (!lservAddr.try_lock()) std::this_thread::sleep_for(std::chrono::milliseconds(50)); if (host != "") @@ -171,17 +169,16 @@ bool Servo::Initialize(IAshitaCore* ashitaCore, ILogManager* logManager, uint32_ if (!::GetModuleInformation(::GetCurrentProcess(), ::GetModuleHandle("FFXiMain.dll"), &mod, sizeof(MODULEINFO))) return false; - // Cast the data and scan for the pattern.. - std::vector data((uint8_t*)(uintptr_t)mod.lpBaseOfDll, (uint8_t*)(uintptr_t)mod.lpBaseOfDll + mod.SizeOfImage); - - unsigned char* Pointer = (unsigned char*)Ashita::Memory::FindPattern(std::ref(data), (uintptr_t)mod.lpBaseOfDll, "8BCDE87F7????F8B0D7F7F7F7FE87F7F7F7F8BF885??750CB9", 0, 0); - StructPointer = NULL; - if (Pointer != NULL) + auto Pointer = (unsigned char*)Ashita::Memory::FindPattern((uintptr_t)mod.lpBaseOfDll, mod.SizeOfImage, "8BCFE8????????8B0D????????E8????????8BE885??750CB9", 0, 0); + StructPointer = nullptr; + if (Pointer != nullptr) { Pointer += 25; StructPointer = (auto_follow*)(*((DWORD*)Pointer)); } + else + ashitaCore->GetChatManager()->Write("[Servo] Failed to locate required signature for autofollow!"); if (StructPointer) { @@ -221,7 +218,14 @@ void Servo::Serv() hostmask.append("127.0.0.1"); lservAddr.unlock(); hostmask.append(":56556"); - publisher.bind(hostmask.c_str()); + try { + publisher.bind(hostmask.c_str()); + } + catch (...) { + this->m_AshitaCore->GetChatManager()->Write("[Servo] Failed to bind to socket."); + publisher.close(); + return; + } connected = true; @@ -256,7 +260,15 @@ void Servo::ServPos() hostmask.append("127.0.0.1"); lservAddr.unlock(); hostmask.append(":56557"); - publisher.bind(hostmask.c_str()); + try { + publisher.bind(hostmask.c_str()); + } + catch (...) { + this->m_AshitaCore->GetChatManager()->Write("[Servo] Failed to bind to socket."); + publisher.close(); + return; + } + if (!connected) std::this_thread::sleep_for(std::chrono::milliseconds(100)); @@ -418,7 +430,7 @@ bool Servo::HandleCommand(const char* szCommand, int iType) cmdParse->GetNextCommand(&arg); if (arg == "on") { - log << Chat::Format::RoyalBlue << "Servo started in server mode, with a hostmask of: "; + log << Chat::Format::RoyalBlue << "[Servo] Servo started in server mode, with a hostmask of: "; while (!lservAddr.try_lock()) std::this_thread::sleep_for(std::chrono::milliseconds(50)); if (cmdParse->GetNextCommand(&arg)) @@ -447,7 +459,7 @@ bool Servo::HandleCommand(const char* szCommand, int iType) else if (arg == "off") { SetState(ServoMode::Mode::Standby); - log << Chat::Format::RoyalBlue << "Servo set to standy!" << Chat::Control::flush; + log << Chat::Format::RoyalBlue << "[Servo] Servo set to standy!" << Chat::Control::flush; } else if (arg == "command" || arg == "send") { @@ -588,10 +600,10 @@ __declspec(dllexport) void __stdcall CreatePluginInfo(plugininfo_t* lpBuffer) g_PluginInfo = lpBuffer; strcpy_s(g_PluginInfo->Name, sizeof(g_PluginInfo->Name), "Servo"); - strcpy_s(g_PluginInfo->Author, sizeof(g_PluginInfo->Author), "bluekirby0"); + strcpy_s(g_PluginInfo->Author, sizeof(g_PluginInfo->Author), "bluekirby0 & atom0s"); g_PluginInfo->InterfaceVersion = ASHITA_INTERFACE_VERSION; - g_PluginInfo->PluginVersion = 3.00f; + g_PluginInfo->PluginVersion = 3.01f; g_PluginInfo->Priority = 0; }