Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a777f05512 | ||
|
|
926babbc66 | ||
|
|
bf0018ae05 | ||
|
|
d6d650335f | ||
|
|
d22aa9de2d | ||
|
|
64a603c96b | ||
|
|
63ac97c864 | ||
|
|
1b8c3a851c | ||
|
|
d38f413c3d |
+90
-1
@@ -41,6 +41,8 @@
|
||||
62.发送公众号消息
|
||||
63.转发公众号消息
|
||||
64.发送小程序
|
||||
65.退款
|
||||
66.下载头像
|
||||
|
||||
### 接口文档:
|
||||
|
||||
@@ -282,7 +284,10 @@
|
||||
|
||||
#### 9.hook消息**
|
||||
###### 接口功能
|
||||
> hook接收文本消息,图片消息,群消息.该接口将hook的消息通过tcp回传给本地的端口
|
||||
> hook接收文本消息,图片消息,群消息.该接口将hook的消息通过tcp回传给本地的端口。
|
||||
enableHttp=1时,使用url,timeout参数配置服务端的接收地址。请求为post,Content-Type 为json。
|
||||
enableHttp=0时,使用ip,port的tcp服务回传消息。
|
||||
|
||||
|
||||
###### 接口地址
|
||||
> [/api/?type=9](/api/?type=9)
|
||||
@@ -295,6 +300,9 @@
|
||||
|---|---|---|---|
|
||||
|port |true |string| 本地服务端端口,用来接收消息内容 |
|
||||
|ip |true |string| 服务端ip地址,用来接收消息内容,可以是任意ip,即tcp客户端连接的服务端的ip (3.8.1.26版本)|
|
||||
|url |true |string| http的请求地址,enableHttp=1时,不能为空 |
|
||||
|timeout |true |string| 超时时间,单位ms|
|
||||
|enableHttp |true |number| 0/1 :1.启用http 0.不启用http|
|
||||
|
||||
###### 返回字段
|
||||
|返回字段|字段类型|说明 |
|
||||
@@ -1911,6 +1919,87 @@
|
||||
"wxid": "filehelper"
|
||||
}
|
||||
|
||||
```
|
||||
响应:
|
||||
``` javascript
|
||||
{"code":1,"result":"OK"}
|
||||
```
|
||||
|
||||
|
||||
#### 65.退款**
|
||||
###### 接口功能
|
||||
> 收到转账消息后,自动退款。type=49 即是转账消息。
|
||||
|
||||
###### 接口地址
|
||||
> [/api/?type=65](/api/?type=65)
|
||||
|
||||
###### HTTP请求方式
|
||||
> POST JSON
|
||||
|
||||
###### 请求参数
|
||||
|参数|必选|类型|说明|
|
||||
|---|---|---|---|
|
||||
|wxid|string|转账人微信id,从hook的消息中获取|
|
||||
|transcationId|string|从hook的消息中获取对应的字段内容。|
|
||||
|transferId|string|从hook的消息中获取对应的字段内容。|
|
||||
|
||||
###### 返回字段
|
||||
|返回字段|字段类型|说明 |
|
||||
|---|---|---|
|
||||
|code|int|返回状态,1成功|
|
||||
|result|string|成功提示|
|
||||
|
||||
|
||||
|
||||
|
||||
###### 接口示例
|
||||
入参:
|
||||
``` javascript
|
||||
{
|
||||
"wxid":"wxid_agz5q76f11112",
|
||||
"transcationId":"10000500012302060002831233124719620",
|
||||
"transferId":"10000500012023020619112332136412"
|
||||
}
|
||||
```
|
||||
响应:
|
||||
``` javascript
|
||||
{"code":1,"result":"OK"}
|
||||
```
|
||||
|
||||
|
||||
#### 66.查询或下载头像**
|
||||
###### 接口功能
|
||||
> 暂时没用的功能
|
||||
|
||||
###### 接口地址
|
||||
> [/api/?type=66](/api/?type=66)
|
||||
|
||||
###### HTTP请求方式
|
||||
> POST JSON
|
||||
|
||||
###### 请求参数
|
||||
|参数|必选|类型|说明|
|
||||
|---|---|---|---|
|
||||
|wxid|string|微信id|
|
||||
|imageUrl|string|头像地址|
|
||||
|
||||
|
||||
###### 返回字段
|
||||
|返回字段|字段类型|说明 |
|
||||
|---|---|---|
|
||||
|code|int|返回状态,1成功|
|
||||
|result|string|成功提示|
|
||||
|
||||
|
||||
|
||||
|
||||
###### 接口示例
|
||||
入参:
|
||||
``` javascript
|
||||
{
|
||||
"wxid":"wxid_agz5q76f11112",
|
||||
"imageUrl":""
|
||||
}
|
||||
```
|
||||
响应:
|
||||
``` javascript
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
from fastapi import FastAPI, Request
|
||||
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
# pip install fastapi
|
||||
# run command :uvicorn test:app --reload
|
||||
# 127.0.0.1:8000/api
|
||||
|
||||
@app.post("/api")
|
||||
def create_item(request: Request):
|
||||
print("recv msg")
|
||||
return {"code": 0, "msg": "success"}
|
||||
|
||||
|
||||
@app.middleware("http")
|
||||
async def TestCustomMiddleware(request: Request, call_next):
|
||||
the_headers = request.headers
|
||||
the_body = await request.json()
|
||||
|
||||
print(the_headers)
|
||||
print(the_body)
|
||||
|
||||
response = await call_next(request)
|
||||
|
||||
return response
|
||||
@@ -78,6 +78,8 @@ typedef enum HTTP_API_ROUTE {
|
||||
WECHAT_FORWARD_PUBLIC_MSG,
|
||||
WECHAT_FORWARD_PUBLIC_MSG_BY_SVRID,
|
||||
WECHAT_SEND_APP_MSG,
|
||||
WECHAT_REFUSE,
|
||||
WECHAT_GET_HEAD_IMG,
|
||||
} WECHAT_HTTP_APIS,
|
||||
*PWECHAT_HTTP_APIS;
|
||||
|
||||
|
||||
+34
-4
@@ -131,13 +131,17 @@ int ContactMgr::AddFriendByWxid(wchar_t *wxid,wchar_t* msg) {
|
||||
WeChatString w_msg(msg);
|
||||
DWORD instance =0;
|
||||
Unkown null_obj={0,0,0,0,0,0xF};
|
||||
// EDI,0xE ESI,0 all
|
||||
// EDI,0xE ESI,8 only chat
|
||||
// EDI,0xE ESI,1 no let look
|
||||
// EDI,0xE ESI,2 no look
|
||||
__asm{
|
||||
PUSHAD
|
||||
PUSHFD
|
||||
CALL contact_mgr_addr
|
||||
MOV dword ptr [instance],EAX
|
||||
MOV EDI,0x6
|
||||
MOV ESI,0
|
||||
MOV EDI,0xE
|
||||
MOV ESI,0x8
|
||||
MOV EAX,0x2
|
||||
SUB ESP,0x18
|
||||
MOV EAX,ESP
|
||||
@@ -150,8 +154,8 @@ int ContactMgr::AddFriendByWxid(wchar_t *wxid,wchar_t* msg) {
|
||||
MOV ECX,ESP
|
||||
PUSH EAX
|
||||
CALL fn1_addr
|
||||
PUSH 0x0
|
||||
PUSH 0x6
|
||||
PUSH ESI
|
||||
PUSH EDI
|
||||
MOV EAX,w_msg
|
||||
|
||||
SUB ESP,0x14
|
||||
@@ -255,4 +259,30 @@ int ContactMgr::AddFriendByWxid(wchar_t *wxid,wchar_t* msg) {
|
||||
success = 1;
|
||||
return success;
|
||||
}
|
||||
|
||||
int ContactMgr::GetHeadImage(wchar_t* wxid,wchar_t* url){
|
||||
int success = -1;
|
||||
WeChatString contact(wxid);
|
||||
WeChatString img_url(url);
|
||||
DWORD head_image_mgr_addr = base_addr_ + WX_HEAD_IMAGE_MGR_OFFSET;
|
||||
DWORD get_img_download_addr = base_addr_ + QUERY_THEN_DOWNLOAD_OFFSET;
|
||||
char temp[0x8] ={0};
|
||||
__asm{
|
||||
PUSHAD
|
||||
PUSHFD
|
||||
CALL head_image_mgr_addr
|
||||
LEA ECX,img_url
|
||||
PUSH ECX
|
||||
LEA ECX,contact
|
||||
PUSH ECX
|
||||
LEA ECX,temp
|
||||
PUSH ECX
|
||||
MOV ECX,EAX
|
||||
CALL get_img_download_addr
|
||||
POPFD
|
||||
POPAD
|
||||
}
|
||||
success = 1;
|
||||
return success;
|
||||
}
|
||||
} // namespace wxhelper
|
||||
@@ -16,6 +16,7 @@ class ContactMgr : public BaseMgr {
|
||||
int AddFriendByWxid(wchar_t* wxid,wchar_t* msg);
|
||||
int VerifyApply(wchar_t *v3, wchar_t *v4,int permission);
|
||||
int GetContactByWxid(wchar_t* wxid,ContactProfile& profile);
|
||||
int GetHeadImage(wchar_t* wxid,wchar_t* url);
|
||||
};
|
||||
} // namespace wxhelper
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ void GlobalContext::initialize(HMODULE module) {
|
||||
#ifndef _DEBUG
|
||||
hide_module->Hide(module_);
|
||||
#endif
|
||||
|
||||
ThreadPool::GetInstance().Create(2,8);
|
||||
HttpServer::GetInstance().Init(config->GetPort());
|
||||
HttpServer::GetInstance().HttpStart();
|
||||
DB::GetInstance().init(base);
|
||||
@@ -28,7 +28,6 @@ void GlobalContext::initialize(HMODULE module) {
|
||||
account_mgr.emplace(AccountMgr{base});
|
||||
chat_room_mgr.emplace(ChatRoomMgr{base});
|
||||
sns_mgr.emplace(SNSMgr{base});
|
||||
ThreadPool::GetInstance().Create(1,512);
|
||||
}
|
||||
|
||||
void GlobalContext::finally() {
|
||||
|
||||
+51
-75
@@ -5,8 +5,10 @@
|
||||
#include <nlohmann/json.hpp>
|
||||
#include "thread_pool.h"
|
||||
#include "wechat_function.h"
|
||||
#include "http_client.h"
|
||||
using namespace nlohmann;
|
||||
using namespace std;
|
||||
|
||||
namespace wxhelper {
|
||||
namespace hooks {
|
||||
static int server_port_ = 0;
|
||||
@@ -43,53 +45,7 @@ static DWORD user_info_next_addr_ = 0;
|
||||
|
||||
UserInfo userinfo = {};
|
||||
|
||||
void SendSocketMessage(InnerMessageStruct *msg) {
|
||||
if (msg == NULL) {
|
||||
return;
|
||||
}
|
||||
unique_ptr<InnerMessageStruct> sms(msg);
|
||||
json j_msg =
|
||||
json::parse(msg->buffer, msg->buffer + msg->length, nullptr, false);
|
||||
if (j_msg.is_discarded() == true) {
|
||||
return;
|
||||
}
|
||||
string jstr = j_msg.dump() + "\n";
|
||||
|
||||
if (server_port_ == 0) {
|
||||
SPDLOG_ERROR("http server port error :{}",server_port_);
|
||||
return;
|
||||
}
|
||||
SOCKET client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
||||
if (client_socket < 0) {
|
||||
SPDLOG_ERROR("socket init fail");
|
||||
return;
|
||||
}
|
||||
BOOL status = false;
|
||||
sockaddr_in client_addr;
|
||||
memset(&client_addr, 0, sizeof(client_addr));
|
||||
client_addr.sin_family = AF_INET;
|
||||
client_addr.sin_port = htons((u_short)server_port_);
|
||||
InetPtonA(AF_INET, server_ip_, &client_addr.sin_addr.s_addr);
|
||||
if (connect(client_socket, reinterpret_cast<sockaddr *>(&client_addr),
|
||||
sizeof(sockaddr)) < 0) {
|
||||
SPDLOG_ERROR("socket connect fail");
|
||||
return;
|
||||
}
|
||||
char recv_buf[1024] = {0};
|
||||
int ret = send(client_socket, jstr.c_str(), jstr.size(), 0);
|
||||
if (ret == -1 || ret == 0) {
|
||||
SPDLOG_ERROR("socket send fail ,ret::{}",ret);
|
||||
closesocket(client_socket);
|
||||
return;
|
||||
}
|
||||
memset(recv_buf, 0, sizeof(recv_buf));
|
||||
ret = recv(client_socket, recv_buf, sizeof(recv_buf), 0);
|
||||
closesocket(client_socket);
|
||||
if (ret == -1 || ret == 0) {
|
||||
SPDLOG_ERROR("socket recv fail ,ret:{}",ret);
|
||||
return;
|
||||
}
|
||||
}
|
||||
static bool enable_http_ = false;
|
||||
|
||||
VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
|
||||
PTP_WORK Work) {
|
||||
@@ -131,38 +87,49 @@ VOID CALLBACK SendMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
|
||||
if (connect(client_socket, reinterpret_cast<sockaddr *>(&client_addr),
|
||||
sizeof(sockaddr)) < 0) {
|
||||
SPDLOG_ERROR("socket connect fail");
|
||||
closesocket(client_socket);
|
||||
WSACleanup();
|
||||
return ;
|
||||
goto clean;
|
||||
}
|
||||
char recv_buf[1024] = {0};
|
||||
ret = send(client_socket, jstr.c_str(), jstr.size(), 0);
|
||||
if (ret == -1 || ret == 0) {
|
||||
if (ret < 0) {
|
||||
SPDLOG_ERROR("socket send fail ,ret:{}", ret);
|
||||
closesocket(client_socket);
|
||||
WSACleanup();
|
||||
return;
|
||||
goto clean;
|
||||
}
|
||||
ret = shutdown(client_socket, SD_SEND);
|
||||
if (ret == SOCKET_ERROR) {
|
||||
SPDLOG_ERROR("shutdown failed with erro:{}", ret);
|
||||
closesocket(client_socket);
|
||||
WSACleanup();
|
||||
return ;
|
||||
goto clean;
|
||||
}
|
||||
|
||||
memset(recv_buf, 0, sizeof(recv_buf));
|
||||
ret = recv(client_socket, recv_buf, sizeof(recv_buf), 0);
|
||||
closesocket(client_socket);
|
||||
if (ret == -1 || ret == 0) {
|
||||
if (ret < 0) {
|
||||
SPDLOG_ERROR("socket recv fail ,ret:{}", ret);
|
||||
WSACleanup();
|
||||
return;
|
||||
goto clean;
|
||||
}
|
||||
clean:
|
||||
closesocket(client_socket);
|
||||
WSACleanup();
|
||||
return;
|
||||
}
|
||||
|
||||
VOID CALLBACK SendHttpMsgCallback(PTP_CALLBACK_INSTANCE instance, PVOID context,
|
||||
PTP_WORK Work) {
|
||||
InnerMessageStruct *msg = (InnerMessageStruct *)context;
|
||||
if (msg == NULL) {
|
||||
SPDLOG_INFO("http msg is null");
|
||||
return;
|
||||
}
|
||||
|
||||
unique_ptr<InnerMessageStruct> sms(msg);
|
||||
json j_msg =
|
||||
json::parse(msg->buffer, msg->buffer + msg->length, nullptr, false);
|
||||
if (j_msg.is_discarded() == true) {
|
||||
return;
|
||||
}
|
||||
string jstr = j_msg.dump() + "\n";
|
||||
HttpClient::GetInstance().SendRequest(jstr);
|
||||
}
|
||||
|
||||
|
||||
void __cdecl OnRecvMsg(DWORD msg_addr) {
|
||||
json j_msg;
|
||||
unsigned long long msgid = *(unsigned long long *)(msg_addr + 0x30);
|
||||
@@ -210,13 +177,14 @@ void __cdecl OnRecvMsg(DWORD msg_addr) {
|
||||
inner_msg->buffer = new char[jstr.size() + 1];
|
||||
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
|
||||
inner_msg->length = jstr.size();
|
||||
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback,inner_msg);
|
||||
SPDLOG_INFO("add work:{}",add);
|
||||
// HANDLE thread = CreateThread(
|
||||
// NULL, 0, (LPTHREAD_START_ROUTINE)SendSocketMessage, inner_msg, NULL, 0);
|
||||
// if (thread) {
|
||||
// CloseHandle(thread);
|
||||
// }
|
||||
if(enable_http_){
|
||||
bool add = ThreadPool::GetInstance().AddWork(SendHttpMsgCallback,inner_msg);
|
||||
SPDLOG_INFO("add http msg work:{}",add);
|
||||
}else{
|
||||
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback,inner_msg);
|
||||
SPDLOG_INFO("add msg work:{}",add);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -263,10 +231,12 @@ void __cdecl OnSnsTimeLineMsg(DWORD msg_addr) {
|
||||
inner_msg->buffer = new char[jstr.size() + 1];
|
||||
memcpy(inner_msg->buffer, jstr.c_str(), jstr.size() + 1);
|
||||
inner_msg->length = jstr.size();
|
||||
HANDLE thread = CreateThread(
|
||||
NULL, 0, (LPTHREAD_START_ROUTINE)SendSocketMessage, inner_msg, NULL, 0);
|
||||
if (thread) {
|
||||
CloseHandle(thread);
|
||||
if(enable_http_){
|
||||
bool add = ThreadPool::GetInstance().AddWork(SendHttpMsgCallback,inner_msg);
|
||||
SPDLOG_INFO("add http msg work:{}",add);
|
||||
}else{
|
||||
bool add = ThreadPool::GetInstance().AddWork(SendMsgCallback,inner_msg);
|
||||
SPDLOG_INFO("add msg work:{}",add);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -285,7 +255,12 @@ _declspec(naked) void HandleSNSMsg() {
|
||||
}
|
||||
}
|
||||
|
||||
int HookRecvMsg(char *client_ip, int port) {
|
||||
int HookRecvMsg(char *client_ip, int port,char* url,uint64_t timeout,bool enable) {
|
||||
|
||||
enable_http_ = enable;
|
||||
if(enable_http_){
|
||||
HttpClient::GetInstance().SetConfig(url,timeout);
|
||||
}
|
||||
server_port_ = port;
|
||||
strcpy_s(server_ip_, client_ip);
|
||||
DWORD base = Utils::GetWeChatWinBase();
|
||||
@@ -317,6 +292,7 @@ int HookRecvMsg(char *client_ip, int port) {
|
||||
|
||||
int UnHookRecvMsg() {
|
||||
server_port_ = 0;
|
||||
enable_http_ = false;
|
||||
if (!msg_hook_flag_) {
|
||||
SPDLOG_INFO("recv msg hook already called");
|
||||
return 2;
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ namespace hooks {
|
||||
extern UserInfo userinfo;
|
||||
extern bool user_info_flag_ ;
|
||||
|
||||
int HookRecvMsg(char* client_ip, int port);
|
||||
int HookRecvMsg(char* client_ip, int port,char* url,uint64_t timeout,bool enable);
|
||||
|
||||
int UnHookRecvMsg();
|
||||
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
#include "pch.h"
|
||||
#include "http_client.h"
|
||||
namespace wxhelper {
|
||||
|
||||
void HttpClient::SendRequest(std::string content) {
|
||||
struct mg_mgr mgr;
|
||||
Data data ;
|
||||
data.done = false;
|
||||
data.post_data = content;
|
||||
mg_mgr_init(&mgr);
|
||||
mg_http_connect(&mgr, url_.c_str(), OnHttpEvent, &data);
|
||||
while (!data.done){
|
||||
mg_mgr_poll(&mgr, 500);
|
||||
}
|
||||
mg_mgr_free(&mgr);
|
||||
}
|
||||
|
||||
|
||||
void HttpClient::OnHttpEvent(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {
|
||||
const char * s_url = GetInstance().url_.c_str();
|
||||
Data data = *(Data*)fn_data;
|
||||
if (ev == MG_EV_OPEN) {
|
||||
// Connection created. Store connect expiration time in c->data
|
||||
*(uint64_t *) c->data = mg_millis() + GetInstance().timeout_;
|
||||
} else if (ev == MG_EV_POLL) {
|
||||
if (mg_millis() > *(uint64_t *) c->data &&
|
||||
(c->is_connecting || c->is_resolving)) {
|
||||
mg_error(c, "Connect timeout");
|
||||
}
|
||||
} else if (ev == MG_EV_CONNECT) {
|
||||
struct mg_str host = mg_url_host(s_url);
|
||||
if (mg_url_is_ssl(s_url)) {
|
||||
// no implement
|
||||
}
|
||||
|
||||
// Send request
|
||||
int content_length = data.post_data.size();
|
||||
mg_printf(c,
|
||||
"POST %s HTTP/1.0\r\n"
|
||||
"Host: %.*s\r\n"
|
||||
"Content-Type: application/json\r\n"
|
||||
"Content-Length: %d\r\n"
|
||||
"\r\n",
|
||||
mg_url_uri(s_url), (int) host.len,
|
||||
host.ptr, content_length);
|
||||
mg_send(c, data.post_data.c_str(), content_length);
|
||||
} else if (ev == MG_EV_HTTP_MSG) {
|
||||
// Response is received. Print it
|
||||
#ifdef _DEBUG
|
||||
struct mg_http_message *hm = (struct mg_http_message *) ev_data;
|
||||
printf("%.*s", (int) hm->message.len, hm->message.ptr);
|
||||
#endif
|
||||
c->is_closing = 1; // Tell mongoose to close this connection
|
||||
data.done = true; // Tell event loop to stops
|
||||
} else if (ev == MG_EV_ERROR) {
|
||||
data.done = true; // Error, tell event loop to stop
|
||||
}
|
||||
}
|
||||
|
||||
void HttpClient::SetConfig(char* url,uint64_t timeout){
|
||||
url_=url;
|
||||
timeout_=timeout;
|
||||
}
|
||||
|
||||
} // namespace wxhelper
|
||||
@@ -0,0 +1,24 @@
|
||||
#ifndef WXHELPER_HTTP_CLIENT_H_
|
||||
#define WXHELPER_HTTP_CLIENT_H_
|
||||
#include "mongoose.h"
|
||||
#include "singleton.h"
|
||||
|
||||
namespace wxhelper {
|
||||
struct Data {
|
||||
bool done;
|
||||
std::string post_data;
|
||||
};
|
||||
class HttpClient : public Singleton<HttpClient> {
|
||||
public:
|
||||
void SendRequest(std::string content);
|
||||
void SetConfig(char* url,uint64_t timeout);
|
||||
|
||||
static void OnHttpEvent(struct mg_connection *c, int ev, void *ev_data,
|
||||
void *fn_data);
|
||||
private:
|
||||
std::string url_;
|
||||
uint64_t timeout_;
|
||||
};
|
||||
|
||||
} // namespace wxhelper
|
||||
#endif
|
||||
+30
-3
@@ -171,12 +171,21 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
|
||||
break;
|
||||
}
|
||||
case WECHAT_MSG_START_HOOK: {
|
||||
|
||||
int port = GetIntParam(j_param, "port");
|
||||
wstring ip = GetWStringParam(j_param, "ip");
|
||||
string client_ip = Utils::WstringToUTF8(ip);
|
||||
int enable = GetIntParam(j_param, "enableHttp");
|
||||
string s_url ="";
|
||||
int timeout = 0;
|
||||
if(enable){
|
||||
wstring url = GetWStringParam(j_param, "url");
|
||||
timeout = GetIntParam(j_param, "timeout");
|
||||
s_url = Utils::WstringToUTF8(url);
|
||||
}
|
||||
char ip_cstr[16];
|
||||
strcpy_s(ip_cstr, client_ip.c_str());
|
||||
int success = hooks::HookRecvMsg(ip_cstr, port);
|
||||
int success = hooks::HookRecvMsg(ip_cstr, port,(char *)s_url.c_str(),timeout,enable);
|
||||
json ret_data = {{"code", success}, {"result", "OK"}};
|
||||
ret = ret_data.dump();
|
||||
break;
|
||||
@@ -429,9 +438,9 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
|
||||
wstring wxid = GetWStringParam(j_param, "wxid");
|
||||
wstring transcationid = GetWStringParam(j_param, "transcationId");
|
||||
wstring transferid = GetWStringParam(j_param, "transferId");
|
||||
BOOL response =g_context.misc_mgr->DoConfirmReceipt(
|
||||
int success =g_context.misc_mgr->DoConfirmReceipt(
|
||||
WS2LPWS(wxid), WS2LPWS(transcationid), WS2LPWS(transferid));
|
||||
json ret_data = {{"msg", response}, {"result", "OK"}};
|
||||
json ret_data = {{"code", success}, {"result", "OK"}};
|
||||
ret = ret_data.dump();
|
||||
break;
|
||||
}
|
||||
@@ -650,6 +659,24 @@ string Dispatch(struct mg_connection *c, struct mg_http_message *hm) {
|
||||
ret = ret_data.dump();
|
||||
break;
|
||||
}
|
||||
case WECHAT_REFUSE:{
|
||||
wstring wxid = GetWStringParam(j_param, "wxid");
|
||||
wstring transcationid = GetWStringParam(j_param, "transcationId");
|
||||
wstring transferid = GetWStringParam(j_param, "transferId");
|
||||
int success =g_context.misc_mgr->DoRefuseReceipt(
|
||||
WS2LPWS(wxid), WS2LPWS(transcationid), WS2LPWS(transferid));
|
||||
json ret_data = {{"code", success}, {"result", "OK"}};
|
||||
ret = ret_data.dump();
|
||||
break;
|
||||
}
|
||||
case WECHAT_GET_HEAD_IMG:{
|
||||
wstring wxid = GetWStringParam(j_param, "wxid");
|
||||
wstring url = GetWStringParam(j_param, "imageUrl");
|
||||
int success =g_context.contact_mgr->GetHeadImage(WS2LPWS(wxid), WS2LPWS(url));
|
||||
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();
|
||||
|
||||
@@ -135,6 +135,44 @@ int MiscMgr::DoConfirmReceipt(wchar_t *wxid, wchar_t *transcationid,
|
||||
return success;
|
||||
}
|
||||
|
||||
int MiscMgr::DoRefuseReceipt(wchar_t *wxid, wchar_t *transcationid,
|
||||
wchar_t *transferid) {
|
||||
int success = -1;
|
||||
WeChatString recv_id(wxid);
|
||||
WeChatString transcation_id(transcationid);
|
||||
WeChatString transfer_id(transferid);
|
||||
char pay_info[0x134] = {0};
|
||||
DWORD new_pay_info_addr = base_addr_ + WX_NEW_WCPAYINFO_OFFSET;
|
||||
DWORD free_pay_info_addr = base_addr_ + WX_FREE_WCPAYINFO_OFFSET;
|
||||
DWORD do_confirm_addr = base_addr_ + WX_CONFIRM_RECEIPT_OFFSET;
|
||||
__asm {
|
||||
PUSHAD
|
||||
LEA ECX,pay_info
|
||||
CALL new_pay_info_addr
|
||||
MOV dword ptr [pay_info + 0x4], 0x1
|
||||
MOV dword ptr [pay_info + 0x4C], 0x1
|
||||
POPAD
|
||||
}
|
||||
memcpy(&pay_info[0x1c], &transcation_id, sizeof(transcation_id));
|
||||
memcpy(&pay_info[0x38], &transfer_id, sizeof(transfer_id));
|
||||
|
||||
__asm {
|
||||
PUSHAD
|
||||
PUSH 0x0
|
||||
SUB ESP,0x8
|
||||
LEA EDX,recv_id
|
||||
LEA ECX,pay_info
|
||||
CALL do_confirm_addr
|
||||
MOV success,EAX
|
||||
ADD ESP,0xC
|
||||
PUSH 0x0
|
||||
LEA ECX,pay_info
|
||||
CALL free_pay_info_addr
|
||||
POPAD
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
int MiscMgr::DoDownloadTask(ULONG64 msg_id) {
|
||||
int success = -1;
|
||||
int db_index = 0;
|
||||
|
||||
@@ -13,6 +13,8 @@ class MiscMgr :public BaseMgr{
|
||||
int DoOCRTask(wchar_t* img_path, std::string& result);
|
||||
int DoConfirmReceipt(wchar_t* wxid, wchar_t* transcationid,
|
||||
wchar_t* transferid);
|
||||
int DoRefuseReceipt(wchar_t* wxid, wchar_t* transcationid,
|
||||
wchar_t* transferid);
|
||||
int DoDownloadTask(ULONG64 msg_id);
|
||||
|
||||
int GetVoice(ULONG64 msg_id, wchar_t* dir);
|
||||
|
||||
+18
-9
@@ -391,11 +391,16 @@ int SendMessageMgr::SendAppletMsg(wchar_t* wxid, wchar_t* appletid){
|
||||
receiver_list.push_back(wwxid);
|
||||
VectorInner* list = (VectorInner*)&receiver_list;
|
||||
DWORD receiver_list_ptr = (DWORD)&list->start;
|
||||
|
||||
|
||||
WeChatString wapplet(appletid);
|
||||
char req[0x268]={0};
|
||||
char req[0x268] = {0};
|
||||
char temp[0x4] = {0};
|
||||
char buff[0x88]={0};
|
||||
char buff[0x88] = {0};
|
||||
DWORD flag = 0xF;
|
||||
DWORD zero = 0;
|
||||
WeChatStr clean;
|
||||
WeChatStr app_id(c_applet_id);
|
||||
|
||||
__asm{
|
||||
PUSHAD
|
||||
PUSHFD
|
||||
@@ -406,7 +411,8 @@ int SendMessageMgr::SendAppletMsg(wchar_t* wxid, wchar_t* appletid){
|
||||
}
|
||||
// 0x40 gh
|
||||
// 0xE8 img
|
||||
memcpy(&req[0x4], &c_applet_id, sizeof(c_applet_id));
|
||||
memcpy(&req[0x4], &app_id, sizeof(app_id));
|
||||
|
||||
__asm{
|
||||
PUSHAD
|
||||
PUSHFD
|
||||
@@ -442,15 +448,18 @@ int SendMessageMgr::SendAppletMsg(wchar_t* wxid, wchar_t* appletid){
|
||||
POPAD
|
||||
}
|
||||
|
||||
__asm{
|
||||
// no need for WeChat to release memory
|
||||
memcpy(&req[0x4], &clean, sizeof(clean));
|
||||
memcpy(&req[0xC8], &zero, sizeof(zero));
|
||||
memcpy(&req[0xCC], &flag, sizeof(flag));
|
||||
__asm {
|
||||
PUSHAD
|
||||
PUSHFD
|
||||
LEA ECX,req
|
||||
PUSH 0x0
|
||||
CALL free_share_app_msg_req_addr
|
||||
POPFD
|
||||
POPAD
|
||||
}
|
||||
return success;
|
||||
}
|
||||
} // namespace wxhelper
|
||||
return success;
|
||||
}
|
||||
} // namespace wxhelperg
|
||||
+10
-3
@@ -6,10 +6,16 @@
|
||||
|
||||
namespace wxhelper {
|
||||
ThreadPool::~ThreadPool() {
|
||||
CloseThreadpoolCleanupGroupMembers(cleanup_group_, true, NULL);
|
||||
CloseThreadpoolCleanupGroup(cleanup_group_);
|
||||
CloseThreadpool(pool_);
|
||||
if(cleanup_group_){
|
||||
CloseThreadpoolCleanupGroupMembers(cleanup_group_, true, NULL);
|
||||
CloseThreadpoolCleanupGroup(cleanup_group_);
|
||||
}
|
||||
DestroyThreadpoolEnvironment(&env_);
|
||||
if (pool_){
|
||||
CloseThreadpool(pool_);
|
||||
}
|
||||
}
|
||||
|
||||
bool ThreadPool::Create(unsigned long min, unsigned long max) {
|
||||
InitializeThreadpoolEnvironment(&env_);
|
||||
pool_ = CreateThreadpool(NULL);
|
||||
@@ -38,4 +44,5 @@ bool ThreadPool::AddWork(PTP_WORK_CALLBACK callback,PVOID opt) {
|
||||
SubmitThreadpoolWork(work);
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace wxhelper
|
||||
@@ -13,9 +13,6 @@ class ThreadPool :public Singleton<ThreadPool>{
|
||||
bool AddWork(PTP_WORK_CALLBACK callback,PVOID opt);
|
||||
|
||||
private:
|
||||
void operator=(const ThreadPool&) = delete;
|
||||
void operator=(ThreadPool&&) = delete;
|
||||
|
||||
PTP_POOL pool_;
|
||||
PTP_CLEANUP_GROUP cleanup_group_;
|
||||
TP_CALLBACK_ENVIRON env_;
|
||||
|
||||
+33
-2
@@ -26,7 +26,9 @@
|
||||
// sendMessageMgr
|
||||
#define WX_SEND_MESSAGE_MGR_OFFSET 0x768be0
|
||||
// shareRecordMgr
|
||||
#define WX_SHARE_RECORD_MGR_OFFSET 0x78d5f0
|
||||
#define WX_SHARE_RECORD_MGR_OFFSET 0x78d5f0
|
||||
// headImageMgr
|
||||
#define WX_HEAD_IMAGE_MGR_OFFSET 0x808850
|
||||
|
||||
|
||||
// setChatMsgValue
|
||||
@@ -198,11 +200,14 @@
|
||||
|
||||
// send app msg
|
||||
#define NEW_SHARE_APP_MSG_REQ_OFFSET 0xfbae50
|
||||
#define FREE_SHARE_APP_MSG_REQ_OFFSET 0xfbc0d0
|
||||
// #define FREE_SHARE_APP_MSG_REQ_OFFSET 0xfbc0d0
|
||||
#define FREE_SHARE_APP_MSG_REQ_OFFSET 0xfbc100
|
||||
#define NEW_WA_UPDATABLE_MSG_INFO_OFFSET 0x7b3d30
|
||||
#define FREE_WA_UPDATABLE_MSG_INFO_OFFSET 0x79d4c0
|
||||
#define SEND_APP_MSG_OFFSET 0xfe8e40
|
||||
|
||||
// query head image then download
|
||||
#define QUERY_THEN_DOWNLOAD_OFFSET 0xc642f0
|
||||
|
||||
|
||||
/*******************hook*********************************************/
|
||||
@@ -804,4 +809,30 @@ struct ContactProfile{
|
||||
std::wstring nickname;
|
||||
std::wstring head_image;
|
||||
};
|
||||
|
||||
struct WeChatStr{
|
||||
char * ptr;
|
||||
DWORD field1;
|
||||
DWORD field2;
|
||||
DWORD field3;
|
||||
DWORD len;
|
||||
DWORD maxlen;
|
||||
|
||||
WeChatStr(const char* p) {
|
||||
ptr = (char *)p;
|
||||
field1 = 0;
|
||||
field2 = 0;
|
||||
field3 = 0;
|
||||
len = strlen(p);
|
||||
maxlen = len | 0xF;
|
||||
}
|
||||
WeChatStr() {
|
||||
ptr = NULL;
|
||||
field1 = 0;
|
||||
field2 = 0;
|
||||
field3 = 0;
|
||||
len = 0;
|
||||
maxlen = 0xF;
|
||||
}
|
||||
};
|
||||
#endif
|
||||
Reference in New Issue
Block a user