Compare commits

...
Author SHA1 Message Date
ttttupupandGitHub 57ab98351a Merge pull request #493 from rainhon/3.9.2.23-V10
添加微信进入接口 3.9.2.23 v10
2024-11-27 08:49:27 +08:00
rain 88e89c4836 添加进入微信接口 2024-11-26 21:49:40 +08:00
rain 158da3fb64 11 2024-11-15 19:02:31 +08:00
hugy 5e04ddfcd2 doc: update 2023-06-08 09:27:14 +08:00
9 changed files with 87 additions and 4 deletions
+8 -2
View File
@@ -303,7 +303,10 @@
|参数|必选|类型|说明|
|---|---|---|---|
|port |true |string| 本地服务端端口,用来接收消息内容 |
|ip |true |string| 服务端ip地址,用来接收消息内容,可以是任意ip,即tcp客户端连接的服务端的ip (3.8.1.26版本)|
|ip |true |string| 服务端ip地址,用来接收消息内容,可以是任意ip,即tcp客户端连接的服务端的ip |
|url |true |string| http的请求地址,enableHttp=1时,不能为空 |
|timeout |true |string| 超时时间,单位ms|
|enableHttp |true |number| 0/1 :1.启用http 0.不启用http|
###### 返回字段
|返回字段|字段类型|说明 |
@@ -317,7 +320,10 @@
``` javascript
{
"port": "19099"
"ip":"127.0.0.1"
"ip":"127.0.0.1",
"url":"http://test.com",
"timeout":"3000",
"enableHttp":1
}
```
响应:
+5 -2
View File
@@ -299,7 +299,7 @@ enableHttp=0时,使用ip,port的tcp服务回传消息。
|参数|必选|类型|说明|
|---|---|---|---|
|port |true |string| 本地服务端端口,用来接收消息内容 |
|ip |true |string| 服务端ip地址,用来接收消息内容,可以是任意ip,即tcp客户端连接的服务端的ip (3.8.1.26版本)|
|ip |true |string| 服务端ip地址,用来接收消息内容,可以是任意ip,即tcp客户端连接的服务端的ip |
|url |true |string| http的请求地址,enableHttp=1时,不能为空 |
|timeout |true |string| 超时时间,单位ms|
|enableHttp |true |number| 0/1 :1.启用http 0.不启用http|
@@ -316,7 +316,10 @@ enableHttp=0时,使用ip,port的tcp服务回传消息。
``` javascript
{
"port": "19099"
"ip":"127.0.0.1"
"ip":"127.0.0.1",
"url":"http://test.com",
"timeout":"3000",
"enableHttp":1,
}
```
响应:
+30
View File
@@ -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<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() {
+2
View File
@@ -18,6 +18,8 @@ namespace wxhelper{
int Logout();
std::string GetQRCodeUrl();
int EnterWeChat();
};
}
+1
View File
@@ -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;
+6
View File
@@ -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();
+32
View File
@@ -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
View File
@@ -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;
+1
View File
@@ -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