diff --git a/src/account_mgr.cc b/src/account_mgr.cc index 5cd20e4..c3ac3f2 100644 --- a/src/account_mgr.cc +++ b/src/account_mgr.cc @@ -1,6 +1,7 @@ #include "pch.h" #include "account_mgr.h" #include "wechat_function.h" +#include "spdlog/spdlog.h" using namespace std; namespace wxhelper { @@ -215,6 +216,35 @@ int AccountMgr::Logout() { return success; } +int AccountMgr::EnterWeChat() { + int success = -1; + DWORD enter_wechat_callback_addr = base_addr_ + WX_ENTER_WECHAT_CALLBACK_OFFSET; + std::vector vec; + bool found = Utils::ScanAndMatchValue(base_addr_ + 0x2A66A18, vec); + if (found) { + HANDLE handle = GetCurrentProcess(); + for (int i = 0; i < vec.size(); i++) { + DWORD ptr = vec.at(i); + DWORD value; + if (ReadProcessMemory(handle, (LPVOID)ptr, &value, sizeof(value), NULL)) { + if (value == base_addr_ + 0x2A66A18) { + DWORD login_wnd = ptr; + __asm { + PUSHAD + MOV ECX, login_wnd + CALL enter_wechat_callback_addr + POPAD + } + success = 1; + break; + } + } + } + } + + return success; +} + /// @brief 根据 502647092 提供的偏移 获取二维码url /// @return std::string AccountMgr::GetQRCodeUrl() { diff --git a/src/account_mgr.h b/src/account_mgr.h index 8342c9c..2286a19 100644 --- a/src/account_mgr.h +++ b/src/account_mgr.h @@ -18,6 +18,8 @@ namespace wxhelper{ int Logout(); std::string GetQRCodeUrl(); + + int EnterWeChat(); }; } diff --git a/src/api_route.h b/src/api_route.h index 8f9cbc8..50c69da 100644 --- a/src/api_route.h +++ b/src/api_route.h @@ -81,6 +81,7 @@ typedef enum HTTP_API_ROUTE { WECHAT_REFUSE, WECHAT_GET_HEAD_IMG, WECHAT_MOD_CONTACT_REMARK, + WECHAT_ENTER_WECHAT, } WECHAT_HTTP_APIS, *PWECHAT_HTTP_APIS; diff --git a/src/http_handler.cc b/src/http_handler.cc index c372af5..014dd08 100644 --- a/src/http_handler.cc +++ b/src/http_handler.cc @@ -685,6 +685,12 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) { ret = ret_data.dump(); break; } + case WECHAT_ENTER_WECHAT: { + int success = g_context.account_mgr->EnterWeChat(); + json ret_data = { {"code", success}, {"result", "OK"} }; + ret = ret_data.dump(); + break; + } default: json ret_data = {{"result", "ERROR"}, {"msg", "not support api"}}; ret = ret_data.dump(); diff --git a/src/utils.cc b/src/utils.cc index d92bd2b..6b09860 100644 --- a/src/utils.cc +++ b/src/utils.cc @@ -211,4 +211,36 @@ bool Utils::IsTextUtf8(const char *str,int length) { } return (bytes_num == 0); } + +bool Utils::ScanAndMatchValue(DWORD value, std::vector& result) { + SYSTEM_INFO sys_info; + GetSystemInfo(&sys_info); + + LPVOID current_addr = sys_info.lpMinimumApplicationAddress; + DWORD pageSize = sys_info.dwPageSize; + + MEMORY_BASIC_INFORMATION mem_info = {}; + HANDLE handle = GetCurrentProcess(); + while (current_addr < sys_info.lpMaximumApplicationAddress) { + if (VirtualQueryEx(handle, current_addr, &mem_info, sizeof(MEMORY_BASIC_INFORMATION))) { + if (mem_info.State == MEM_COMMIT && (mem_info.Protect & (PAGE_READONLY | PAGE_READWRITE | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE))) { + // 读取内存并搜索值 + LPVOID pBuffer = new BYTE[mem_info.RegionSize]; + if (ReadProcessMemory(handle, mem_info.BaseAddress, pBuffer, mem_info.RegionSize, NULL)) { + for (DWORD i = 0; i < mem_info.RegionSize; i += sizeof(DWORD)) { + if (*(PDWORD)((LPBYTE)pBuffer + i) == value) { + result.push_back((DWORD)mem_info.BaseAddress + i); + } + } + } + delete[] pBuffer; + } + current_addr = (LPBYTE)mem_info.BaseAddress + mem_info.RegionSize; + } + else { + current_addr = (LPBYTE)current_addr + pageSize; + } + }; + return !result.empty(); +} } // namespace wxhelper \ No newline at end of file diff --git a/src/utils.h b/src/utils.h index 284c324..3cd8207 100644 --- a/src/utils.h +++ b/src/utils.h @@ -49,6 +49,8 @@ class Utils { static bool IsTextUtf8(const char * str,int length) ; + static bool ScanAndMatchValue(DWORD value, std::vector& result); + template static std::vector split(T1 str, T2 letter) { std::vector arr; diff --git a/src/wechat_function.h b/src/wechat_function.h index f1dc8ea..bfc49b8 100644 --- a/src/wechat_function.h +++ b/src/wechat_function.h @@ -127,6 +127,7 @@ #define WX_GET_CURRENT_DATA_PATH_OFFSET 0xc872c0 #define WX_QR_CODE_LOGIN_MGR_OFFSET 0xae9db0 #define WX_GET_QR_CODE_IMAGE_OFFSET 0xcda6f0 +#define WX_ENTER_WECHAT_CALLBACK_OFFSET 0xaf5050 //forward #define WX_FORWARD_MSG_OFFSET 0xce6730