diff --git a/WeChatFerry/rpc/proto/wcf.proto b/WeChatFerry/rpc/proto/wcf.proto index 3a121f2..270e5e6 100644 --- a/WeChatFerry/rpc/proto/wcf.proto +++ b/WeChatFerry/rpc/proto/wcf.proto @@ -30,6 +30,7 @@ enum Functions { FUNC_DOWNLOAD_ATTACH = 0x54; FUNC_GET_CONTACT_INFO = 0x55; FUNC_REVOKE_MSG = 0x56; + FUNC_REFRESH_QRCODE = 0x57; FUNC_DECRYPT_IMAGE = 0x60; FUNC_EXEC_OCR = 0x61; FUNC_ADD_ROOM_MEMBERS = 0x70; diff --git a/WeChatFerry/spy/funcs.cpp b/WeChatFerry/spy/funcs.cpp index ad74649..d52f5ae 100644 --- a/WeChatFerry/spy/funcs.cpp +++ b/WeChatFerry/spy/funcs.cpp @@ -409,10 +409,17 @@ OcrResult_t GetOcrResult(string path) return ret; } -void RefreshLoginQrcode() { +string GetLoginUrl() +{ + if (GET_DWORD(g_WeChatWinDllAddr + g_WxCalls.login) == 1) { + return ""; // 已登录直接返回空字符 + } + DWORD refreshLoginQrcodeCall1 = g_WeChatWinDllAddr + g_WxCalls.rlq.call1; DWORD refreshLoginQrcodeCall2 = g_WeChatWinDllAddr + g_WxCalls.rlq.call2; + DWORD loginUrlAddr = g_WeChatWinDllAddr + g_WxCalls.rlq.url; + // 刷新二维码 __asm { pushad; pushfd; @@ -422,16 +429,8 @@ void RefreshLoginQrcode() { popfd; popad; } -} -string GetLoginUrl() { - // 判断是否登录, 已登录直接返回空字符 - int isLogin = (int)GET_DWORD(g_WeChatWinDllAddr + g_WxCalls.login); - if (isLogin) { - return ""; - } - - DWORD loginUrlAddr = g_WeChatWinDllAddr + g_WxCalls.rlq.url; - string qrcodeLoginUrl = "http://weixin.qq.com/x/" + string(reinterpret_cast(*(DWORD*)loginUrlAddr)); - return qrcodeLoginUrl; + // 获取二维码链接 + string url = "http://weixin.qq.com/x/" + string(reinterpret_cast(*(DWORD *)loginUrlAddr)); + return url; } diff --git a/WeChatFerry/spy/funcs.h b/WeChatFerry/spy/funcs.h index 3a12145..ec4e0f8 100644 --- a/WeChatFerry/spy/funcs.h +++ b/WeChatFerry/spy/funcs.h @@ -9,3 +9,4 @@ int RefreshPyq(uint64_t id); int DownloadAttach(uint64_t id, std::string thumb, std::string extra); int RevokeMsg(uint64_t id); OcrResult_t GetOcrResult(std::string path); +string GetLoginUrl(); diff --git a/WeChatFerry/spy/rpc_server.cpp b/WeChatFerry/spy/rpc_server.cpp index 4e336dd..1e3b847 100644 --- a/WeChatFerry/spy/rpc_server.cpp +++ b/WeChatFerry/spy/rpc_server.cpp @@ -689,6 +689,24 @@ bool func_revoke_msg(uint64_t id, uint8_t *out, size_t *len) return true; } +bool func_refresh_qrcode(uint8_t *out, size_t *len) +{ + Response rsp = Response_init_default; + rsp.func = Functions_FUNC_REFRESH_QRCODE; + rsp.which_msg = Response_str_tag; + + rsp.msg.str = (char *)GetLoginUrl().c_str(); + + pb_ostream_t stream = pb_ostream_from_buffer(out, *len); + if (!pb_encode(&stream, Response_fields, &rsp)) { + LOG_ERROR("Encoding failed: {}", PB_GET_ERROR(&stream)); + return false; + } + *len = stream.bytes_written; + + return true; +} + bool func_decrypt_image(DecPath dec, uint8_t *out, size_t *len) { Response rsp = Response_init_default; @@ -926,6 +944,10 @@ static bool dispatcher(uint8_t *in, size_t in_len, uint8_t *out, size_t *out_len ret = func_revoke_msg(req.msg.ui64, out, out_len); break; } + case Functions_FUNC_REFRESH_QRCODE: { + ret = func_refresh_qrcode(out, out_len); + break; + } case Functions_FUNC_DECRYPT_IMAGE: { ret = func_decrypt_image(req.msg.dec, out, out_len); break;