Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

添加微信进入接口 3.9.2.23 v10 #493

Merged
merged 2 commits into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions src/account_mgr.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "pch.h"
#include "account_mgr.h"
#include "wechat_function.h"
#include "spdlog/spdlog.h"

using namespace std;
namespace wxhelper {
Expand Down Expand Up @@ -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<DWORD> 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() {
Expand Down
2 changes: 2 additions & 0 deletions src/account_mgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ namespace wxhelper{
int Logout();

std::string GetQRCodeUrl();

int EnterWeChat();
};

}
Expand Down
1 change: 1 addition & 0 deletions src/api_route.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
6 changes: 6 additions & 0 deletions src/http_handler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
32 changes: 32 additions & 0 deletions src/utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -211,4 +211,36 @@ bool Utils::IsTextUtf8(const char *str,int length) {
}
return (bytes_num == 0);
}

bool Utils::ScanAndMatchValue(DWORD value, std::vector<DWORD>& 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
2 changes: 2 additions & 0 deletions src/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ class Utils {

static bool IsTextUtf8(const char * str,int length) ;

static bool ScanAndMatchValue(DWORD value, std::vector<DWORD>& result);

template <typename T1, typename T2>
static std::vector<T1> split(T1 str, T2 letter) {
std::vector<T1> arr;
Expand Down
1 change: 1 addition & 0 deletions src/wechat_function.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down