From 8c47f096c92dcd1b035542f867653938a92876cb Mon Sep 17 00:00:00 2001 From: Changhua Date: Tue, 4 Mar 2025 00:18:43 +0800 Subject: [PATCH] feat(misc): impl get qr code --- WeChatFerry/spy/misc_manager.cpp | 22 ++++++++++++++++------ WeChatFerry/spy/rpc_server.cpp | 2 +- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/WeChatFerry/spy/misc_manager.cpp b/WeChatFerry/spy/misc_manager.cpp index f674d1d..d7a1662 100644 --- a/WeChatFerry/spy/misc_manager.cpp +++ b/WeChatFerry/spy/misc_manager.cpp @@ -29,7 +29,6 @@ namespace OsSns = Offsets::Misc::Sns; #define OS_GET_MGR_BY_PREFIX_LOCAL_ID 0x213FB00 #define OS_GET_PRE_DOWNLOAD_MGR 0x1C0EE70 #define OS_PUSH_ATTACH_TASK 0x1CDF4E0 -#define OS_LOGIN_QR_CODE 0x59620D8 using get_sns_data_mgr_t = QWORD (*)(); using get_sns_timeline_mgr_t = QWORD (*)(); @@ -43,6 +42,7 @@ using get_mgr_by_prefix_localid_t = QWORD (*)(QWORD, QWORD); using push_attach_task_t = QWORD (*)(QWORD, QWORD, QWORD, QWORD); using get_ocr_manager_t = QWORD (*)(); using do_ocr_task_t = QWORD (*)(QWORD, QWORD, QWORD, QWORD, QWORD, QWORD); +using get_qr_code_mgr_t = QWORD (*)(); struct ImagePattern { uint8_t header1_candidate; @@ -340,13 +340,23 @@ int revoke_message(uint64_t id) std::string get_login_url() { - LPVOID targetAddress = reinterpret_cast(g_WeChatWinDllAddr) + OS_LOGIN_QR_CODE; - char *dataPtr = *reinterpret_cast(targetAddress); - if (!dataPtr) { + std::string uri; + get_qr_code_mgr_t get_qr_code_mgr = (get_qr_code_mgr_t)(g_WeChatWinDllAddr + Offsets::Misc::QR_CODE); + + uint64_t addr = get_qr_code_mgr() + 0x68; + uint64_t len = *(uint64_t *)(addr + 0x10); + if (len == 0) { LOG_ERROR("获取二维码失败."); - return ""; + return uri; } - return "http://weixin.qq.com/x/" + std::string(dataPtr, 22); + + if (*(uint64_t *)(addr + 0x18) == 0xF) { + uri = std::string((char *)addr, len); + } else { + uri = std::string(*(char **)(addr), len); + } + + return "http://weixin.qq.com/x/" + uri; } int receive_transfer(const std::string &wxid, const std::string &transferid, const std::string &transactionid) diff --git a/WeChatFerry/spy/rpc_server.cpp b/WeChatFerry/spy/rpc_server.cpp index 148540a..e39bda6 100644 --- a/WeChatFerry/spy/rpc_server.cpp +++ b/WeChatFerry/spy/rpc_server.cpp @@ -263,7 +263,7 @@ const std::unordered_map RpcServer::rpcFu // { Functions_FUNC_DOWNLOAD_ATTACH, [](const Request &r, uint8_t *out, size_t *len) { return misc::rpc_download_attachment(r.msg.att, out, len); } }, // { Functions_FUNC_GET_CONTACT_INFO, [](const Request &r, uint8_t *out, size_t *len) { return contact::rpc_get_contact_info(r.msg.str, out, len); } }, // { Functions_FUNC_REVOKE_MSG, [](const Request &r, uint8_t *out, size_t *len) { return misc::rpc_revoke_message(r.msg.ui64, out, len); } }, - // { Functions_FUNC_REFRESH_QRCODE, [](const Request &r, uint8_t *out, size_t *len) { return misc::rpc_get_login_url(out, len); } }, + { Functions_FUNC_REFRESH_QRCODE, [](const Request &r, uint8_t *out, size_t *len) { return misc::rpc_get_login_url(out, len); } }, { Functions_FUNC_DECRYPT_IMAGE, [](const Request &r, uint8_t *out, size_t *len) { return misc::rpc_decrypt_image(r.msg.dec, out, len); } }, { Functions_FUNC_EXEC_OCR, [](const Request &r, uint8_t *out, size_t *len) { return misc::rpc_get_ocr_result(r.msg.str, out, len); } }, // { Functions_FUNC_ADD_ROOM_MEMBERS, [](const Request &r, uint8_t *out, size_t *len) { return chatroom::rpc_add_chatroom_member(r.msg.m, out, len); } },