feat: fix

This commit is contained in:
ttttupup 2024-04-06 23:37:07 +08:00
parent ff21d07e40
commit b6e07cc3d7
8 changed files with 88 additions and 121 deletions

View File

@ -12,7 +12,7 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /MD /EHsc ") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17 /MD /EHsc /FAcs")
file(GLOB CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c ) file(GLOB CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/*.c )
@ -30,7 +30,7 @@ add_subdirectory(../base base)
add_library(wxhelper SHARED ${CPP_FILES} ${ASM_FILES}) add_library(wxhelper SHARED ${CPP_FILES} ${ASM_FILES})
target_compile_definitions(wxhelper PRIVATE WECHAT_VERSION=39825) target_compile_definitions(wxhelper PRIVATE WECHAT_VERSION=39943)
# target_include_directories(wxhelper # target_include_directories(wxhelper
# PRIVATE ../base/src/include # PRIVATE ../base/src/include

View File

@ -1,12 +1,12 @@
#include "chat_controller.h" #include "chat_controller.h"
#include "json_utils.h"
#include "nlohmann/json.hpp" #include "nlohmann/json.hpp"
#include "offset.h"
#include "spdlog/spdlog.h" #include "spdlog/spdlog.h"
#include "utils.h" #include "utils.h"
#include "wechat_interface.h" #include "wechat_interface.h"
#include "wxutils.h" #include "wxutils.h"
#include "offset.h"
#include "json_utils.h"
namespace offset = wechat::offset; namespace offset = wechat::offset;
namespace prototype = wechat::prototype; namespace prototype = wechat::prototype;
@ -16,7 +16,33 @@ namespace jsonutils = wxhelper::jsonutils;
namespace wxhelper { namespace wxhelper {
std::string ChatController::SendTextMsg(std::string params) { std::string ChatController::SendTextMsg(std::string params) {
return std::string(); int64_t base_addr = wxutils::GetWeChatWinBase();
nlohmann::json jp = nlohmann::json::parse(params);
SPDLOG_INFO("sendTextMsg wxid={},msg={}",jp["wxid"],jp["msg"]);
std::wstring wxid = jsonutils::GetWStringParam(jp, "wxid");
std::wstring msg = jsonutils::GetWStringParam(jp, "msg");
prototype::WeChatString to_user(wxid);
prototype::WeChatString text_msg(msg);
uint64_t send_message_mgr_addr = base_addr + offset::kGetSendMessageMgr;
uint64_t send_text_msg_addr = base_addr + offset::kSendTextMsg;
uint64_t free_chat_msg_addr = base_addr + offset::kFreeChatMsg;
char chat_msg[0x460] = {0};
uint64_t temp[3] = {0};
func::__GetSendMessageMgr mgr;
mgr = (func::__GetSendMessageMgr)send_message_mgr_addr;
func::__SendTextMsg send;
send = (func::__SendTextMsg)send_text_msg_addr;
func::__FreeChatMsg free;
free = (func::__FreeChatMsg)free_chat_msg_addr;
mgr();
uint64_t success = send(reinterpret_cast<UINT64>(&chat_msg),
reinterpret_cast<UINT64>(&to_user),
reinterpret_cast<UINT64>(&text_msg),
reinterpret_cast<UINT64>(&temp), 1, 1, 0, 0);
free(reinterpret_cast<UINT64>(&chat_msg));
nlohmann::json ret_data = {{"code", success}, {"data", {}}, {"msg", "success"}};
return ret_data.dump();
} }
std::string ChatController::SendImageMsg(std::string params) { std::string ChatController::SendImageMsg(std::string params) {
return std::string(); return std::string();

View File

@ -1,9 +1,8 @@
#ifndef WXHELPER_CHAT_CONTROLLER_H_ #ifndef WXHELPER_CHAT_CONTROLLER_H_
#define WXHELPER_CHAT_CONTROLLER_H_ #define WXHELPER_CHAT_CONTROLLER_H_
#include <Windows.h>
#include "http_controller.h" #include "http_controller.h"
#include "spdlog/spdlog.h"
namespace wxhelper { namespace wxhelper {
class ChatController : public http::HttpController<ChatController> { class ChatController : public http::HttpController<ChatController> {
public: public:

View File

@ -2,61 +2,59 @@
#include "hook.h" #include "hook.h"
#include "base64.h"
#include "client_socket.h" #include "client_socket.h"
#include "config.h" #include "config.h"
#include "detours.h" #include "detours.h"
#include "http_client.h" #include "http_client.h"
#include "nlohmann/json.hpp" #include "nlohmann/json.hpp"
#include "offset.h"
#include "spdlog/spdlog.h" #include "spdlog/spdlog.h"
#include "thread_pool.h" // #include "thread_pool.h"
#include "utils.h" #include "utils.h"
#include "wechat_interface.h"
#include "wxutils.h" #include "wxutils.h"
namespace hook { namespace hook {
void SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
VOID SendTcpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
PTP_WORK Work) {
wechat::InnerMessageStruct *msg = (wechat::InnerMessageStruct *)context;
if (msg == NULL) {
SPDLOG_INFO("add work:msg is null");
return;
}
std::unique_ptr<wechat::InnerMessageStruct> sms(msg);
nlohmann::json j_msg = nlohmann::json::parse(
msg->buffer, msg->buffer + msg->length, nullptr, false);
if (j_msg.is_discarded() == true) {
return;
}
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);
}
VOID SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
PTP_WORK Work) { PTP_WORK Work) {
wechat::InnerMessageStruct *msg = (wechat::InnerMessageStruct *)context; InnerMessageStruct *msg = (InnerMessageStruct *)context;
if (msg == NULL) { if (msg == NULL) {
SPDLOG_INFO("http msg is null"); SPDLOG_INFO("http msg is null");
return; return;
} }
std::unique_ptr<InnerMessageStruct> sms(msg);
std::unique_ptr<wechat::InnerMessageStruct> sms(msg);
nlohmann::json j_msg = nlohmann::json::parse( nlohmann::json j_msg = nlohmann::json::parse(
msg->buffer, msg->buffer + msg->length, nullptr, false); msg->buffer, msg->buffer + msg->length, nullptr, false);
if (j_msg.is_discarded() == true) { if (j_msg.is_discarded()) {
return; return;
} }
std::string jstr = j_msg.dump() + "\n"; std::string jstr = j_msg.dump() + "\n";
std::string url =wxhelper::Config::GetInstance().GetRecvHttpUrl(); std::string url = wxhelper::Config::GetInstance().GetRecvHttpUrl();
int timeout = wxhelper::Config::GetInstance().GetRecvHttpTimeout(); int timeout = wxhelper::Config::GetInstance().GetRecvHttpTimeout();
http::HttpClient client{url,timeout}; http::HttpClient client{url, timeout};
client.SendRequest(jstr); client.SendRequest(jstr);
} }
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;
}
std::unique_ptr<InnerMessageStruct> 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 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) BaseHook::BaseHook(void *origin, void *detour)
: origin_(origin), detour_(detour) {} : origin_(origin), detour_(detour) {}
@ -91,55 +89,4 @@ int BaseHook::Unhook() {
return ret; return ret;
} }
SyncMsgHook::SyncMsgHook(void *origin, void *detour)
: BaseHook(origin, detour) {}
void SyncMsgHook::HandleSyncMsg(INT64 param1, INT64 param2, INT64 param3) {
nlohmann::json msg;
msg["pid"] = GetCurrentProcessId();
msg["fromUser"] =
wxhelper::wxutils::ReadSKBuiltinString(*(INT64 *)(param2 + 0x18));
msg["toUser"] =
wxhelper::wxutils::ReadSKBuiltinString(*(INT64 *)(param2 + 0x28));
msg["content"] =
wxhelper::wxutils::ReadSKBuiltinString(*(INT64 *)(param2 + 0x30));
msg["signature"] =
wxhelper::wxutils::ReadWeChatStr(*(INT64 *)(param2 + 0x48));
msg["msgId"] = *(INT64 *)(param2 + 0x60);
msg["msgSequence"] = *(DWORD *)(param2 + 0x5C);
msg["createTime"] = *(DWORD *)(param2 + 0x58);
msg["displayFullContent"] =
wxhelper::wxutils::ReadWeChatStr(*(INT64 *)(param2 + 0x50));
DWORD type = *(DWORD *)(param2 + 0x24);
msg["type"] = type;
if (type == 3) {
int a = 1;
std::string img =
wxhelper::wxutils::ReadSKBuiltinBuffer(*(INT64 *)(param2 + 0x40));
SPDLOG_INFO("encode size:{}", img.size());
msg["base64Img"] = base64_encode(img);
a = 2;
}
std::string jstr = msg.dump() + '\n';
wechat::InnerMessageStruct *inner_msg = new wechat::InnerMessageStruct;
inner_msg->buffer = new char[jstr.size() + 1];
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
inner_msg->length = jstr.size();
std::string mode = wxhelper::Config::GetInstance().GetRecvMessageMode();
if (mode == "http") {
bool add =
base::ThreadPool::GetInstance().AddWork(SendHttpMsgCallback, inner_msg);
SPDLOG_INFO("add http msg work:{}", add);
} else if (mode == "tcp") {
bool add =
base::ThreadPool::GetInstance().AddWork(SendTcpMsgCallback, inner_msg);
SPDLOG_INFO("add tcp msg work:{}", add);
}
int64_t addr =
wxhelper::wxutils::GetWeChatWinBase() + wechat::offset::kDoAddMsg;
wechat::function::__DoAddMsg addMsg = (wechat::function::__DoAddMsg)addr;
addMsg(param1, param2, param3);
}
} // namespace hook } // namespace hook

View File

@ -1,19 +1,32 @@
#ifndef WXHELPER_HOOK_H_ #ifndef WXHELPER_HOOK_H_
#define WXHELPER_HOOK_H_ #define WXHELPER_HOOK_H_
#include "noncopyable.h"
#include <Windows.h> #include <Windows.h>
#include <stdint.h>
namespace hook { namespace hook {
struct InnerMessageStruct {
char* buffer;
int64_t length;
~InnerMessageStruct() {
if (this->buffer != NULL) {
delete[] this->buffer;
this->buffer = NULL;
}
}
};
static void SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, void SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
PTP_WORK Work); PTP_WORK Work);
static void SendTcpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context, void SendTcpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
PTP_WORK Work); PTP_WORK Work);
class BaseHook : public NonCopyable { class BaseHook {
public: public:
BaseHook():hook_flag_(false),origin_(nullptr),detour_(nullptr){}
BaseHook(void* origin, void* detour); BaseHook(void* origin, void* detour);
int Hook(); int Hook();
int Unhook(); int Unhook();
virtual ~BaseHook() {}
protected: protected:
bool hook_flag_; bool hook_flag_;
@ -21,12 +34,5 @@ class BaseHook : public NonCopyable {
void* detour_; void* detour_;
}; };
class SyncMsgHook : public BaseHook {
public:
explicit SyncMsgHook(void* origin, void* detour);
private:
static void HandleSyncMsg(INT64 param1, INT64 param2, INT64 param3);
};
} // namespace hook } // namespace hook
#endif #endif

View File

@ -1,9 +1,9 @@
#ifndef WXHELPER_HTTP_CONTROLLER_H_ #ifndef WXHELPER_HTTP_CONTROLLER_H_
#define WXHELPER_HTTP_CONTROLLER_H_ #define WXHELPER_HTTP_CONTROLLER_H_
#include <Windows.h>
#include "http_router.h" #include "http_router.h"
#include "singleton.h"
namespace http { namespace http {
#define PATHS_BEGIN static void AddPath() { #define PATHS_BEGIN static void AddPath() {
#define ADD_PATH(path, method) RegisterPath(path, &method) #define ADD_PATH(path, method) RegisterPath(path, &method)
@ -15,7 +15,7 @@ class BaseHttpController {
}; };
template <typename T> template <typename T>
class HttpController : public BaseHttpController { class HttpController : public base::Singleton<T>{
public: public:
virtual ~HttpController() {} virtual ~HttpController() {}

View File

@ -130,11 +130,11 @@ const uint64_t kSyncMsg = 0xc39680;
const uint64_t kSyncMsgNext = 0xc39680; const uint64_t kSyncMsgNext = 0xc39680;
const uint64_t kGetCurrentDataPath = 0x101a920; const uint64_t kGetCurrentDataPath = 0x101a920;
const uint64_t kGetAppDataSavePath = 0x13a5b90; const uint64_t kGetAppDataSavePath = 0x13a5b90;
const uint64_t kGetSendMessageMgr = 0x94cd10; const uint64_t kGetSendMessageMgr = 0xa7c730;
const uint64_t kSendTextMsg = 0x1091F70; const uint64_t kSendTextMsg = 0x11de090;
const uint64_t kFreeChatMsg = 0x94e590; const uint64_t kFreeChatMsg = 0xa7dfb0;
const uint64_t kDoAddMsg = 0x10d9450; const uint64_t kDoAddMsg = 0x1225a60;
const uint64_t kSendImageMsg = 0x1087950; const uint64_t kSendImageMsg = 0x1087950;
const uint64_t kChatMsgInstanceCounter = 0x956e00; const uint64_t kChatMsgInstanceCounter = 0x956e00;
const uint64_t kSendFileMsg = 0xea0850; const uint64_t kSendFileMsg = 0xea0850;

View File

@ -32,17 +32,6 @@ struct SqlResult {
bool is_blob; bool is_blob;
}; };
struct InnerMessageStruct {
char *buffer;
int64_t length;
~InnerMessageStruct() {
if (this->buffer != NULL) {
delete[] this->buffer;
this->buffer = NULL;
}
}
};
struct SelfInfoInner { struct SelfInfoInner {
std::string name; std::string name;
std::string city; std::string city;