From 35a7aae3d04dcf0d2964901a55ebe117857ff5f6 Mon Sep 17 00:00:00 2001 From: LuChao Date: Sat, 1 Jun 2024 14:56:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A=E5=92=8C?= =?UTF-8?q?=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/wxhelper/src/hook.cc | 214 ++++++++++++++++++++++++++------------- app/wxhelper/src/hook.h | 78 +++++++++----- 2 files changed, 193 insertions(+), 99 deletions(-) diff --git a/app/wxhelper/src/hook.cc b/app/wxhelper/src/hook.cc index eac3c1c..de827fe 100644 --- a/app/wxhelper/src/hook.cc +++ b/app/wxhelper/src/hook.cc @@ -1,92 +1,160 @@ #include #include "hook.h" - #include "client_socket.h" #include "config.h" #include "detours.h" #include "http_client.h" #include "nlohmann/json.hpp" #include "spdlog/spdlog.h" -// #include "thread_pool.h" +#include "thread_pool.h" #include "utils.h" #include "wxutils.h" -namespace hook { -void SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, - PTP_WORK Work) { - InnerMessageStruct *msg = (InnerMessageStruct *)context; - if (msg == NULL) { - SPDLOG_INFO("http msg is null"); - return; - } - std::unique_ptr sms(msg); - nlohmann::json j_msg = nlohmann::json::parse( - msg->buffer, msg->buffer + msg->length, nullptr, false); - if (j_msg.is_discarded()) { - return; - } - std::string jstr = j_msg.dump() + "\n"; - std::string url = wxhelper::Config::GetInstance().GetRecvHttpUrl(); - int timeout = wxhelper::Config::GetInstance().GetRecvHttpTimeout(); - http::HttpClient client{url, timeout}; - client.SendRequest(jstr); -} +#include +namespace hook +{ + /** + * @brief 发送 HTTP 消息的回调函数 + * @param instance 回调实例 + * @param context 上下文 + * @param Work 工作项 + */ + void SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, PTP_WORK Work) + { + wxhelper::wxutils::print_utf8_to_console("SendHttpMsgCallback called"); // 调试打印 -void SendTcpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, - PTP_WORK Work) { - InnerMessageStruct *msg = (InnerMessageStruct *)context; - if (msg == NULL) { - SPDLOG_INFO("add work:msg is null"); - return; + SPDLOG_INFO("SendHttpMsgCallback called"); // 调试打印 + + InnerMessageStruct *msg = (InnerMessageStruct *)context; + if (msg == NULL) + { + wxhelper::wxutils::print_utf8_to_console("httpMsg is null"); // 调试打印 + + SPDLOG_INFO("httpMsg is null"); + return; + } + std::unique_ptr sms(msg); + nlohmann::json j_msg = nlohmann::json::parse( + msg->buffer, msg->buffer + msg->length, nullptr, false); + if (j_msg.is_discarded()) + { + wxhelper::wxutils::print_utf8_to_console("jsonMsg discarded"); // 调试打印 + + SPDLOG_INFO("jsonMsg discarded"); // 调试打印 + return; + } + std::string jstr = j_msg.dump() + "\n"; + std::string url = wxhelper::Config::GetInstance().GetRecvHttpUrl(); + int timeout = wxhelper::Config::GetInstance().GetRecvHttpTimeout(); + http::HttpClient client{url, timeout}; + client.SendRequest(jstr); } - std::unique_ptr sms(msg); - nlohmann::json j_msg = nlohmann::json::parse( - msg->buffer, msg->buffer + msg->length, nullptr, false); - if (j_msg.is_discarded()) { - return; + + /** + * @brief 发送 TCP 消息的回调函数 + * @param instance 回调实例 + * @param context 上下文 + * @param Work 工作项 + */ + void SendTcpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, PTP_WORK Work) + { + wxhelper::wxutils::print_utf8_to_console("SendTcpMsgCallback called"); // 调试打印 + + SPDLOG_INFO("SendTcpMsgCallback called"); // 调试打印 + InnerMessageStruct *msg = (InnerMessageStruct *)context; + if (msg == NULL) + { + wxhelper::wxutils::print_utf8_to_console("add work:msg is null"); // 调试打印 + + SPDLOG_INFO("add work:msg is null"); + return; + } + std::unique_ptr sms(msg); + nlohmann::json j_msg = nlohmann::json::parse( + msg->buffer, msg->buffer + msg->length, nullptr, false); + if (j_msg.is_discarded()) + { + wxhelper::wxutils::print_utf8_to_console("jsonMsg discarded"); // 调试打印 + SPDLOG_INFO("jsonMsg discarded"); // 调试打印 + return; + } + std::string jstr = j_msg.dump() + "\n"; + // wxhelper::wxutils::print_utf8_to_console("SendTcpMsgCallback jstr:" + jstr); + wxhelper::wxutils::print_utf8_to_console("SendTcpMsgCallback jstr return JSON"); + + std::string ip = wxhelper::Config::GetInstance().GetRecvTcpIp(); + int port = wxhelper::Config::GetInstance().GetRecvTcpPort(); + wxhelper::TcpClient client{ip, port}; + client.SendAndCloseSocket(jstr); } - std::string jstr = j_msg.dump() + "\n"; - std::string ip = wxhelper::Config::GetInstance().GetRecvTcpIp(); - int port = wxhelper::Config::GetInstance().GetRecvTcpPort(); - wxhelper::TcpClient client{ip, port}; - client.SendAndCloseSocket(jstr); -} - - -BaseHook::BaseHook(void *origin, void *detour) - : origin_(origin), detour_(detour) {} - -int BaseHook::Hook() { - if (hook_flag_) { - SPDLOG_INFO("hook already called"); - return 2; + /** + * @brief 钩子类的构造函数 + * @param origin 原始函数指针 + * @param detour 替换函数指针 + */ + BaseHook::BaseHook(void *origin, void *detour) + : origin_(origin), detour_(detour) + { + wxhelper::wxutils::print_utf8_to_console("BaseHook created with origin"); // 调试打印 + // 调试打印 + SPDLOG_INFO("BaseHook created with origin: {} and detour: {}", origin, detour); // 调试打印 } - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourAttach((PVOID *)origin_, detour_); - LONG ret = DetourTransactionCommit(); - if (ret == NO_ERROR) { - hook_flag_ = true; - } - return ret; -} -int BaseHook::Unhook() { - if (!hook_flag_) { - SPDLOG_INFO("hook already called"); - return NO_ERROR; - } - UINT64 base = wxhelper::wxutils::GetWeChatWinBase(); - DetourTransactionBegin(); - DetourUpdateThread(GetCurrentThread()); - DetourDetach((PVOID *)origin_, detour_); - LONG ret = DetourTransactionCommit(); - if (ret == NO_ERROR) { - hook_flag_ = false; - } - return ret; -} + /** + * @brief 安装钩子函数 + * @return 返回安装钩子的结果 + */ + int BaseHook::Hook() + { + wxhelper::wxutils::print_utf8_to_console("Hook called"); // 调试打印 + SPDLOG_INFO("Hook called"); // 调试打印 + if (hook_flag_) + { + // std::cout << "hook already called" << std::endl; // 调试打印 + wxhelper::wxutils::print_utf8_to_console("hook already called"); // 调试打印 -} // namespace hook \ No newline at end of file + SPDLOG_INFO("hook already called"); + + return 2; + } + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourAttach((PVOID *)origin_, detour_); + LONG ret = DetourTransactionCommit(); + if (ret == NO_ERROR) + { + hook_flag_ = true; + } + return ret; + } + + /** + * @brief 卸载钩子函数 + * @return 返回卸载钩子的结果 + */ + int BaseHook::Unhook() + { + wxhelper::wxutils::print_utf8_to_console("Unhook called"); // 调试打印 + + SPDLOG_INFO("Unhook called"); // 调试打印 + if (!hook_flag_) + { + wxhelper::wxutils::print_utf8_to_console("hook already called"); // 调试打印 + SPDLOG_INFO("hook already called"); + return NO_ERROR; + } + UINT64 base = wxhelper::wxutils::GetWeChatWinBase(); + DetourTransactionBegin(); + DetourUpdateThread(GetCurrentThread()); + DetourDetach((PVOID *)origin_, detour_); + LONG ret = DetourTransactionCommit(); + if (ret == NO_ERROR) + { + hook_flag_ = false; + } + return ret; + } + +} // namespace hook \ No newline at end of file diff --git a/app/wxhelper/src/hook.h b/app/wxhelper/src/hook.h index 182350e..3221467 100644 --- a/app/wxhelper/src/hook.h +++ b/app/wxhelper/src/hook.h @@ -4,35 +4,61 @@ #include namespace hook { -struct InnerMessageStruct { - char* buffer; - int64_t length; - ~InnerMessageStruct() { - if (this->buffer != NULL) { - delete[] this->buffer; - this->buffer = NULL; - } - } -}; + /** + * @struct InnerMessageStruct 定义了一个名为 InnerMessageStruct 的结构体,用于在内部消息传递中存储缓冲区和长度信息 + */ + struct InnerMessageStruct { + char* buffer; + int64_t length; + // 析构函数,用于释放缓冲区内存 + ~InnerMessageStruct() { + if (this->buffer!= NULL) { + delete[] this->buffer; + this->buffer = NULL; + } + } + }; -void SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, - PTP_WORK Work); + /** + * @brief 发送 HTTP 消息的回调函数 + * @param instance 回调实例 + * @param context 上下文 + * @param Work 工作项 + */ + void SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, PTP_WORK Work); -void SendTcpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, - PTP_WORK Work); -class BaseHook { - public: - BaseHook():hook_flag_(false),origin_(nullptr),detour_(nullptr){} - BaseHook(void* origin, void* detour); - int Hook(); - int Unhook(); - virtual ~BaseHook() {} + /** + * @brief 发送 TCP 消息的回调函数 + * @param instance 回调实例 + * @param context 上下文 + * @param Work 工作项 + */ + void SendTcpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, PTP_WORK Work); - protected: - bool hook_flag_; - void* origin_; - void* detour_; -}; + /** + * @class BaseHook 定义了一个名为 BaseHook 的类,作为钩子的基类 + */ + class BaseHook { + public: + // 构造函数 + BaseHook():hook_flag_(false),origin_(nullptr),detour_(nullptr){} + // 构造函数,接收原始函数和替换函数的指针 + BaseHook(void* origin, void* detour); + // 钩子函数,用于安装钩子 + int Hook(); + // 卸载钩子函数 + int Unhook(); + // 虚析构函数 + virtual ~BaseHook() {} + + protected: + // 钩子标志 + bool hook_flag_; + // 原始函数指针 + void* origin_; + // 替换函数指针 + void* detour_; + }; } // namespace hook #endif \ No newline at end of file